agent-sdk/slash-commands.md +0 −594 deleted
File Deleted View Diff
1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# Slash Commands dalam SDK
6
7> Pelajari cara menggunakan slash commands untuk mengontrol sesi Claude Code melalui SDK
8
9Slash commands menyediakan cara untuk mengontrol sesi Claude Code dengan perintah khusus yang dimulai dengan `/`. Perintah-perintah ini dapat dikirim melalui SDK untuk melakukan tindakan seperti memadatkan konteks, mencantumkan penggunaan konteks, atau memanggil perintah khusus. Hanya perintah yang bekerja tanpa terminal interaktif yang dapat dikirim melalui SDK; pesan `system/init` mencantumkan yang tersedia di sesi Anda.
10
11<h2 id="discovering-available-slash-commands">
12 Menemukan Slash Commands yang Tersedia
13</h2>
14
15Claude Agent SDK menyediakan informasi tentang slash commands yang tersedia dalam pesan inisialisasi sistem. Akses informasi ini ketika sesi Anda dimulai:
16
17<CodeGroup>
18 ```typescript TypeScript theme={null}
19 import { query } from "@anthropic-ai/claude-agent-sdk";
20
21 for await (const message of query({
22 prompt: "Hello Claude",
23 options: { maxTurns: 1 }
24 })) {
25 if (message.type === "system" && message.subtype === "init") {
26 console.log("Available slash commands:", message.slash_commands);
27 // Includes built-in commands plus bundled skills, for example:
28 // ["clear", "compact", "context", "usage", "code-review", "verify", ...]
29 }
30 }
31 ```
32
33 ```python Python theme={null}
34 import asyncio
35 from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage
36
37
38 async def main():
39 async for message in query(prompt="Hello Claude", options=ClaudeAgentOptions(max_turns=1)):
40 if isinstance(message, SystemMessage) and message.subtype == "init":
41 print("Available slash commands:", message.data["slash_commands"])
42 # Includes built-in commands plus bundled skills, for example:
43 # ["clear", "compact", "context", "usage", "code-review", "verify", ...]
44
45
46 asyncio.run(main())
47 ```
48</CodeGroup>
49
50<h2 id="sending-slash-commands">
51 Mengirim Slash Commands
52</h2>
53
54Kirim slash commands dengan memasukkannya dalam string prompt Anda, seperti teks biasa. Perintah yang bertindak pada riwayat percakapan, seperti `/compact`, memerlukan pesan sebelumnya untuk bekerja, jadi contoh di bawah ini mengajukan pertanyaan terlebih dahulu dan kemudian mengirim perintah sebagai tindak lanjut ke percakapan yang sama:
55
56<CodeGroup>
57 ```typescript TypeScript theme={null}
58 import { query } from "@anthropic-ai/claude-agent-sdk";
59
60 // Build up conversation history first
61 try {
62 for await (const message of query({
63 prompt: "What does the README in this directory cover?",
64 options: { maxTurns: 2 }
65 })) {
66 if (message.type === "result" && message.subtype === "success") {
67 console.log(message.result);
68 }
69 }
70 } catch (error) {
71 // A single-shot query() throws after yielding an error result,
72 // so the follow-up query below still runs.
73 console.error(`Session ended with an error: ${error}`);
74 }
75
76 // Send a slash command as a follow-up to the same conversation
77 for await (const message of query({
78 prompt: "/compact",
79 options: { continue: true, maxTurns: 1 }
80 })) {
81 if (message.type === "result") {
82 console.log("Command executed, result subtype:", message.subtype);
83 // Example output: Command executed, result subtype: success
84 }
85 }
86 ```
87
88 ```python Python theme={null}
89 import asyncio
90 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
91
92
93 async def main():
94 # Build up conversation history first
95 try:
96 async for message in query(
97 prompt="What does the README in this directory cover?",
98 options=ClaudeAgentOptions(max_turns=2),
99 ):
100 if isinstance(message, ResultMessage) and message.subtype == "success":
101 print(message.result)
102 except Exception as error:
103 # A single-shot query() raises after yielding an error result,
104 # so the follow-up query below still runs.
105 print(f"Session ended with an error: {error}")
106
107 # Send a slash command as a follow-up to the same conversation
108 async for message in query(
109 prompt="/compact",
110 options=ClaudeAgentOptions(continue_conversation=True, max_turns=1),
111 ):
112 if isinstance(message, ResultMessage):
113 print("Command executed, result subtype:", message.subtype)
114 # Example output: Command executed, result subtype: success
115
116
117 asyncio.run(main())
118 ```
119</CodeGroup>
120
121<Note>
122 Kueri dapat berakhir dengan hasil kesalahan, misalnya ketika batas `maxTurns` / `max_turns` tercapai sebelum pekerjaan selesai. Pesan hasil akhir kemudian memiliki `is_error: true` dan subtipe kesalahan seperti `error_max_turns` alih-alih `success`.
123
124 Setelah menghasilkan pesan hasil akhir tersebut, SDK melempar kesalahan, karena proses CLI keluar dengan kode non-nol.
125
126 Bungkus loop dalam `try`/`catch` di TypeScript atau `try`/`except` di Python jika perintah Anda mungkin mencapai batas, seperti yang ditunjukkan dalam [Single Message Input](/id/agent-sdk/streaming-vs-single-mode#single-message-input), atau atur `maxTurns` cukup tinggi agar pekerjaan dapat selesai. Di Python, tangkap `Exception`: SDK menampilkan hasil kesalahan sebagai `Exception` biasa.
127</Note>
128
129<h2 id="common-slash-commands">
130 Slash Commands Umum
131</h2>
132
133<h3 id="/compact-compact-conversation-history">
134 `/compact` - Memadatkan Riwayat Percakapan
135</h3>
136
137Perintah `/compact` mengurangi ukuran riwayat percakapan Anda dengan merangkum pesan yang lebih lama sambil mempertahankan konteks penting. Pemadatan memerlukan percakapan yang sudah ada dengan setidaknya dua pertukaran sebelumnya untuk dirangkum. Contoh ini memiliki percakapan terlebih dahulu, kemudian memadatkannya dan membaca pesan sistem `compact_boundary` yang melaporkan hasilnya:
138
139<CodeGroup>
140 ```typescript TypeScript theme={null}
141 import { query } from "@anthropic-ai/claude-agent-sdk";
142
143 // Pemadatan memerlukan riwayat yang sudah ada, jadi mulai dengan percakapan terlebih dahulu
144 try {
145 for await (const message of query({
146 prompt: "Jelaskan apa yang dilakukan proyek ini",
147 options: { maxTurns: 2 }
148 })) {
149 if (message.type === "result" && message.subtype === "success") {
150 console.log(message.result);
151 }
152 }
153 } catch (error) {
154 // Satu query() sekali jalan melempar setelah menghasilkan hasil kesalahan,
155 // jadi query tindak lanjut di bawah masih berjalan.
156 console.error(`Sesi berakhir dengan kesalahan: ${error}`);
157 }
158
159 // Padatkan percakapan yang sama
160 for await (const message of query({
161 prompt: "/compact",
162 options: { continue: true, maxTurns: 1 }
163 })) {
164 if (message.type === "system" && message.subtype === "compact_boundary") {
165 console.log("Pemadatan selesai");
166 console.log("Token sebelum pemadatan:", message.compact_metadata.pre_tokens);
167 console.log("Pemicu:", message.compact_metadata.trigger);
168 // Contoh output:
169 // Pemadatan selesai
170 // Token sebelum pemadatan: 1842
171 // Pemicu: manual
172 }
173 }
174 ```
175
176 ```python Python theme={null}
177 import asyncio
178 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage, SystemMessage
179
180
181 async def main():
182 # Pemadatan memerlukan riwayat yang sudah ada, jadi mulai dengan percakapan terlebih dahulu
183 try:
184 async for message in query(
185 prompt="Jelaskan apa yang dilakukan proyek ini",
186 options=ClaudeAgentOptions(max_turns=2),
187 ):
188 if isinstance(message, ResultMessage) and message.subtype == "success":
189 print(message.result)
190 except Exception as error:
191 # Satu query() sekali jalan menaikkan setelah menghasilkan hasil kesalahan,
192 # jadi query tindak lanjut di bawah masih berjalan.
193 print(f"Sesi berakhir dengan kesalahan: {error}")
194
195 # Padatkan percakapan yang sama
196 async for message in query(
197 prompt="/compact",
198 options=ClaudeAgentOptions(continue_conversation=True, max_turns=1),
199 ):
200 if isinstance(message, SystemMessage) and message.subtype == "compact_boundary":
201 print("Pemadatan selesai")
202 print("Token sebelum pemadatan:", message.data["compact_metadata"]["pre_tokens"])
203 print("Pemicu:", message.data["compact_metadata"]["trigger"])
204 # Contoh output:
205 # Pemadatan selesai
206 # Token sebelum pemadatan: 1842
207 # Pemicu: manual
208
209
210 asyncio.run(main())
211 ```
212</CodeGroup>
213
214<Note>
215 Pesan `compact_boundary` hanya tiba ketika pemadatan berjalan. Tanpa ada yang dirangkum, `/compact` melaporkan alasannya sebagai gantinya dari menaikkan: jalannya masih berakhir dengan hasil `success`, tidak ada pesan `compact_boundary` yang dipancarkan, dan teks hasil membawa pesan, misalnya `Tidak cukup pesan untuk dipadatkan.` setelah satu pertukaran pendek. Panggilan `query()` sekali jalan yang segar dimulai dengan konteks kosong, jadi gunakan pola ini dalam sesi dengan putaran sebelumnya, misalnya dalam [mode input streaming](/id/agent-sdk/streaming-vs-single-mode) atau ketika melanjutkan sesi.
216</Note>
217
218<h3 id="/clear-reset-conversation-context">
219 `/clear` - Atur Ulang Konteks Percakapan
220</h3>
221
222Perintah `/clear` mengatur ulang percakapan ke konteks kosong, sehingga prompt berikutnya dimulai tanpa riwayat percakapan sebelumnya. Percakapan sebelumnya tetap tersimpan di disk dan dapat dikembalikan dengan melewatkan ID sesinya ke [opsi `resume`](/id/agent-sdk/sessions#resume-by-id).
223
224Ini berguna dalam [mode input streaming](/id/agent-sdk/streaming-vs-single-mode), di mana Anda mengirim beberapa prompt melalui satu koneksi. Untuk panggilan `query()` sekali jalan, setiap panggilan sudah dimulai dengan konteks kosong, jadi mengirim `/clear` tidak memiliki efek praktis; mulai `query()` baru sebagai gantinya.
225
226<Note>
227 `/clear` di SDK memerlukan Claude Code v2.1.117 atau lebih baru. Dalam versi sebelumnya, ini dihilangkan dari `slash_commands`.
228</Note>
229
230<h2 id="creating-custom-slash-commands">
231 Membuat Slash Commands Khusus
232</h2>
233
234Selain menggunakan slash commands bawaan, Anda dapat membuat perintah khusus Anda sendiri yang tersedia melalui SDK. Perintah khusus didefinisikan sebagai file markdown di direktori tertentu, mirip dengan cara subagents dikonfigurasi.
235
236<Note>
237 Direktori `.claude/commands/` adalah format warisan. Format yang direkomendasikan adalah `.claude/skills/<name>/SKILL.md`, yang mendukung invokasi slash-command yang sama (`/name`) ditambah invokasi otonom oleh Claude. Lihat [Skills](/id/agent-sdk/skills) untuk format saat ini. CLI terus mendukung kedua format, dan contoh di bawah tetap akurat untuk `.claude/commands/`.
238</Note>
239
240<h3 id="file-locations">
241 Lokasi File
242</h3>
243
244Slash commands khusus disimpan di direktori yang ditentukan berdasarkan cakupan mereka:
245
246* **Perintah proyek**: `.claude/commands/` - Tersedia hanya di proyek saat ini (warisan; lebih suka `.claude/skills/`)
247* **Perintah pribadi**: `~/.claude/commands/` - Tersedia di semua proyek Anda (warisan; lebih suka `~/.claude/skills/`)
248
249<h3 id="file-format">
250 Format File
251</h3>
252
253Setiap perintah khusus adalah file markdown di mana:
254
255* Nama file (tanpa ekstensi `.md`) menjadi nama perintah
256* Konten file mendefinisikan apa yang dilakukan perintah
257* Frontmatter YAML opsional menyediakan konfigurasi
258
259<h4 id="basic-example">
260 Contoh Dasar
261</h4>
262
263Buat direktori `.claude/commands` di proyek Anda jika belum ada, kemudian buat `.claude/commands/refactor.md`:
264
265```markdown theme={null}
266Refactor the selected code to improve readability and maintainability.
267Focus on clean code principles and best practices.
268```
269
270Ini membuat perintah `/refactor` yang dapat Anda gunakan melalui SDK.
271
272<h4 id="with-frontmatter">
273 Dengan Frontmatter
274</h4>
275
276Buat `.claude/commands/security-check.md`:
277
278```markdown theme={null}
279allowed-tools: Read, Grep, Glob
280description: Run security vulnerability scan
281model: claude-opus-4-8
282
283Analyze the codebase for security vulnerabilities including:
284- SQL injection risks
285- XSS vulnerabilities
286- Exposed credentials
287- Insecure configurations
288```
289
290<h3 id="using-custom-commands-in-the-sdk">
291 Menggunakan Custom Commands di SDK
292</h3>
293
294Setelah didefinisikan di sistem file, perintah khusus secara otomatis tersedia melalui SDK:
295
296<CodeGroup>
297 ```typescript TypeScript theme={null}
298 import { query } from "@anthropic-ai/claude-agent-sdk";
299
300 // Use a custom command
301 try {
302 for await (const message of query({
303 prompt: "/refactor src/auth/login.ts",
304 options: { maxTurns: 3 }
305 })) {
306 if (message.type === "assistant") {
307 console.log("Refactoring suggestions:", message.message);
308 }
309 }
310 } catch (error) {
311 // A single-shot query() throws after yielding an error result,
312 // so the second query below still runs.
313 console.error(`Session ended with an error: ${error}`);
314 }
315
316 // Custom commands appear in the slash_commands list
317 for await (const message of query({
318 prompt: "Hello",
319 options: { maxTurns: 1 }
320 })) {
321 if (message.type === "system" && message.subtype === "init") {
322 console.log("Available commands:", message.slash_commands);
323 // Includes built-in commands plus bundled skills and your custom commands, for example:
324 // ["clear", "compact", "context", "usage", "code-review", "verify", "refactor", "security-check", ...]
325 }
326 }
327 ```
328
329 ```python Python theme={null}
330 import asyncio
331 from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, SystemMessage
332
333
334 async def main():
335 # Use a custom command
336 try:
337 async for message in query(
338 prompt="/refactor src/auth/login.py", options=ClaudeAgentOptions(max_turns=3)
339 ):
340 if isinstance(message, AssistantMessage):
341 for block in message.content:
342 if hasattr(block, "text"):
343 print("Refactoring suggestions:", block.text)
344 except Exception as error:
345 # A single-shot query() raises after yielding an error result,
346 # so the second query below still runs.
347 print(f"Session ended with an error: {error}")
348
349 # Custom commands appear in the slash_commands list
350 async for message in query(prompt="Hello", options=ClaudeAgentOptions(max_turns=1)):
351 if isinstance(message, SystemMessage) and message.subtype == "init":
352 print("Available commands:", message.data["slash_commands"])
353 # Includes built-in commands plus bundled skills and your custom commands, for example:
354 # ["clear", "compact", "context", "usage", "code-review", "verify", "refactor", "security-check", ...]
355
356
357 asyncio.run(main())
358 ```
359</CodeGroup>
360
361<h3 id="advanced-features">
362 Fitur Lanjutan
363</h3>
364
365<h4 id="arguments-and-placeholders">
366 Argumen dan Placeholder
367</h4>
368
369Perintah khusus mendukung argumen dinamis menggunakan placeholder:
370
371Buat `.claude/commands/fix-issue.md`:
372
373```markdown theme={null}
374argument-hint: [issue-number] [priority]
375description: Fix a GitHub issue
376
377Fix issue #$0 with priority $1.
378Check the issue description and implement the necessary changes.
379```
380
381Gunakan di SDK:
382
383<CodeGroup>
384 ```typescript TypeScript theme={null}
385 import { query } from "@anthropic-ai/claude-agent-sdk";
386
387 // Pass arguments to custom command
388 for await (const message of query({
389 prompt: "/fix-issue 123 high",
390 options: { maxTurns: 5 }
391 })) {
392 // Command will process with $0="123" and $1="high"
393 if (message.type === "result" && message.subtype === "success") {
394 console.log("Issue fixed:", message.result);
395 }
396 }
397 ```
398
399 ```python Python theme={null}
400 import asyncio
401 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
402
403
404 async def main():
405 # Pass arguments to custom command
406 async for message in query(prompt="/fix-issue 123 high", options=ClaudeAgentOptions(max_turns=5)):
407 # Command will process with $0="123" and $1="high"
408 if isinstance(message, ResultMessage):
409 print("Issue fixed:", message.result)
410
411
412 asyncio.run(main())
413 ```
414</CodeGroup>
415
416<h4 id="bash-command-execution">
417 Eksekusi Perintah Bash
418</h4>
419
420Perintah khusus dapat mengeksekusi perintah bash dan menyertakan output mereka:
421
422Buat `.claude/commands/git-commit.md`:
423
424```markdown theme={null}
425allowed-tools: Bash(git add *), Bash(git status *), Bash(git commit *)
426description: Create a git commit
427
428## Context
429
430- Current status: !`git status`
431- Current diff: !`git diff HEAD`
432
433## Task
434
435Create a git commit with appropriate message based on the changes.
436```
437
438<h4 id="file-references">
439 Referensi File
440</h4>
441
442Sertakan konten file menggunakan awalan `@`:
443
444Buat `.claude/commands/review-config.md`:
445
446```markdown theme={null}
447description: Review configuration files
448
449Review the following configuration files for issues:
450- Package config: @package.json
451- TypeScript config: @tsconfig.json
452- Environment config: @.env
453
454Check for security issues, outdated dependencies, and misconfigurations.
455```
456
457<h3 id="organization-with-namespacing">
458 Organisasi dengan Namespacing
459</h3>
460
461Organisir perintah dalam subdirektori untuk struktur yang lebih baik:
462
463```bash theme={null}
464.claude/commands/
465├── frontend/
466│ ├── component.md # Creates /component (project:frontend)
467│ └── style-check.md # Creates /style-check (project:frontend)
468├── backend/
469│ ├── api-test.md # Creates /api-test (project:backend)
470│ └── db-migrate.md # Creates /db-migrate (project:backend)
471└── review.md # Creates /review (project)
472```
473
474Subdirektori muncul dalam deskripsi perintah tetapi tidak mempengaruhi nama perintah itu sendiri.
475
476<h3 id="practical-examples">
477 Contoh Praktis
478</h3>
479
480<h4 id="pull-request-review-command">
481 Perintah Pull Request Review
482</h4>
483
484Buat `.claude/commands/review-pr.md`:
485
486```markdown theme={null}
487allowed-tools: Read, Grep, Glob, Bash(git diff *)
488description: Comprehensive code review
489
490## Changed Files
491!`git diff --name-only HEAD~1`
492
493## Detailed Changes
494!`git diff HEAD~1`
495
496## Review Checklist
497
498Review the above changes for:
4991. Code quality and readability
5002. Security vulnerabilities
5013. Performance implications
5024. Test coverage
5035. Documentation completeness
504
505Provide specific, actionable feedback organized by priority.
506```
507
508<Note>
509 Claude Code mencakup skills `code-review` dan `verify` yang disertakan. Jika Anda memberi nama perintah khusus setelah salah satunya, misalnya `.claude/commands/code-review.md`, perintah Anda menimpa skill yang disertakan dan `slash_commands` mencantumkan nama sekali.
510</Note>
511
512<h4 id="test-runner-command">
513 Perintah Test Runner
514</h4>
515
516Buat `.claude/commands/test.md`:
517
518```markdown theme={null}
519allowed-tools: Bash, Read, Edit
520argument-hint: [test-pattern]
521description: Run tests with optional pattern
522
523Run tests matching pattern: $ARGUMENTS
524
5251. Detect the test framework (Jest, pytest, etc.)
5262. Run tests with the provided pattern
5273. If tests fail, analyze and fix them
5284. Re-run to verify fixes
529```
530
531Gunakan perintah-perintah ini melalui SDK:
532
533<CodeGroup>
534 ```typescript TypeScript theme={null}
535 import { query } from "@anthropic-ai/claude-agent-sdk";
536
537 // Run code review
538 try {
539 for await (const message of query({
540 prompt: "/review-pr",
541 options: { maxTurns: 3 }
542 })) {
543 // Process review feedback
544 }
545 } catch (error) {
546 // A single-shot query() throws after yielding an error result,
547 // so the second query below still runs.
548 console.error(`Session ended with an error: ${error}`);
549 }
550
551 // Run specific tests
552 for await (const message of query({
553 prompt: "/test auth",
554 options: { maxTurns: 5 }
555 })) {
556 // Handle test results
557 }
558 ```
559
560 ```python Python theme={null}
561 import asyncio
562 from claude_agent_sdk import query, ClaudeAgentOptions
563
564
565 async def main():
566 # Run code review
567 try:
568 async for message in query(prompt="/review-pr", options=ClaudeAgentOptions(max_turns=3)):
569 # Process review feedback
570 pass
571 except Exception as error:
572 # A single-shot query() raises after yielding an error result,
573 # so the second query below still runs.
574 print(f"Session ended with an error: {error}")
575
576 # Run specific tests
577 async for message in query(prompt="/test auth", options=ClaudeAgentOptions(max_turns=5)):
578 # Handle test results
579 pass
580
581
582 asyncio.run(main())
583 ```
584</CodeGroup>
585
586<h2 id="see-also">
587 Lihat Juga
588</h2>
589
590* [Slash Commands](/id/skills) - Dokumentasi slash command lengkap
591* [Subagents dalam SDK](/id/agent-sdk/subagents) - Konfigurasi berbasis sistem file serupa untuk subagents
592* [Referensi TypeScript SDK](/id/agent-sdk/typescript) - Dokumentasi API lengkap
593* [Gambaran umum SDK](/id/agent-sdk/overview) - Konsep SDK umum
594* [Referensi CLI](/id/cli-reference) - Antarmuka baris perintah