Free

Dari Slash Commands ke Skills: Kapan dan Bagaimana Bermigrasi

Custom commands telah digabung ke dalam Skills. Kapan bermigrasi ke `.claude/skills/` dan apa yang didapat.


Tiga tulisan sebelumnya membahas slash command secara lengkap: dari file Markdown, ke injeksi !command, sampai orkestrasi subagent dan MCP. Semua itu masih berlaku—tapi di balik layar, tim resmi melakukan penggabungan: custom commands sudah dilebur ke dalam Skills.

.claude/commands/review.md kamu masih jalan, /review masih bisa dipakai, tidak ada yang perlu diubah. Tapi kalau kamu ingin command itu tumbuh dengan kemampuan lebih (banyak file, eksekusi fork, aktivasi otomatis berdasarkan path), jalur barunya adalah .claude/skills/review/SKILL.md. Tulisan ini menjelaskan dua hal: bagaimana cara migrasi, dan kapan migrasi itu layak.


Migrasi minimal: ubah satu path, sisanya biarkan

Janji kompatibilitas dari pihak resmi sudah jelas: .claude/commands/deploy.md dan .claude/skills/deploy/SKILL.md keduanya akan terdaftar sebagai /deploy, dengan fungsi yang sama persis. Kalau namanya bentrok, skills yang menang.

Langkah migrasi minimal:

cd .claude/commands
mkdir -p ../skills/review
mv review.md ../skills/review/SKILL.md

Isi file tidak perlu diubah satu baris pun. YAML frontmatter, !`command`, @file, $ARGUMENTS—semuanya kompatibel.

Tapi kalau cuma sampai di sini, pembaca pasti bertanya: lalu buat apa migrasi? Jawabannya: direktori skill bisa berisi banyak file, sedangkan command cuma satu.


Kenapa harus bermigrasi: empat hal ekstra dari SKILL.md

1. File pendukung: pisahkan dokumen yang panjang

SKILL.md adalah pintu masuk, dan direktori yang sama bisa menampung file pendukung apa pun. Bayangkan struktur seperti ini:

.claude/skills/review/
├── SKILL.md            # pintu masuk, instruksi singkat + referensi
├── checklist.md        # checklist code review yang panjang
├── examples/
│   └── good-diff.md    # contoh yang baik
└── scripts/
    └── lint.sh         # script yang bisa dipanggil SKILL.md

Rujuk file pendukung dengan path relatif di dalam SKILL.md:

Tinjau diff saat ini, ikuti standar di [checklist.md](checklist.md).
Lihat [examples/good-diff.md](examples/good-diff.md) untuk format output yang diharapkan.

File pendukung ini tidak otomatis masuk ke context—Claude hanya membacanya saat dibutuhkan. Saran resminya, SKILL.md dijaga di bawah 500 baris, sisanya dipindah ke file pendukung.

2. disable-model-invocation: skill mana yang hanya boleh kamu picu manual

Secara default, Claude akan memanggil skill apa pun saat momen yang pas. Ini berbahaya untuk command yang punya efek samping seperti /deploy, /commit, /send-email—kamu tidak mau Claude "lihat kodenya enak lalu langsung deploy".

---
name: deploy
description: Deploy ke production
disable-model-invocation: true
allowed-tools: Bash(kamal deploy:*), Bash(git push:*)
---

Setelah baris ini ditambahkan, /deploy hanya bisa dipicu manual oleh kamu; Claude tidak akan memanggilnya sendiri di tengah percakapan.

Sebaliknya, user-invocable: false berarti "hanya Claude yang boleh memanggilnya, tapi tidak muncul di menu /"—cocok untuk skill yang sifatnya pengetahuan latar (misalnya legacy-system-context: Claude memuatnya otomatis di skenario yang relevan, tapi tidak ada gunanya kamu picu manual).

3. context: fork: jalankan skill di dalam subagent

Ini upgrade terbesarnya. Di tulisan sebelumnya disebutkan kalau command bisa memakai allowed-tools: Task untuk menyuruh model menjalankan subagent—tapi kamu harus mendeskripsikan "buka Explore subagent untuk melakukan..." secara manual di dalam prompt.

SKILL menyelesaikannya dengan satu baris frontmatter:

---
name: deep-research
description: Riset mendalam sebuah simbol
context: fork
agent: Explore
---

Teliti semua penggunaan $ARGUMENTS:
- Semua titik pemanggilan
- Skenario bisnis
- Implementasi alternatif

Kembalikan ringkasan ≤300 kata.

Saat /deep-research SomeClass dipicu: seluruh SKILL.md menjadi prompt sebuah subagent independen, dieksekusi dengan agent type Explore, dan saat selesai hanya kesimpulannya yang dikembalikan. Context percakapan utama tetap bersih total.

Artinya, "membuka subagent" yang tadinya berupa deskripsi teks di dalam prompt, sekarang menjadi atribut deklaratif sebuah skill.

4. paths: aktivasi otomatis berdasarkan tipe file

---
name: rails-conventions
description: Konvensi coding untuk proyek Rails
paths: ["app/**/*.rb", "config/**/*.rb"]
---

Ikuti konvensi Rails di proyek ini:
- Gunakan service object, bukan fat controller
- ActiveRecord scope harus dinamai
...

Saat kamu sedang menyunting app/models/user.rb, skill ini otomatis masuk ke context; saat menyunting package.json, tidak. Lebih presisi daripada CLAUDE.md yang sifatnya global—anggap saja ini "CLAUDE.md berlapis berdasarkan path".


Praktik: upgrade /plan menjadi skill

Contoh /plan di akhir tulisan sebelumnya awalnya adalah command satu file:

.claude/commands/plan.md

Upgrade jadi skill:

.claude/skills/plan/
├── SKILL.md
├── research-prompt.md     # instruksi untuk subagent 1
└── risk-prompt.md         # instruksi untuk subagent 2

SKILL.md:

---
name: plan
description: Hasilkan rencana implementasi dari Linear ticket
disable-model-invocation: true
allowed-tools: mcp__linear__*, Task, Read, Grep, Bash(git log:*)
---

## Context

@.claude/context/architecture.md

## Status

!`git log --oneline -10`

## Tugas

Ambil deskripsi dan komentar dari Linear ticket $ARGUMENTS.

Pakai Task untuk menjalankan dua subagent paralel:
1. Riset kode: prompt ada di [research-prompt.md](research-prompt.md)
2. Penilaian risiko: prompt ada di [risk-prompt.md](risk-prompt.md)

Rangkum hasil keduanya, lalu keluarkan langkah implementasi + daftar risiko + saran granularitas commit.

Prompt untuk kedua subagent ditaruh di file terpisah; kalau butuh perbaikan, kamu ubah satu file tanpa menyentuh SKILL.md. SKILL.md sendiri tetap rapi di bawah 30 baris, sedangkan file pendukung boleh panjang ratusan baris.

Kalau kamu tidak mau repot menjadwalkan subagent sendiri, ada versi yang lebih radikal—lempar seluruh skill ke dalam fork dan biarkan Explore agent mengeksekusinya sekaligus:

---
name: plan
context: fork
agent: Explore
allowed-tools: mcp__linear__*
---

Picu /plan ENG-4213 → Explore agent di context terpisah mengambil seluruh isi SKILL.md sebagai tugas → hanya rencana akhir yang dikembalikan. Percakapan utama tetap bersih.


Kapan sebaiknya tidak migrasi

Tidak semua command layak di-upgrade. Kondisi yang tetap lebih cocok tinggal di .claude/commands/:

  • Satu Markdown saja sudah cukup: tidak ada checklist, examples, atau scripts yang perlu dipisah
  • Tidak butuh eksekusi fork: tugasnya terkait erat dengan percakapan utama dan perlu melihat seluruh histori
  • Tidak butuh aktivasi otomatis by path: memang dipicu manual oleh user
  • Tidak butuh kontrol akses: aman saja kalau Claude memanggilnya sendiri

/commit, /pr-desc dan sejenisnya cuma butuh frontmatter plus beberapa baris prompt—ditaruh di .claude/commands/ justru lebih lurus. Pihak resmi sudah menegaskan kedua bentuk hidup berdampingan, dan tidak ada yang akan di-deprecate.


Keadaan saat keduanya hidup bersama

Susunan .claude/ yang paling rapi sekarang:

.claude/
├── commands/           # ringan: satu file + prompt sederhana
│   ├── commit.md
│   └── pr-desc.md
├── skills/             # berat: banyak file / fork / kontrol izin
│   ├── plan/
│   │   ├── SKILL.md
│   │   ├── research-prompt.md
│   │   └── risk-prompt.md
│   ├── deploy/
│   │   └── SKILL.md    # disable-model-invocation
│   └── rails-conventions/
│       └── SKILL.md    # aktivasi otomatis via paths glob
└── context/
    └── coding-standards.md

Jangan main migrasi semua sekaligus. Pemicu migrasi adalah "command ini mulai menggelembung"—isinya melebihi 200 baris, perlu memecah dokumen, atau ingin dijalankan di subagent. Saat itu datang, baru pindah path-nya; beberapa menit beres.


Ringkasan

Kemampuan yang diinginkan commands/ skills/
Shortcut prompt satu file
!`command` / @file / $ARGUMENTS
Kontrol izin via allowed-tools
File pendukung (reference, scripts)
disable-model-invocation anti-salah-picu
context: fork + agent: eksekusi terisolasi
Aktivasi otomatis via paths: glob

Tiga kemampuan pertama setara antara commands dan skills; empat kemampuan sisanya eksklusif milik skills. Pakai yang kamu butuh, kalau tidak butuh ya tidak usah repot.

Jalur resmi memang mulai condong ke skills, tapi janji kompatibilitas commands/ sudah jelas—ini bukan perubahan "pindah sekarang atau mati", melainkan perluasan yang memberi kemampuan baru tanpa memaksa. Pahami perbedaannya, migrasi sesuai kebutuhan, dan jangan kejar kerapian yang cuma di permukaan.