10 Mencari cara memasang plugins? Lihat [Temukan dan pasang plugins](/docs/id/discover-plugins). Untuk membuat plugins, lihat [Plugins](/docs/id/plugins). Untuk mendistribusikan plugins, lihat [Plugin marketplaces](/docs/id/plugin-marketplaces).10 Mencari cara memasang plugins? Lihat [Temukan dan pasang plugins](/docs/id/discover-plugins). Untuk membuat plugins, lihat [Plugins](/docs/id/plugins). Untuk mendistribusikan plugins, lihat [Plugin marketplaces](/docs/id/plugin-marketplaces).
11</Tip>11</Tip>
12 12
13Referensi ini menyediakan spesifikasi teknis lengkap untuk sistem plugin Claude Code, termasuk skema komponen, perintah CLI, dan alat pengembangan.13Sebuah **plugin** adalah direktori yang mandiri berisi komponen-komponen yang memperluas Claude Code dengan fungsionalitas khusus. Komponen plugin mencakup skills, agents, hooks, MCP servers, LSP servers, dan monitors.
14
15Sebuah **plugin** adalah direktori yang mandiri berisi komponen yang memperluas Claude Code dengan fungsionalitas khusus. Komponen plugin mencakup skills, agents, hooks, MCP servers, LSP servers, dan monitors.
16 14
17<h2 id="plugin-components-reference">15<h2 id="plugin-components-reference">
18 Referensi komponen plugin16 Referensi komponen plugin
22 Skills20 Skills
23</h3>21</h3>
24 22
25Plugins menambahkan skills ke Claude Code, membuat pintasan `/name` yang dapat Anda atau Claude panggil.23Plugin menambahkan skills ke Claude Code, membuat pintasan `/name` yang dapat Anda atau Claude panggil.
26 24
27**Lokasi**: Direktori `skills/` atau `commands/` di root plugin, atau file `SKILL.md` tunggal di root plugin25**Lokasi**: Direktori `skills/` atau `commands/` di root plugin, atau file `SKILL.md` tunggal di root plugin
28 26
40 └── SKILL.md38 └── SKILL.md
41```39```
42 40
43**Perilaku integrasi**:41Skills dan commands secara otomatis ditemukan ketika plugin diinstal.
44 42
45* Skills dan commands secara otomatis ditemukan saat plugin dipasang43Jika plugin tidak memiliki direktori `skills/` dan tidak memiliki field manifest `skills`, file `SKILL.md` di root plugin dimuat sebagai skill tunggal. Atur field frontmatter `name` untuk mengontrol nama invokasi skill. Tanpanya, Claude Code kembali ke nama direktori instalasi, yang untuk plugin yang diinstal dari marketplace adalah string versi yang berubah pada setiap pembaruan. Untuk plugin yang mengirimkan lebih dari satu skill, gunakan tata letak direktori `skills/` yang ditunjukkan di atas.
46* Claude dapat memanggilnya secara otomatis berdasarkan konteks tugas
47* Skills dapat menyertakan file pendukung di samping SKILL.md
48 44
49Jika plugin tidak memiliki direktori `skills/` dan tidak memiliki field manifest `skills`, file `SKILL.md` di root plugin dimuat sebagai skill tunggal. Atur field frontmatter `name` untuk mengontrol nama invokasi skill. Tanpanya, Claude Code kembali ke nama direktori instalasi, yang untuk plugins yang dipasang dari marketplace adalah string versi yang berubah pada setiap update. Untuk plugins yang mengirimkan lebih dari satu skill, gunakan tata letak direktori `skills/` yang ditunjukkan di atas.45Dalam skills dan commands plugin, field frontmatter Boolean seperti `disable-model-invocation` menerima `yes`, `no`, `on`, `off`, `1`, dan `0` dalam huruf apa pun, selain `true` dan `false`. Sebelum v2.1.218, Claude Code hanya mengenali `true` dan `false`.
50 46
51Untuk detail lengkap, lihat [Skills](/docs/id/skills).47Untuk detail lengkap, lihat [Skills](/docs/id/skills).
52 48
54 Agents50 Agents
55</h3>51</h3>
56 52
57Plugins dapat menyediakan subagents khusus untuk tugas-tugas tertentu yang dapat Claude panggil secara otomatis jika sesuai.53Plugin dapat menyediakan subagents khusus untuk tugas-tugas tertentu yang dapat Claude panggil secara otomatis jika sesuai.
58 54
59**Lokasi**: Direktori `agents/` di root plugin55**Lokasi**: Direktori `agents/` di root plugin
60 56
75Prompt sistem terperinci untuk agent yang menjelaskan peran, keahlian, dan perilakunya.71Prompt sistem terperinci untuk agent yang menjelaskan peran, keahlian, dan perilakunya.
76```72```
77 73
78Plugin agents mendukung field frontmatter `name`, `description`, `model`, `effort`, `maxTurns`, `tools`, `disallowedTools`, `skills`, `memory`, `background`, dan `isolation`. Satu-satunya nilai `isolation` yang valid adalah `"worktree"`. Untuk alasan keamanan, `hooks`, `mcpServers`, dan `permissionMode` tidak didukung untuk agents yang dikirim plugin.74Plugin agents mendukung field frontmatter `name`, `description`, `model`, `effort`, `maxTurns`, `tools`, `disallowedTools`, `skills`, `memory`, `background`, dan `isolation`. Satu-satunya nilai `isolation` yang valid adalah `"worktree"`. Untuk alasan keamanan, `hooks`, `mcpServers`, dan `permissionMode` tidak didukung untuk agents yang dikirimkan plugin.
75
76Claude Code memuat agent plugin bahkan ketika frontmatternya tidak memiliki `name` atau tidak dapat diuraikan:
77
78* Tidak ada `name`: Claude Code memberi nama agent sesuai file, jadi `agents/reviewer.md` dalam plugin bernama `my-plugin` dimuat sebagai `my-plugin:reviewer`
79* Frontmatter yang tidak dapat diuraikan: Claude Code memberi nama agent sesuai file, menggunakan `Agent from my-plugin plugin` sebagai deskripsinya, dan mengabaikan setiap field dalam file
79 80
80**Titik integrasi**:81Sebaliknya, Claude Code melewati file project, user, atau managed agent yang frontmatternya tidak memiliki `name` atau tidak dapat diuraikan.
81 82
82* Agents muncul di typeahead [@-mention](/docs/id/sub-agents#invoke-subagents-explicitly) dengan nama yang diberi scope, seperti `my-plugin:code-reviewer`, setelah plugin diaktifkan83Untuk menemukan file dalam direktori `agents/` default plugin yang frontmatternya tidak dapat diuraikan, jalankan `claude plugin validate`. Path yang Anda berikan tergantung pada apakah plugin memiliki manifest, dan kedua contoh menggunakan `./my-plugin` sebagai direktori plugin:
83* Claude dapat memanggil agents secara otomatis berdasarkan konteks tugas84
84* Agents dapat dipanggil secara manual oleh pengguna85* Plugin dengan manifest: `claude plugin validate ./my-plugin`
85* Plugin agents bekerja bersama agents Claude bawaan86* Plugin tanpa manifest: `claude plugin validate ./my-plugin/agents`. Memerlukan Claude Code v2.1.233 atau lebih baru.
87
88Agents muncul dalam [@-mention typeahead](/docs/id/sub-agents#invoke-subagents-explicitly) di bawah nama scoped mereka, seperti `my-plugin:code-reviewer`, setelah plugin diaktifkan.
86 89
87Untuk detail lengkap, lihat [Subagents](/docs/id/sub-agents).90Untuk detail lengkap, lihat [Subagents](/docs/id/sub-agents).
88 91
90 Hooks93 Hooks
91</h3>94</h3>
92 95
93Plugins dapat menyediakan event handlers yang merespons peristiwa Claude Code secara otomatis.96Plugin dapat menyediakan event handlers yang merespons event Claude Code secara otomatis.
94 97
95**Lokasi**: `hooks/hooks.json` di root plugin, atau inline di plugin.json98**Lokasi**: `hooks/hooks.json` di root plugin, atau inline dalam plugin.json
96 99
97**Format**: Konfigurasi JSON dengan event matchers dan actions100**Format**: Konfigurasi JSON dengan event matchers dan actions
98 101
116}119}
117```120```
118 121
119Plugin hooks merespons peristiwa lifecycle yang sama seperti [hooks yang ditentukan pengguna](/docs/id/hooks):122Plugin hooks merespons event lifecycle yang sama seperti [user-defined hooks](/docs/id/hooks):
120 123
121| Event | When it fires |124| Event | Kapan event ini dipicu |
122| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |125| :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
123| `SessionStart` | When a session begins or resumes |126| `SessionStart` | Ketika sesi dimulai atau dilanjutkan |
124| `Setup` | When you start Claude Code with `--init-only`, or with `--init` or `--maintenance` in `-p` mode. For one-time preparation in CI or scripts |127| `Setup` | Ketika Anda memulai Claude Code dengan `--init-only`, atau dengan `--init` atau `--maintenance` dalam mode `-p`. Untuk persiapan satu kali dalam CI atau skrip |
125| `UserPromptSubmit` | When you submit a prompt, before Claude processes it |128| `UserPromptSubmit` | Ketika Anda mengirimkan prompt, sebelum Claude memprosesnya |
126| `UserPromptExpansion` | When a user-typed command expands into a prompt, before it reaches Claude. Can block the expansion |129| `UserPromptExpansion` | Ketika perintah yang diketik pengguna berkembang menjadi prompt, sebelum mencapai Claude. Dapat memblokir ekspansi |
127| `PreToolUse` | Before a tool call executes. Can block it |130| `PreToolUse` | Sebelum panggilan alat dieksekusi. Dapat memblokir |
128| `PermissionRequest` | When a tool call needs a permission decision |131| `PermissionRequest` | Ketika panggilan alat memerlukan keputusan izin |
129| `PermissionDenied` | When auto mode denies a tool call, including denials without a classifier verdict. Use JSON `hookSpecificOutput.retry: true` to tell the model it may retry the denied tool call. Claude Code ignores `retry` when the classifier produced no verdict |132| `PermissionDenied` | Ketika mode otomatis menolak panggilan alat, termasuk penolakan tanpa putusan classifier. Gunakan JSON `hookSpecificOutput.retry: true` untuk memberitahu model bahwa mungkin dapat mencoba ulang panggilan alat yang ditolak. Claude Code mengabaikan `retry` ketika classifier tidak menghasilkan putusan |
130| `PostToolUse` | After a tool call succeeds |133| `PostToolUse` | Setelah panggilan alat berhasil |
131| `PostToolUseFailure` | After a tool call fails |134| `PostToolUseFailure` | Setelah panggilan alat gagal |
132| `PostToolBatch` | After a full batch of parallel tool calls resolves, before the next model call |135| `PostToolBatch` | Setelah batch lengkap panggilan alat paralel terselesaikan, sebelum panggilan model berikutnya |
133| `Notification` | When Claude Code sends a notification |136| `Notification` | Ketika Claude Code mengirimkan notifikasi |
134| `MessageDisplay` | While assistant message text is displayed |137| `MessageDisplay` | Saat teks pesan asisten ditampilkan |
135| `SubagentStart` | When a subagent is spawned |138| `SubagentStart` | Ketika subagent dimulai |
136| `SubagentStop` | When a subagent finishes |139| `SubagentStop` | Ketika subagent selesai |
137| `TaskCreated` | When a task is being created via `TaskCreate` |140| `TaskCreated` | Ketika tugas sedang dibuat melalui `TaskCreate` |
138| `TaskCompleted` | When a task is being marked as completed |141| `TaskCompleted` | Ketika tugas sedang ditandai sebagai selesai |
139| `Stop` | When Claude finishes responding |142| `Stop` | Ketika Claude selesai merespons |
140| `StopFailure` | When the turn ends due to an API error |143| `StopFailure` | Ketika giliran berakhir karena kesalahan API |
141| `TeammateIdle` | When an [agent team](/docs/en/agent-teams) teammate is about to go idle |144| `TeammateIdle` | Ketika rekan tim [agent team](/docs/id/agent-teams) akan menjadi idle |
142| `InstructionsLoaded` | When a CLAUDE.md or `.claude/rules/*.md` file is loaded into context. Fires at session start and when files are lazily loaded during a session |145| `InstructionsLoaded` | Ketika file CLAUDE.md atau `.claude/rules/*.md` dimuat ke dalam konteks. Dipicu saat awal sesi dan ketika file dimuat dengan malas selama sesi |
143| `ConfigChange` | When a configuration file changes during a session |146| `ConfigChange` | Ketika file konfigurasi berubah selama sesi |
144| `CwdChanged` | When the working directory changes, for example when Claude executes a `cd` command. Useful for reactive environment management with tools like direnv |147| `CwdChanged` | Ketika direktori kerja berubah, misalnya ketika Claude mengeksekusi perintah `cd`. Berguna untuk manajemen lingkungan reaktif dengan alat seperti direnv |
145| `DirectoryAdded` | When a working directory is added mid-session via `/add-dir` or the SDK `register_repo_root` control request |148| `DirectoryAdded` | Ketika direktori kerja ditambahkan di tengah sesi melalui `/add-dir` atau permintaan kontrol SDK `register_repo_root` |
146| `FileChanged` | When a watched file changes on disk. The `matcher` field specifies which filenames to watch |149| `FileChanged` | Ketika file yang dipantau berubah di disk. Bidang `matcher` menentukan nama file mana yang dipantau |
147| `WorktreeCreate` | When a worktree is being created via `--worktree`, `isolation: "worktree"`, or for a background session. Replaces default git behavior |150| `WorktreeCreate` | Ketika worktree sedang dibuat melalui `--worktree`, `isolation: "worktree"`, atau untuk sesi latar belakang. Menggantikan perilaku git default |
148| `WorktreeRemove` | When a worktree is being removed at session exit, when a subagent finishes, or when you delete a background session |151| `WorktreeRemove` | Ketika worktree sedang dihapus saat keluar sesi, ketika subagent selesai, atau ketika Anda menghapus sesi latar belakang |
149| `PreCompact` | Before context compaction |152| `PreCompact` | Sebelum pemadatan konteks |
150| `PostCompact` | After context compaction completes |153| `PostCompact` | Setelah pemadatan konteks selesai |
151| `PreModelSwitch` | Before Claude Code applies a model switch that you or a client requested. Can block the switch |154| `PreModelSwitch` | Sebelum Claude Code menerapkan pergantian model yang Anda atau klien minta. Dapat memblokir pergantian |
152| `PostModelSwitch` | After the session's model changes, including changes Claude Code makes on its own, such as restoring the model when you resume a session |155| `PostModelSwitch` | Setelah model sesi berubah, termasuk perubahan yang Claude Code lakukan sendiri, seperti memulihkan model ketika Anda melanjutkan sesi |
153| `Elicitation` | When an MCP server requests user input during a tool call |156| `Elicitation` | Ketika server MCP meminta input pengguna selama panggilan alat |
154| `ElicitationResult` | After a user responds to an MCP elicitation, before the response is sent back to the server |157| `ElicitationResult` | Setelah pengguna merespons elicitation MCP, sebelum respons dikirim kembali ke server |
155| `SessionEnd` | When a session terminates |158| `SessionEnd` | Ketika sesi berakhir |
156 159
157**Tipe hook**:160**Tipe hook**:
158 161
159* `command`: jalankan perintah shell atau scripts162* `command`: jalankan perintah shell atau script
160* `http`: kirim JSON event sebagai POST request ke URL163* `http`: kirim event JSON sebagai POST request ke URL
161* `mcp_tool`: panggil tool pada [MCP server](/docs/id/mcp) yang dikonfigurasi164* `mcp_tool`: panggil tool pada [MCP server](/docs/id/mcp) yang dikonfigurasi
162* `prompt`: evaluasi prompt dengan LLM (menggunakan placeholder `$ARGUMENTS` untuk konteks)165* `prompt`: evaluasi prompt dengan LLM (menggunakan placeholder `$ARGUMENTS` untuk konteks)
163* `agent`: jalankan verifier agentic dengan tools untuk tugas verifikasi kompleks166* `agent`: jalankan verifier agentic dengan tools untuk tugas verifikasi kompleks
164 167
165Hooks yang menargetkan [MCP server bundel](/docs/id/mcp#plugin-provided-mcp-servers) plugin itu sendiri harus menggunakan nama yang diberi scope. Tool matchers dan field `if` mengambil nama tool yang diberi scope `mcp__plugin_<plugin-name>_<server-name>__<tool>`, dan field `server` hook `mcp_tool` mengambil `plugin:<plugin-name>:<server-name>`. Matcher yang ditulis terhadap kunci server bare tidak pernah aktif. Lihat [Match MCP tools](/docs/id/hooks#match-mcp-tools) dan [Plugin-provided MCP servers](/docs/id/mcp#plugin-provided-mcp-servers).168Hooks yang menargetkan [bundled MCP server](#mcp-servers) plugin sendiri harus menggunakan nama scopednya. Tool matchers dan field `if` mengambil nama tool scoped `mcp__plugin_<plugin-name>_<server-name>__<tool>`, dan field `server` hook `mcp_tool` mengambil `plugin:<plugin-name>:<server-name>`. Matcher yang ditulis terhadap bare server key tidak pernah aktif. Lihat [Match MCP tools](/docs/id/hooks#match-mcp-tools) dan [Plugin-provided MCP servers](/docs/id/mcp#plugin-provided-mcp-servers).
166 169
167<h3 id="mcp-servers">170<h3 id="mcp-servers">
168 MCP servers171 MCP servers
169</h3>172</h3>
170 173
171Plugins dapat menggabungkan Model Context Protocol (MCP) servers untuk menghubungkan Claude Code dengan alat dan layanan eksternal.174Plugin dapat membundel Model Context Protocol (MCP) servers untuk menghubungkan Claude Code dengan tools dan services eksternal.
172 175
173**Lokasi**: `.mcp.json` di root plugin, atau inline di plugin.json176**Lokasi**: `.mcp.json` di root plugin, atau inline dalam plugin.json
174 177
175**Format**: Konfigurasi MCP server standar178**Format**: Konfigurasi MCP server standar
176 179
196 199
197**Perilaku integrasi**:200**Perilaku integrasi**:
198 201
199* Plugin MCP servers dimulai secara otomatis saat plugin diaktifkan202* MCP servers plugin dimulai secara otomatis ketika plugin diaktifkan
200* Servers muncul sebagai alat MCP standar di toolkit Claude203* Servers muncul sebagai MCP tools standar dalam toolkit Claude
201* Kemampuan server terintegrasi dengan mulus dengan alat Claude yang ada204* Plugin servers dapat dikonfigurasi secara independen dari user MCP servers
202* Plugin servers dapat dikonfigurasi secara independen dari MCP servers pengguna205* Jika Anda menjalankan [`/reload-plugins`](/docs/id/discover-plugins#apply-plugin-changes-without-restarting) di tengah sesi, Claude Code mempertahankan koneksi live dari servers yang konfigurasinya tidak berubah
203 206
204<h3 id="lsp-servers">207<h3 id="lsp-servers">
205 LSP servers208 LSP servers
206</h3>209</h3>
207 210
208<Tip>211<Tip>
209 Mencari cara menggunakan LSP plugins? Pasang dari marketplace resmi: cari "lsp" di tab Discover `/plugin`. Bagian ini mendokumentasikan cara membuat LSP plugins untuk bahasa yang tidak tercakup oleh marketplace resmi.212 Mencari untuk menggunakan LSP plugins? Instal dari marketplace resmi: cari "lsp" di tab Discover `/plugin`. Bagian ini mendokumentasikan cara membuat LSP plugins untuk bahasa yang tidak tercakup oleh marketplace resmi.
210</Tip>213</Tip>
211 214
212Plugins dapat menyediakan server [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) untuk memberikan Claude intelijen kode real-time saat bekerja pada codebase Anda.215Plugin dapat menyediakan [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) servers untuk memberikan Claude [real-time code intelligence](/docs/id/discover-plugins#code-intelligence) saat bekerja pada codebase Anda.
213
214Integrasi LSP menyediakan:
215 216
216* **Diagnostik instan**: Claude melihat kesalahan dan peringatan segera setelah setiap edit217**Lokasi**: `.lsp.json` di root plugin, atau inline dalam `plugin.json`
217* **Navigasi kode**: buka definisi, temukan referensi, dan informasi hover
218* **Kesadaran bahasa**: informasi tipe dan dokumentasi untuk simbol kode
219 218
220**Lokasi**: `.lsp.json` di root plugin, atau inline di `plugin.json`219**Format**: Konfigurasi JSON yang memetakan nama language server ke konfigurasi mereka
221
222**Format**: Konfigurasi JSON yang memetakan nama language server ke konfigurasinya
223 220
224**Format file `.lsp.json`**:221**Format file `.lsp.json`**:
225 222
235}232}
236```233```
237 234
238**Inline di `plugin.json`**:235**Inline dalam `plugin.json`**:
239 236
240```json theme={null}237```json theme={null}
241{238{
256 253
257| Field | Deskripsi |254| Field | Deskripsi |
258| :-------------------- | :------------------------------------------------- |255| :-------------------- | :------------------------------------------------- |
259| `command` | Biner LSP yang akan dijalankan (harus ada di PATH) |256| `command` | Binary LSP yang akan dieksekusi (harus dalam PATH) |
260| `extensionToLanguage` | Memetakan ekstensi file ke pengenal bahasa |257| `extensionToLanguage` | Memetakan ekstensi file ke identifier bahasa |
261 258
262**Field opsional:**259**Field opsional:**
263 260
264| Field | Deskripsi |261| Field | Deskripsi |
265| :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |262| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
266| `args` | Argumen baris perintah untuk LSP server |263| `args` | Argumen command-line untuk LSP server |
267| `transport` | Transport komunikasi: `stdio` (default) atau `socket` |264| `transport` | Transport komunikasi: `stdio` (default) atau `socket`. Claude Code menerima `socket` tetapi menjalankan setiap server melalui stdio, jadi aturan protokol stdout berlaku untuk semua servers |
268| `env` | Variabel lingkungan yang diatur saat memulai server |265| `env` | Variabel environment yang diatur saat memulai server |
269| `initializationOptions` | Opsi yang diteruskan ke server selama inisialisasi |266| `initializationOptions` | Opsi yang dilewatkan ke server selama inisialisasi |
270| `settings` | Pengaturan yang diteruskan melalui `workspace/didChangeConfiguration` |267| `settings` | Settings yang dilewatkan melalui `workspace/didChangeConfiguration` |
271| `workspaceFolder` | Jalur folder workspace untuk server |268| `workspaceFolder` | Path folder workspace untuk server |
272| `startupTimeout` | Waktu maksimal untuk menunggu startup server (milidetik) |269| `startupTimeout` | Waktu maksimal untuk menunggu startup server (milliseconds) |
273| `shutdownTimeout` | Waktu maksimal untuk menunggu shutdown yang elegan (milidetik). Ketika timeout berlalu, Claude Code menghentikan proses server. Ketika tidak diatur, tidak ada timeout yang berlaku |270| `shutdownTimeout` | Waktu maksimal untuk menunggu graceful shutdown (milliseconds). Ketika timeout berlalu, Claude Code menghentikan proses server. Ketika tidak diatur, tidak ada timeout yang berlaku |
274| `restartOnCrash` | Apakah memulai ulang server setelah crash. Default ke `true`. Atur ke `false` untuk membiarkan server yang crash tetap berhenti daripada memulai ulang |271| `restartOnCrash` | Apakah memulai ulang server setelah crash. Default ke `true`. Atur ke `false` untuk membiarkan server yang crash tetap berhenti daripada memulai ulang |
275| `maxRestarts` | Jumlah maksimal upaya restart sebelum menyerah |272| `maxRestarts` | Jumlah maksimal upaya restart sebelum menyerah |
276| `diagnostics` | Apakah mendorong diagnostik ke dalam konteks Claude setelah edits (default `true`). Atur ke `false` untuk mempertahankan navigasi kode tetapi menekan injeksi diagnostik otomatis. |273| `diagnostics` | Apakah mendorong diagnostics ke konteks Claude setelah edits (default `true`). Atur ke `false` untuk menjaga navigasi kode tetapi menekan injeksi diagnostik otomatis. |
277 274
278`restartOnCrash` dan `shutdownTimeout` memerlukan Claude Code v2.1.205 atau lebih baru. Sebelum v2.1.205, skema config menerima kedua opsi tetapi mengatur salah satu menyebabkan Claude Code melewati LSP server itu sepenuhnya saat startup, dengan alasan hanya terlihat di output `claude --debug`.275`restartOnCrash` dan `shutdownTimeout` memerlukan Claude Code v2.1.205 atau lebih baru. Sebelum v2.1.205, skema config menerima kedua opsi tetapi mengatur salah satu menyebabkan Claude Code melewati LSP server itu sepenuhnya pada startup, dengan alasan hanya terlihat dalam output `claude --debug`.
279 276
280**Multiple servers untuk ekstensi yang sama**: ketika lebih dari satu LSP server yang diaktifkan mendeklarasikan ekstensi file yang sama di `extensionToLanguage`, apakah servers berasal dari satu plugin atau dari plugin yang berbeda, server pertama yang terdaftar menangani file dengan ekstensi itu dan yang lain tidak pernah dimulai. Interface `/plugin` menampilkan peringatan yang menamai plugin yang servernya aktif.277**Multiple servers untuk ekstensi yang sama**: ketika lebih dari satu LSP server yang diaktifkan mendeklarasikan ekstensi file yang sama dalam `extensionToLanguage`, apakah servers berasal dari satu plugin atau dari plugin berbeda, server pertama yang terdaftar menangani file dengan ekstensi itu dan yang lain tidak pernah dimulai. Interface `/plugin` menampilkan peringatan yang menamai plugin yang servernya aktif.
281 278
282**Servers yang gagal menginisialisasi**: Claude Code melewati server yang konfigurasinya tidak valid, misalnya yang hilang `command` atau `extensionToLanguage`, dan server yang dikonfigurasi lainnya masih dimulai. Jalankan `claude --debug` untuk melihat mengapa server dilewati.279**Servers yang gagal menginisialisasi**: Claude Code melewati server yang konfigurasinya tidak valid, misalnya yang hilang `command` atau `extensionToLanguage`, dan server yang dikonfigurasi lainnya masih dimulai. Jalankan `claude --debug` untuk melihat mengapa server dilewati.
283 280
284Server yang dilewati tidak mengklaim ekstensi filenya, jadi server valid lain yang mendeklarasikan ekstensi yang sama, dari plugin yang sama atau berbeda, masih menangani file tersebut. Sebelum v2.1.205, server yang gagal menginisialisasi masih mengklaim ekstensinya dan memblokir server valid lain untuk ekstensi yang sama.281Server yang dilewati tidak mengklaim ekstensi filenya, jadi server valid lain yang mendeklarasikan ekstensi yang sama, dari plugin yang sama atau berbeda, masih menangani file tersebut.
282
283**Kirim output log ke stderr, bukan stdout**: Claude Code membaca stdout server hanya sebagai pesan protokol, dan menerima header pesan hingga 64 KiB dan body pesan hingga 32 MiB. Claude Code memutuskan server yang melebihi batas apa pun atau menulis output non-protokol ke stdout, dan menghitung putus sebagai crash untuk `restartOnCrash` dan `maxRestarts`. Ketika Anda menjalankan dengan `--debug`, Claude Code menulis error yang menamai penyebabnya ke debug log.
285 284
286<Warning>285<Warning>
287 **Anda harus memasang biner language server secara terpisah.** LSP plugins mengonfigurasi cara Claude Code terhubung ke language server, tetapi mereka tidak menyertakan server itu sendiri. Jika Anda melihat `Executable not found in $PATH` di tab Errors `/plugin`, pasang biner yang diperlukan untuk bahasa Anda.286 **Anda harus menginstal binary language server secara terpisah.** LSP plugins mengonfigurasi cara Claude Code terhubung ke language server, tetapi mereka tidak menyertakan server itu sendiri. Jika Anda melihat `Executable not found in $PATH` di tab Errors `/plugin`, instal binary yang diperlukan untuk bahasa Anda.
288</Warning>287</Warning>
289 288
290**LSP plugins yang tersedia:**289**Plugin LSP yang tersedia:**
291 290
292| Plugin | Language server | Perintah instalasi |291| Plugin | Language server | Perintah instalasi |
293| :------------------ | :------------------------- | :---------------------------------------------------------------------------------------- |292| :------------------ | :------------------------- | :---------------------------------------------------------------------------------------- |
295| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |294| `typescript-lsp` | TypeScript Language Server | `npm install -g typescript-language-server typescript` |
296| `rust-analyzer-lsp` | rust-analyzer | [Lihat instalasi rust-analyzer](https://rust-analyzer.github.io/manual.html#installation) |295| `rust-analyzer-lsp` | rust-analyzer | [Lihat instalasi rust-analyzer](https://rust-analyzer.github.io/manual.html#installation) |
297 296
298Pasang language server terlebih dahulu, kemudian pasang plugin dari marketplace.297Instal language server terlebih dahulu, kemudian instal plugin dari marketplace.
299 298
300<h3 id="monitors">299<h3 id="monitors">
301 Monitors300 Monitors
302</h3>301</h3>
303 302
304Plugins dapat mendeklarasikan monitors latar belakang yang Claude Code mulai secara otomatis saat plugin aktif. Setiap monitor menjalankan perintah shell untuk seumur hidup sesi dan mengirimkan setiap baris stdout ke Claude sebagai notifikasi, sehingga Claude dapat bereaksi terhadap entri log, perubahan status, atau peristiwa yang dipolling tanpa diminta untuk memulai watch itu sendiri.303Plugin dapat mendeklarasikan background monitors yang Claude Code mulai secara otomatis ketika plugin aktif. Setiap monitor menjalankan perintah shell untuk seumur hidup sesi dan mengirimkan setiap baris stdout ke Claude sebagai notifikasi, sehingga Claude dapat bereaksi terhadap entri log, perubahan status, atau event yang dipolling tanpa diminta untuk memulai watch itu sendiri.
305 304
306Plugin monitors menggunakan mekanisme yang sama seperti [Monitor tool](/docs/id/tools-reference#monitor-tool) dan berbagi batasan ketersediaannya. Mereka hanya berjalan dalam sesi CLI interaktif, berjalan tanpa sandbox pada tingkat kepercayaan yang sama seperti [hooks](#hooks), dan dilewati pada host di mana Monitor tool tidak tersedia.305Plugin monitors menggunakan mekanisme yang sama seperti [Monitor tool](/docs/id/tools-reference#monitor-tool) dan berbagi batasan ketersediaannya. Mereka hanya berjalan dalam sesi CLI interaktif, berjalan unsandboxed pada tingkat kepercayaan yang sama seperti [hooks](#hooks), dan dilewati pada host di mana Monitor tool tidak tersedia.
307 306
308**Lokasi**: `monitors/monitors.json` di root plugin, atau inline di `plugin.json`307**Lokasi**: `monitors/monitors.json` di root plugin, atau inline dalam `plugin.json`
309 308
310**Format**: Array JSON dari entri monitor309**Format**: Array JSON dari entri monitor
311 310
312`monitors/monitors.json` berikut memantau endpoint status deployment dan log error lokal:311`monitors/monitors.json` berikut mengawasi endpoint status deployment dan log error lokal:
313 312
314```json theme={null}313```json theme={null}
315[314[
327]326]
328```327```
329 328
330Untuk mendeklarasikan monitors inline, atur `experimental.monitors` di `plugin.json` ke array yang sama. Untuk memuat dari jalur non-default, atur `experimental.monitors` ke string jalur relatif seperti `"./config/monitors.json"`. Monitors adalah [komponen eksperimental](#experimental-components).329Untuk mendeklarasikan monitors inline, atur `experimental.monitors` dalam `plugin.json` ke array yang sama. Untuk memuat dari path non-default, atur `experimental.monitors` ke string path relatif seperti `"./config/monitors.json"`. Monitors adalah [komponen eksperimental](#experimental-components).
331 330
332**Field yang diperlukan:**331**Field yang diperlukan:**
333 332
334| Field | Deskripsi |333| Field | Deskripsi |
335| :------------ | :------------------------------------------------------------------------------------------------------------ |334| :------------ | :------------------------------------------------------------------------------------------------------------- |
336| `name` | Pengenal unik dalam plugin. Mencegah proses duplikat saat plugin dimuat ulang atau skill dipanggil lagi |335| `name` | Identifier unik dalam plugin. Mencegah proses duplikat ketika plugin dimuat ulang atau skill dipanggil lagi |
337| `command` | Perintah shell yang dijalankan sebagai proses latar belakang persisten dalam direktori kerja sesi |336| `command` | Perintah shell yang dijalankan sebagai proses background persisten dalam direktori kerja sesi |
338| `description` | Ringkasan singkat tentang apa yang sedang dipantau. Ditampilkan di panel tugas dan dalam ringkasan notifikasi |337| `description` | Ringkasan singkat tentang apa yang sedang diawasi. Ditampilkan dalam panel task dan dalam ringkasan notifikasi |
339 338
340**Field opsional:**339**Field opsional:**
341 340
342| Field | Deskripsi |341| Field | Deskripsi |
343| :----- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |342| :----- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
344| `when` | Mengontrol kapan monitor dimulai. `"always"` memulainya saat startup sesi dan pada reload plugin, dan merupakan default. `"on-skill-invoke:<skill-name>"` memulainya pertama kali skill bernama dalam plugin ini dikirim |343| `when` | Mengontrol kapan monitor dimulai. `"always"` memulainya pada startup sesi dan pada reload plugin, dan merupakan default. `"on-skill-invoke:<skill-name>"` memulainya pertama kali skill bernama dalam plugin ini dikirimkan |
345 344
346Nilai `command` mendukung [substitusi variabel](#environment-variables) `${CLAUDE_PLUGIN_ROOT}`, `${CLAUDE_PLUGIN_DATA}`, dan `${CLAUDE_PROJECT_DIR}`, plus `${ENV_VAR}` apa pun dari lingkungan. Awali perintah dengan `cd "${CLAUDE_PLUGIN_ROOT}" && ` jika script perlu berjalan dari direktori plugin itu sendiri.345Nilai `command` mendukung substitusi path [path substitutions](#environment-variables) `${CLAUDE_PLUGIN_ROOT}`, `${CLAUDE_PLUGIN_DATA}`, dan `${CLAUDE_PROJECT_DIR}`, ditambah `${ENV_VAR}` apa pun dari environment. Awali perintah dengan `cd "${CLAUDE_PLUGIN_ROOT}" && ` jika script perlu berjalan dari direktori plugin itu sendiri.
347 346
348Perintah `command` monitor tidak dapat mereferensikan nilai [`${user_config.*}`](#user-configuration). Perintah berjalan melalui shell, jadi Claude Code menolak monitor dengan [error](/docs/id/errors#plugin-command-references-user-config) daripada mengganti nilai. Proses monitor tidak menerima variabel lingkungan `CLAUDE_PLUGIN_OPTION_<KEY>`, jadi biarkan script monitor membaca nilai dari file config yang dimilikinya. Sebelum v2.1.207, perintah monitor mengganti nilai `${user_config.*}`.347Monitor `command` tidak dapat mereferensikan nilai [`${user_config.*}`](#user-configuration). Perintah berjalan melalui shell, jadi Claude Code menolak monitor dengan [error](/docs/id/errors#plugin-command-references-user-config) daripada mensubstitusi nilai. Proses monitor tidak menerima variabel environment `CLAUDE_PLUGIN_OPTION_<KEY>`, jadi biarkan script monitor membaca nilai dari file config yang dimilikinya.
349 348
350Menonaktifkan plugin di tengah sesi tidak menghentikan monitors yang sudah berjalan. Mereka berhenti saat sesi berakhir.349Jika Anda menonaktifkan plugin di tengah sesi, Claude Code tidak menghentikan monitors yang sudah berjalan; mereka berhenti ketika sesi berakhir.
351 350
352<h3 id="themes">351<h3 id="themes">
353 Themes352 Themes
354</h3>353</h3>
355 354
356Plugins dapat mengirimkan color themes yang muncul di `/theme` bersama preset bawaan dan themes lokal pengguna. Sebuah theme adalah file JSON di `themes/` dengan preset `base` dan peta `overrides` yang sparse dari color tokens. Themes adalah [komponen eksperimental](#experimental-components).355Plugin dapat mengirimkan color themes yang muncul dalam `/theme` bersama preset built-in dan themes lokal pengguna. Theme adalah file JSON dalam `themes/` dengan preset `base` dan map `overrides` sparse dari color tokens. Themes adalah [komponen eksperimental](#experimental-components).
357 356
358```json theme={null}357```json theme={null}
359{358{
367}366}
368```367```
369 368
370Memilih plugin theme menyimpan `custom:<plugin-name>:<slug>` di config pengguna. Plugin themes bersifat read-only; menekan `Ctrl+E` pada salah satu di `/theme` menyalinnya ke `~/.claude/themes/` sehingga pengguna dapat mengedit salinannya.369Ketika pengguna memilih theme plugin, Claude Code menyimpan `custom:<plugin-name>:<slug>` dalam config mereka. Plugin themes adalah read-only: ketika pengguna menekan `Ctrl+E` pada satu dalam `/theme`, Claude Code menyalinnya ke `~/.claude/themes/` sehingga mereka dapat mengedit salinannya.
371 370
372***371***
373 372
375 Cakupan instalasi plugin374 Cakupan instalasi plugin
376</h2>375</h2>
377 376
378Saat Anda memasang plugin, Anda memilih **cakupan** yang menentukan di mana plugin tersedia dan siapa lagi yang dapat menggunakannya:377Ketika Anda menginstal plugin, Anda memilih **cakupan** yang menentukan di mana plugin tersedia dan siapa lagi yang dapat menggunakannya:
379 378
380| Cakupan | File pengaturan | Kasus penggunaan |379| Cakupan | File pengaturan | Kasus penggunaan |
381| :-------- | :-------------------------------------------------- | :------------------------------------------------ |380| :-------- | :--------------------------------------- | :-------------------------------------------------------------------------------------- |
382| `user` | `~/.claude/settings.json` | Plugin pribadi tersedia di semua proyek (default) |381| `user` | `~/.claude/settings.json` | Plugin pribadi tersedia di semua proyek (default) |
383| `project` | `.claude/settings.json` | Plugin tim yang dibagikan melalui version control |382| `project` | `.claude/settings.json` | Plugin tim yang dibagikan melalui kontrol versi |
384| `local` | `.claude/settings.local.json` | Plugin khusus proyek, gitignored |383| `local` | `.claude/settings.local.json` | Plugin khusus proyek, diabaikan git ketika Claude Code menyimpan pengaturan ke dalamnya |
385| `managed` | [Pengaturan terkelola](/docs/id/settings#settings-files) | Plugin terkelola (read-only, hanya update) |384| `managed` | [Managed settings](/docs/id/managed-settings) | Plugin terkelola (baca saja, hanya perbarui) |
386 385
387Plugins menggunakan sistem cakupan yang sama dengan konfigurasi Claude Code lainnya. Untuk instruksi instalasi dan flag cakupan, lihat [Pasang plugins](/docs/id/discover-plugins#install-plugins). Untuk penjelasan lengkap tentang cakupan, lihat [Configuration scopes](/docs/id/settings#configuration-scopes).386Plugin menggunakan sistem cakupan yang sama dengan konfigurasi Claude Code lainnya. Untuk instruksi instalasi dan flag cakupan, lihat [Install plugins](/docs/id/discover-plugins#install-plugins). Untuk penjelasan lengkap tentang cakupan, lihat [Configuration scopes](/docs/id/settings#where-settings-live).
388 387
389***388***
390 389
391<h2 id="skills-directory-plugins">390<h2 id="skills-directory-plugins">
392 Skills-directory plugins391 Plugin direktori skills
393</h2>392</h2>
394 393
395Folder apa pun di bawah direktori skills yang berisi manifest `.claude-plugin/plugin.json` dimuat sebagai plugin bernama `<name>@skills-dir` pada sesi berikutnya, tanpa marketplace dan tanpa langkah instalasi. Scaffold satu dengan [`plugin init`](#plugin-init). Tidak seperti instalasi marketplace, plugin ditemukan di tempat daripada disalin ke cache plugin.394Folder apa pun di bawah direktori skills yang berisi manifes `.claude-plugin/plugin.json` dimuat sebagai plugin bernama `<name>@skills-dir` pada sesi berikutnya, tanpa marketplace dan tanpa langkah instalasi. Buat satu dengan [`plugin init`](#plugin-init). Tidak seperti instalasi marketplace yang disalin, plugin ditemukan di tempat daripada disalin ke cache plugin.
396 395
397Pohon direktori skills mendukung tiga hal yang berbeda:396Pohon direktori skills mendukung tiga hal yang berbeda:
398 397
399| Apa yang Anda miliki | Apa itu |398| Apa yang Anda miliki | Apa itu |
400| :-------------------------------------------- | :---------------------------------------------------------------------------------------------------- |399| :-------------------------------------------- | :---------------------------------------------------------------------------------------------------- |
401| `<skills-dir>/foo/SKILL.md` tanpa manifest | Sebuah [skill](/docs/id/skills) biasa bernama `foo` |400| `<skills-dir>/foo/SKILL.md` tanpa manifes | [skill](/docs/id/skills) biasa bernama `foo` |
402| `<skills-dir>/foo/.claude-plugin/plugin.json` | Plugin `foo@skills-dir`, yang dapat menggabungkan skills, agents, hooks, dan lainnya miliknya sendiri |401| `<skills-dir>/foo/.claude-plugin/plugin.json` | Plugin `foo@skills-dir`, yang dapat menggabungkan skills, agents, hooks, dan lainnya miliknya sendiri |
403| `<plugin>/skills/bar/SKILL.md` | Skill `bar` yang dikemas di dalam plugin |402| `<plugin>/skills/bar/SKILL.md` | Skill `bar` yang dikemas di dalam plugin |
404 403
405<h3 id="choose-where-the-plugin-loads-from">404<h3 id="choose-where-the-plugin-loads-from">
406 Pilih di mana plugin dimuat405 Pilih tempat plugin dimuat dari
407</h3>406</h3>
408 407
409| Direktori skills | Cakupan | Dimuat |408| Direktori skills | Cakupan | Memuat |
410| :---------------------- | :------- | :---------------------------------------------------------------------------------- |409| :---------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------ |
411| `~/.claude/skills/` | personal | Di setiap proyek, karena lokasi hanya milik Anda |410| `~/.claude/skills/` | personal | Di setiap proyek, karena lokasi hanya milik Anda |
412| `<cwd>/.claude/skills/` | project | Hanya setelah Anda menerima dialog [trust](/docs/id/settings) workspace untuk folder itu |411| `<cwd>/.claude/skills/` | proyek | Hanya setelah Anda menerima [dialog kepercayaan](/docs/id/permissions#what-runs-before-you-trust-a-folder) workspace untuk folder tersebut |
413 412
414Plugin cakupan proyek diperiksa ke dalam repositori dan mencapai setiap kolaborator yang mengklonnya. Karena konten itu berasal dari repositori daripada dari Anda, itu dimuat hanya setelah gerbang kepercayaan yang sama yang mengatur `.claude/settings.json`, dan komponen yang menjalankan kode dibatasi lebih lanjut:413Plugin dengan cakupan proyek diperiksa ke dalam repositori dan menjangkau setiap kolaborator yang mengklonnya. Karena konten tersebut berasal dari repositori daripada dari Anda, konten tersebut dimuat hanya setelah gerbang kepercayaan yang sama yang mengatur aturan izin proyek di `.claude/settings.json`, jadi mempercayai folder induk atau menjalankan dengan `-p` tidak cukup, dan komponen yang menjalankan kode dibatasi lebih lanjut:
415 414
416* MCP servers yang dideklarasikannya melalui [persetujuan per-server yang sama](/docs/id/mcp) seperti `.mcp.json` proyek415* Server MCP yang dideklarasikannya melalui [persetujuan per-server yang sama](/docs/id/mcp) sebagai `.mcp.json` proyek
417* LSP servers dimulai hanya setelah Anda mempercayai workspace416* Server LSP dimulai hanya setelah Anda mempercayai workspace
418* [Background monitors](#monitors) tidak dimuat417* [Monitor latar belakang](#monitors) tidak dimuat
419 418
420Plugin cakupan personal tidak memiliki batasan ini.419Plugin dengan cakupan personal tidak memiliki pembatasan ini.
421 420
422<Warning>421<Warning>
423 Plugin `@skills-dir` cakupan proyek dimuat hanya dari `.claude/skills/` direktori tempat Anda memulai Claude Code. Mereka tidak [berjalan ke root repositori](/docs/id/skills#automatic-discovery-from-parent-and-nested-directories) seperti yang dilakukan skills dan commands biasa, jadi meluncurkan dari subdirektori melewatkan plugin yang tinggal di root repo. Luncurkan dari root repositori, atau jalankan `/reload-plugins` setelah mengubah direktori.422 Plugin `@skills-dir` dengan cakupan proyek dimuat hanya dari `.claude/skills/` dari [direktori kerja utama](/docs/id/permissions#working-directories) sesi. Mereka tidak [berjalan ke akar repositori](/docs/id/skills#discovery-from-parent-and-nested-directories) seperti yang dilakukan skills dan perintah biasa, jadi peluncuran dari subdirektori melewatkan plugin yang berada di akar repo. Luncurkan dari akar repositori, atau [pindahkan sesi ke sana dengan `/cd`](/docs/id/permissions#move-the-session-to-another-directory) pada v2.1.246 atau lebih baru.
424</Warning>423</Warning>
425 424
426<h3 id="edit-reload-and-disable-a-skills-directory-plugin">425<h3 id="edit-reload-and-disable-a-skills-directory-plugin">
427 Edit, reload, dan disable skills-directory plugin426 Edit, muat ulang, dan nonaktifkan plugin direktori skills
428</h3>427</h3>
429 428
430Perubahan yang Anda buat pada `SKILL.md` skill berlaku segera dalam sesi saat ini. Perubahan pada komponen plugin lainnya, seperti `hooks/`, `.mcp.json`, `agents/`, dan `output-styles/`, tidak. Jalankan `/reload-plugins` atau restart Claude Code untuk mengambilnya. Lihat [Live change detection](/docs/id/skills#live-change-detection).429Perubahan yang Anda buat pada `SKILL.md` skill berlaku segera dalam sesi saat ini. Perubahan pada komponen lain plugin, seperti `hooks/`, `.mcp.json`, `agents/`, dan `output-styles/`, tidak. Jalankan `/reload-plugins` atau mulai ulang Claude Code untuk mengambilnya. Lihat [Deteksi perubahan langsung](/docs/id/skills#live-change-detection).
431 430
432Untuk menghentikan loading skills-directory plugin, hapus foldernya atau nonaktifkan berdasarkan nama. Tidak ada langkah `uninstall` karena tidak ada yang dipasang dari marketplace.431Untuk menghentikan pemuatan plugin direktori skills, hapus foldernya atau nonaktifkan berdasarkan nama. Tidak ada langkah `uninstall` karena tidak ada yang diinstal dari marketplace.
433 432
434```bash theme={null}433```bash theme={null}
435claude plugin disable my-tool@skills-dir434claude plugin disable my-tool@skills-dir
437 436
438***437***
439 438
439<h2 id="synced-plugins">
440 Plugin yang disinkronkan dari claude.ai
441</h2>
442
443Di [Cowork](https://claude.com/product/cowork) dan [sesi cloud](/docs/id/cloud-environments#what-carries-over-from-your-setup), Claude Code mengunduh plugin yang diaktifkan untuk akun claude.ai Anda ke dalam `~/.claude/plugins/synced/` di lingkungan sesi itu sendiri dan memuat masing-masing sebagai `<name>@synced`, tanpa marketplace dan tanpa catatan instalasi. Claude Code tidak memuat plugin tersebut di sesi yang Anda mulai di terminal Anda sendiri. Di dalam lingkungan Cowork atau cloud tersebut, `claude plugin list` menampilkan salinan yang diunduh di bawah judul `Synced from claude.ai`. Sebelum v2.1.239, Claude Code memuat plugin ini sebagai `<name>@inline`, identitas yang digunakan plugin `--plugin-dir`.
444
445Kelola plugin yang disinkronkan dengan ID `<name>@synced` yang dicetak oleh `claude plugin list`:
446
447* **Matikan salah satu**: di sesi yang disinkronkan, jalankan `claude plugin disable <name>@synced`, atau minta Claude untuk menjalankannya. Claude Code menyimpan pilihan sebagai `"<name>@synced": false` di [`enabledPlugins`](/docs/id/settings-reference#enabledplugins) tingkat pengguna lingkungan tersebut. Untuk menghidupkan kembali plugin, jalankan `claude plugin enable <name>@synced` di sesi yang sama. Untuk menjaga plugin tetap keluar dari setiap sesi yang disinkronkan, [matikan untuk akun claude.ai Anda](/docs/id/desktop#extend-claude-code). Untuk menjaganya tetap keluar dari sesi yang disinkronkan satu proyek di setiap lingkungan, atur `"<name>@synced": false` di bawah `enabledPlugins` di `.claude/settings.json` proyek yang berkomitmen tersebut.
448* **Kelola plugin itu sendiri di claude.ai**: `claude plugin install`, `update`, dan `uninstall` tidak berlaku untuk plugin yang disinkronkan. Untuk menghapusnya, matikan plugin untuk akun claude.ai Anda; sesi yang disinkronkan berikutnya dimulai tanpanya.
449
450Ketika plugin yang diaktifkan dari sumber lain, seperti instalasi marketplace, plugin [skills-directory](#skills-directory-plugins), atau plugin `--plugin-dir`, cocok dengan nama plugin yang disinkronkan, Claude Code memuat plugin tersebut dan melaporkan salinan yang disinkronkan sebagai tidak dimuat. Untuk menggunakan salinan claude.ai sebagai gantinya, nonaktifkan salinan Anda sendiri. Sebelum v2.1.239, Claude Code memuat salinan yang disinkronkan alih-alih instalasi marketplace dengan nama yang sama.
451
452***
453
440<h2 id="plugin-manifest-schema">454<h2 id="plugin-manifest-schema">
441 Skema manifest plugin455 Skema manifes plugin
442</h2>456</h2>
443 457
444File `.claude-plugin/plugin.json` mendefinisikan metadata dan konfigurasi plugin Anda. Bagian ini mendokumentasikan semua field dan opsi yang didukung.458File `.claude-plugin/plugin.json` mendefinisikan metadata dan konfigurasi plugin Anda.
445 459
446Manifest bersifat opsional. Jika dihilangkan, Claude Code secara otomatis menemukan komponen di [lokasi default](#file-locations-reference) dan menurunkan nama plugin dari nama direktori. Gunakan manifest saat Anda perlu memberikan metadata atau jalur komponen khusus.460Manifes bersifat opsional. Jika dihilangkan, Claude Code secara otomatis menemukan komponen di [lokasi default](#file-locations-reference) dan menurunkan nama plugin dari nama direktori. Gunakan manifes ketika Anda perlu memberikan metadata atau jalur komponen kustom.
447 461
448<h3 id="complete-schema">462<h3 id="complete-schema">
449 Skema lengkap463 Skema lengkap
464 "repository": "https://github.com/author/plugin",478 "repository": "https://github.com/author/plugin",
465 "license": "MIT",479 "license": "MIT",
466 "keywords": ["keyword1", "keyword2"],480 "keywords": ["keyword1", "keyword2"],
481 "metadata": { "catalogId": "cat-123", "tier": "pro" },
467 "skills": "./custom/skills/",482 "skills": "./custom/skills/",
468 "commands": ["./custom/commands/special.md"],483 "commands": ["./custom/commands/special.md"],
469 "agents": ["./custom/agents/reviewer.md"],484 "agents": ["./custom/agents/reviewer.md"],
473 "lspServers": "./.lsp.json",488 "lspServers": "./.lsp.json",
474 "experimental": {489 "experimental": {
475 "themes": "./themes/",490 "themes": "./themes/",
476 "monitors": "./monitors.json"491 "monitors": "./monitors.json",
492 "evals": "quality/evals"
477 },493 },
478 "dependencies": [494 "dependencies": [
479 "helper-lib",495 "helper-lib",
483```499```
484 500
485<h3 id="required-fields">501<h3 id="required-fields">
486 Field yang diperlukan502 Bidang yang diperlukan
487</h3>503</h3>
488 504
489Jika Anda menyertakan manifest, `name` adalah satu-satunya field yang diperlukan.505Jika Anda menyertakan manifes, `name` adalah satu-satunya bidang yang diperlukan.
490 506
491| Field | Tipe | Deskripsi | Contoh |507| Bidang | Tipe | Deskripsi | Contoh |
492| :----- | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------- |508| :----- | :----- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------- |
493| `name` | string | Pengenal unik (kebab-case, tanpa spasi). Saat [entri marketplace](/docs/id/plugin-marketplaces#plugin-entries) mencantumkan plugin dengan nama berbeda, nama entri marketplace adalah yang digunakan oleh kunci `enabledPlugins` dan `/plugin` | `"deployment-tools"` |509| `name` | string | Pengidentifikasi unik dalam kebab-case, tanpa spasi, karakter kontrol, atau karakter pemformatan bidirectional. Ketika [entri marketplace](/docs/id/plugin-marketplaces#plugin-entries) mencantumkan plugin dengan nama berbeda, nama entri marketplace adalah yang digunakan oleh kunci `enabledPlugins` dan `/plugin` | `"deployment-tools"` |
494 510
495Nama ini digunakan untuk namespacing komponen. Misalnya, di UI, agent `agent-creator` untuk plugin dengan nama `plugin-dev` akan muncul sebagai `plugin-dev:agent-creator`.511Nama ini digunakan untuk namespacing komponen. Misalnya, di UI, agent `agent-creator` untuk plugin dengan nama `plugin-dev` akan muncul sebagai `plugin-dev:agent-creator`.
496 512
497<h3 id="unrecognized-fields">513<h3 id="unrecognized-fields">
498 Field yang tidak dikenali514 Bidang yang tidak dikenali
499</h3>515</h3>
500 516
501Claude Code mengabaikan field tingkat atas yang tidak dikenalinya. Anda dapat menyimpan metadata dari ekosistem lain di `plugin.json` dan plugin masih dimuat. Ini membuat praktis untuk mempertahankan satu manifest yang berfungsi ganda sebagai manifest ekstensi VS Code atau Cursor, `package.json` npm, atau manifest bundle MCPB/DXT.517Claude Code mengabaikan bidang tingkat atas yang tidak dikenalinya. Anda dapat menyimpan metadata dari ekosistem lain di `plugin.json` dan plugin masih dimuat. Ini membuat praktis untuk mempertahankan satu manifes yang berfungsi ganda sebagai manifes ekstensi VS Code atau Cursor, `package.json` npm, atau manifes bundle MCPB/DXT.
518
519`claude plugin validate` melaporkan bidang yang tidak dikenali sebagai peringatan, bukan kesalahan. Jika bidang hanya berbeda satu atau dua karakter dari yang dikenali, peringatan menyarankan nama yang mungkin dimaksudkan. Plugin dengan hanya peringatan bidang yang tidak dikenali masih lulus validasi dan dimuat saat runtime.
502 520
503`claude plugin validate` melaporkan field yang tidak dikenali sebagai peringatan, bukan kesalahan. Jika field adalah satu atau dua karakter dari yang dikenali, peringatan menyarankan nama yang mungkin dimaksudkan. Plugin dengan hanya peringatan field yang tidak dikenali masih lulus validasi dan dimuat saat runtime.521Bagaimana Claude Code menangani bidang yang dikenali yang nilainya memiliki tipe salah tergantung pada bidangnya:
504 522
505Field dengan tipe yang salah masih gagal. Misalnya, nilai `keywords` yang merupakan string daripada array adalah kesalahan load, dan `claude plugin validate` melaporkannya sebagai satu.523* **Sebagian besar bidang**: plugin gagal dimuat. Misalnya, nilai `keywords` yang berupa string alih-alih array adalah kesalahan pemuatan, dan `claude plugin validate` melaporkannya sebagai demikian.
524* **`experimental` dan `metadata`**: Claude Code mengabaikan nilai non-objek, dan `claude plugin validate` melaporkan peringatan.
506 525
507Teruskan `--strict` untuk memperlakukan peringatan sebagai kesalahan. Gunakan di CI untuk menangkap nama field yang salah eja atau field yang tersisa dari manifest tool lain sebelum menerbitkan, meskipun plugin akan dimuat saat runtime.526Teruskan `--strict` untuk memperlakukan peringatan sebagai kesalahan. Gunakan di CI untuk menangkap nama bidang yang salah ketik atau bidang yang tersisa dari manifes alat lain sebelum menerbitkan, meskipun plugin akan dimuat saat runtime.
508 527
509```bash theme={null}528```bash theme={null}
510claude plugin validate ./my-plugin --strict529claude plugin validate ./my-plugin --strict
511```530```
512 531
513<h3 id="metadata-fields">532<h3 id="metadata-fields">
514 Field metadata533 Bidang metadata
515</h3>534</h3>
516 535
517| Field | Tipe | Deskripsi | Contoh |536| Bidang | Tipe | Deskripsi | Contoh |
518| :--------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------- |537| :--------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------- |
519| `$schema` | string | URL JSON Schema untuk autocomplete dan validasi editor. Claude Code mengabaikan field ini saat waktu load. | `"https://json.schemastore.org/claude-code-plugin-manifest.json"` |538| `$schema` | string | URL JSON Schema untuk autocomplete dan validasi editor. Claude Code mengabaikan bidang ini saat waktu pemuatan. | `"https://json.schemastore.org/claude-code-plugin-manifest.json"` |
520| `displayName` | string | Nama yang dapat dibaca manusia ditampilkan di picker `/plugin` dan permukaan UI lainnya. Kembali ke `name` saat dihilangkan. Tidak seperti `name`, dapat berisi spasi dan casing apa pun. Tidak digunakan untuk namespacing atau lookup. Memerlukan Claude Code v2.1.143 atau lebih baru. | `"Deployment Tools"` |539| `displayName` | string | Nama yang dapat dibaca manusia ditampilkan di pemilih `/plugin` dan permukaan UI lainnya. Untuk plugin yang diinstal marketplace, `displayName` pada [entri marketplace](/docs/id/plugin-marketplaces#optional-plugin-fields) mengambil alih nilai ini. Ketika tidak ada nama tampilan yang ditetapkan di tempat mana pun, pengguna melihat `name`. Tidak seperti `name`, dapat berisi spasi dan casing apa pun. Tidak digunakan untuk namespacing atau pencarian. | `"Deployment Tools"` |
521| `version` | string | Opsional. Versi semantik. Mengatur ini mengikat plugin ke string versi tersebut, sehingga pengguna hanya menerima update saat Anda menaikkannya. Jika dihilangkan, Claude Code kembali ke SHA commit git, sehingga setiap commit diperlakukan sebagai versi baru. Jika juga diatur di entri marketplace, `plugin.json` menang. Lihat [Version management](#version-management). | `"2.1.0"` |540| `version` | string | Opsional. Versi semantik. Menetapkan ini mengikat plugin ke string versi itu, sehingga pengguna hanya menerima pembaruan ketika Anda menaikkannya, kecuali untuk [sumber `command`](/docs/id/plugin-marketplaces#command-sources); lihat [Manajemen versi](#version-management). Jika juga ditetapkan di entri marketplace, `plugin.json` menang. Jika dihilangkan, versi berasal dari sumber berikutnya di [Manajemen versi](#version-management). | `"2.1.0"` |
522| `description` | string | Penjelasan singkat tentang tujuan plugin | `"Deployment automation tools"` |541| `description` | string | Penjelasan singkat tentang tujuan plugin | `"Deployment automation tools"` |
523| `author` | object | Informasi penulis | `{"name": "Dev Team", "email": "dev@company.com"}` |542| `author` | object | Informasi penulis | `{"name": "Dev Team", "email": "dev@company.com"}` |
524| `homepage` | string | URL dokumentasi | `"https://docs.example.com"` |543| `homepage` | string | URL dokumentasi | `"https://docs.example.com"` |
525| `repository` | string | URL kode sumber | `"https://github.com/user/plugin"` |544| `repository` | string | URL kode sumber | `"https://github.com/user/plugin"` |
526| `license` | string | Pengenal lisensi | `"MIT"`, `"Apache-2.0"` |545| `license` | string | Pengidentifikasi lisensi | `"MIT"`, `"Apache-2.0"` |
527| `keywords` | array | Tag penemuan | `["deployment", "ci-cd"]` |546| `keywords` | array | Tag penemuan | `["deployment", "ci-cd"]` |
528| `defaultEnabled` | boolean | Apakah plugin dimulai dalam keadaan diaktifkan saat pengguna belum menetapkan satu. Default ke `true`. Lihat [Default enablement](#default-enablement). Memerlukan Claude Code v2.1.154 atau lebih baru. | `false` |547| `metadata` | object | Objek bentuk bebas untuk data Anda sendiri, seperti bidang hak atau katalog. Claude Code tidak membacanya, jadi nilai tidak pernah mempengaruhi perilaku plugin. Claude Code mengabaikan nilai non-objek, dan `claude plugin validate` melaporkannya sebagai peringatan. Sebelum v2.1.222, Claude Code memperlakukan kunci sebagai [bidang yang tidak dikenali](#unrecognized-fields). | `{"catalogId": "cat-123"}` |
548| `defaultEnabled` | boolean | Apakah plugin dimulai dalam keadaan diaktifkan ketika pengguna belum menetapkan satu. Default ke `true`. Lihat [Pengaktifan default](#default-enablement). | `false` |
529 549
530<h3 id="default-enablement">550<h3 id="default-enablement">
531 Default enablement551 Pengaktifan default
532</h3>552</h3>
533 553
534Atur `defaultEnabled: false` di `plugin.json` untuk mengirimkan plugin yang dipasang dalam keadaan dinonaktifkan. Pengguna mengaktifkannya dengan `claude plugin enable <plugin>` atau antarmuka `/plugin`. Gunakan ini untuk plugins yang menambah biaya atau cakupan yang harus pengguna pilih, seperti yang menghubungkan ke layanan eksternal. Ini memerlukan Claude Code v2.1.154 atau lebih baru. Versi sebelumnya mengabaikan field dan mengaktifkan plugin saat instalasi.554Atur `defaultEnabled: false` di `plugin.json` untuk mengirimkan plugin yang diinstal dalam keadaan dinonaktifkan. Pengguna menghidupkannya dengan `claude plugin enable <plugin>` atau antarmuka `/plugin`. Gunakan ini untuk plugin yang menambah biaya atau ruang lingkup yang harus dipilih pengguna, seperti yang menghubungkan ke layanan eksternal.
535 555
536`defaultEnabled` adalah fallback saat tidak ada yang lain telah memutuskan status plugin. Dua hal mengambil alih:556`defaultEnabled` adalah fallback ketika tidak ada yang telah memutuskan status plugin. Dua hal mengambil alih:
537 557
538* **Pengaturan pengguna**: entri untuk plugin di `enabledPlugins` pada cakupan pengaturan apa pun. Setelah ditulis, itu bertahan di seluruh update dan reinstall plugin, jadi mengubah `defaultEnabled` dalam rilis kemudian tidak membalik pengguna yang ada.558* **Pengaturan pengguna**: entri untuk plugin di `enabledPlugins` di ruang lingkup pengaturan apa pun. Setelah ditulis, itu bertahan di seluruh pembaruan dan penginstalan ulang plugin, jadi mengubah `defaultEnabled` dalam rilis kemudian tidak membalik pengguna yang ada.
539* **Persyaratan dependensi**: ketika plugin diperlukan oleh yang lain yang aktif, Claude Code menulis `true` untuk itu saat waktu instalasi atau enable. Itu memberikannya pengaturan eksplisit, jadi defaultnya tidak lagi berlaku. Lihat [Enable or disable a plugin with dependencies](/docs/id/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies).559* **Persyaratan ketergantungan**: ketika plugin diperlukan oleh plugin lain yang aktif, Claude Code menulis `true` untuk itu pada waktu instalasi atau pengaktifan. Itu memberikannya pengaturan eksplisit, jadi default-nya sendiri tidak lagi berlaku. Lihat [Aktifkan atau nonaktifkan plugin dengan ketergantungan](/docs/id/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies).
540 560
541Field yang sama dapat muncul dalam entri marketplace plugin, di mana itu mengambil alih nilai di `plugin.json`. Lihat [Optional plugin fields](/docs/id/plugin-marketplaces#optional-plugin-fields).561Bidang yang sama dapat muncul di entri marketplace plugin, di mana itu mengambil alih nilai di `plugin.json`. Lihat [Bidang plugin opsional](/docs/id/plugin-marketplaces#optional-plugin-fields).
542 562
543<h3 id="component-path-fields">563<h3 id="component-path-fields">
544 Field jalur komponen564 Bidang jalur komponen
545</h3>565</h3>
546 566
547| Field | Tipe | Deskripsi | Contoh |567| Bidang | Tipe | Deskripsi | Contoh |
548| :---------------------- | :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |568| :---------------------- | :-------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------- |
549| `skills` | string\|array | Direktori skill khusus yang berisi `<name>/SKILL.md`. Menambah scan default `skills/`. Lihat [Path behavior rules](#path-behavior-rules) untuk pengecualian marketplace-root | `"./custom/skills/"` |569| `skills` | string\|array | Direktori skill kustom yang berisi `<name>/SKILL.md`. Menambah pemindaian `skills/` default. Lihat [Aturan perilaku jalur](#path-behavior-rules) untuk pengecualian akar marketplace | `"./custom/skills/"` |
550| `commands` | string\|array | File skill `.md` datar atau direktori khusus (menggantikan default `commands/`) | `"./custom/cmd.md"` atau `["./cmd1.md"]` |570| `commands` | string\|array | File skill `.md` datar kustom atau direktori (menggantikan `commands/` default) | `"./custom/cmd.md"` atau `["./cmd1.md"]` |
551| `agents` | string\|array | File agent khusus (menggantikan default `agents/`) | `"./custom/agents/reviewer.md"` |571| `agents` | string\|array | File agent kustom (menggantikan `agents/` default) | `"./custom/agents/reviewer.md"` |
572| `workflows` | string\|array | File skrip [workflow](/docs/id/workflows) kustom atau direktori (menggantikan `workflows/` default) | `"./custom/workflows/"` |
552| `hooks` | string\|array\|object | Jalur konfigurasi hook atau konfigurasi inline | `"./my-extra-hooks.json"` |573| `hooks` | string\|array\|object | Jalur konfigurasi hook atau konfigurasi inline | `"./my-extra-hooks.json"` |
553| `mcpServers` | string\|array\|object | Jalur konfigurasi MCP atau konfigurasi inline | `"./my-extra-mcp-config.json"` |574| `mcpServers` | string\|array\|object | Jalur konfigurasi MCP atau konfigurasi inline | `"./my-extra-mcp-config.json"` |
554| `outputStyles` | string\|array | File/direktori gaya output khusus (menggantikan default `output-styles/`) | `"./styles/"` |575| `outputStyles` | string\|array | File/direktori gaya output kustom (menggantikan `output-styles/` default) | `"./styles/"` |
555| `lspServers` | string\|array\|object | Konfigurasi [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) untuk intelijen kode (buka definisi, temukan referensi, dll.) | `"./.lsp.json"` |576| `lspServers` | string\|array\|object | Konfigurasi [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) untuk intelijen kode (buka definisi, temukan referensi, dll.) | `"./.lsp.json"` |
556| `experimental.themes` | string\|array | File/direktori tema warna (menggantikan default `themes/`). Lihat [Themes](#themes) | `"./themes/"` |577| `experimental.themes` | string\|array | File/direktori tema warna (menggantikan `themes/` default). Lihat [Tema](#themes) | `"./themes/"` |
557| `experimental.monitors` | string\|array | Konfigurasi [Monitor](/docs/id/tools-reference#monitor-tool) latar belakang yang dimulai secara otomatis saat plugin aktif. Lihat [Monitors](#monitors) | `"./monitors.json"` |578| `experimental.monitors` | string\|array | Konfigurasi [Monitor](/docs/id/tools-reference#monitor-tool) latar belakang yang dimulai secara otomatis ketika plugin aktif. Lihat [Monitor](#monitors) | `"./monitors.json"` |
558| `userConfig` | object | Nilai yang dapat dikonfigurasi pengguna yang diminta saat enable. Lihat [User configuration](#user-configuration) | Lihat di bawah |579| `experimental.evals` | string\|array | Direktori di bawah akar plugin yang menyimpan [kasus eval](/docs/id/plugin-evals#use-a-different-eval-directory) plugin, ketika bukan `evals/` default. `claude plugin eval --eval-dir` menggantinya | `"quality/evals"` |
559| `channels` | array | Deklarasi channel untuk message injection (Telegram, Slack, Discord style). Lihat [Channels](#channels) | Lihat di bawah |580| `userConfig` | object | Nilai yang dapat dikonfigurasi pengguna yang diminta saat pengaktifan. Lihat [Konfigurasi pengguna](#user-configuration) | Lihat di bawah |
560| `dependencies` | array | Plugin lain yang diperlukan plugin ini, secara opsional dengan batasan versi semver. Lihat [Constrain plugin dependency versions](/docs/id/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |581| `channels` | array | Deklarasi saluran untuk injeksi pesan (gaya Telegram, Slack, Discord). Lihat [Saluran](#channels) | Lihat di bawah |
582| `dependencies` | array | Plugin lain yang diperlukan plugin ini, secara opsional dengan batasan versi semver. Lihat [Batasi versi ketergantungan plugin](/docs/id/plugin-dependencies) | `[{ "name": "secrets-vault", "version": "~2.1.0" }]` |
561 583
562<h3 id="experimental-components">584<h3 id="experimental-components">
563 Komponen eksperimental585 Komponen eksperimental
564</h3>586</h3>
565 587
566Komponen di bawah kunci `experimental`, `themes` dan `monitors`, memiliki skema manifest yang mungkin berubah antar rilis saat mereka stabil. Di mana Anda mendeklarasikannya adalah migrasi terpisah: tingkat atas masih berfungsi, `claude plugin validate` memperingatkan, dan rilis mendatang akan memerlukan `experimental.*`.588Komponen di bawah kunci `experimental`, `themes` dan `monitors`, memiliki skema manifes yang mungkin berubah antar rilis saat mereka stabil. Tempat Anda mendeklarasikannya adalah migrasi terpisah: tingkat atas masih berfungsi, `claude plugin validate` memperingatkan, dan rilis mendatang akan memerlukan `experimental.*`.
567 589
568<h3 id="user-configuration">590<h3 id="user-configuration">
569 User configuration591 Konfigurasi pengguna
570</h3>592</h3>
571 593
572Field `userConfig` mendeklarasikan nilai yang Claude Code minta dari pengguna saat plugin diaktifkan. Gunakan ini daripada memerlukan pengguna untuk mengedit `settings.json` secara manual.594Bidang `userConfig` mendeklarasikan nilai yang diminta Claude Code kepada pengguna ketika plugin diaktifkan. Gunakan ini alih-alih mengharuskan pengguna untuk mengedit `settings.json` secara manual.
573 595
574```json theme={null}596```json theme={null}
575{597{
577 "api_endpoint": {599 "api_endpoint": {
578 "type": "string",600 "type": "string",
579 "title": "API endpoint",601 "title": "API endpoint",
580 "description": "Endpoint API tim Anda"602 "description": "Your team's API endpoint"
581 },603 },
582 "api_token": {604 "api_token": {
583 "type": "string",605 "type": "string",
584 "title": "API token",606 "title": "API token",
585 "description": "Token autentikasi API",607 "description": "API authentication token",
586 "sensitive": true608 "sensitive": true
587 }609 }
588 }610 }
589}611}
590```612```
591 613
592Kunci harus berupa pengenal yang valid. Setiap opsi mendukung field berikut:614Kunci harus berupa pengidentifikasi yang valid. Setiap opsi mendukung bidang-bidang ini:
593 615
594| Field | Diperlukan | Deskripsi |616| Bidang | Diperlukan | Deskripsi |
595| :------------ | :--------- | :---------------------------------------------------------------------------------------------------- |617| :------------ | :--------- | :----------------------------------------------------------------------------------------------------- |
596| `type` | Ya | Salah satu dari `string`, `number`, `boolean`, `directory`, atau `file` |618| `type` | Ya | Salah satu dari `string`, `number`, `boolean`, `directory`, atau `file` |
597| `title` | Ya | Label yang ditampilkan dalam dialog konfigurasi |619| `title` | Ya | Label ditampilkan di dialog konfigurasi |
598| `description` | Ya | Teks bantuan yang ditampilkan di bawah field |620| `description` | Ya | Teks bantuan ditampilkan di bawah bidang |
599| `sensitive` | Tidak | Jika `true`, menyembunyikan input dan menyimpan nilai dalam penyimpanan aman daripada `settings.json` |621| `sensitive` | Tidak | Jika `true`, menyembunyikan input dan menyimpan nilai dalam penyimpanan aman alih-alih `settings.json` |
600| `required` | Tidak | Jika `true`, validasi gagal saat field kosong |622| `required` | Tidak | Jika `true`, validasi gagal ketika bidang kosong |
601| `default` | Tidak | Nilai yang digunakan saat pengguna tidak memberikan apa pun |623| `default` | Tidak | Nilai yang digunakan ketika pengguna tidak memberikan apa pun |
602| `multiple` | Tidak | Untuk tipe `string`, izinkan array string |624| `multiple` | Tidak | Untuk tipe `string`, izinkan array string |
603| `min` / `max` | Tidak | Batas untuk tipe `number` |625| `min` / `max` | Tidak | Batas untuk tipe `number` |
604 626
605Setiap nilai tersedia untuk substitusi sebagai `${user_config.KEY}` di konfigurasi MCP dan LSP server dan perintah hook. Nilai non-sensitif juga dapat disubstitusi dalam konten skill dan agent. Semua nilai diekspor ke proses hook sebagai variabel lingkungan `CLAUDE_PLUGIN_OPTION_<KEY>`, di mana `<KEY>` adalah kunci opsi yang dikapitalisasi.627Setiap nilai tersedia untuk substitusi sebagai `${user_config.KEY}` di konfigurasi server MCP dan LSP serta perintah hook. Nilai non-sensitif juga dapat disubstitusi dalam konten skill dan agent. Semua nilai diekspor ke proses hook sebagai variabel lingkungan `CLAUDE_PLUGIN_OPTION_<KEY>`, di mana `<KEY>` adalah kunci opsi dengan huruf besar.
628
629Bidang yang berjalan dalam shell menolak `${user_config.*}`: mensubstitusi nilai yang dikonfigurasi ke dalam perintah shell akan membiarkan shell menjalankan apa pun yang berisi nilai itu, jadi komponen gagal dengan [kesalahan](/docs/id/errors#plugin-command-references-user-config) sebagai gantinya. Setiap bidang yang ditolak memiliki cara alternatif untuk melewatkan nilai:
630
631| Bidang yang ditolak | Cara melewatkan nilai |
632| :--------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------- |
633| Perintah hook bentuk shell | Gunakan [bentuk exec](/docs/id/hooks#exec-form-and-shell-form) dengan `args`, atau baca `CLAUDE_PLUGIN_OPTION_<KEY>` dari lingkungan hook |
634| Perintah [Monitor](#monitors) | Baca nilai dari file konfigurasi dalam skrip |
635| MCP [`headersHelper`](/docs/id/mcp#use-dynamic-headers-for-custom-authentication) | Baca nilai dari file konfigurasi dalam skrip |
636
637Sebelum v2.1.207, bidang-bidang ini mensubstitusi nilai `${user_config.KEY}`; perbarui plugin yang mengandalkan ini.
606 638
607Field yang berjalan dalam shell menolak `${user_config.*}`: mensubstitusi nilai yang dikonfigurasi ke dalam perintah shell akan membiarkan shell menjalankan apa pun yang nilai itu berisi, jadi komponen gagal dengan [error](/docs/id/errors#plugin-command-references-user-config) sebagai gantinya. Setiap field yang ditolak memiliki cara alternatif untuk melewatkan nilai:639Nilai non-sensitif disimpan di bawah kunci [`pluginConfigs`](/docs/id/settings-reference#pluginconfigs) di `settings.json` pengguna Anda sebagai `pluginConfigs[<plugin-id>].options`.
608 640
609| Field yang ditolak | Cara melewatkan nilai |641Di macOS, Claude Code menyimpan nilai sensitif di macOS Keychain, kembali ke `~/.claude/.credentials.json` ketika Keychain menolak penulisan. Di platform tanpa keychain yang didukung, itu menyimpannya di `~/.claude/.credentials.json`. Penyimpanan Keychain dibagikan dengan token OAuth dan memiliki batas total sekitar 2 KB, jadi simpan nilai sensitif tetap kecil.
610| :--------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
611| Perintah hook bentuk shell | Gunakan [exec form](/docs/id/hooks#exec-form-and-shell-form) dengan `args`, atau baca `CLAUDE_PLUGIN_OPTION_<KEY>` dari lingkungan hook |
612| Perintah [Monitor](#monitors) | Baca nilai dari file konfigurasi dalam script |
613| MCP [`headersHelper`](/docs/id/mcp#use-dynamic-headers-for-custom-authentication) | Baca nilai dari file konfigurasi dalam script |
614 642
615Sebelum v2.1.207, field ini mensubstitusi nilai `${user_config.KEY}`; perbarui plugins yang mengandalkan ini.643Claude Code membaca semua nilai `pluginConfigs` dari hanya tiga sumber pengaturan:
616 644
617Nilai non-sensitif disimpan di bawah kunci [`pluginConfigs`](/docs/id/settings#pluginconfigs) di `settings.json` sebagai `pluginConfigs[<plugin-id>].options`. Claude Code menulis kunci ke pengaturan pengguna dan membacanya kembali dari pengaturan pengguna, flag `--settings`, dan pengaturan yang dikelola saja; entri di `.claude/settings.json` atau `.claude/settings.local.json` proyek diabaikan. Sebelum v2.1.207, Claude Code juga membaca pengaturan proyek dan lokal.645* **Pengaturan pengguna**: `~/.claude/settings.json`, file yang ditulis prompt waktu pengaktifan
646* **`--settings`**: bendera CLI atau pengaturan inline SDK
647* **Pengaturan terkelola**: [kebijakan yang dikendalikan organisasi](/docs/id/permissions#managed-settings)
618 648
619Nilai sensitif masuk ke Keychain macOS, atau ke `~/.claude/.credentials.json` di platform di mana keychain yang didukung tidak tersedia. Penyimpanan keychain dibagikan dengan token OAuth dan memiliki batas total sekitar 2 KB, jadi jaga nilai sensitif tetap kecil.649Ketika lebih dari satu sumber menetapkan kunci yang sama, pengaturan terkelola mengambil alih, kemudian `--settings`, kemudian pengaturan pengguna. Satu-satunya sumber yang dapat Anda hapus dari daftar ini adalah pengaturan pengguna: teruskan [`--setting-sources`](/docs/id/cli-reference#cli-flags) tanpa `user` dan Claude Code melewatinya. Pengaturan terkelola dan `--settings` tetap apa pun yang Anda teruskan. Opsi [`settingSources`](/docs/id/agent-sdk/claude-code-features#what-settingsources-does-not-control) SDK menetapkan daftar yang sama.
650
651Entri di `.claude/settings.json` atau `.claude/settings.local.json` proyek diabaikan. Kedua file berada di workspace, jadi repositori yang dikloning dapat menyediakan nilai di sana, dan nilai-nilai itu akan mengalir ke perintah hook plugin, konfigurasi server MCP, perintah LSP, dan perintah monitor. Sebelum v2.1.207, entri-entri ini dibaca. Pembatasan khusus untuk `pluginConfigs`: [`enabledPlugins`](/docs/id/settings-reference#enabledplugins) masih menghormati pengaturan proyek dan lokal.
620 652
621<h3 id="channels">653<h3 id="channels">
622 Channels654 Saluran
623</h3>655</h3>
624 656
625Field `channels` memungkinkan plugin mendeklarasikan satu atau lebih message channels yang menyuntikkan konten ke dalam percakapan. Setiap channel mengikat ke MCP server yang disediakan plugin.657Bidang `channels` memungkinkan plugin mendeklarasikan satu atau lebih saluran pesan yang menyuntikkan konten ke dalam percakapan. Setiap saluran mengikat ke server MCP yang disediakan plugin.
626 658
627```json theme={null}659```json theme={null}
628{660{
633 "bot_token": {665 "bot_token": {
634 "type": "string",666 "type": "string",
635 "title": "Bot token",667 "title": "Bot token",
636 "description": "Token bot Telegram",668 "description": "Telegram bot token",
637 "sensitive": true669 "sensitive": true
638 },670 },
639 "owner_id": {671 "owner_id": {
640 "type": "string",672 "type": "string",
641 "title": "Owner ID",673 "title": "Owner ID",
642 "description": "ID pengguna Telegram Anda"674 "description": "Your Telegram user ID"
643 }675 }
644 }676 }
645 }677 }
647}679}
648```680```
649 681
650Field `server` diperlukan dan harus cocok dengan kunci di `mcpServers` plugin. Field `userConfig` per-channel opsional menggunakan skema yang sama dengan field tingkat atas, memungkinkan plugin meminta token bot atau ID pemilik saat plugin diaktifkan.682Bidang `server` diperlukan dan harus cocok dengan kunci di `mcpServers` plugin. `userConfig` per-saluran opsional menggunakan skema yang sama dengan bidang tingkat atas, memungkinkan plugin untuk meminta token bot atau ID pemilik ketika plugin diaktifkan.
651 683
652<h3 id="path-behavior-rules">684<h3 id="path-behavior-rules">
653 Aturan perilaku jalur685 Aturan perilaku jalur
654</h3>686</h3>
655 687
656Apakah jalur khusus menggantikan atau memperluas direktori default plugin tergantung pada field:688Apakah jalur kustom menggantikan atau memperluas direktori default plugin tergantung pada bidangnya:
657 689
658* **Menggantikan default**: `commands`, `agents`, `outputStyles`, `experimental.themes`, `experimental.monitors`. Misalnya, saat manifest menentukan `commands`, direktori default `commands/` tidak dipindai. Untuk menyimpan default dan menambahkan lebih banyak, sertakan secara eksplisit: `"commands": ["./commands/", "./extras/"]`690* **Menggantikan default**: `commands`, `agents`, `workflows`, `outputStyles`, `experimental.themes`, `experimental.monitors`. Misalnya, ketika manifes menentukan `commands`, direktori `commands/` default tidak dipindai. Untuk menyimpan default dan menambah lebih banyak, cantumkan secara eksplisit: `"commands": ["./commands/", "./extras/"]`
659* **Menambah default**: `skills`. Direktori default `skills/` selalu dipindai, dan direktori yang tercantum di `skills` dimuat bersama dengannya. Pengecualian: untuk [entri marketplace yang `source`-nya diselesaikan ke root marketplace](/docs/id/plugin-marketplaces#advanced-plugin-entries), mendeklarasikan subdirektori khusus menggantikan scan default `skills/`691* **Menambah default**: `skills`. Direktori `skills/` default selalu dipindai, dan direktori yang tercantum di `skills` dimuat bersama dengannya. Pengecualian: untuk [entri marketplace yang `source`-nya diselesaikan ke akar marketplace](/docs/id/plugin-marketplaces#advanced-plugin-entries), mendeklarasikan subdirektori spesifik menggantikan pemindaian `skills/` default
660* **Aturan penggabungan sendiri**: [hooks](#hooks), [MCP servers](#mcp-servers), dan [LSP servers](#lsp-servers). Lihat setiap bagian untuk cara beberapa sumber digabungkan692* **Aturan penggabungan sendiri**: [hooks](#hooks), [server MCP](#mcp-servers), dan [server LSP](#lsp-servers). Lihat setiap bagian untuk cara beberapa sumber menggabungkan
661 693
662Saat plugin memiliki folder default dan kunci manifest yang cocok, Claude Code v2.1.140 dan yang lebih baru menandai folder yang diabaikan di `claude plugin list` dan tampilan detail `/plugin`. Plugin masih dimuat menggunakan jalur manifest. Tidak ada peringatan yang ditampilkan saat kunci manifest menunjuk ke folder default, misalnya `"commands": ["./commands/deploy.md"]`, karena folder ditangani secara eksplisit dalam hal itu.694Ketika plugin memiliki folder default dan kunci manifes yang cocok, Claude Code memperingatkan tentang folder yang diabaikan di `claude plugin list` dan tampilan detail `/plugin`. Plugin masih dimuat menggunakan jalur manifes. Claude Code tidak memperingatkan ketika kunci manifes menunjuk ke folder default, misalnya `"commands": ["./commands/deploy.md"]`, karena jalur itu secara eksplisit menamai folder.
663 695
664Untuk semua field jalur:696Untuk semua bidang jalur:
665 697
666* Semua jalur harus relatif terhadap root plugin dan dimulai dengan `./`698* Semua jalur harus relatif terhadap akar plugin dan dimulai dengan `./`, kecuali bidang `skills` juga menerima `"."`
667* Komponen dari jalur khusus menggunakan aturan penamaan dan namespacing yang sama699 * Baik `"."` maupun `"./"` menunjukkan akar plugin itu sendiri
700 * Sebelum v2.1.221, `"."` gagal validasi manifes dan plugin tidak dimuat, jadi gunakan `"./"` untuk mendukung versi sebelumnya
701* Komponen dari jalur kustom menggunakan aturan penamaan dan namespacing yang sama
668* Beberapa jalur dapat ditentukan sebagai array702* Beberapa jalur dapat ditentukan sebagai array
669* Saat jalur skill menunjuk ke direktori yang berisi `SKILL.md` secara langsung, misalnya `"skills": ["./"]` menunjuk ke root plugin, field frontmatter `name` di `SKILL.md` menentukan nama invokasi skill. Ini memberikan nama stabil terlepas dari direktori instalasi. Jika `name` tidak diatur di frontmatter, basename direktori digunakan sebagai fallback.703* Jalur skill dapat menunjuk ke direktori yang berisi `SKILL.md` secara langsung, misalnya `"skills": ["."]` untuk akar plugin
704 * Claude Code mengambil nama invokasi skill dari bidang frontmatter `name` di `SKILL.md`, jadi nama tetap stabil apa pun direktori instalasi dinamai
705 * Jika `name` tidak ditetapkan di frontmatter, Claude Code kembali ke nama dasar direktori
670 706
671Plugin yang memiliki `SKILL.md` di root-nya, tidak ada subdirektori `skills/`, dan tidak ada field manifest `skills` secara otomatis dimuat sebagai plugin single-skill di Claude Code v2.1.142 dan yang lebih baru. Anda tidak perlu mengatur `"skills": ["./"]` di `plugin.json` untuk layout ini. Nama invokasi skill mengikuti aturan yang sama seperti di atas: field frontmatter `name`, atau basename direktori sebagai fallback.707Plugin yang memiliki `SKILL.md` di akarnya, tidak ada subdirektori `skills/`, dan tidak ada bidang manifes `skills` secara otomatis dimuat sebagai plugin skill tunggal. Anda tidak perlu menetapkan `"skills": ["./"]` di `plugin.json` untuk tata letak ini.
672 708
673**Contoh jalur**:709**Contoh jalur**:
674 710
692Claude Code menyediakan tiga variabel untuk mereferensikan jalur:728Claude Code menyediakan tiga variabel untuk mereferensikan jalur:
693 729
694| Variabel | Diselesaikan ke | Gunakan untuk |730| Variabel | Diselesaikan ke | Gunakan untuk |
695| :---------------------- | :-------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- |731| :---------------------- | :-------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ |
696| `${CLAUDE_PLUGIN_ROOT}` | Jalur absolut ke direktori instalasi plugin | Scripts, binaries, dan file konfigurasi yang disertakan dengan plugin |732| `${CLAUDE_PLUGIN_ROOT}` | Jalur absolut ke direktori instalasi plugin | Skrip, biner, dan file konfigurasi yang disertakan dengan plugin |
697| `${CLAUDE_PLUGIN_DATA}` | [Direktori persisten](#persistent-data-directory) yang bertahan setelah plugin updates, dibuat pada referensi pertama | Dependensi yang dipasang seperti `node_modules` atau Python virtual environments, kode yang dihasilkan, dan caches |733| `${CLAUDE_PLUGIN_DATA}` | [Direktori persisten](#persistent-data-directory) yang bertahan pembaruan plugin, dibuat pada referensi pertama | Ketergantungan yang diinstal seperti `node_modules` atau lingkungan virtual Python, kode yang dihasilkan, dan cache |
698| `${CLAUDE_PROJECT_DIR}` | Root proyek | Scripts dan file konfigurasi lokal proyek |734| `${CLAUDE_PROJECT_DIR}` | Akar proyek | Skrip dan file konfigurasi lokal proyek |
699 735
700Ketiga variabel diekspor sebagai variabel lingkungan ke proses hook dan ke subprocess MCP dan LSP server. Field mana yang mensubstitusi mereka inline tergantung pada komponen plugin:736Ketiga-tiganya diekspor sebagai variabel lingkungan ke proses hook dan ke subproses server MCP dan LSP. Bidang mana yang mensubstitusi mereka secara inline tergantung pada komponen plugin:
701 737
702| Komponen plugin | Field di mana placeholder diselesaikan |738| Komponen plugin | Bidang tempat placeholder diselesaikan |
703| :----------------------------- | :------------------------------------------ |739| :----------------------------- | :------------------------------------------ |
704| Konten skill dan agent | Di mana pun placeholder muncul |740| Konten skill dan agent | Di mana pun placeholder muncul |
705| Perintah hook dan monitor | Di mana pun placeholder muncul |741| Perintah hook dan monitor | Di mana pun placeholder muncul |
707| Server MCP `http`, `sse`, `ws` | `url`, `headers`, `headersHelper` |743| Server MCP `http`, `sse`, `ws` | `url`, `headers`, `headersHelper` |
708| Server LSP | `command`, `args`, `env`, `workspaceFolder` |744| Server LSP | `command`, `args`, `env`, `workspaceFolder` |
709 745
710Dalam perintah hook, gunakan [exec form](/docs/id/hooks#exec-form-and-shell-form) dengan `args` sehingga setiap jalur dilewatkan sebagai satu argumen tanpa quoting. Dalam hook bentuk shell dan perintah monitor, bungkus variabel dalam tanda kutip ganda, seperti `"${CLAUDE_PROJECT_DIR}/scripts/server.sh"`. Hook bentuk shell ini menjalankan script yang disertakan dengan plugin:746Dalam perintah hook, gunakan [bentuk exec](/docs/id/hooks#exec-form-and-shell-form) dengan `args` sehingga setiap jalur dilewatkan sebagai satu argumen tanpa tanda kutip. Dalam hook bentuk shell dan perintah monitor, bungkus variabel dalam tanda kutip ganda, seperti `"${CLAUDE_PROJECT_DIR}/scripts/server.sh"`. Hook bentuk shell ini menjalankan skrip yang disertakan dengan plugin:
711 747
712```json theme={null}748```json theme={null}
713{749{
726}762}
727```763```
728 764
729`${CLAUDE_PLUGIN_ROOT}` berubah saat plugin diperbarui. Direktori versi sebelumnya tetap berada di disk selama sekitar tujuh hari setelah update sebelum pembersihan, tetapi perlakukan sebagai ephemeral dan jangan tulis state di sana.765`${CLAUDE_PLUGIN_ROOT}` berubah ketika plugin diperbarui. Direktori versi sebelumnya tetap di disk untuk periode tenggang setelah pembaruan, tetapi perlakukan sebagai sementara dan jangan tulis status di sana. Lihat [plugin caching](#plugin-caching-and-file-resolution) untuk semantik pembersihan.
766
767Ketika plugin diperbarui di tengah sesi, perintah hook, monitor, server MCP, dan server LSP terus menggunakan jalur versi sebelumnya. Jalankan `/reload-plugins` untuk beralih hook, server MCP, dan server LSP ke jalur baru; monitor memerlukan restart sesi. Dalam sesi tanpa terminal interaktif, reload meninggalkan server MCP plugin di jalur lama sampai sesi berikutnya.
730 768
731Saat plugin diperbarui di tengah sesi, perintah hook, monitor, MCP server, dan LSP server terus menggunakan jalur versi sebelumnya. Jalankan `/reload-plugins` untuk mengalihkan hooks, MCP server, dan LSP server ke jalur baru; monitor memerlukan restart sesi.769Untuk plugin dengan sumber `command`, Claude Code [dapat memuat ulang plugin itu sendiri](/docs/id/plugin-marketplaces#when-claude-code-re-runs-the-command).
732 770
733MCP server juga dapat memanggil permintaan `roots/list` untuk membaca direktori kerja sesi saat runtime. Lihat [apa yang dikembalikan `roots/list` dan kapan Claude Code memberi tahu server tentang perubahan](/docs/id/mcp#option-3-add-a-local-stdio-server).771Server MCP juga dapat memanggil permintaan `roots/list` untuk membaca direktori kerja sesi saat runtime. Lihat [apa yang dikembalikan `roots/list` dan kapan Claude Code memberi tahu server tentang perubahan](/docs/id/mcp#option-3-add-a-local-stdio-server).
734 772
735<h4 id="persistent-data-directory">773<h4 id="persistent-data-directory">
736 Direktori data persisten774 Direktori data persisten
737</h4>775</h4>
738 776
739Direktori `${CLAUDE_PLUGIN_DATA}` diselesaikan ke `~/.claude/plugins/data/{id}/`, di mana `{id}` adalah pengenal plugin dengan karakter di luar `a-z`, `A-Z`, `0-9`, `_`, dan `-` diganti dengan `-`. Untuk plugin yang dipasang sebagai `formatter@my-marketplace`, direktorinya adalah `~/.claude/plugins/data/formatter-my-marketplace/`.777Direktori `${CLAUDE_PLUGIN_DATA}` diselesaikan ke `~/.claude/plugins/data/{id}/`, di mana `{id}` adalah pengidentifikasi plugin dengan karakter di luar `a-z`, `A-Z`, `0-9`, `_`, dan `-` diganti dengan `-`. Untuk plugin yang diinstal sebagai `formatter@my-marketplace`, direktorinya adalah `~/.claude/plugins/data/formatter-my-marketplace/`.
778
779Penggunaan umum adalah menginstal ketergantungan bahasa sekali dan menggunakannya kembali di seluruh sesi dan pembaruan plugin. Gunakan untuk ketergantungan Python, ketergantungan yang dikunci dengan Yarn atau pnpm, dan paket yang skrip siklus hidupnya harus berjalan. Untuk plugin yang diinstal marketplace, Anda mungkin tidak membutuhkannya sama sekali: Claude Code secara otomatis menginstal [ketergantungan paket Node.js yang memenuhi syarat](#node-js-package-dependencies) ketika itu cache plugin.
740 780
741Penggunaan umum adalah memasang dependensi bahasa sekali dan menggunakannya kembali di seluruh sesi dan update plugin. Karena direktori data bertahan lebih lama dari versi plugin tunggal, pemeriksaan keberadaan direktori saja tidak dapat mendeteksi saat update mengubah manifest dependensi plugin. Pola yang direkomendasikan membandingkan manifest yang disertakan terhadap salinan di direktori data dan memasang ulang saat mereka berbeda.781Karena direktori data melampaui versi plugin apa pun, pemeriksaan keberadaan direktori saja tidak dapat mendeteksi ketika pembaruan mengubah manifes ketergantungan plugin. Pola yang direkomendasikan membandingkan manifes bundel terhadap salinan di direktori data dan menginstal ulang ketika mereka berbeda.
742 782
743Hook `SessionStart` ini memasang `node_modules` pada run pertama dan lagi kapan pun update plugin menyertakan `package.json` yang berubah:783Hook `SessionStart` ini menginstal `node_modules` pada run pertama dan lagi kapan pun pembaruan plugin menyertakan `package.json` yang berubah:
744 784
745```json theme={null}785```json theme={null}
746{786{
759}799}
760```800```
761 801
762`diff` keluar nonzero saat salinan yang disimpan hilang atau berbeda dari yang disertakan, mencakup run pertama dan updates yang mengubah dependensi. Jika `npm install` gagal, trailing `rm` menghapus manifest yang disalin sehingga sesi berikutnya mencoba lagi.802`diff` keluar nonzero ketika salinan yang disimpan hilang atau berbeda dari yang bundel, mencakup run pertama dan pembaruan yang mengubah ketergantungan. Jika `npm install` gagal, `rm` trailing menghapus manifes yang disalin sehingga sesi berikutnya mencoba lagi.
763 803
764Scripts yang disertakan di `${CLAUDE_PLUGIN_ROOT}` kemudian dapat berjalan terhadap `node_modules` yang persisten:804Skrip yang disertakan dalam `${CLAUDE_PLUGIN_ROOT}` kemudian dapat berjalan terhadap `node_modules` yang persisten:
765 805
766```json theme={null}806```json theme={null}
767{807{
777}817}
778```818```
779 819
780Direktori data dihapus secara otomatis saat Anda menghapus plugin dari cakupan terakhir di mana itu dipasang. Antarmuka `/plugin` menunjukkan ukuran direktori dan meminta sebelum menghapus. CLI menghapus secara default; teruskan [`--keep-data`](#plugin-uninstall) untuk mempertahankannya.820Direktori data dihapus secara otomatis ketika Anda mencopot plugin dari ruang lingkup terakhir tempat itu diinstal. Antarmuka `/plugin` menampilkan ukuran direktori dan meminta sebelum menghapus. CLI menghapus secara default; teruskan [`--keep-data`](#plugin-uninstall) untuk mempertahankannya.
781 821
782***822***
783 823
784<h2 id="plugin-caching-and-file-resolution">824<h2 id="plugin-caching-and-file-resolution">
785 Plugin caching dan resolusi file825 Caching plugin dan resolusi file
786</h2>826</h2>
787 827
788Plugins ditentukan dalam salah satu dari dua cara:828Plugin ditentukan dalam salah satu dari dua cara:
789 829
790* Melalui `claude --plugin-dir` atau `claude --plugin-url`, untuk durasi sesi.830* Melalui `claude --plugin-dir` atau `claude --plugin-url`, untuk durasi sesi.
791* Melalui marketplace, dipasang untuk sesi mendatang.831* Melalui marketplace, diinstal untuk sesi mendatang.
792 832
793Untuk tujuan keamanan dan verifikasi, Claude Code menyalin plugin *marketplace* ke **plugin cache** lokal pengguna (`~/.claude/plugins/cache`) daripada menggunakannya di tempat. Memahami perilaku ini penting saat mengembangkan plugins yang mereferensikan file eksternal.833Untuk tujuan keamanan dan verifikasi, Claude Code menyalin plugin *marketplace* ke **plugin cache** lokal pengguna (`~/.claude/plugins/cache`) daripada menggunakannya di tempat, kecuali untuk [`command` sources dalam link mode](/docs/id/plugin-marketplaces#copy-mode-and-link-mode), yang Claude Code gunakan di tempat melalui link dalam entri cache.
794 834
795Setiap versi yang dipasang adalah direktori terpisah dalam cache. Saat Anda memperbarui atau menghapus plugin, direktori versi sebelumnya ditandai sebagai orphaned dan dihapus secara otomatis 7 hari kemudian. Periode grace memungkinkan sesi Claude Code bersamaan yang sudah memuat versi lama untuk terus berjalan tanpa kesalahan.835Untuk plugin yang disalin, setiap versi yang diinstal adalah direktori terpisah dalam cache, dikelompokkan berdasarkan marketplace dan plugin serta dinamai untuk versi yang diselesaikan, dengan salinannya sendiri dari file plugin dan [dependensi paket Node.js](#node-js-package-dependencies). Dependensi yang diselesaikan dari [release tag](/docs/id/plugin-dependencies#tag-plugin-releases-for-version-resolution) mendapatkan nama direktori dengan akhiran commit-SHA.
796 836
797Tools Glob dan Grep Claude melewati direktori versi orphaned selama pencarian, jadi hasil file tidak menyertakan kode plugin yang ketinggalan zaman.837Ketika Anda memperbarui atau mencopot plugin, Claude Code menandai direktori versi sebelumnya sebagai orphaned dan menghapusnya dalam sweep latar belakang kira-kira 14 hari kemudian. Periode grace memungkinkan sesi Claude Code bersamaan yang sudah memuat versi lama untuk terus berjalan tanpa kesalahan. Claude Code menjalankan sweep hanya saat setidaknya satu plugin diinstal; setelah Anda mencopot plugin terakhir Anda, direktori orphaned tetap di disk sampai Anda menginstal plugin lagi.
838
839Claude Code menghapus folder plugin atau marketplace dari cache hanya ketika tidak lagi berisi direktori atau symlink apa pun. Jika Anda membuat symlink dari checkout pengembangan ke dalam cache sebagai entri versi plugin, Claude Code tidak pernah menandai link sebagai orphaned dan tidak pernah menghapusnya atau folder yang menahannya. Claude Code juga tidak pernah menulis file pelacakan versinya di dalam checkout yang ditautkan.
840
841Tools Glob dan Grep Claude melewati direktori versi orphaned selama pencarian, sehingga hasil file tidak menyertakan kode plugin yang sudah ketinggalan zaman.
842
843<h3 id="node-js-package-dependencies">
844 Dependensi paket Node.js
845</h3>
846
847Ketika Claude Code menyalin plugin ke dalam cache, Claude Code juga menginstal dependensi paket Node.js plugin di sana, sehingga hooks dan MCP servers plugin dapat memuatnya. Bagian ini mencakup paket npm dan Bun yang dideklarasikan plugin dalam `package.json` miliknya sendiri. Untuk plugin yang bergantung pada plugin lain, lihat [versi dependensi plugin](/docs/id/plugin-dependencies).
848
849Claude Code menjalankan install di dalam direktori versi yang disalin setiap kali membuat satu: ketika Anda menginstal plugin, ketika Claude Code memperbarui plugin ke versi baru, dan pada awal sesi ketika plugin yang diaktifkan belum di-cache, seperti pada mesin baru. Install hanya berjalan ketika direktori root plugin berisi `package.json` dan lockfile yang didukung:
850
851| Lockfile | Command |
852| :--------------------------------------------- | :----------------------------------------------- |
853| `bun.lock` atau `bun.lockb` | `bun install --frozen-lockfile --ignore-scripts` |
854| `npm-shrinkwrap.json` atau `package-lock.json` | `npm ci --ignore-scripts` |
855
856Jika plugin berisi lebih dari satu lockfile ini, Claude Code menggunakan kecocokan pertama, memeriksa secara berurutan: `bun.lock`, `bun.lockb`, `npm-shrinkwrap.json`, `package-lock.json`. Claude Code melewati `yarn.lock` dan `pnpm-lock.yaml` karena Yarn dan pnpm mendukung hook konfigurasi waktu resolusi yang melewati `--ignore-scripts`.
857
858Kirimkan lockfile npm untuk jangkauan terluas. Claude Code menjalankan package manager lockfile yang cocok dari PATH pengguna dan tidak kembali ke lockfile lain jika hilang. Untuk plugin yang didistribusikan melalui sumber npm, gunakan `npm-shrinkwrap.json`; npm mengecualikan `package-lock.json` dari paket yang dipublikasikan.
859
860Claude Code membatasi install dependensi ini sehingga tidak ada kode dari plugin atau paketnya yang dieksekusi selama install, dan membatasi berapa lama install dapat berjalan:
861
862* **Frozen resolution:** Bun dan npm menginstal dengan tepat apa yang dikunci lockfile, dan gagal daripada re-resolve versi ketika `package.json` dan lockfile tidak setuju.
863* **No lifecycle scripts:** `--ignore-scripts` menjaga agar script `preinstall`, `install`, dan `postinstall` tidak berjalan, sehingga dependensi yang membangun modul native dalam script tersebut diunduh tetapi tidak dikompilasi selama install ini.
864* **60-second timeout:** Claude Code menghentikan install yang berjalan lebih lama dan memperlakukannya sebagai gagal.
865
866Mengambil plugin sumber npm itu sendiri menjalankan `npm install` dengan lifecycle scripts diaktifkan, sebelum install dependensi ini berjalan.
867
868Install yang gagal atau dilewati tidak pernah memblokir plugin. Ketika install gagal, atau Claude Code melewati lockfile yarn atau pnpm, Claude Code mencatat alasannya sebagai peringatan dalam [debug output](#debugging-commands). Plugin dengan `package.json` dan tidak ada lockfile dilewati tanpa entri log. Install yang time-out dapat meninggalkan pohon `node_modules` parsial dalam salinan cache.
869
870Anda tidak dapat mematikan install otomatis; tidak ada pengaturan atau variabel lingkungan yang menonaktifkannya. Di jaringan terbatas, lihat [persyaratan akses jaringan](/docs/id/network-config#network-access-requirements) untuk host yang diizinkan.
871
872Untuk dependensi yang install otomatis tidak dapat sediakan, seperti paket yang memerlukan lifecycle scripts mereka untuk membangun, dependensi Python, atau plugin yang dikunci dengan Yarn atau pnpm, instal dari hook ke [direktori data persisten](#persistent-data-directory).
798 873
799<h3 id="path-traversal-limitations">874<h3 id="path-traversal-limitations">
800 Batasan path traversal875 Batasan path traversal
801</h3>876</h3>
802 877
803Plugin yang dipasang tidak dapat mereferensikan file di luar direktorinya. Jalur yang melintasi di luar root plugin (seperti `../shared-utils`) tidak akan berfungsi setelah instalasi karena file eksternal tersebut tidak disalin ke cache.878Claude Code tidak membiarkan plugin mereferensikan file di luar direktorinya sendiri. Claude Code menolak path komponen yang diselesaikan di luar root plugin, apakah path dideklarasikan dalam `plugin.json` atau dalam [entri marketplace](/docs/id/plugin-marketplaces#plugin-entries). Itu mencakup path yang menunjuk di luar plugin seperti yang ditulis, seperti `../shared-utils`, dan symlink yang mengarah di luar plugin, selain [link dalam satu marketplace](#share-files-within-a-marketplace-with-symlinks).
879
880Di macOS dan Linux, Claude Code juga menolak path komponen yang berisi backslash di mana pun dalam path, bahkan ketika path tetap berada di dalam plugin. Komponen yang dideklarasikan dengan path backslash oleh karena itu hanya dimuat di Windows. Tulis path komponen dengan forward slash, seperti `./commands/deploy.md`.
881
882Ketika Claude Code menolak path, Claude Code melaporkan error [`path escapes plugin directory`](/docs/id/errors#path-escapes-plugin-directory) dan memuat plugin tanpa komponen tersebut.
883
884Claude Code juga tidak menyalin file di luar direktori plugin ke dalam cache ketika menginstal plugin, jadi ketika script di dalam plugin yang disalin membaca path di atas root plugin, script tidak menemukan file tersebut juga.
804 885
805<h3 id="share-files-within-a-marketplace-with-symlinks">886<h3 id="share-files-within-a-marketplace-with-symlinks">
806 Bagikan file dalam marketplace dengan symlinks887 Bagikan file dalam marketplace dengan symlink
807</h3>888</h3>
808 889
809Jika plugin Anda perlu berbagi file dengan bagian lain dari marketplace yang sama, Anda dapat membuat symbolic links di dalam direktori plugin Anda. Cara symlink ditangani saat plugin disalin ke cache tergantung pada di mana targetnya diselesaikan:890Jika plugin Anda perlu berbagi file dengan bagian lain dari marketplace yang sama, Anda dapat membuat symbolic link di dalam direktori plugin Anda. Bagaimana symlink ditangani ketika plugin disalin ke dalam cache tergantung pada di mana targetnya diselesaikan:
810 891
811* **Dalam direktori plugin itu sendiri:** symlink dipertahankan sebagai symlink relatif dalam cache, sehingga terus diselesaikan ke target yang disalin saat runtime.892* **Dalam direktori plugin sendiri:** symlink dipertahankan sebagai symlink relatif dalam cache, sehingga tetap diselesaikan ke target yang disalin saat runtime.
812* **Di tempat lain dalam marketplace yang sama:** symlink didereferensikan. Konten target disalin ke cache di tempatnya. Ini memungkinkan direktori `skills/` meta-plugin untuk menghubungkan ke skills yang ditentukan oleh plugins lain dalam marketplace.893* **Di tempat lain dalam marketplace yang sama:** symlink didereferensikan. Konten target disalin ke dalam cache di tempatnya. Ini memungkinkan direktori `skills/` meta-plugin untuk menautkan ke skill yang ditentukan oleh plugin lain dalam marketplace.
813* **Di luar marketplace:** symlink dilewati untuk keamanan. Ini mencegah plugins dari menarik file host arbitrer seperti jalur sistem ke dalam cache.894* **Di luar marketplace:** symlink dilewati untuk keamanan. Ini mencegah plugin dari menarik file host arbitrer seperti path sistem ke dalam cache.
814 895
815Untuk plugins yang dipasang dengan `--plugin-dir` atau dari jalur lokal, hanya symlinks yang diselesaikan dalam direktori plugin itu sendiri yang dipertahankan. Semua yang lain dilewati.896Untuk plugin yang diinstal dengan `--plugin-dir`, dari path lokal, atau dari [`command` source](/docs/id/plugin-marketplaces#copy-mode-and-link-mode) dalam copy mode, hanya symlink yang diselesaikan dalam direktori plugin sendiri yang dipertahankan. Semua yang lain dilewati.
816 897
817Perintah berikut membuat link dari dalam plugin marketplace ke skill bersama yang ditentukan oleh plugin sibling. Di Windows, gunakan `mklink /D` dari Command Prompt yang ditingkatkan atau aktifkan Developer Mode:898Perintah berikut membuat link dari dalam plugin marketplace ke skill bersama yang ditentukan oleh plugin sibling. Di Windows, gunakan `mklink /D` dari Command Prompt yang ditingkatkan atau aktifkan Developer Mode:
818 899
820ln -s ../../shared-plugin/skills/foo ./skills/foo901ln -s ../../shared-plugin/skills/foo ./skills/foo
821```902```
822 903
823Ini memberikan fleksibilitas sambil mempertahankan manfaat keamanan dari sistem caching.
824
825***904***
826 905
827<h2 id="plugin-directory-structure">906<h2 id="plugin-directory-structure">
837```text theme={null}916```text theme={null}
838enterprise-plugin/917enterprise-plugin/
839├── .claude-plugin/ # Direktori metadata (opsional)918├── .claude-plugin/ # Direktori metadata (opsional)
840│ └── plugin.json # plugin manifest919│ └── plugin.json # manifes plugin
841├── skills/ # Skills920├── skills/ # Skills
842│ ├── code-reviewer/921│ ├── code-reviewer/
843│ │ └── SKILL.md922│ │ └── SKILL.md
851│ ├── security-reviewer.md930│ ├── security-reviewer.md
852│ ├── performance-tester.md931│ ├── performance-tester.md
853│ └── compliance-checker.md932│ └── compliance-checker.md
933├── workflows/ # Skrip workflow
934│ └── release-audit.js
854├── output-styles/ # Definisi gaya output935├── output-styles/ # Definisi gaya output
855│ └── terse.md936│ └── terse.md
856├── themes/ # Definisi tema warna937├── themes/ # Definisi tema warna
859│ └── monitors.json940│ └── monitors.json
860├── hooks/ # Konfigurasi hooks941├── hooks/ # Konfigurasi hooks
861│ ├── hooks.json # Konfigurasi hook utama942│ ├── hooks.json # Konfigurasi hook utama
862│ └── security-hooks.json # Hook tambahan943│ └── security-hooks.json # Hooks tambahan
863├── bin/ # Plugin executables ditambahkan ke PATH944├── bin/ # Plugin yang dapat dijalankan ditambahkan ke PATH
864│ └── my-tool # Dapat dipanggil sebagai perintah bare di Bash tool945│ └── my-tool # Dapat dipanggil sebagai perintah bare di Bash tool
865├── settings.json # Pengaturan default untuk plugin946├── settings.json # Pengaturan default untuk plugin
866├── .mcp.json # Definisi MCP server947├── .mcp.json # Definisi server MCP
867├── .lsp.json # Konfigurasi LSP server948├── .lsp.json # Konfigurasi server LSP
868├── scripts/ # Hook dan utility scripts949├── scripts/ # Skrip hook dan utilitas
869│ ├── security-scan.sh950│ ├── security-scan.sh
870│ ├── format-code.py951│ ├── format-code.py
871│ └── deploy.js952│ └── deploy.js
874```955```
875 956
876<Warning>957<Warning>
877 Direktori `.claude-plugin/` berisi file `plugin.json`. Semua direktori lainnya (commands/, agents/, skills/, output-styles/, themes/, monitors/, hooks/) harus berada di root plugin, bukan di dalam `.claude-plugin/`.958 Direktori `.claude-plugin/` berisi file `plugin.json`. Semua direktori lainnya (commands/, agents/, skills/, workflows/, output-styles/, themes/, monitors/, hooks/) harus berada di root plugin, bukan di dalam `.claude-plugin/`.
878</Warning>959</Warning>
879 960
880File `CLAUDE.md` di root plugin tidak dimuat sebagai konteks proyek. Plugin berkontribusi konteks melalui skills, agents, dan hooks daripada CLAUDE.md. Untuk mengirimkan instruksi yang dimuat ke dalam konteks Claude, letakkan mereka dalam sebuah [skill](#skills).961File `CLAUDE.md` di root plugin tidak dimuat sebagai konteks proyek. Plugin berkontribusi konteks melalui skills, agents, dan hooks daripada CLAUDE.md. Untuk mengirimkan instruksi yang dimuat ke dalam konteks Claude, letakkan di [skill](#skills).
881 962
882<h3 id="file-locations-reference">963<h3 id="file-locations-reference">
883 Referensi lokasi file964 Referensi lokasi file
884</h3>965</h3>
885 966
886| Komponen | Lokasi Default | Tujuan |967| Komponen | Lokasi Default | Tujuan |
887| :---------------- | :--------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |968| :---------------- | :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
888| **Manifest** | `.claude-plugin/plugin.json` | Metadata dan konfigurasi plugin (opsional) |969| **Manifes** | `.claude-plugin/plugin.json` | Metadata dan konfigurasi plugin (opsional) |
889| **Skills** | `skills/` | Skills dengan struktur `<name>/SKILL.md` |970| **Skills** | `skills/` | Skills dengan struktur `<name>/SKILL.md` |
890| **Commands** | `commands/` | Skills sebagai file Markdown datar. Gunakan `skills/` untuk plugin baru |971| **Commands** | `commands/` | Skills sebagai file Markdown datar. Gunakan `skills/` untuk plugin baru |
891| **Agents** | `agents/` | File Markdown Subagent |972| **Agents** | `agents/` | File Markdown subagent |
973| **Workflows** | `workflows/` | File skrip [Workflow](/docs/id/workflows) |
892| **Output styles** | `output-styles/` | Definisi gaya output |974| **Output styles** | `output-styles/` | Definisi gaya output |
893| **Themes** | `themes/` | Definisi tema warna |975| **Themes** | `themes/` | Definisi tema warna |
894| **Hooks** | `hooks/hooks.json` | Konfigurasi hook |976| **Hooks** | `hooks/hooks.json` | Konfigurasi hook |
895| **MCP servers** | `.mcp.json` | Definisi MCP server |977| **Server MCP** | `.mcp.json` | Definisi server MCP |
896| **LSP servers** | `.lsp.json` | Konfigurasi language server |978| **Server LSP** | `.lsp.json` | Konfigurasi language server |
897| **Monitors** | `monitors/monitors.json` | Konfigurasi monitor latar belakang |979| **Monitors** | `monitors/monitors.json` | Konfigurasi monitor latar belakang |
898| **Executables** | `bin/` | Executables ditambahkan ke `PATH` Bash tool. File di sini dapat dipanggil sebagai perintah bare di panggilan Bash tool apa pun saat plugin diaktifkan |980| **Executables** | `bin/` | Executable yang ditambahkan ke `PATH` Bash tool dan dapat dipanggil sebagai perintah bare saat plugin diaktifkan. Anda tidak dapat menyertakan direktori ini dalam plugin yang Anda [distribusikan melalui pengaturan organisasi claude.ai](/docs/id/plugin-marketplaces#keep-executables-out-of-the-top-level-bin-directory) |
899| **Settings** | `settings.json` | Konfigurasi default yang diterapkan saat plugin diaktifkan. Saat ini hanya kunci [`agent`](/docs/id/sub-agents) dan [`subagentStatusLine`](/docs/id/statusline#subagent-status-lines) yang didukung |981| **Settings** | `settings.json` | Konfigurasi default yang diterapkan saat plugin diaktifkan. Hanya kunci [`agent`](/docs/id/sub-agents) dan [`subagentStatusLine`](/docs/id/statusline#subagent-status-lines) yang didukung |
900 982
901***983***
902 984
904 Referensi perintah CLI986 Referensi perintah CLI
905</h2>987</h2>
906 988
907Claude Code menyediakan perintah CLI untuk manajemen plugin non-interaktif, berguna untuk scripting dan otomasi.989Claude Code menyediakan perintah CLI untuk manajemen plugin non-interaktif, berguna untuk skrip dan otomasi.
908 990
909<h3 id="plugin-init">991<h3 id="plugin-init">
910 plugin init992 plugin init
911</h3>993</h3>
912 994
913Scaffold plugin baru di `~/.claude/skills/<name>/`. Pada sesi Claude Code berikutnya itu dimuat secara otomatis sebagai `<name>@skills-dir` dan muncul di `/plugin` dan `claude plugin list` tanpa langkah instalasi.995Membuat perancah plugin baru di `~/.claude/skills/<name>/`. Pada sesi Claude Code berikutnya, plugin akan dimuat secara otomatis sebagai `<name>@skills-dir` dan muncul di `/plugin` dan `claude plugin list` tanpa langkah instalasi.
914 996
915Lihat [Skills-directory plugins](#skills-directory-plugins) untuk persyaratan cakupan dan kepercayaan.997Lihat [Skills-directory plugins](#skills-directory-plugins) untuk persyaratan cakupan dan kepercayaan.
916 998
918claude plugin init <name> [options]1000claude plugin init <name> [options]
919```1001```
920 1002
921**Argumen:**1003Perintah ini mengambil argumen-argumen berikut:
922 1004
923* `<name>`: Nama plugin. Menjadi namespace skill dan nama direktori di bawah `~/.claude/skills/`, jadi tidak dapat berisi spasi atau pemisah jalur.1005* `<name>`: Nama plugin. Menjadi namespace skill dan nama direktori di bawah `~/.claude/skills/`, jadi tidak boleh mengandung spasi atau pemisah jalur.
924 1006
925**Opsi:**1007Perintah ini menerima opsi-opsi berikut:
926 1008
927| Opsi | Deskripsi | Default |1009| Opsi | Deskripsi | Default |
928| :----------------------- | :-------------------------------------------------------------------------------------------------------------------- | :---------------------- |1010| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------- | :---------------------- |
929| `--description <text>` | Deskripsi manifest | |1011| `--description <text>` | Deskripsi manifest | |
930| `--author <name>` | Nama penulis | `git config user.name` |1012| `--author <name>` | Nama penulis | `git config user.name` |
931| `--author-email <email>` | Email penulis | `git config user.email` |1013| `--author-email <email>` | Email penulis | `git config user.email` |
932| `--with <components...>` | Juga scaffold folder komponen. Nilai yang valid: `skills`, `agents`, `hooks`, `mcp`, `lsp`, `output-style`, `channel` | |1014| `--with <components...>` | Juga membuat perancah folder komponen. Nilai yang valid: `skills`, `agents`, `hooks`, `mcp`, `lsp`, `output-style`, `channel` | |
933| `-f, --force` | Timpa `.claude-plugin/` yang ada di target | |1015| `-f, --force` | Timpa `.claude-plugin/` yang ada di target | |
934| `-h, --help` | Tampilkan bantuan untuk perintah | |1016| `-h, --help` | Tampilkan bantuan untuk perintah | |
935 1017
936**Alias:** `new`1018`claude plugin new` adalah alias untuk perintah ini.
937 1019
938Setiap nilai `--with` menambahkan file starter untuk komponen itu, siap untuk diedit:1020Setiap nilai `--with` menambahkan file pemula untuk komponen tersebut, siap untuk diedit:
939 1021
940| Komponen | Apa yang di-scaffold |1022| Komponen | Apa yang dibuat perancah |
941| :------------- | :---------------------------------------------------------------------------------------------------- |1023| :------------- | :---------------------------------------------------------------------------------------------------- |
942| `skills` | Skill `<name>:example` bernama namespace ekstra bersama yang default |1024| `skills` | Skill `<name>:example` dengan namespace tambahan di samping yang default |
943| `agents` | Definisi subagent `agents/` |1025| `agents` | Definisi subagent `agents/` |
944| `hooks` | `hooks/hooks.json` dengan event handler sampel |1026| `hooks` | `hooks/hooks.json` dengan contoh penanganan acara |
945| `mcp` | `.mcp.json` dengan contoh server HTTP dan stdio |1027| `mcp` | `.mcp.json` dengan contoh server HTTP dan stdio |
946| `lsp` | Contoh `.lsp.json` language-server |1028| `lsp` | Contoh language-server `.lsp.json` |
947| `output-style` | `output-styles/<name>.md` yang berlaku otomatis saat plugin diaktifkan |1029| `output-style` | `output-styles/<name>.md` yang diterapkan secara otomatis saat plugin diaktifkan |
948| `channel` | [Channel](/docs/id/channels) berbasis MCP: server stdio (`server.ts`), `.mcp.json`-nya, dan `package.json` |1030| `channel` | [channel](/docs/id/channels) berbasis MCP: server stdio (`server.ts`), `.mcp.json`-nya, dan `package.json` |
949 1031
950Plugin yang di-scaffold menggunakan sumber `@skills-dir` daripada marketplace. Admin dapat memblokir sumber ini dengan `strictKnownMarketplaces` atau dengan menambahkan `{"source": "skills-dir"}` ke `blockedMarketplaces` dalam [managed settings](/docs/id/plugin-marketplaces#managed-marketplace-restrictions). Saat diblokir, `plugin init` gagal sebelum menulis.1032Plugin yang dibuat perancah menggunakan sumber `@skills-dir` daripada marketplace. Admin dapat memblokir sumber ini dengan `strictKnownMarketplaces` atau dengan menambahkan `{"source": "skills-dir"}` ke `blockedMarketplaces` dalam [managed settings](/docs/id/plugin-marketplaces#managed-marketplace-restrictions). Ketika diblokir, `plugin init` gagal sebelum menulis.
951 1033
952**Contoh:**1034Contoh-contoh ini menunjukkan invokasi umum:
953 1035
954```bash theme={null}1036```bash theme={null}
955# Scaffold plugin minimal1037# Membuat perancah plugin minimal
956claude plugin init my-helper1038claude plugin init my-helper
957 1039
958# Scaffold dengan folder skill dan hook1040# Membuat perancah dengan folder skill dan hook
959claude plugin init my-helper --with skills hooks1041claude plugin init my-helper --with skills hooks
960 1042
961# Timpa scaffold yang ada1043# Timpa perancah yang ada
962claude plugin init my-helper --force1044claude plugin init my-helper --force
963```1045```
964 1046
966 plugin install1048 plugin install
967</h3>1049</h3>
968 1050
969Pasang plugin dari marketplace yang tersedia.1051Instal plugin dari marketplace yang tersedia.
970 1052
971```bash theme={null}1053```bash theme={null}
972claude plugin install <plugin> [options]1054claude plugin install <plugin> [options]
973```1055```
974 1056
975**Argumen:**1057Perintah ini mengambil argumen-argumen berikut:
976 1058
977* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name` untuk marketplace tertentu1059* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name` untuk marketplace tertentu
978 1060
979**Opsi:**1061Perintah ini menerima opsi-opsi berikut:
980 1062
981| Opsi | Deskripsi | Default |1063| Opsi | Deskripsi | Default |
982| :-------------------- | :------------------------------------------------- | :------ |1064| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
983| `-s, --scope <scope>` | Cakupan instalasi: `user`, `project`, atau `local` | `user` |1065| `-s, --scope <scope>` | Cakupan instalasi: `user`, `project`, atau `local` | `user` |
1066| `--config <key=value>` | Atur opsi [`userConfig`](#user-configuration) yang dideklarasikan dalam manifest plugin. Ulangi flag untuk mengatur beberapa opsi | |
1067| `-y, --yes` | Terima perintah yang dideklarasikan marketplace plugin, tanpa prompt konfirmasi: perintah yang menghasilkan plugin dengan [sumber `command`](/docs/id/plugin-marketplaces#command-sources), atau [`headersHelper`](/docs/id/plugin-marketplaces#authenticate-archive-downloads) yang mengautentikasi unduhan arsip. Menerima `headersHelper` memerlukan Claude Code v2.1.238 atau lebih baru. Claude Code masih mencetak perintah terlebih dahulu. Diperlukan ketika stdin atau stdout bukan TTY. Tidak berpengaruh di dalam sesi Claude Code, jadi jalankan perintah dari terminal Anda sendiri | |
1068| `--json` | Cetak hasil sebagai satu objek JSON pada baris terakhir stdout alih-alih pesan yang dapat dibaca manusia, untuk digunakan dalam skrip. Lihat [format hasil JSON](#plugin-json-result). Memerlukan Claude Code v2.1.268 atau lebih baru | |
984| `-h, --help` | Tampilkan bantuan untuk perintah | |1069| `-h, --help` | Tampilkan bantuan untuk perintah | |
985 1070
986Cakupan menentukan file pengaturan mana yang ditambahkan plugin yang dipasang. Misalnya, `--scope project` menulis ke `enabledPlugins` di .claude/settings.json, membuat plugin tersedia untuk semua orang yang mengkloning repositori proyek.1071Cakupan menentukan file pengaturan mana yang ditambahkan plugin yang diinstal. Misalnya, `--scope project` menulis ke `enabledPlugins` dalam .claude/settings.json, membuat plugin tersedia untuk semua orang yang mengkloning repositori proyek.
1072
1073<span id="plugin-json-result" />Dengan `--json`, baris terakhir stdout adalah satu objek JSON. Parsing hanya baris itu, karena Claude Code mencetak perintah apa pun yang dideklarasikan marketplace sebelumnya. Tiga field selalu ada:
987 1074
988**Contoh:**1075* `command`: subperintah yang dijalankan, seperti `install`
1076* `outcome`: `ok` atau `failed`
1077* `message`: deskripsi hasil yang dapat dibaca manusia
1078
1079Field lain, seperti `pluginId`, `scope`, dan `failureCode`, muncul hanya ketika berlaku. Opsi `--json` pada `plugin uninstall`, `plugin update`, `plugin enable`, dan `plugin disable` mencetak objek yang sama dengan field subperintah tersebut. Kesalahan penggunaan, seperti `--scope` yang tidak valid, tidak mencetak baris hasil dan keluar 1 dengan alasan di stderr.
1080
1081Contoh-contoh ini menunjukkan invokasi umum:
989 1082
990```bash theme={null}1083```bash theme={null}
991# Pasang ke cakupan user (default)1084# Instal ke cakupan pengguna (default)
992claude plugin install formatter@my-marketplace1085claude plugin install formatter@my-marketplace
993 1086
994# Pasang ke cakupan project (dibagikan dengan tim)1087# Instal ke cakupan proyek (dibagikan dengan tim)
995claude plugin install formatter@my-marketplace --scope project1088claude plugin install formatter@my-marketplace --scope project
996 1089
997# Pasang ke cakupan local (gitignored)1090# Instal ke cakupan lokal (tidak dibagikan dengan tim)
998claude plugin install formatter@my-marketplace --scope local1091claude plugin install formatter@my-marketplace --scope local
999```1092```
1000 1093
1002 plugin uninstall1095 plugin uninstall
1003</h3>1096</h3>
1004 1097
1005Hapus plugin yang dipasang.1098Hapus plugin yang diinstal.
1006 1099
1007```bash theme={null}1100```bash theme={null}
1008claude plugin uninstall <plugin> [options]1101claude plugin uninstall <plugin> [options]
1009```1102```
1010 1103
1011**Argumen:**1104Perintah ini mengambil argumen-argumen berikut:
1012 1105
1013* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`1106* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`
1014 1107
1015**Opsi:**1108Perintah ini menerima opsi-opsi berikut:
1016 1109
1017| Opsi | Deskripsi | Default |1110| Opsi | Deskripsi | Default |
1018| :-------------------- | :------------------------------------------------------------------------------------------------------------------ | :------ |1111| :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
1019| `-s, --scope <scope>` | Hapus dari cakupan: `user`, `project`, atau `local` | `user` |1112| `-s, --scope <scope>` | Copot instalasi dari cakupan: `user`, `project`, atau `local` | `user` |
1020| `--keep-data` | Pertahankan [direktori data persisten](#persistent-data-directory) plugin | |1113| `--keep-data` | Pertahankan [direktori data persisten](#persistent-data-directory) plugin | |
1021| `--prune` | Juga hapus dependensi yang dipasang otomatis yang tidak diperlukan plugin lain. Lihat [plugin prune](#plugin-prune) | |1114| `--prune` | Juga hapus dependensi yang diinstal otomatis yang tidak diperlukan plugin lain. Lihat [plugin prune](#plugin-prune) | |
1022| `-y, --yes` | Lewati prompt konfirmasi `--prune`. Diperlukan ketika stdin atau stdout bukan TTY | |1115| `-y, --yes` | Lewati prompt konfirmasi `--prune`. Diperlukan ketika stdin atau stdout bukan TTY | |
1116| `--json` | Cetak hasil sebagai satu objek JSON pada baris terakhir stdout, dalam [format yang sama seperti `plugin install --json`](#plugin-json-result). Tidak dapat digabungkan dengan `--prune`. Memerlukan Claude Code v2.1.268 atau lebih baru | |
1023| `-h, --help` | Tampilkan bantuan untuk perintah | |1117| `-h, --help` | Tampilkan bantuan untuk perintah | |
1024 1118
1025**Alias:** `remove`, `rm`1119`claude plugin remove` dan `claude plugin rm` adalah alias untuk perintah ini.
1026 1120
1027Secara default, menghapus dari cakupan terakhir yang tersisa juga menghapus direktori `${CLAUDE_PLUGIN_DATA}` plugin. Gunakan `--keep-data` untuk mempertahankannya, misalnya saat memasang ulang setelah menguji versi baru.1121Secara default, mencopot instalasi dari cakupan terakhir yang tersisa juga menghapus direktori `${CLAUDE_PLUGIN_DATA}` plugin. Gunakan `--keep-data` untuk mempertahankannya, misalnya saat menginstal ulang setelah menguji versi baru.
1122
1123<Note>
1124 Ketika plugin yang diinstal dari marketplace berbeda berbagi nama, bentuk `plugin-name@marketplace-name` mencopot instalasi hanya plugin dari marketplace bernama. Sebelum v2.1.212, bentuk yang memenuhi syarat dapat mencocokkan dan mencopot instalasi plugin dengan nama yang sama dari marketplace berbeda.
1125</Note>
1028 1126
1029<h3 id="plugin-prune">1127<h3 id="plugin-prune">
1030 plugin prune1128 plugin prune
1031</h3>1129</h3>
1032 1130
1033Hapus dependensi plugin yang dipasang otomatis yang tidak lagi diperlukan oleh plugin yang dipasang. Dependensi yang Claude Code tarik untuk memenuhi bidang [`dependencies`](/docs/id/plugin-dependencies) plugin lain dihapus; plugin yang Anda pasang secara langsung tidak pernah disentuh.1131Hapus dependensi plugin yang diinstal otomatis yang tidak lagi diperlukan oleh plugin yang diinstal. Dependensi yang Claude Code tarik untuk memenuhi field [`dependencies`](/docs/id/plugin-dependencies) plugin lain dihapus; plugin yang Anda instal secara langsung tidak pernah disentuh.
1034 1132
1035```bash theme={null}1133```bash theme={null}
1036claude plugin prune [options]1134claude plugin prune [options]
1037```1135```
1038 1136
1039**Opsi:**1137Perintah ini menerima opsi-opsi berikut:
1040 1138
1041| Opsi | Deskripsi | Default |1139| Opsi | Deskripsi | Default |
1042| :-------------------- | :---------------------------------------------------------------------- | :------ |1140| :-------------------- | :---------------------------------------------------------------------- | :------ |
1045| `-y, --yes` | Lewati prompt konfirmasi. Diperlukan ketika stdin atau stdout bukan TTY | |1143| `-y, --yes` | Lewati prompt konfirmasi. Diperlukan ketika stdin atau stdout bukan TTY | |
1046| `-h, --help` | Tampilkan bantuan untuk perintah | |1144| `-h, --help` | Tampilkan bantuan untuk perintah | |
1047 1145
1048**Alias:** `autoremove`1146`claude plugin autoremove` adalah alias untuk perintah ini.
1049
1050Perintah ini mencantumkan dependensi yatim piatu dan meminta konfirmasi sebelum menghapusnya. Untuk menghapus plugin dan membersihkan dependensinya dalam satu langkah, jalankan `claude plugin uninstall <plugin> --prune`.
1051 1147
1052<Note>1148Perintah mencantumkan dependensi yatim piatu dan meminta konfirmasi sebelum menghapusnya. Untuk menghapus plugin dan membersihkan dependensinya dalam satu langkah, jalankan `claude plugin uninstall <plugin> --prune`.
1053 `claude plugin prune` memerlukan Claude Code v2.1.121 atau lebih baru.
1054</Note>
1055 1149
1056<h3 id="plugin-enable">1150<h3 id="plugin-enable">
1057 plugin enable1151 plugin enable
1058</h3>1152</h3>
1059 1153
1060Aktifkan plugin yang dinonaktifkan. Jika plugin mendeklarasikan [dependencies](/docs/id/plugin-dependencies), Claude Code mengaktifkannya secara transitif pada cakupan yang sama, dan perintah gagal ketika dependensi tidak dipasang.1154Aktifkan plugin yang dinonaktifkan. Ketika target diinstal dari marketplace dan mendeklarasikan [dependencies](/docs/id/plugin-dependencies), Claude Code mengaktifkannya secara transitif pada cakupan yang sama. Perintah gagal dalam kondisi yang [Enable or disable a plugin with dependencies](/docs/id/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies) daftar.
1061 1155
1062```bash theme={null}1156```bash theme={null}
1063claude plugin enable <plugin> [options]1157claude plugin enable <plugin> [options]
1064```1158```
1065 1159
1066**Argumen:**1160Perintah ini mengambil argumen-argumen berikut:
1067 1161
1068* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`1162* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`
1069 1163
1070**Opsi:**1164Perintah ini menerima opsi-opsi berikut:
1071 1165
1072| Opsi | Deskripsi | Default |1166| Opsi | Deskripsi | Default |
1073| :-------------------- | :-------------------------------------------------------- | :------ |1167| :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
1074| `-s, --scope <scope>` | Cakupan untuk diaktifkan: `user`, `project`, atau `local` | `user` |1168| `-s, --scope <scope>` | Cakupan untuk diaktifkan: `user`, `project`, atau `local`. Ketika dihilangkan, Claude Code mendeteksi cakupan tempat plugin diinstal | Auto-detect |
1169| `--json` | Cetak hasil sebagai satu objek JSON pada baris terakhir stdout, dalam [format yang sama seperti `plugin install --json`](#plugin-json-result). Memerlukan Claude Code v2.1.268 atau lebih baru | |
1075| `-h, --help` | Tampilkan bantuan untuk perintah | |1170| `-h, --help` | Tampilkan bantuan untuk perintah | |
1076 1171
1077<h3 id="plugin-disable">1172<h3 id="plugin-disable">
1078 plugin disable1173 plugin disable
1079</h3>1174</h3>
1080 1175
1081Nonaktifkan plugin tanpa menghapusnya. Gagal ketika plugin yang diaktifkan lain [bergantung pada](/docs/id/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies) target. Pesan kesalahan mencakup perintah berantai yang menonaktifkan setiap dependensi terlebih dahulu.1176Nonaktifkan plugin tanpa mencopot instalasinya. Ketika target diinstal dari marketplace, perintah gagal jika plugin yang diaktifkan lain [bergantung pada](/docs/id/plugin-dependencies#enable-or-disable-a-plugin-with-dependencies) itu. Pesan kesalahan mencakup perintah berantai yang menonaktifkan setiap dependensi terlebih dahulu.
1082 1177
1083```bash theme={null}1178```bash theme={null}
1084claude plugin disable <plugin> [options]1179claude plugin disable [plugin] [options]
1085```1180```
1086 1181
1087**Argumen:**1182Perintah ini mengambil argumen-argumen berikut:
1088 1183
1089* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`1184* `[plugin]`: Nama plugin atau `plugin-name@marketplace-name`. Opsional saat menggunakan `--all`
1090 1185
1091**Opsi:**1186Perintah ini menerima opsi-opsi berikut:
1092 1187
1093| Opsi | Deskripsi | Default |1188| Opsi | Deskripsi | Default |
1094| :-------------------- | :----------------------------------------------------------- | :------ |1189| :-------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------- |
1095| `-s, --scope <scope>` | Cakupan untuk dinonaktifkan: `user`, `project`, atau `local` | `user` |1190| `-a, --all` | Nonaktifkan semua plugin yang diaktifkan. Tidak dapat digabungkan dengan `--scope` | |
1191| `-s, --scope <scope>` | Cakupan untuk dinonaktifkan: `user`, `project`, atau `local`. Ketika dihilangkan, Claude Code mendeteksi cakupan tempat plugin diinstal | Auto-detect |
1192| `--json` | Cetak hasil sebagai satu objek JSON pada baris terakhir stdout, dalam [format yang sama seperti `plugin install --json`](#plugin-json-result). Memerlukan Claude Code v2.1.268 atau lebih baru | |
1096| `-h, --help` | Tampilkan bantuan untuk perintah | |1193| `-h, --help` | Tampilkan bantuan untuk perintah | |
1097 1194
1098<h3 id="plugin-update">1195<h3 id="plugin-update">
1105claude plugin update <plugin> [options]1202claude plugin update <plugin> [options]
1106```1203```
1107 1204
1108**Argumen:**1205Perintah ini mengambil argumen-argumen berikut:
1109 1206
1110* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`1207* `<plugin>`: Nama plugin atau `plugin-name@marketplace-name`
1111 1208
1112**Opsi:**1209Perintah ini menerima opsi-opsi berikut:
1113 1210
1114| Opsi | Deskripsi | Default |1211| Opsi | Deskripsi | Default |
1115| :-------------------- | :------------------------------------------------------------------- | :------ |1212| :-------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
1116| `-s, --scope <scope>` | Cakupan untuk diperbarui: `user`, `project`, `local`, atau `managed` | `user` |1213| `-s, --scope <scope>` | Cakupan untuk diperbarui: `user`, `project`, `local`, atau `managed` | `user` |
1214| `-y, --yes` | Terima perintah yang dideklarasikan marketplace plugin, tanpa prompt konfirmasi: perintah yang menghasilkan plugin dengan [sumber `command`](/docs/id/plugin-marketplaces#command-sources), atau [`headersHelper`](/docs/id/plugin-marketplaces#authenticate-archive-downloads) yang mengautentikasi unduhan arsip. Menerima `headersHelper` memerlukan Claude Code v2.1.238 atau lebih baru. Claude Code masih mencetak perintah terlebih dahulu. Diperlukan ketika stdin atau stdout bukan TTY. Tidak berpengaruh di dalam sesi Claude Code, jadi jalankan perintah dari terminal Anda sendiri | |
1215| `--json` | Cetak hasil sebagai satu objek JSON pada baris terakhir stdout, dalam [format yang sama seperti `plugin install --json`](#plugin-json-result). Memerlukan Claude Code v2.1.268 atau lebih baru | |
1117| `-h, --help` | Tampilkan bantuan untuk perintah | |1216| `-h, --help` | Tampilkan bantuan untuk perintah | |
1118 1217
1218<Note>
1219 Claude Code menyelesaikan nama plugin tanpa kualifikasi terhadap plugin yang diinstal. Ketika plugin yang diinstal dari marketplace berbeda berbagi nama, Claude Code menolak pembaruan dan mencantumkan perintah `plugin-name@marketplace-name` yang memenuhi syarat untuk dijalankan sebagai gantinya. Sebelum v2.1.246, Claude Code hanya menerima bentuk yang memenuhi syarat dan menolak nama tanpa kualifikasi sebagai tidak ditemukan.
1220</Note>
1221
1119***1222***
1120 1223
1121<h3 id="plugin-list">1224<h3 id="plugin-list">
1122 plugin list1225 plugin list
1123</h3>1226</h3>
1124 1227
1125Daftar plugin yang dipasang dengan versi, marketplace sumber, dan status enable mereka.1228Daftar plugin yang diinstal dengan versi, marketplace sumber, dan status pengaktifan mereka.
1126 1229
1127```bash theme={null}1230```bash theme={null}
1128claude plugin list [options]1231claude plugin list [options]
1129```1232```
1130 1233
1131**Opsi:**1234Perintah ini menerima opsi-opsi berikut:
1132 1235
1133| Opsi | Deskripsi | Default |1236| Opsi | Deskripsi | Default |
1134| :------------ | :------------------------------------------------------------------ | :------ |1237| :------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
1135| `--json` | Output sebagai JSON | |1238| `--json` | Output sebagai JSON. Baris plugin dengan masalah pemuatan atau peringatan penulisan membawa array string `errors` atau `notes`. Pada Claude Code v2.1.268 atau lebih baru, array `errorDetails` dan `noteDetails` paralel memberikan `type` diagnostik setiap entri dan nama yang dirujuknya, seperti plugin, marketplace, server, atau file | |
1136| `--available` | Sertakan plugin yang tersedia dari marketplace. Memerlukan `--json` | |1239| `--available` | Sertakan plugin yang tersedia dari marketplace. Memerlukan `--json` | |
1137| `-h, --help` | Tampilkan bantuan untuk perintah | |1240| `-h, --help` | Tampilkan bantuan untuk perintah | |
1138 1241
1139Dalam sesi interaktif, `/plugin list` mencetak daftar yang sama secara inline. Bentuk interaktif menerima `--enabled` atau `--disabled` untuk menampilkan hanya plugin dalam status itu, dan `ls` sebagai singkatan untuk `list`.1242Dalam sesi interaktif, `/plugin list` mencetak daftar serupa secara inline, tetapi mencakup hanya plugin yang diinstal marketplace:
1243
1244* Plugin yang dimuat dari direktori skills muncul di antarmuka `/plugin` dan dalam `claude plugin list`, tetapi tidak dalam output `/plugin list` inline.
1245* Pada Claude Code v2.1.239 atau lebih baru, [plugin yang disinkronkan dari claude.ai](#synced-plugins) muncul dalam `claude plugin list` ketika Anda menjalankannya di lingkungan tempat sesi yang disinkronkan mengunduhnya. Mereka tidak muncul dalam output `/plugin list` inline.
1246* Plugin yang dimuat untuk sesi dengan `--plugin-dir` atau `--plugin-url` muncul di antarmuka `/plugin`, dan dalam `claude plugin list` hanya ketika flag yang sama mendahului subperintah, seperti dalam `claude --plugin-dir <dir> plugin list`. Hanya nama flag lokasi mereka, jadi `claude plugin list` tanpa kualifikasi tidak dapat menemukannya, tidak seperti plugin yang disinkronkan dan plugin direktori skills, yang direktorinya tetap Claude Code pindai.
1247
1248Bentuk interaktif menerima `--enabled` atau `--disabled` untuk menampilkan hanya plugin dalam status itu, dan `ls` sebagai singkatan untuk `list`.
1140 1249
1141<h3 id="plugin-details">1250<h3 id="plugin-details">
1142 plugin details1251 plugin details
1143</h3>1252</h3>
1144 1253
1145Tampilkan inventaris komponen plugin dan perkiraan biaya token yang diproyeksikan. Output mencantumkan semua komponen yang disumbangkan plugin, dikelompokkan sebagai Skills, Agents, Hooks, server MCP, dan server LSP, bersama dengan perkiraan berapa banyak token yang ditambahkannya ke setiap sesi. Grup Skills mencakup entri `skills/` dan `commands/`.1254Tampilkan inventaris komponen plugin dan biaya token yang diproyeksikan. Output mencantumkan semua komponen yang disumbangkan plugin, dikelompokkan sebagai Skills, Agents, Hooks, server MCP, dan server LSP, bersama dengan perkiraan berapa banyak token yang ditambahkannya ke setiap sesi. Grup Skills mencakup entri `skills/` dan `commands/`.
1146 1255
1147```bash theme={null}1256```bash theme={null}
1148claude plugin details <name>1257claude plugin details <name>
1149```1258```
1150 1259
1151**Argumen:**1260Perintah ini mengambil argumen-argumen berikut:
1152 1261
1153* `<name>`: Nama plugin atau `plugin-name@marketplace-name`1262* `<name>`: Nama plugin atau `plugin-name@marketplace-name`
1154 1263
1155**Opsi:**1264Perintah ini menerima opsi-opsi berikut:
1156 1265
1157| Opsi | Deskripsi | Default |1266| Opsi | Deskripsi | Default |
1158| :----------- | :------------------------------- | :------ |1267| :----------- | :------------------------------- | :------ |
1160 1269
1161Output menampilkan dua angka biaya untuk setiap komponen:1270Output menampilkan dua angka biaya untuk setiap komponen:
1162 1271
1163* **Always-on:** token yang ditambahkan ke setiap sesi oleh teks daftar plugin, seperti deskripsi skill, deskripsi agent, dan nama perintah, terlepas dari apakah ada komponen yang diaktifkan.1272* **Always-on:** token yang ditambahkan ke setiap sesi oleh teks daftar plugin, seperti deskripsi skill, deskripsi agent, dan nama perintah, terlepas dari apakah komponen apa pun diaktifkan.
1164* **On-invoke:** token yang dihabiskan komponen saat diaktifkan. Ditampilkan per komponen, bukan sebagai total plugin, karena sesi khas hanya mengaktifkan subset komponen.1273* **On-invoke:** token yang dihabiskan komponen saat diaktifkan. Ditampilkan per komponen, bukan sebagai total plugin, karena sesi khas hanya mengaktifkan subset komponen.
1165 1274
1166Contoh ini menunjukkan seperti apa output untuk plugin dengan dua skill:1275Contoh ini menunjukkan seperti apa output untuk plugin dengan dua skill:
1173Component inventory1282Component inventory
1174 Skills (2) scan-dependencies, review-changes1283 Skills (2) scan-dependencies, review-changes
1175 Agents (0)1284 Agents (0)
1176 Hooks (1) (harness-only — no model context cost)1285 Hooks (1) SessionStart (harness-only — no model context cost)
1177 MCP servers (0)1286 MCP servers (0)
1178 LSP servers (0)1287 LSP servers (0)
1179 1288
1189 Token counts are estimates and may differ from actual usage.1298 Token counts are estimates and may differ from actual usage.
1190```1299```
1191 1300
1192Total always-on dihitung melalui API `count_tokens` untuk model aktif Anda. Angka per-komponen diskalakan secara proporsional dari total tersebut. Jika API tidak dapat dijangkau, perintah kembali ke perkiraan berbasis karakter.1301Total always-on dihitung melalui API `count_tokens` untuk model aktif Anda. Angka per-komponen diskalakan secara proporsional dari total itu. Jika API tidak dapat dijangkau, perintah kembali ke perkiraan berbasis karakter.
1302
1303<h3 id="plugin-validate">
1304 plugin validate
1305</h3>
1306
1307Periksa plugin atau marketplace untuk kesalahan sintaks dan skema sebelum menerbitkan.
1308
1309Perintah keluar 0 ketika validasi lulus, 1 ketika gagal, dan 2 ketika validasi itu sendiri gagal, seperti ketika jalur yang Anda berikan tidak dapat dibaca.
1310
1311```bash theme={null}
1312claude plugin validate <path> [options]
1313```
1314
1315Perintah ini mengambil argumen-argumen berikut:
1316
1317* `<path>`: Jalur ke direktori plugin atau direktori marketplace. Lihat [Validate a plugin or a directory without a manifest](/docs/id/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) untuk file mana yang dicakup plugin run.
1318
1319Perintah ini menerima opsi-opsi berikut:
1320
1321| Opsi | Deskripsi | Default |
1322| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
1323| `--strict` | Perlakukan peringatan sebagai kesalahan dan keluar 1 pada mereka. Gunakan dalam CI untuk menangkap masalah yang ditoleransi runtime, seperti [unrecognized fields](#unrecognized-fields) | |
1324| `--json` | Output laporan validasi sebagai satu objek JSON dengan kode keluar yang sama. Memerlukan Claude Code v2.1.259 atau lebih baru | |
1325| `-h, --help` | Tampilkan bantuan untuk perintah | |
1326
1327Dengan `--json`, Claude Code menulis laporan ke stdout sebagai satu objek JSON dengan field tingkat atas ini:
1328
1329* `success`: versi yang sama yang diberikan kode keluar
1330* `strict`: apakah run memperlakukan peringatan sebagai kesalahan
1331* `target`: jalur yang diselesaikan Claude Code divalidasi
1332* `manifest`: hasil manifest itu sendiri, atau `null` untuk [run tanpa manifest](/docs/id/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest)
1333* `contents`: hasil per-file, masing-masing menamai `file`-nya dan membawa array `errors`, `warnings`, dan `notes`
1334
1335Pada keluar 2, perintah tidak menulis apa pun ke stdout; pesan kesalahan masuk ke stderr.
1336
1337Dalam sesi interaktif, `/plugin validate <path>` menjalankan pemeriksaan yang sama secara inline.
1338
1339<h3 id="plugin-eval">
1340 plugin eval
1341</h3>
1342
1343Jalankan [eval cases](/docs/id/plugin-evals) plugin dan laporkan hasil yang diskor. Memerlukan Claude Code v2.1.269 atau lebih baru. Setiap case adalah prompt plus graders; Claude Code menjalankannya beberapa kali dalam sesi terisolasi dengan hanya plugin target yang dimuat, dan secara default juga tanpa plugin sehingga laporan menunjukkan perbedaannya. Lihat [Test plugins with evals](/docs/id/plugin-evals) untuk format case, graders, hasil, dan penggunaan CI.
1344
1345```bash theme={null}
1346claude plugin eval [target] [options]
1347```
1348
1349Target opsional adalah direktori plugin, file `prompt.md` atau `case.yaml` tunggal, plugin yang diinstal sebagai `name` atau `name@marketplace`, atau `name@skills-dir`, dan default ke direktori saat ini. Letakkan sebelum `--tag`, `--allow-tools`, dan `--json`.
1350
1351Tabel ini mencantumkan opsi yang paling banyak digunakan run. Jalankan `claude plugin eval --help` untuk set lengkap, termasuk `--case`, `--tag`, `--output-dir`, `--report`, `--allow-real-servers`, `--keep-temp`, dan `--verbose`.
1352
1353| Opsi | Deskripsi | Default |
1354| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------- |
1355| `--runs <n>` | Runs per case per arm | Setiap case's `runs`, else 3 |
1356| `-j, --concurrency <n>` | Sesi agent untuk dijalankan sekaligus, 1 hingga 8. Mereka berbagi batas laju Anda | `1` |
1357| `--model <model>` | Model untuk agent yang diuji | Setiap case's `model`, else `ANTHROPIC_MODEL` jika diatur, else default Claude Code |
1358| `--judge-model <model>` | Model untuk `llm` dan `baseline` graders | Model kecil cepat |
1359| `--ablation <mode>` | `none` atau `with-without`. Lihat [Compare against a no-plugin baseline](/docs/id/plugin-evals#compare-against-a-no-plugin-baseline) | `with-without` ketika plugin diselesaikan, else `none` |
1360| `--threshold <0..1>` | Keluar 1 jika case apa pun mencetak di bawah ini | `1.0` |
1361| `--max-cost-usd <usd>` | Berhenti sebelum run berikutnya setelah pengeluaran mencapai ini, keluar 2, dan laporkan hasil parsial | Tidak ada batas |
1362| `--allow-tools <tools...>` | Berikan tools di luar set read-only, seperti `Bash`, `Write`, `Edit`, atau `"mcp__plugin_<plugin>_<server>__*"`. Lihat [Grant tools](/docs/id/plugin-evals#grant-tools) | |
1363| `--scaffold` | Jalankan setiap case's [`scaffold_script`](/docs/id/plugin-evals#add-setup-or-history-with-case-yaml) | Off |
1364| `--trust-plugin` | Lewati prompt kepercayaan first-run, untuk CI. Lihat [What a run can access](/docs/id/plugin-evals#security) | Off |
1365| `--mocks <mode>` | `record` atau `off`. Lihat [Mock MCP servers](/docs/id/plugin-evals#mock-mcp-servers) | `record` |
1366| `--eval-dir <dir>` | Direktori di bawah plugin yang menyimpan cases | Manifest's `experimental.evals`, else `evals` |
1367| `--json [path]` | Cetak [result document](/docs/id/plugin-evals#json-result) ke stdout, atau tulis ke path `.json` | |
1368| `--no-publish` | Simpan laporan HTML secara lokal | |
1369| `-h, --help` | Tampilkan bantuan untuk perintah | |
1370
1371Perintah keluar 0 ketika setiap case memenuhi threshold, 1 pada case yang gagal, kesalahan load, atau direktori plugin yang tidak dipercaya, 2 pada run parsial, 130 ketika terputus, dan 143 ketika dihentikan. Lihat [Run evals in CI](/docs/id/plugin-evals#run-evals-in-ci).
1372
1373<h3 id="plugin-eval-init">
1374 plugin eval init
1375</h3>
1376
1377Buat suite eval untuk plugin di direktori saat ini. Memerlukan Claude Code v2.1.269 atau lebih baru. Di terminal ini memulai wawancara penulisan yang membaca plugin, mengusulkan cases dan graders, pilot mereka, dan menulis file. Dengan `--bare`, atau tanpa terminal, itu menulis template single-case kosong sebagai gantinya. Jalankan dari dalam sesi Claude Code interaktif, itu mencetak instruksi wawancara untuk sesi itu ikuti daripada menulis template. Lihat [Create your first eval suite](/docs/id/plugin-evals#create-your-first-eval-suite).
1378
1379```bash theme={null}
1380claude plugin eval init [name] [options]
1381```
1382
1383Name opsional adalah case name: wawancara tidak memerlukan satu, sementara `--bare` dan path template no-terminal memerlukan satu. Itu menerima opsi ini:
1384
1385| Opsi | Deskripsi | Default |
1386| :------------------ | :------------------------------------------------------------------------------------------------ | :-------------------------------------------- |
1387| `--bare` | Tulis `prompt.md` kosong dan `graders/criteria.md` untuk `<name>` alih-alih menjalankan wawancara | |
1388| `-i, --interactive` | Perlukan wawancara. Gagal tanpa terminal alih-alih menulis template | |
1389| `--eval-dir <dir>` | Direktori di bawah direktori saat ini untuk menulis cases ke | Manifest's `experimental.evals`, else `evals` |
1390| `-h, --help` | Tampilkan bantuan untuk perintah | |
1193 1391
1194<h3 id="plugin-tag">1392<h3 id="plugin-tag">
1195 plugin tag1393 plugin tag
1196</h3>1394</h3>
1197 1395
1198Buat tag rilis git untuk plugin di direktori saat ini. Jalankan dari dalam folder plugin. Lihat [Tag plugin releases](/docs/id/plugin-dependencies#tag-plugin-releases-for-version-resolution).1396Buat tag git rilis untuk plugin. Secara default perintah menandai plugin di direktori saat ini; berikan jalur untuk menandai plugin di tempat lain. Lihat [Tag plugin releases](/docs/id/plugin-dependencies#tag-plugin-releases-for-version-resolution).
1199 1397
1200```bash theme={null}1398```bash theme={null}
1201claude plugin tag [options]1399claude plugin tag [path] [options]
1202```1400```
1203 1401
1204**Opsi:**1402Perintah ini mengambil argumen-argumen berikut:
1403
1404* `[path]`: Jalur ke direktori plugin. Default ke direktori saat ini.
1405
1406Perintah ini menerima opsi-opsi berikut:
1205 1407
1206| Opsi | Deskripsi | Default |1408| Opsi | Deskripsi | Default |
1207| :------------ | :-------------------------------------------------------- | :------ |1409| :-------------------- | :-------------------------------------------------------------- | :------- |
1208| `--push` | Dorong tag ke remote setelah membuatnya | |1410| `--push` | Dorong tag ke remote setelah membuatnya | |
1209| `--dry-run` | Cetak apa yang akan diberi tag tanpa membuat tag | |1411| `--dry-run` | Cetak apa yang akan ditandai tanpa membuat tag | |
1210| `-f, --force` | Buat tag bahkan jika pohon kerja kotor atau tag sudah ada | |1412| `-f, --force` | Buat tag bahkan jika pohon kerja kotor atau tag sudah ada | |
1413| `-m, --message <msg>` | Pesan anotasi tag. Gunakan `%s` sebagai placeholder untuk versi | |
1414| `--remote <name>` | Remote untuk didorong dengan `--push` | `origin` |
1211| `-h, --help` | Tampilkan bantuan untuk perintah | |1415| `-h, --help` | Tampilkan bantuan untuk perintah | |
1212 1416
1213***1417***
1220 Perintah debugging1424 Perintah debugging
1221</h3>1425</h3>
1222 1426
1223Gunakan `claude --debug` untuk melihat detail loading plugin:1427Gunakan `claude --debug` untuk melihat detail pemuatan plugin:
1224 1428
1225Ini menunjukkan:1429Ini menampilkan:
1226 1430
1227* Plugin mana yang sedang dimuat1431* Plugin mana yang sedang dimuat
1228* Kesalahan apa pun dalam manifest plugin1432* Kesalahan apa pun dalam manifes plugin
1229* Registrasi skill, agent, dan hook1433* Pendaftaran skill, agent, dan hook
1230* Inisialisasi MCP server1434* Inisialisasi server MCP
1231 1435
1232<h3 id="common-issues">1436<h3 id="common-issues">
1233 Masalah umum1437 Masalah umum
1234</h3>1438</h3>
1235 1439
1236| Masalah | Penyebab | Solusi |1440| Masalah | Penyebab | Solusi |
1237| :---------------------------------- | :----------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1441| :---------------------------------- | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1238| Plugin tidak dimuat | `plugin.json` tidak valid | Jalankan `claude plugin validate` atau `/plugin validate` untuk memeriksa `plugin.json`, frontmatter skill/agent/command, dan `hooks/hooks.json` untuk kesalahan sintaks dan skema |1442| Plugin tidak dimuat | `plugin.json` tidak valid | Jalankan `claude plugin validate ./my-plugin` atau `/plugin validate ./my-plugin`, di mana `./my-plugin` adalah direktori plugin Anda, untuk memeriksa `plugin.json`, `hooks/hooks.json`, dan frontmatter dari skills, agents, dan commands di direktori default plugin untuk kesalahan sintaks dan skema. Lihat [Validate a plugin or a directory without a manifest](/docs/id/plugin-marketplaces#validate-a-plugin-or-a-directory-without-a-manifest) untuk mengetahui apa yang dicakup oleh suatu run |
1239| Skills tidak muncul | Struktur direktori salah | Pastikan `skills/` atau `commands/` di root plugin, bukan di `.claude-plugin/` |1443| Skills tidak muncul | Struktur direktori salah | Pastikan `skills/` atau `commands/` berada di root plugin, bukan di dalam `.claude-plugin/` |
1240| Hooks tidak aktif | Script tidak dapat dieksekusi | Jalankan `chmod +x script.sh` |1444| Hooks tidak aktif | Script tidak dapat dieksekusi | Jalankan `chmod +x script.sh` |
1241| MCP server gagal | `${CLAUDE_PLUGIN_ROOT}` hilang | Gunakan variabel untuk semua jalur plugin |1445| Server MCP gagal | `${CLAUDE_PLUGIN_ROOT}` hilang | Gunakan variabel untuk semua path plugin |
1242| Kesalahan jalur | Jalur absolut digunakan | Semua jalur harus relatif dan dimulai dengan `./` |1446| Kesalahan path | Path absolut digunakan | Buat path relatif, dimulai dengan `./`; lihat [Path behavior rules](#path-behavior-rules), yang mencakup pengecualian `"."` di field `skills` |
1243| LSP `Executable not found in $PATH` | Language server tidak dipasang | Pasang biner (misalnya, `npm install -g typescript-language-server typescript`) |1447| LSP `Executable not found in $PATH` | Language server tidak terinstal | Instal binary (misalnya, `npm install -g typescript-language-server typescript`) |
1244 1448
1245<h3 id="example-error-messages">1449<h3 id="example-error-messages">
1246 Contoh pesan kesalahan1450 Contoh pesan kesalahan
1247</h3>1451</h3>
1248 1452
1249**Kesalahan validasi manifest**:1453**Kesalahan validasi manifes**:
1250 1454
1251* `Invalid JSON syntax: Unexpected token } in JSON at position 142`: periksa koma yang hilang, koma ekstra, atau string yang tidak dikutip1455* `Invalid JSON syntax: Unexpected token } in JSON at position 142`: periksa koma yang hilang, koma berlebih, atau string yang tidak dikutip
1252* `Plugin has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Required`: field yang diperlukan hilang1456* `Plugin <name> has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Invalid input: expected string, received undefined`: field yang diperlukan hilang
1253* `Plugin has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`: kesalahan sintaks JSON1457* `Plugin <name> has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...`: kesalahan sintaks JSON. Sebelum v2.1.246, Claude Code juga menghasilkan kesalahan ini untuk `plugin.json` yang disimpan sebagai UTF-8 dengan byte-order mark (BOM) di awal, bahkan ketika JSON sebaliknya valid.
1254 1458
1255**Kesalahan loading plugin**:1459**Kesalahan pemuatan plugin**:
1256 1460
1257* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`: jalur command ada tetapi tidak berisi file command yang valid1461* `Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.`: path command ada tetapi tidak berisi file command yang valid
1258* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`: jalur `source` di marketplace.json menunjuk ke direktori yang tidak ada1462* `Plugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.`: path `source` di marketplace.json menunjuk ke direktori yang tidak ada
1259* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`: hapus definisi komponen duplikat atau hapus `strict: false` di entri marketplace1463* `Plugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.`: hapus definisi komponen duplikat atau hapus `strict: false` di entri marketplace
1260 1464
1261<h3 id="hook-troubleshooting">1465<h3 id="hook-troubleshooting">
1266 1470
12671. Periksa script dapat dieksekusi: `chmod +x ./scripts/your-script.sh`14711. Periksa script dapat dieksekusi: `chmod +x ./scripts/your-script.sh`
12682. Verifikasi baris shebang: Baris pertama harus `#!/bin/bash` atau `#!/usr/bin/env bash`14722. Verifikasi baris shebang: Baris pertama harus `#!/bin/bash` atau `#!/usr/bin/env bash`
12693. Periksa jalur menggunakan `${CLAUDE_PLUGIN_ROOT}`: `"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh"`14733. Periksa path menggunakan `${CLAUDE_PLUGIN_ROOT}`: `"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh"`
12704. Uji script secara manual: `./scripts/your-script.sh`14744. Uji script secara manual: `./scripts/your-script.sh`
1271 1475
1272**Hook tidak dipicu pada event yang diharapkan**:1476**Hook tidak dipicu pada event yang diharapkan**:
1273 1477
12741. Verifikasi nama event benar (case-sensitive): `PostToolUse`, bukan `postToolUse`14781. Verifikasi nama event benar (case-sensitive): `PostToolUse`, bukan `postToolUse`
12752. Periksa pola matcher cocok dengan alat Anda: `"matcher": "Write|Edit"` untuk operasi file14792. Periksa pola matcher cocok dengan tools Anda: `"matcher": "Write|Edit"` untuk operasi file
12763. Konfirmkan tipe hook valid: `command`, `http`, `mcp_tool`, `prompt`, atau `agent`14803. Konfirmasi tipe hook valid: `command`, `http`, `mcp_tool`, `prompt`, atau `agent`
1277 1481
1278<h3 id="mcp-server-troubleshooting">1482<h3 id="mcp-server-troubleshooting">
1279 Troubleshooting MCP server1483 Troubleshooting server MCP
1280</h3>1484</h3>
1281 1485
1282**Server tidak dimulai**:1486**Server tidak memulai**:
1283 1487
12841. Periksa command ada dan dapat dieksekusi14881. Periksa command ada dan dapat dieksekusi
12852. Verifikasi semua jalur menggunakan variabel `${CLAUDE_PLUGIN_ROOT}`14892. Verifikasi semua path menggunakan variabel `${CLAUDE_PLUGIN_ROOT}`
12863. Periksa log MCP server: `claude --debug` menunjukkan kesalahan inisialisasi14903. Periksa log server MCP: `claude --debug` menampilkan kesalahan inisialisasi
12874. Uji server secara manual di luar Claude Code14914. Uji server secara manual di luar Claude Code
1288 1492
1289**Alat server tidak muncul**:1493**Tool server tidak muncul**:
1290 1494
12911. Pastikan server dikonfigurasi dengan benar di `.mcp.json` atau `plugin.json`14951. Pastikan server dikonfigurasi dengan benar di `.mcp.json` atau `plugin.json`
12922. Verifikasi server mengimplementasikan protokol MCP dengan benar14962. Verifikasi server mengimplementasikan protokol MCP dengan benar
1298 1502
1299**Gejala**: Plugin dimuat tetapi komponen (skills, agents, hooks) hilang.1503**Gejala**: Plugin dimuat tetapi komponen (skills, agents, hooks) hilang.
1300 1504
1301**Struktur yang benar**: Komponen harus berada di root plugin, bukan di dalam `.claude-plugin/`. Hanya `plugin.json` yang termasuk di `.claude-plugin/`.1505**Struktur yang benar**: Komponen harus berada di root plugin, bukan di dalam `.claude-plugin/`. Hanya `plugin.json` yang termasuk dalam `.claude-plugin/`.
1302
1303```text theme={null}
1304my-plugin/
1305├── .claude-plugin/
1306│ └── plugin.json ← Hanya manifest di sini
1307├── commands/ ← Di level root
1308├── agents/ ← Di level root
1309└── hooks/ ← Di level root
1310```
1311
1312Jika komponen Anda berada di dalam `.claude-plugin/`, pindahkan ke root plugin.
1313 1506
1314**Daftar periksa debug**:1507**Daftar periksa debug**:
1315 1508
1327 Manajemen versi1520 Manajemen versi
1328</h3>1521</h3>
1329 1522
1330Claude Code menggunakan versi plugin sebagai cache key yang menentukan apakah pembaruan tersedia. Ketika Anda menjalankan `/plugin update` atau auto-update dipicu, Claude Code menghitung versi saat ini dan melewati pembaruan jika cocok dengan apa yang sudah terpasang.1523Claude Code menggunakan versi plugin sebagai cache key yang menentukan apakah update tersedia. Ketika Anda menjalankan `/plugin update` atau auto-update aktif, Claude Code menghitung versi saat ini dan melewati update jika cocok dengan yang sudah terinstal.
1331 1524
1332Versi diselesaikan dari yang pertama dari ini yang diatur:1525Untuk setiap tipe sumber kecuali `command`, Claude Code menyelesaikan versi dari yang pertama dari ini yang diatur:
1333 1526
13341. Field `version` dalam `plugin.json` plugin15271. Field `version` dalam `plugin.json` plugin
13352. Field `version` dalam entri marketplace plugin dalam `marketplace.json`15282. Field `version` dalam entri marketplace plugin dalam `marketplace.json`
13363. Git commit SHA dari sumber plugin, untuk sumber `github`, `url`, `git-subdir`, dan relative-path dalam marketplace yang dihosting git15293. SHA commit git dari sumber plugin, untuk sumber `github`, `url`, `git-subdir`, dan relative-path dalam marketplace yang di-host git
13374. `unknown`, untuk sumber `npm` atau direktori lokal yang tidak berada dalam repositori git15304. Digest SHA-256, untuk [sumber `archive`](/docs/id/plugin-marketplaces#zip-archives): pin `sha256` dalam entri marketplace, atau digest dari file yang diunduh ketika Anda tidak menetapkan pin. Claude Code mempersingkatnya menjadi 12 karakter pertama
15315. `unknown`, untuk sumber `npm` atau direktori lokal yang tidak berada dalam repositori git
1338 1532
1339Ini memberi Anda dua cara untuk memberi versi pada plugin:1533Untuk [sumber `command`](/docs/id/plugin-marketplaces#command-sources), Claude Code selalu menurunkan versi dari apa yang dihasilkan perintah: hash konten 12-karakter sendiri, atau ditambahkan ke versi `plugin.json` sebagai `<version>-<hash>` ketika satu diatur. Claude Code mengabaikan field `version` entri marketplace untuk sumber command. Perintah yang output hash-nya berubah oleh karena itu menghasilkan versi baru, bahkan ketika string versi yang ditulis tetap sama. Dalam [link mode](/docs/id/plugin-marketplaces#copy-mode-and-link-mode), hash mencakup path nyata direktori yang dicetak dan entri tingkat atasnya daripada konten file.
1340 1534
1341| Pendekatan | Cara | Perilaku pembaruan | Terbaik untuk |1535Untuk tipe sumber tersebut, ini memberi Anda tiga cara untuk membuat versi plugin:
1342| :------------------- | :----------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------- |
1343| **Versi eksplisit** | Atur `"version": "2.1.0"` dalam `plugin.json` | Pengguna mendapatkan pembaruan hanya ketika Anda menaikkan field ini. Mendorong commit baru tanpa menaikkannya tidak berpengaruh, dan `/plugin update` melaporkan "already at the latest version". | Plugin yang dipublikasikan dengan siklus rilis stabil |
1344| **Versi commit-SHA** | Hilangkan `version` dari `plugin.json` dan entri marketplace | Pengguna mendapatkan pembaruan pada setiap commit baru ke sumber git plugin | Plugin internal atau tim di bawah pengembangan aktif |
1345 1536
1346<Warning>1537| Pendekatan | Cara | Perilaku update | Terbaik untuk |
1347 Jika Anda mengatur `version` dalam `plugin.json`, Anda harus menaikkannya setiap kali Anda ingin pengguna menerima perubahan. Mendorong commit baru saja tidak cukup, karena Claude Code melihat string versi yang sama dan menyimpan salinan yang di-cache. Jika Anda melakukan iterasi dengan cepat, biarkan `version` tidak diatur sehingga git commit SHA digunakan sebagai gantinya.1538| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- |
1348</Warning>1539| **Versi eksplisit** | Atur `"version": "2.1.0"` dalam `plugin.json` | Pengguna mendapatkan update hanya ketika Anda menaikkan field ini. Mendorong commit baru tanpa menaikkannya tidak berpengaruh, dan `/plugin update` melaporkan "already at the latest version". | Plugin yang dipublikasikan dengan siklus rilis stabil |
1540| **Versi commit-SHA** | Hilangkan `version` dari `plugin.json` dan entri marketplace | Pengguna mendapatkan update kapan pun commit yang diselesaikan sumber berubah | Plugin internal atau tim dalam pengembangan aktif |
1541| **Versi digest** | Gunakan [sumber `archive`](/docs/id/plugin-marketplaces#zip-archives) dan hilangkan `version` dari `plugin.json` dan entri marketplace | Dengan pin `sha256`, pengguna mendapatkan update ketika Anda mengubah pin. Tanpa satu, pengguna mendapatkan update kapan pun byte file zip yang di-host berubah | Plugin yang dipublikasikan sebagai file zip ke server statis atau repositori artefak |
1349 1542
1350Jika Anda menggunakan versi eksplisit, ikuti [semantic versioning](https://semver.org) (`MAJOR.MINOR.PATCH`): naikkan MAJOR untuk perubahan breaking, MINOR untuk fitur baru, PATCH untuk perbaikan bug. Dokumentasikan perubahan dalam `CHANGELOG.md`.1543Jika Anda menggunakan versi eksplisit, ikuti [semantic versioning](https://semver.org) (`MAJOR.MINOR.PATCH`): naikkan MAJOR untuk perubahan breaking, MINOR untuk fitur baru, PATCH untuk perbaikan bug. Dokumentasikan perubahan dalam `CHANGELOG.md`.
1351 1544