@file referansları, allowed-tools, alt ajanlar ve MCP araçlarıyla slash command'ları kısayollardan ekip iş akışı kütüphanesine yükselt.
İlk iki yazı slash command'ın ne olduğunu (bir Markdown dosyası) ve ! önekiyle shell çıktısını context'e nasıl enjekte edeceğinizi anlatıyordu. Bu yazı daha ileri gidiyor: tek bir command Claude Code'un en güçlü yeteneklerini — dosya referansları, alt ajanlar, MCP araçları — nasıl orkestre eder ve izinleri nasıl kontrol altında tutarsınız.
Bu katmana geldiğinizde command artık yalnızca bir "prompt kısayolu" değil, yeniden kullanılabilir küçük iş akışlarına dönüşür.
@file referansı: !cat'ten daha uygun statik enjeksiyon!cat file.md dosya içeriğini context'e tıkabilir ama shell üzerinden gider ve birkaç dezavantajı vardır: her tetiklemede bir alt süreç doğurmak gerekir; dosya yolunda boşluk veya özel karakter varsa ekstra escape şart olur; ve Claude Code bunu "bir dosya" olarak tanımaz, yalnızca bir metin parçası olarak görür.
@ referansı ise native'dir:
---
description: Değişiklikleri proje kurallarına göre incele
---
Aşağıdaki standartlara bak:
@.claude/context/coding-standards.md
@.claude/context/security-checklist.md
Şimdi git diff'teki değişiklikleri incele ve kurala aykırı olan her yeri işaret et.
!`git diff HEAD`
@path Claude Code'a "bu dosyayı konuşmaya bir ek olarak ilişkilendir" der. Farklar:
| Senaryo | !cat kullan |
@ kullan |
|---|---|---|
Yol bir argümandan geliyor ($ARGUMENTS) |
✅ Yalnızca !cat olur |
❌ @ değişken genişletmeyi desteklemez |
| Sabit proje standartları, şablonlar | ⚠️ Olur ama ağır | ✅ Native, bir shell çağrısı kazanır |
| Dinamik içerik (diff, log, test sonucu) | ✅ ! şart |
❌ Olmaz |
Kural: statik dosyalar için @, dinamik çıktı için !, parametreli yollar için !cat $ARGUMENTS.
allowed-tools: command'a izin sınırı koymakVarsayılanda command çalışırken model, session'daki tüm araçları kullanabilir. Bazen bu istediğiniz şey değildir — örneğin /review salt okunur bir inceleme görevidir, "bu arada" tek bir satır kodu bile değiştirmesini istemezsiniz.
Frontmatter'a allowed-tools ekleyin; command etkin olduğu sürece yalnızca listelenen araçlara izin verilir:
---
description: Salt okunur kod incelemesi
allowed-tools: Read, Grep, Glob, Bash(git diff:*), Bash(git log:*)
---
Mevcut branch ile master arasındaki farkı yalnızca okuyarak incele, değişiklik yapma.
!`git diff master...HEAD`
Birkaç önemli nokta:
Bash(git diff:*) ince taneli yetkilendirmedir — yalnızca git diff ile başlayan bash çağrılarına izin verir, git push engellenirRead / Grep / Glob açıkça yalnızca salt okunur araçları verirEdit / Write listelenmediğinden model kodu değiştirmek istese bile çağıramazBenzer biçimde, /deploy gibi yüksek yetkili bir command'a ters yönde yetki verilebilir:
---
description: Mevcut branch'i deploy et
allowed-tools: Bash(kamal deploy:*), Bash(git push:*), Read
---
"Bu command neleri yapabilir" i önceden sabitlemek, her çalıştırmada bash istemlerini elle onaylamaya bel bağlamaktan çok daha güvenilirdir.
Bazı görevler ana konuşmanın context'ini patlatır — bir fonksiyonun tüm çağrı noktalarını bulmak için onlarca dosyayı taramak, codebase istatistikleri çıkarmak, analiz için büyük bir log parçası çekmek. Bunu doğrudan ana konuşmada yaparsanız binlerce satır çıktı context'te kalır ve sonraki turlarda konuşma yavaşlar, zekası düşer.
Doğru yaklaşım, bu işi bir subagent'a devretmektir: subagent bağımsız bir context'te koşar ve yalnızca sonucu ana konuşmaya geri getirir. Command içinde açıkça talimat vermek yeterlidir:
---
description: Bir sembolün tüm kullanımlarını derinlemesine araştır
allowed-tools: Task
---
Explore subagent'ını kullanarak aşağıdaki sembolün tüm kullanımlarını derinlemesine araştır: $ARGUMENTS
Subagent'tan şunları kapsamasını iste:
- Tüm çağrı noktaları (test dosyaları dahil)
- Dokunulan iş senaryoları
- Eşdeğer alternatif bir implementasyon var mı
Subagent döndüğünde bana yalnızca ≤300 kelimelik bir özet ver, ham kod parçaları yapıştırma.
/trace SomeClass#some_method'u tetiklediğinizde Claude Code bir Explore subagent'ı başlatır, codebase'i paralel tarar ve ana konuşmaya yalnızca damıtılmış sonuç döner. Grep çıktısı yok, dosya parçaları yok, context tertemiz.
Daha ileri oyun:
---
description: Üç aday çözümü paralel araştır
allowed-tools: Task
---
Aynı anda 3 subagent ayağa kaldır, sırasıyla aşağıdaki üç implementasyon yolunu araştırsınlar:
1. Mevcut ActiveJob + Sidekiq ile
2. Solid Queue ile
3. Hafif bir queue'yu kendi yazarak
Her ajan şu soruları cevaplasın: iş yükü, risk, mevcut koda ne kadar müdahale. Üç sonuç da elime geçtiğinde karşılaştırmayı ben yapacağım.
Üç subagent paralel koşar, ana konuşma tek bir turluk sonuç bekler. Bu command'ın sunduğu en büyük kaldıraçlardan biridir — "sonuca ulaşmak için çok token harcayan" araştırma görevlerini tek dokunuşla tetiklenen iş akışlarına çevirir.
Session'a bir MCP server bağlıysa (Linear, GitHub, Sentry, kendi yazdığınız veritabanı proxy'si vb.), command doğrudan modele bu araçları çağırmasını söyleyebilir:
---
description: Linear issue'ya göre implementasyon todo'su üret
allowed-tools: mcp__linear__*, Read, Grep
---
Linear issue $ARGUMENTS'ın tam açıklamasını ve yorumlarını oku.
Codebase'in mevcut durumuyla birleştirerek (ilgili dosyaları Grep/Read ile kendin bul), implementasyon için bir todo listesi çıkar:
- Hangi dosyalar değişecek
- Her adım ayrı commit mi, birlikte mi gidecek
- Önce PM ile netleştirilmesi gereken bir belirsizlik var mı
Kod yazmaya başlama, yalnızca planı çıkar.
mcp__linear__* tüm Linear MCP araçlarına izin verir; model issue ayrıntılarını, yorumları ve durumu çekebilir. Tüm command "ticket'tan implementasyon planına" bir iş akışının başlangıç noktasına dönüşür.
Kritik nokta: allowed-tools içinde MCP aracı adını yazarken tam önekiyle yazmalısınız (mcp__<server>__<tool>), aksi halde yetkilendirme işlemez.
Çok yaygın bir yanılgı: /review dosyasına /test yazmak ve bunun test command'ını tetikleyeceğini sanmak. Tetiklemez. Slash command yalnızca kullanıcının en üst seviye girdisinde bir kez genişletilir; command'ın içindeki /xxx yalnızca sıradan bir metindir — model onu okur ama Claude Code çalıştırmaya gitmez.
Birden fazla command'ı birleştirmek için birkaç doğru yol vardır:
Yol A: Ortak mantığı bir context dosyasına ayırın, her command @ veya !cat ile referansla çeksin
@.claude/context/review-checklist.md
@.claude/context/security-checklist.md
Yol B: Command içinde açıkça "tıpkı /review gibi yap" deyin + kritik talimatları tekrarlayın
Zarif değil ama işe yarar. Prompt yeterince net olduğu sürece model aynı rotayı izler.
Yol C: Bir command Task aracıyla subagent başlatsın, subagent'ın prompt'u aynı context dosyalarını yeniden kullansın
Gerçek iş akışı orkestrasyonu hep bu yoldan geçer. Ana command zamanlama ve özetlemeyle, subagent somut adımları yürütmekle sorumlu olur.
Kaçınılması gereken anti-pattern: command'ı yüzlerce satır uzunluğunda yazıp tek bir talimatla her şeyi yapmaya çalışmak. Granülarite bir kez bozulduğunda bakım maliyeti fırlar ve tek bir çalıştırma tokan bütçesini tek bir command bitirir.
Buraya kadar Claude Code'da command'a "dış yetenek" enjekte etmenin mekanizmaları temelde tamamlandı. Nasıl seçeceğinize dair:
| İhtiyaç | Tercih edilen mekanizma |
|---|---|
| Sabit standartlar, şablonlar, context belgeleri | @file referansı |
| Gerçek zamanlı durum (diff, log, test sonucu, DB sorgusu) | !shell enjeksiyonu |
| Parametreli dosya içeriği | !cat $ARGUMENTS |
| Context yiyen araştırma, dosyalar arası arama | Task üzerinden subagent |
| Dış sistem (issue tracker, monitoring, production verisi) | MCP araçları + allowed-tools |
| Çok adımlı seri/paralel iş akışı | Ana command'ın subagent zamanlaması |
İzin sınırları allowed-tools ile açıkça bildirilir — özellikle takımca paylaşılan command'lar için: neleri yapabileceğini önceden yazmak, her seferinde elle onaya güvenmekten daha sağlamdır.
Hepsini birleştirip bir "Linear ticket'a göre implementasyon yolu araştır" command'ına bakalım:
---
description: Linear ticket'a dayalı uygulama planı üret
allowed-tools: mcp__linear__*, Task, Read, Grep, Glob, Bash(git log:*)
---
## Context
@.claude/context/architecture.md
@.claude/context/coding-standards.md
## Mevcut codebase durumu
!`git log --oneline -10`
## Görev
Linear ticket $ARGUMENTS'ın açıklamasını, yorumlarını ve ilişkili ticket'larını çek.
Sonra iki subagent'ı paralel olarak başlat:
1. Birincisi: codebase'de mevcut ilgili tüm implementasyonları, yeniden kullanılabilecek modülleri bulsun
2. İkincisi: riski değerlendirsin — bu değişiklik hangi yüksek trafikli kod yollarına dokunacak, test coverage açığı var mı
İki ajan da döndükten sonra şunları çıkar:
- Uygulama adımları (bağımlılık sırasına göre dizilmiş)
- Risk listesi
- Önerilen commit granülaritesi
Kod yazmaya başlama.
/plan ENG-4213'ü tetiklediğinizde tek bir komutla her şey biter: ticket'ı çek → codebase'i paralel araştır → riski değerlendir → planı topla. Kullanıcının yapması gereken tek şey sonucu okuyup işe koyulup koyulmayacağına karar vermek.
Slash command serisinin ilk üç yazısının eksiksiz yayı böyledir: yeniden kullanılabilir prompt'ları tanımlamak (intro) → context'i dinamik olarak enjekte etmek (context) → araçları ve alt ajanları orkestre etmek (bu yazı). Bu katmana geldiğinizde .claude/commands/ artık bir kısayol değil, ekibinizin küçük iş akışı kütüphanesidir.