Gunakan referensi @file, allowed-tools, subagen, dan tool MCP untuk mengubah slash command dari pintasan jadi pustaka alur kerja tim.
Dua artikel sebelumnya membahas apa itu slash command (sebuah file Markdown) dan cara pakai prefix ! untuk menyuntikkan output shell ke context. Yang ini melangkah lebih jauh: bagaimana membuat satu command mengorkestrasi kapabilitas terkuat Claude Code — referensi file, subagen, tool MCP — sambil menjaga izin tetap terkendali.
Begitu sampai di lapisan ini, command bukan lagi sekadar "pintasan prompt", melainkan alur kerja kecil yang bisa dipakai ulang.
@file: injeksi statis yang lebih pas daripada !cat!cat file.md memang bisa menjejalkan isi file ke context, tapi ia lewat shell dan punya beberapa kelemahan: setiap pemicuan harus memunculkan subproses; path yang mengandung spasi atau karakter khusus butuh escape tambahan; dan Claude Code tidak mengenalinya sebagai "sebuah file", melainkan hanya sepotong teks.
Referensi @ sifatnya native:
---
description: Tinjau perubahan sesuai standar proyek
---
Rujuk standar berikut:
@.claude/context/coding-standards.md
@.claude/context/security-checklist.md
Sekarang tinjau perubahan di git diff dan tunjukkan setiap pelanggaran standar.
!`git diff HEAD`
@path memberitahu Claude Code untuk "melampirkan file ini ke percakapan sebagai attachment". Perbedaannya:
| Skenario | Pakai !cat |
Pakai @ |
|---|---|---|
Path datang dari argumen ($ARGUMENTS) |
✅ Hanya bisa !cat |
❌ @ tidak mendukung ekspansi variabel |
| Standar proyek tetap, template | ⚠️ Bisa, tapi berat | ✅ Native, hemat satu panggilan shell |
| Konten dinamis (diff, log, hasil test) | ✅ Wajib ! |
❌ Tidak bisa |
Pola aturannya: file statis pakai @, output dinamis pakai !, path berparameter pakai !cat $ARGUMENTS.
allowed-tools: memasang batas izin pada commandSecara default, saat command dijalankan, model bisa memakai semua tool yang ada di session. Kadang ini bukan yang Anda inginkan — misalnya /review adalah tugas tinjauan read-only, dan Anda tidak mau ia "iseng" mengubah satu baris kode sekalipun.
Tambahkan allowed-tools di frontmatter, maka selama command itu aktif hanya tool yang terdaftar yang boleh dipakai:
---
description: Tinjauan kode read-only
allowed-tools: Read, Grep, Glob, Bash(git diff:*), Bash(git log:*)
---
Tinjau perbedaan antara branch saat ini dan master, read-only tanpa perubahan.
!`git diff master...HEAD`
Beberapa poin kunci:
Bash(git diff:*) adalah izin berbutir halus — hanya mengizinkan panggilan bash yang diawali git diff, sementara git push akan diblokirRead / Grep / Glob secara eksplisit hanya memberi tool read-onlyEdit / Write tidak didaftarkan, jadi sekalipun model ingin mengubah kode, ia tidak punya aksesDengan cara serupa, command berwenang tinggi seperti /deploy bisa diotorisasi terbalik:
---
description: Deploy branch saat ini
allowed-tools: Bash(kamal deploy:*), Bash(git push:*), Read
---
Menetapkan "command ini boleh melakukan apa" di muka jauh lebih andal ketimbang mengandalkan review manual atas tiap prompt bash saat eksekusi.
Beberapa tugas bisa meledakkan context percakapan utama — menelusuri puluhan file untuk mencari semua pemanggil sebuah fungsi, menjalankan statistik codebase, menarik potongan log besar untuk dianalisis. Kalau dilakukan langsung di percakapan utama, ribuan baris output akan menempel di context, dan obrolan selanjutnya jadi lambat dan dungu.
Cara yang benar adalah menyerahkan pekerjaan semacam itu ke subagen: subagen berjalan di context terpisah, lalu hanya membawa kesimpulan kembali ke percakapan utama. Dalam command cukup instruksikan secara eksplisit:
---
description: Investigasi mendalam semua penggunaan suatu simbol
allowed-tools: Task
---
Pakai subagen Explore untuk menelusuri secara mendalam semua penggunaan simbol berikut: $ARGUMENTS
Minta subagen mencakup:
- Semua call site (termasuk file test)
- Skenario bisnis yang tersentuh
- Apakah ada implementasi alternatif yang setara
Setelah subagen kembali, cukup berikan saya ringkasan ≤300 kata, jangan tempelkan potongan kode mentah.
Picu /trace SomeClass#some_method, maka Claude Code akan memunculkan subagen Explore yang memindai codebase secara paralel, sementara percakapan utama hanya menerima kesimpulan yang sudah disarikan. Tanpa output grep, tanpa potongan file, context tetap bersih.
Trik lanjutan:
---
description: Investigasi paralel tiga opsi kandidat
allowed-tools: Task
---
Jalankan 3 subagen bersamaan untuk meneliti tiga jalur implementasi berikut:
1. Memakai ActiveJob + Sidekiq yang sudah ada
2. Memakai Solid Queue
3. Membangun queue ringan sendiri
Setiap agen menjawab: volume kerja, risiko, dan tingkat intrusi ke kode yang ada. Setelah ketiga kesimpulan masuk, saya yang akan membandingkannya.
Tiga subagen berjalan paralel, percakapan utama menunggu satu putaran hasil. Ini salah satu leverage terbesar yang diberikan command — mengubah tugas riset yang "butuh banyak token untuk sampai ke kesimpulan" menjadi alur kerja satu tombol.
Kalau session terhubung ke MCP server (Linear, GitHub, Sentry, proxy database internal, dsb.), command bisa langsung menginstruksikan model untuk memanggil tool tersebut:
---
description: Buat todo implementasi dari Linear issue
allowed-tools: mcp__linear__*, Read, Grep
---
Baca deskripsi lengkap dan komentar Linear issue $ARGUMENTS.
Dikombinasikan dengan kondisi codebase saat ini (cari sendiri file terkait dengan Grep/Read), susun daftar todo implementasi:
- File mana saja yang perlu diubah
- Tiap langkah dicommit terpisah atau sekaligus
- Ada ambiguitas yang perlu diklarifikasi dulu ke PM?
Jangan mulai menulis kode, hanya keluarkan rencana.
mcp__linear__* memberi izin ke semua tool Linear MCP, sehingga model bisa menarik detail issue, komentar, dan statusnya. Seluruh command ini jadi titik awal alur kerja "dari ticket ke rencana implementasi".
Poin penting: saat menulis nama tool MCP di allowed-tools, gunakan prefix lengkapnya (mcp__<server>__<tool>), kalau tidak izin tidak akan berlaku.
Kesalahpahaman yang sangat umum: menulis /test di dalam file /review dengan asumsi akan memicu command test. Tidak akan. Slash command hanya diekspansi sekali pada level input teratas dari pengguna; /xxx di dalam command hanyalah teks biasa — model akan membacanya, tapi Claude Code tidak akan mengeksekusinya.
Untuk mengkomposisi beberapa command, ada beberapa cara yang benar:
Cara A: Pindahkan logika bersama ke file context, masing-masing command rujuk dengan @ atau !cat
@.claude/context/review-checklist.md
@.claude/context/security-checklist.md
Cara B: Tulis eksplisit di command "lakukan seperti /review" + ulangi instruksi kunci
Tidak elegan, tapi efektif. Asal prompt-nya cukup jelas, model akan menempuh pola yang sama.
Cara C: Satu command memakai tool Task untuk memunculkan subagen, lalu prompt subagen memakai kembali set file context yang sama
Orkestrasi alur kerja sejati selalu lewat jalur ini. Command induk bertugas menjadwal dan meringkas, subagen yang menjalankan langkah konkret.
Anti-pattern yang harus dihindari: menulis command sepanjang ratusan baris yang mencoba menyelesaikan segalanya dalam satu instruksi. Setelah granularitasnya meledak, biaya pemeliharaan melonjak, dan anggaran token sekali jalan pun bakal habis oleh satu command saja.
Sampai di sini, mekanisme untuk menyuntikkan "kemampuan eksternal" ke command Claude Code sudah lengkap. Cara memilih:
| Kebutuhan | Mekanisme utama |
|---|---|
| Standar tetap, template, dokumen context | Referensi @file |
| Status real-time (diff, log, hasil test, query database) | Injeksi !shell |
| Konten file berparameter | !cat $ARGUMENTS |
| Riset boros context, pencarian lintas file | subagen via Task |
| Sistem eksternal (issue tracker, monitoring, data produksi) | Tool MCP + allowed-tools |
| Alur kerja multi-langkah serial/paralel | Command induk menjadwal subagen |
Batas izin dideklarasikan eksplisit lewat allowed-tools, apalagi untuk command yang dibagi dalam tim — menetapkan kemampuannya di muka lebih andal daripada bergantung pada persetujuan manual tiap kali.
Disatukan semuanya, lihat command "investigasi jalur implementasi berdasarkan Linear ticket":
---
description: Hasilkan rencana implementasi berdasarkan Linear ticket
allowed-tools: mcp__linear__*, Task, Read, Grep, Glob, Bash(git log:*)
---
## Context
@.claude/context/architecture.md
@.claude/context/coding-standards.md
## Status codebase saat ini
!`git log --oneline -10`
## Tugas
Tarik deskripsi, komentar, dan ticket terkait dari Linear ticket $ARGUMENTS.
Lalu jalankan dua subagen paralel:
1. Pertama: cari semua implementasi terkait yang sudah ada di codebase, serta modul yang bisa dipakai ulang
2. Kedua: evaluasi risiko — perubahan ini akan menyentuh jalur kode berlalu lintas tinggi mana, adakah celah cakupan test
Setelah kedua agen kembali, keluarkan:
- Langkah implementasi (tersusun menurut urutan dependensi)
- Daftar risiko
- Rekomendasi granularitas commit
Jangan mulai menulis kode.
Picu /plan ENG-4213, satu instruksi menuntaskan semuanya: tarik ticket → investigasi codebase paralel → evaluasi risiko → rangkum rencana. Yang perlu dilakukan pengguna hanyalah membaca kesimpulan lalu memutuskan untuk mulai kerja.
Inilah busur lengkap tiga artikel pertama seri slash command: mendefinisikan prompt yang bisa dipakai ulang (intro) → menyuntikkan context secara dinamis (context) → mengorkestrasi tool dan subagen (artikel ini). Sampai di lapisan ini, .claude/commands/ bukan lagi sekadar pintasan, melainkan pustaka alur kerja kecil milik tim.