Slash Commands dalam SDK
Pelajari cara menggunakan slash commands untuk mengontrol sesi Claude Code melalui SDK
Slash 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.
Menemukan Slash Commands yang Tersedia
Claude Agent SDK menyediakan informasi tentang slash commands yang tersedia dalam pesan inisialisasi sistem. Akses informasi ini ketika sesi Anda dimulai:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Hello Claude",
options: { maxTurns: 1 }
})) {
if (message.type === "system" && message.subtype === "init") {
console.log("Available slash commands:", message.slash_commands);
// Includes built-in commands plus bundled skills, for example:
// ["clear", "compact", "context", "usage", "code-review", "verify", ...]
}
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, SystemMessage
async def main():
async for message in query(prompt="Hello Claude", options=ClaudeAgentOptions(max_turns=1)):
if isinstance(message, SystemMessage) and message.subtype == "init":
print("Available slash commands:", message.data["slash_commands"])
# Includes built-in commands plus bundled skills, for example:
# ["clear", "compact", "context", "usage", "code-review", "verify", ...]
asyncio.run(main())
Mengirim Slash Commands
Kirim 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:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Build up conversation history first
try {
for await (const message of query({
prompt: "What does the README in this directory cover?",
options: { maxTurns: 2 }
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
} catch (error) {
// A single-shot query() throws after yielding an error result,
// so the follow-up query below still runs.
console.error(`Session ended with an error: ${error}`);
}
// Send a slash command as a follow-up to the same conversation
for await (const message of query({
prompt: "/compact",
options: { continue: true, maxTurns: 1 }
})) {
if (message.type === "result") {
console.log("Command executed, result subtype:", message.subtype);
// Example output: Command executed, result subtype: success
}
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
async def main():
# Build up conversation history first
try:
async for message in query(
prompt="What does the README in this directory cover?",
options=ClaudeAgentOptions(max_turns=2),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
except Exception as error:
# A single-shot query() raises after yielding an error result,
# so the follow-up query below still runs.
print(f"Session ended with an error: {error}")
# Send a slash command as a follow-up to the same conversation
async for message in query(
prompt="/compact",
options=ClaudeAgentOptions(continue_conversation=True, max_turns=1),
):
if isinstance(message, ResultMessage):
print("Command executed, result subtype:", message.subtype)
# Example output: Command executed, result subtype: success
asyncio.run(main())
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.
Setelah menghasilkan pesan hasil akhir tersebut, SDK melempar kesalahan, karena proses CLI keluar dengan kode non-nol.
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, atau atur maxTurns cukup tinggi agar pekerjaan dapat selesai. Di Python, tangkap Exception: SDK menampilkan hasil kesalahan sebagai Exception biasa.
Slash Commands Umum
`/compact` - Memadatkan Riwayat Percakapan
Perintah /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:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Pemadatan memerlukan riwayat yang sudah ada, jadi mulai dengan percakapan terlebih dahulu
try {
for await (const message of query({
prompt: "Jelaskan apa yang dilakukan proyek ini",
options: { maxTurns: 2 }
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
} catch (error) {
// Satu query() sekali jalan melempar setelah menghasilkan hasil kesalahan,
// jadi query tindak lanjut di bawah masih berjalan.
console.error(`Sesi berakhir dengan kesalahan: ${error}`);
}
// Padatkan percakapan yang sama
for await (const message of query({
prompt: "/compact",
options: { continue: true, maxTurns: 1 }
})) {
if (message.type === "system" && message.subtype === "compact_boundary") {
console.log("Pemadatan selesai");
console.log("Token sebelum pemadatan:", message.compact_metadata.pre_tokens);
console.log("Pemicu:", message.compact_metadata.trigger);
// Contoh output:
// Pemadatan selesai
// Token sebelum pemadatan: 1842
// Pemicu: manual
}
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage, SystemMessage
async def main():
# Pemadatan memerlukan riwayat yang sudah ada, jadi mulai dengan percakapan terlebih dahulu
try:
async for message in query(
prompt="Jelaskan apa yang dilakukan proyek ini",
options=ClaudeAgentOptions(max_turns=2),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
except Exception as error:
# Satu query() sekali jalan menaikkan setelah menghasilkan hasil kesalahan,
# jadi query tindak lanjut di bawah masih berjalan.
print(f"Sesi berakhir dengan kesalahan: {error}")
# Padatkan percakapan yang sama
async for message in query(
prompt="/compact",
options=ClaudeAgentOptions(continue_conversation=True, max_turns=1),
):
if isinstance(message, SystemMessage) and message.subtype == "compact_boundary":
print("Pemadatan selesai")
print("Token sebelum pemadatan:", message.data["compact_metadata"]["pre_tokens"])
print("Pemicu:", message.data["compact_metadata"]["trigger"])
# Contoh output:
# Pemadatan selesai
# Token sebelum pemadatan: 1842
# Pemicu: manual
asyncio.run(main())
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 atau ketika melanjutkan sesi.
`/clear` - Atur Ulang Konteks Percakapan
Perintah /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.
Ini berguna dalam mode input streaming, 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.
/clear di SDK memerlukan Claude Code v2.1.117 atau lebih baru. Dalam versi sebelumnya, ini dihilangkan dari slash_commands.
Membuat Slash Commands Khusus
Selain 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.
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 untuk format saat ini. CLI terus mendukung kedua format, dan contoh di bawah tetap akurat untuk .claude/commands/.
Lokasi File
Slash commands khusus disimpan di direktori yang ditentukan berdasarkan cakupan mereka:
- Perintah proyek:
.claude/commands/- Tersedia hanya di proyek saat ini (warisan; lebih suka.claude/skills/) - Perintah pribadi:
~/.claude/commands/- Tersedia di semua proyek Anda (warisan; lebih suka~/.claude/skills/)
Format File
Setiap perintah khusus adalah file markdown di mana:
- Nama file (tanpa ekstensi
.md) menjadi nama perintah - Konten file mendefinisikan apa yang dilakukan perintah
- Frontmatter YAML opsional menyediakan konfigurasi
Contoh Dasar
Buat direktori .claude/commands di proyek Anda jika belum ada, kemudian buat .claude/commands/refactor.md:
Refactor the selected code to improve readability and maintainability.
Focus on clean code principles and best practices.
Ini membuat perintah /refactor yang dapat Anda gunakan melalui SDK.
Dengan Frontmatter
Buat .claude/commands/security-check.md:
---
allowed-tools: Read, Grep, Glob
description: Run security vulnerability scan
model: claude-opus-4-8
---
Analyze the codebase for security vulnerabilities including:
- SQL injection risks
- XSS vulnerabilities
- Exposed credentials
- Insecure configurations
Menggunakan Custom Commands di SDK
Setelah didefinisikan di sistem file, perintah khusus secara otomatis tersedia melalui SDK:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Use a custom command
try {
for await (const message of query({
prompt: "/refactor src/auth/login.ts",
options: { maxTurns: 3 }
})) {
if (message.type === "assistant") {
console.log("Refactoring suggestions:", message.message);
}
}
} catch (error) {
// A single-shot query() throws after yielding an error result,
// so the second query below still runs.
console.error(`Session ended with an error: ${error}`);
}
// Custom commands appear in the slash_commands list
for await (const message of query({
prompt: "Hello",
options: { maxTurns: 1 }
})) {
if (message.type === "system" && message.subtype === "init") {
console.log("Available commands:", message.slash_commands);
// Includes built-in commands plus bundled skills and your custom commands, for example:
// ["clear", "compact", "context", "usage", "code-review", "verify", "refactor", "security-check", ...]
}
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, SystemMessage
async def main():
# Use a custom command
try:
async for message in query(
prompt="/refactor src/auth/login.py", options=ClaudeAgentOptions(max_turns=3)
):
if isinstance(message, AssistantMessage):
for block in message.content:
if hasattr(block, "text"):
print("Refactoring suggestions:", block.text)
except Exception as error:
# A single-shot query() raises after yielding an error result,
# so the second query below still runs.
print(f"Session ended with an error: {error}")
# Custom commands appear in the slash_commands list
async for message in query(prompt="Hello", options=ClaudeAgentOptions(max_turns=1)):
if isinstance(message, SystemMessage) and message.subtype == "init":
print("Available commands:", message.data["slash_commands"])
# Includes built-in commands plus bundled skills and your custom commands, for example:
# ["clear", "compact", "context", "usage", "code-review", "verify", "refactor", "security-check", ...]
asyncio.run(main())
Fitur Lanjutan
Argumen dan Placeholder
Perintah khusus mendukung argumen dinamis menggunakan placeholder:
Buat .claude/commands/fix-issue.md:
---
argument-hint: [issue-number] [priority]
description: Fix a GitHub issue
---
Fix issue #$0 with priority $1.
Check the issue description and implement the necessary changes.
Gunakan di SDK:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Pass arguments to custom command
for await (const message of query({
prompt: "/fix-issue 123 high",
options: { maxTurns: 5 }
})) {
// Command will process with $0="123" and $1="high"
if (message.type === "result" && message.subtype === "success") {
console.log("Issue fixed:", message.result);
}
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
async def main():
# Pass arguments to custom command
async for message in query(prompt="/fix-issue 123 high", options=ClaudeAgentOptions(max_turns=5)):
# Command will process with $0="123" and $1="high"
if isinstance(message, ResultMessage):
print("Issue fixed:", message.result)
asyncio.run(main())
Eksekusi Perintah Bash
Perintah khusus dapat mengeksekusi perintah bash dan menyertakan output mereka:
Buat .claude/commands/git-commit.md:
---
allowed-tools: Bash(git add *), Bash(git status *), Bash(git commit *)
description: Create a git commit
---
## Context
- Current status: !`git status`
- Current diff: !`git diff HEAD`
## Task
Create a git commit with appropriate message based on the changes.
Referensi File
Sertakan konten file menggunakan awalan @:
Buat .claude/commands/review-config.md:
---
description: Review configuration files
---
Review the following configuration files for issues:
- Package config: @package.json
- TypeScript config: @tsconfig.json
- Environment config: @.env
Check for security issues, outdated dependencies, and misconfigurations.
Organisasi dengan Namespacing
Organisir perintah dalam subdirektori untuk struktur yang lebih baik:
.claude/commands/
├── frontend/
│ ├── component.md # Creates /component (project:frontend)
│ └── style-check.md # Creates /style-check (project:frontend)
├── backend/
│ ├── api-test.md # Creates /api-test (project:backend)
│ └── db-migrate.md # Creates /db-migrate (project:backend)
└── review.md # Creates /review (project)
Subdirektori muncul dalam deskripsi perintah tetapi tidak mempengaruhi nama perintah itu sendiri.
Contoh Praktis
Perintah Pull Request Review
Buat .claude/commands/review-pr.md:
---
allowed-tools: Read, Grep, Glob, Bash(git diff *)
description: Comprehensive code review
---
## Changed Files
!`git diff --name-only HEAD~1`
## Detailed Changes
!`git diff HEAD~1`
## Review Checklist
Review the above changes for:
1. Code quality and readability
2. Security vulnerabilities
3. Performance implications
4. Test coverage
5. Documentation completeness
Provide specific, actionable feedback organized by priority.
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.
Perintah Test Runner
Buat .claude/commands/test.md:
---
allowed-tools: Bash, Read, Edit
argument-hint: [test-pattern]
description: Run tests with optional pattern
---
Run tests matching pattern: $ARGUMENTS
1. Detect the test framework (Jest, pytest, etc.)
2. Run tests with the provided pattern
3. If tests fail, analyze and fix them
4. Re-run to verify fixes
Gunakan perintah-perintah ini melalui SDK:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Run code review
try {
for await (const message of query({
prompt: "/review-pr",
options: { maxTurns: 3 }
})) {
// Process review feedback
}
} catch (error) {
// A single-shot query() throws after yielding an error result,
// so the second query below still runs.
console.error(`Session ended with an error: ${error}`);
}
// Run specific tests
for await (const message of query({
prompt: "/test auth",
options: { maxTurns: 5 }
})) {
// Handle test results
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
# Run code review
try:
async for message in query(prompt="/review-pr", options=ClaudeAgentOptions(max_turns=3)):
# Process review feedback
pass
except Exception as error:
# A single-shot query() raises after yielding an error result,
# so the second query below still runs.
print(f"Session ended with an error: {error}")
# Run specific tests
async for message in query(prompt="/test auth", options=ClaudeAgentOptions(max_turns=5)):
# Handle test results
pass
asyncio.run(main())
Lihat Juga
- Slash Commands - Dokumentasi slash command lengkap
- Subagents dalam SDK - Konfigurasi berbasis sistem file serupa untuk subagents
- Referensi TypeScript SDK - Dokumentasi API lengkap
- Gambaran umum SDK - Konsep SDK umum
- Referensi CLI - Antarmuka baris perintah