İçeriğe atla

Agent Skill'leri Prosedürdür, Proje Bilgisi Değil

Skill, model görevi açıklamasıyla eşleştirdiğinde ya da siz adını yazdığınızda yüklenir. SKILL.md prosedürü taşısın, proje bilgilerini repodan okusun.

Ayhan Sipahi Ayhan Sipahi

Deploy komutunu, bulut bölgesini, staging URL’sini ve duyuru kanalını içine gömen bir SKILL.md yalnızca tek bir repoda doğrudur. Claude Code, Cursor, GitHub Copilot, OpenAI Codex ve Gemini CLI artık aynı SKILL.md formatını okuyor; Claude Code için tek bir symlink eklenince klasör de ortak oluyor. Klasör araçlar ve repolar arasında dolaşıyor, içine gömülü her bilgi de diğer repoların hepsinde aynı anda eskiyor. Bu kaymanın nedeni yapısal: skill klasörü taşınabiliyor, yol kapsamlı kurallar taşınamıyor, bilgiler de taşınabilen tek dosyaya akıyor.

Bir skill’in iki tetikleyicisi vardır: ya adını yazarsınız ya da model görevinizi skill’in açıklamasıyla eşleştirir. İkisi de bir dosyaya dokunuldu diye devreye girmez. Stil rehberi gibi tek bir prosedürün dışında da geçerli olması gereken bilgiler, her zaman çalışan ya da eşleşen bir yolda çalışan bir tetikleyici ister. Yalnızca tek bir prosedürün ihtiyaç duyduğu bilgiler o prosedürle birlikte yüklenebilir. Yine de skill klasörü onların da evi değildir. Bu klasör repolar ve araçlar arasında dolaşan katmandır ve aynı bilginin çoğu zaman başka okuyucuları da vardır. Dolayısıyla bilgiler skill’lere ait değildir. Skill bir prosedürdür; bilgileri talimat dosyasından, yol kapsamlı bir kuraldan, talimatların işaret ettiği bir repo dosyasından ya da çağrı argümanlarından okur. Skill’in aşağıda ele alınan paths alanı yalnızca skill’in ne zaman önerileceğini daraltır.

Bu yazı, birden fazla kodlama ajanı için skill klasörü ve talimat dosyası bakımı yapan okurlar için. Skill’deki her satıra uygulanacak iki soruluk bir test ve beş araçta her bağlam türünün evi var. Ardından öncesi ve sonrasıyla tek bir release skill’i, kuralın esnediği durumlar ve bu sitedeki eski bir yazının düzeltmesi geliyor.

Her Katmanın Kendi Tetikleyicisi#

Ajan yapılandırmasının her katmanının kendi tetikleyicisi vardır ve katmanın neyi güvenle taşıyabileceğine bu tetikleyici karar verir. Her oturumda yüklenen talimat dosyası (CLAUDE.md, AGENTS.md, GEMINI.md ya da copilot-instructions.md) her oturumun başında okunur. Yol kapsamlı bir kural, ajan desenine uyan bir dosyayla çalıştığında yüklenir. Çağrı argümanları ve enjekte edilen komut çıktısı tek bir çağrı boyunca yaşar. Skill ise açıklama eşleşmesiyle ya da yazılan adla yüklenir. Claude Code’un karşılaştırma tablosu bu tetikleyiciyi “You typing /<name>, or Claude matching the description to your task” diye yazar. Pratikte ikisi de garantili değildir: model eşleşmeyi kaçırabilir, insan da adı unutabilir.

Üreticiler de eşleşmeye garanti vermez. Claude Code’un özellik genel bakışına göre açıklamalar belirsiz olduğunda ya da çakıştığında Claude yanlış skill’i yükleyebilir ya da işe yarayacak olanı kaçırabilir. VS Code’un Copilot belgeleri sonucu açıkça yazar: “Discovery makes skills available to the model but does not guarantee that it invokes a skill for every relevant prompt.” Claude Code, skill içeriğinin kaybolması için iki yol daha ekler. Skill sayısı arttığında açıklamalar, modelin context penceresinin %1’i kadar olan karakter bütçesine sığmak için listeden düşer. Compaction sonrasında çağrılmış skill’ler her biri ilk 5.000 token’la ve toplam 25.000 token’lık ortak bütçeyle geri gelir; proje kökündeki CLAUDE.md ise diskten eksiksiz yeniden okunur.

Tetikleyicilerden üç bağlam türü çıkar. Evrensel bağlam her repoda geçerlidir: canary rollout’un nasıl işlediği, PDF formlarının yapısı, herkese açık bir API’nin referansı. Yerel bağlam bu repo, bu ekip ya da bu makine için geçerlidir: build komutu, deploy hedefi, dil listesi, bildirim kanalı, stil rehberi. Anlık bağlam yalnızca bu oturum için geçerlidir: hedef ortam, güncel diff, sürüm, ticket. Skill’in içinde yalnızca ilk tür yaşayabilir ve herhangi bir satır için test kısadır. Bu satır bir sonraki repoda yanlış olur mu? O zaman yerel bağlamdır. Bir sonraki oturumda yanlış olur mu? O zaman anlık bağlamdır. Skill’e yalnızca iki soruyu da geçen satırlar aittir.

Aksi Yönü Gösteren İki Resmi Cümle#

Resmi belgelerdeki iki cümle, proje bilgilerini skill’lerde saklamaya izin veriyormuş gibi okunur. İkisine de aynı belgelerden yanıt verilebilir.

agentskills.io’daki Agent Skills genel bakışı şöyle der: “Skills solve this by packaging procedural knowledge and company-, team-, and user-specific context into portable, version-controlled folders that agents load on demand.” Yani skill’ler prosedürel bilgiyi ve şirkete, ekibe, kullanıcıya özgü bağlamı, ajanların talep üzerine yüklediği taşınabilir ve sürüm kontrollü klasörlere paketler. Cümle, bir skill’in bağlam taşıyabileceği konusunda haklı; asıl soru hangi bağlamı taşıdığı. Talep üzerine yükleme, yalnızca prosedürün dışında da geçerli olması gereken bağlam için sorundur. Standardın kendi etkinleştirme adımı da bunu gösterir: ajan, görev skill’in açıklamasıyla eşleştiğinde SKILL.md talimatlarının tamamını context’e okur. Her düzenlemede gereken bir stil rehberi bu yüzden atlanabilir. Release komutu ise yalnızca release sırasında gerekir; tam gerektiği anda yüklenir.

Yalnızca tek bir prosedürün ihtiyaç duyduğu bilgiler için iki itiraz kalır: taşınabilirlik ve kopya. Standart, bir skill’i bir kez yazıp skill uyumlu her ajanda kullanabileceğinizi vaat eder. Dolayısıyla tek bir projenin deploy komutunu taşıyan skill her ajana taşınır ve tek bir repoda doğrudur. Üstelik skill bu komutun tek okuyucusu da değildir. CI aynı komutu çalıştırır, elle release yapan biri de aynı notları okur; skill’deki kopya ikinci bir kopyadır. Reposundan hiç çıkmayan bir skill birinci itirazı ortadan kaldırır, ikincisini kaldırmaz. Skill yazma pratiği bu cümleyi zaten daha dar yorumluyor. obra/superpowers içindeki writing-skills rehberi, skill yazma gerekçeleri arasında “Pattern applies broadly (not project-specific)” maddesini sayar. Yazmama gerekçeleri arasında ise “Project-specific conventions (put in your instructions file)” maddesi var.

Cümle tek bir ölçekte geçerlidir. Bir organizasyonun tamamına dağıtılan bir skill, gittiği her repoda değişmeyen bilgileri taşıyabilir, çünkü karar testi o ölçekte geçer. Bir sonraki repo aynı organizasyonun başka bir reposudur ve satır orada da doğru kalır. Tek bir reponun istisnaya ihtiyaç duyduğu anda o bilgi reponun talimat dosyasına taşınır ve skill onu oradan okur.

İkinci cümle Anthropic’in. Claude Code’un özellik genel bakışı şöyle der: “Skills can be reference or action. Reference skills provide knowledge Claude uses throughout your session (like your API style guide). Action skills tell Claude to do something specific (like /deploy that runs your deployment workflow).” Yani skill’ler referans ya da eylem olabilir; referans skill’ler oturum boyunca kullanılan bilgiyi, örneğin API stil rehberinizi, sağlar. Oysa stil rehberi yol tetikleyicili yerel bağlamdır: eşleşen dosyalar düzenlendiğinde geçerlidir. Referans skill ona semantik bir tetikleyici verir; böylece rehber ancak model skill’i hatırladığında uygulanır. Anthropic’in başka rehberleri de yol tetikleyicisini işaret ediyor. Memory belgeleri bir CLAUDE.md girdisi için şunu söyler: “If an entry is a multi-step procedure or only matters for one part of the codebase, move it to a skill or a path-scoped rule instead.” Steering yazısı daha ileri gider: “As the file grows, push team-specific conventions into path-scoped rules and procedures into skills, where they load only when relevant.”

Bu sitedeki eski bir yazı, Claude Code Skill’leri ve Bağlam Penceresi Şişmesi, iki tablo satırında tam tersini önermişti. “Görev projenin özel kurallarını gerektiriyor” sinyali için “Bu kuralları kodlayan bir skill yaz” diyordu. “CLAUDE.md 200 satırı aşıyor” sinyali için “Denetle ve evrensel olmayan kuralları skill’lere taşı” diyordu. İki satır da her oturumda yüklenen token’lardan tasarruf etmek için bilgileri semantik bir tetikleyiciye taşıyordu; oysa yol kapsamlı kurallar aynı tasarrufu bu takas olmadan sağlar. Düzeltilmiş satırlar şöyle: kuralları talimat dosyasına ya da yol kapsamlı bir kurala koyun, skill onları adlandırıp oradan okusun. Dosya büyüdüğünde kod tabanının tek bir bölümünü ilgilendiren kuralları yol kapsamlı kurallara, çok adımlı prosedürleri skill’lere taşıyın ve bilgileri skill’lerin dışında tutun.

Her Bağlam Türünün Yaşadığı Yer#

Beş aracın hepsinde her tetikleyici türünün bir evi var, ama dosyalar da yükleme kuralları da araçtan araca değişiyor. Tablo dört katmanı Ekim 2026 itibarıyla eşler ve her hücre, kaynaklarda listelenen üretici sayfasından geliyor. Son sütun için bir not var. Gemini CLI belgelerindeki uyarıya göre ücretsiz katman ve Google One kullanıcıları 18 Haziran 2026’da Antigravity CLI’a taşındı. O sütun, Gemini CLI’ı hâlâ sunan ücretli katmanlar için geçerli.

KatmanClaude CodeCursorGitHub CopilotCodexGemini CLI
Her oturumda yüklenen bilgilerCLAUDE.md ve paths alanı olmayan .claude/rules/*.md; CLAUDE.md ya da CLAUDE.local.md yoksa AGENTS.md (v2.1.277 ve sonrası) ya da @AGENTS.md import’ualwaysApply: true olan .cursor/rules/*.mdc; kökteki AGENTS.md.github/copilot-instructions.md; AGENTS.md ya da repo kökünde tek bir CLAUDE.md veya GEMINI.md~/.codex/AGENTS.md ve proje kökünden çalışma dizinine inen AGENTS.md zinciri; varsayılan üst sınır 32 KiB~/.gemini/, çalışma alanı ve üst dizinlerdeki GEMINI.md; context.fileName ile AGENTS.md eklenebilir
Yol kapsamlı bilgilerpaths: alanı olan .claude/rules/*.md, eşleşen dosyada Read, Write ya da Edit anında yüklenir; alt dizindeki CLAUDE.md, Claude orada çalışmaya başlayıncaglobs alanı olan .mdc; o dizindeki dosyalar için iç içe AGENTS.mdapplyTo alanı olan .github/instructions/*.instructions.md; en yakın AGENTS.md öncelik alıriç içe AGENTS.md ya da AGENTS.override.md, başlangıçta kökten başlatma dizinine bir kez zincirleniriç içe GEMINI.md, bir araç o dizine eriştiğinde keşfedilir
Prosedürler.claude/skills/, ~/.claude/skills/, iç içe <altdizin>/.claude/skills/, plugin’ler, yönetilen; skill başına symlink belgelenmiş, .agents/skills/ listede yok.agents/skills/, .cursor/skills/; ayrıca .claude/skills/ ve .codex/skills/ okunur.github/skills/, .claude/skills/, .agents/skills/; kişisel ~/.copilot/skills/, ~/.agents/skills/çalışma dizininden repo köküne kadar her dizindeki .agents/skills/; ~/.agents/skills/; /etc/codex/skills.gemini/skills/ ya da .agents/skills/ (aynı katmanda .agents kazanır); ~ altında aynı çift
Anlık bağlam$ARGUMENTS, $ARGUMENTS[N] ya da $N, adlandırılmış arguments; !`cmd` model skill’i okumadan önce çalışır/skill-name ile aynı mesajda gönderilen metin; ikame belgelenmemiş/skill-name sonrasına yazılan ek bağlam; argument-hint; ikame belgelenmemişprompt içinde $skill-name anması; ikame belgelenmemişmodel açıklama eşleşmesinde activate_skill çağırır, kullanıcı onaylar; argüman kanalı belgelenmemiş

GitHub Copilot birkaç yüzeyden oluşur ve tablodaki sütunu bunları bir araya getirir. GitHub’ın destek tablosu, hangi talimat dosyalarının okunduğunu yüzey yüzey listeler ve bu listeler yüzeyden yüzeye değişir.

Bir ev her araçta aynıdır. Yalnızca tek bir prosedürün ihtiyaç duyduğu bir bilgi sıradan bir repo dosyasında durabilir. Her oturumda yüklenen dosya tek satırla bu dosyaya işaret eder, skill de onu çalışırken okur. Aşağıdaki release örneği bu evi kullanır.

Claude Code’un auto memory’si tek bir makine için hatırlatma aracıdır. Claude Code belgeleri “Auto memory is machine-local.” der ve dosyalarının makineler ya da bulut ortamları arasında paylaşılmadığını ekler; ekip bilgileri bu yüzden repoya giren dosyalarda kalır.

bilgiler

bilgiler

bilgiler

değerler

Her oturum

Talimat dosyası

Kapsamdaki eşleşen yol

Yol kapsamlı kural

Skill çalışırken okunur

Talimatların işaret ettiği repo dosyası

Bu çağrı

Argümanlar ve enjekte edilen çıktı

Skill: yalnızca prosedür

Açıklama eşleşmesi ya da yazılan ad

Her oturumda yüklenen satır pahalı olandır ve bilgileri dışarı iten de budur. CLAUDE.md her istekte token harcar. Memory belgeleri dosya başına 200 satırın altını hedefler, çünkü daha uzun dosyalar daha çok context tüketir ve uyumu düşürür. Codex ise AGENTS.md zincirini project_doc_max_bytes sınırında, varsayılan olarak 32 KiB’de keser. Yol kapsamlı satır bu büyümeyi tetikleyici türünü değiştirmeden karşılar, ama bedeli farklıdır. En az taşınabilen katmandır: beş sözdizimi ve dört ayrı anlam. Claude Code ve Cursor kuralı dosyaya dokunulunca yükler. Copilot applyTo glob’larını eşleştirir ve en yakın AGENTS.md dosyasını tercih eder. Codex başlatma dizinine bakar, Gemini CLI ise dizine erişilince yükler. Hiç eşleşmeyen bir glob ise sessizce başarısız olur. Claude Code’un InstructionsLoaded hook’u tam da bu hata için var: hangi CLAUDE.md ve kural dosyalarının ne zaman ve neden yüklendiğini kaydeder.

Prosedürler satırı en taşınabilir olanıdır: dört araç .agents/skills/ dizinini olduğu gibi okur, Claude Code ise .claude/skills/ altındaki skill başına symlink üzerinden okur. Bilgileri taşınabilir katmanın dışında tutmanın nedeni de bu asimetridir. Taşınan kopya, bilginin yanlış olduğu repolara varan kopyadır. Format taşınır, davranış ise ancak kısmen taşınır: spesifikasyonun frontmatter alanları her araçta geçerlidir, paths, context: fork, argüman ikamesi ve enjeksiyon ise araca özgü eklentilerdir. Yerleşimin talimat dosyası tarafı (paylaşılan AGENTS.md, symlink’ler ve @AGENTS.md import’u) için tek yapılandırma yazısına bakın.

Ad çözümlemesi bir neden daha ekler. Skill’ler ada göre birbirini ezer ve her araç çakışmayı farklı çözer. Claude Code’da “Enterprise over personal, and personal over project”, yani bir ekip arkadaşının kişisel release skill’i, o kişinin oturumlarında projedekinin yerine geçer. Gemini CLI’da “the version from the higher-precedence location is used” ve çalışma alanı kullanıcının üstündedir. Codex ikisini birleştirmez; ikisi de skill seçicide görünebilir. Her oturumda yüklenen dosyalar farklı davranır; Claude Code’un CLAUDE.md dosyaları “are additive: all levels contribute content to Claude’s context simultaneously.” Skill içindeki bir bilgi aynı adlı bir skill tarafından bütünüyle değiştirilebilir; talimat dosyasındaki bilgi değiştirilemez.

Release Skill’i Öncesi ve Sonrası#

Girişteki skill, bütün bilgiler içine gömülü haliyle:

---
name: release
description: Deploy the web app. Use when the user asks to ship, deploy, or release.
---

# Release

1. Run `pnpm run deploy -- --env staging --region eu-central-1`.
2. Wait for the `deploy.yml` workflow to pass.
3. Confirm `https://staging.example.com/healthz` returns 200.
4. Post the changelog excerpt to `#releases` in Slack.

Her satır iki sorudan geçer:

SatırBir sonraki repoda yanlış mı?Bir sonraki oturumda yanlış mı?Karar
pnpm run deploy, eu-central-1evethayıryerel bağlam
--env staginghayırevetanlık bağlam
deploy.ymlevethayıryerel bağlam
https://staging.example.com/healthzevetevetyerel ve anlık bağlam
#releasesevethayıryerel bağlam
deploy et, CI’ı bekle, sağlığı kontrol et, duyurhayırhayırskill

Yalnızca son satır testi geçer. Yeni sürüm prosedürü korur ve beklediği bilgileri adlandırır; kanonik kopya .agents/skills/release/SKILL.md içinde yaşar:

---
name: release
description: Release the project to a target environment using the project's documented release process, then verify and announce it. Use when the user asks to ship, deploy, or cut a release.
---

# Release

Target environment: the one named in the request ($ARGUMENTS). If none is named, ask.
Previous release tag (closest tag reachable from HEAD): !`git describe --tags --abbrev=0 2>/dev/null || echo "none"`

The project instructions point to a release doc. This skill expects six facts from it:
the release command, the version source, the CI workflow that gates a release,
each environment's base URL, the health check, and the announcement convention.

1. Read the release doc and find those facts for the target environment.
   If any is missing, stop and ask. Do not guess.
2. Confirm the working tree is clean. Read the version to release from the version
   source and check that it is newer than the previous tag above. If that line still
   shows a command, run it. "none" means this is the first release.
3. If the target is production, show the commands you will run and wait for an explicit yes.
4. Run the release command for the target environment.
5. Wait for the CI workflow to finish. If it fails, report the failing job and stop.
6. Run the health check against the target environment's base URL.
7. Draft the announcement following the project's convention and show it to the
   user before posting.

Skill’deki the project instructions ifadesi bilerek araçtan bağımsız: çalışan aracın yüklediği CLAUDE.md, AGENTS.md, GEMINI.md ya da copilot-instructions.md dosyalarından hangisiyse onu kasteder. Skill artık bilgi adlarını taşır ve değerleri çalışırken getirir. Anthropic’in context engineering rehberi aynı deseni, hafif tanımlayıcılar (dosya yolları, kayıtlı sorgular, web bağlantıları) tutup içeriği çalışma anında getiren ajanlar için anlatır. Bedeli incelemede görünür: inceleyen kişi bir yerine iki dosya okur ve skill tek başına değerlendirilemez. Karşılığında eksik bir bilgi hemen belli olur, çünkü skill durup sorar; gömülü bayat bir bilgi ise sessizce yanlış sonuç verir. Release’in yan etkileri olduğu için Claude Code belgeleri disable-model-invocation: true ayarını da önerir (“Use disable-model-invocation: true for skills with side effects.”). Cursor ve VS Code aynı alanı belgeler; Codex ise agents/openai.yaml içinde allow_implicit_invocation: false kullanır. Bu ayar açıklama tetikleyicisini kaldırır ve geriye yalnızca yazılan adı bırakır. Ama bu bir koruma değildir: elle yazılan /release production yine çalışır. Üçüncü adım bu yüzden production’dan önce onay ister; kesin engel ise CI’da ya da bir hook’ta durur ve bir sonraki bölüm bunu ele alıyor.

Bilgiler repodaki bir release belgesine taşınır. Her oturumda yüklenen dosya bu belgeye işaret eden tek bir satır tutar. Burada bu dosya, CLAUDE.md’nin @AGENTS.md ile import ettiği ya da CLAUDE.md yokken Claude Code’un doğrudan okuduğu AGENTS.md:

## Release

- Release process, environments, and settings: `docs/RELEASE.md`

Her oturum yalnızca bu satırın bedelini öder; değerlerin bedelini yalnızca release öder. Release belgesi değerleri ortam bazında tutar:

# Release

- Release command: `pnpm run deploy -- --env <environment>`
- Version source: the `version` field in `package.json`
- CI gate: the `deploy.yml` workflow must pass
- Environments and base URLs:
  - staging: `https://staging.example.com`
  - production: `https://example.com`
- Health check: `GET /healthz` on the environment's base URL, expect 200
- Announcement: post the changelog excerpt to `#releases`

Elle release yapan biri de aynı dosyayı okur; böylece her bilgi tek bir yerde durur. Bir deploy komutunun iki kopyası zamanla birbirinden ayrılır ve Claude Code’un memory belgeleri uyarır: “if two instructions contradict each other, Claude may pick one arbitrarily.” Cursor’ın rules belgeleri genel çözümü verir: “Reference files instead of copying their contents. This keeps rules short and prevents them from becoming stale as code changes.”

Bölge release yolundan tamamen çıkar. Deploy betiği bölgeyi ve hesabı infra/config.ts dosyasından okur; release komutunda --region parametresi olmamasının nedeni budur. Betiğiniz bu parametreyi istiyorsa, değerin nereden geleceğini release belgesi söyler. Bir ajan altyapı kodunu düzenlerken değeri tek yerde tutan şey yol kapsamlı bir kuraldır. Claude Code’da bu kural .claude/rules/infra.md dosyasıdır:

---
paths:
  - "infra/**"
---

# Infrastructure

- Region, account IDs, and stack names live in `infra/config.ts`. Read them there; do not copy them into other files.

Aynı kural Cursor’da globs: infra/** ve alwaysApply: false alanlı .cursor/rules/infra.mdc ya da iç içe bir infra/AGENTS.md olur. Copilot’ta applyTo: "infra/**" alanlı .github/instructions/infra.instructions.md olur. Codex’te infra/AGENTS.md olur ve Codex infra/ içinde ya da altında başlatıldığında uygulanır. Gemini CLI’da ise infra/GEMINI.md olur. Ortam çağrı argümanı olarak gelir; release etiketi ise enjeksiyonla ya da skill’in adını verdiği komutla.

$ARGUMENTS ve !`komut` Claude Code eklentileridir; skills sayfası “Claude Code extends the standard with additional features like invocation control, subagent execution, and dynamic context injection.” der. Spesifikasyon argüman ikamesi tanımlamaz, diğer dört araç da belgelemez. Bu yüzden yeni sürüm her yer tutucuyu, yer tutucu düz metin olarak kalsa bile işleyen bir cümleyle eşler. Ortam, istekte adı geçen ortamdır. Etiket satırı ya render edilmiştir ya da hâlâ komutu gösteriyorsa ajan onu çalıştırır. Claude Code’da yer tutucu dolar; başka yerde anlamı cümle taşır. Enjeksiyonun kendi bedeli var, çünkü skill render edilirken shell komutu çalıştırır: “Injected commands never prompt for permission while the skill renders. Claude Code checks each one against your permission rules first.” Başarısız bir komut, eksik bir değerden daha kötüdür: “A failed command aborts the entire skill invocation, not just its own placeholder.” Etiket satırındaki || echo "none" yedeği, etiketi olmayan repolar için var. git describe, repodaki en yeni etiketi değil, HEAD’den erişilebilen en yakın etiketi döndürür. Mevcut daldan çıkan bir release için changelog’un ihtiyaç duyduğu taban da genellikle budur.

Kuralın Esnediği Yerler#

Evrensel bağlam skill klasörünün içinde durabilir. Genel bir canary rollout kontrol listesi ya da herkese açık bir kütüphanenin referansı testin iki sorusundan da geçer. Spesifikasyon ona bir yer de verir: references/ dizini, ajanların gerektiğinde okuyabileceği ek belgeleri taşır. İki spesifikasyon notu maliyeti düşük tutar: “Keep individual reference files focused. Agents load these on demand, so smaller files mean less use of context.” ve “Keep file references one level deep from SKILL.md.” Test yine de herkese açık bir API’nin belgelerini (evrensel bağlam) kendi API stil rehberinizden (yerel bağlam) ayırır.

Skill paths alanı, bir prosedürün ne zaman önerileceğini daraltır. Claude Code alanı “Glob patterns that limit when this skill is activated” diye tanımlar. Cursor’ın sürümü ise “When set, the skill is only surfaced when the agent works with files that match.” der. Bu, prosedürü kod tabanının doğru bölümünde önermenin yoludur; skill gövdesini bir bilgi deposuna çevirmez. Alan spesifikasyonda yoktur ve Codex, Copilot ve Gemini CLI onu belgelemez.

context: fork, skill’in bilgilerini render anında getirmek zorunda olduğu tek durumdur. Claude Code fork edilmiş skill’i bir alt ajanda çalıştırır ve “The subagent doesn’t see your conversation history, so the skill’s instructions have to stand on their own.” Bilgiler açısından durum daha da zor: “The built-in Explore and Plan agents skip CLAUDE.md and git status to keep their context small, so a forked skill using agent: Explore sees only the SKILL.md content and the agent’s own system prompt.” Çözüm yine bir işaretçidir: skill, AGENTS.md içindeki release satırını render anında !`grep -A2 '^## Release' AGENTS.md` ile enjekte edebilir ya da general-purpose ajanında çalışabilir.

Zorunlu kılma (enforcement) iki dosyaya da ait değildir. Claude Code’un özellik genel bakışı, CLAUDE.md ya da skill içindeki bir talimatı rica olarak ele alır ve “A PreToolUse hook that blocks the edit is enforcement.” der. Steering yazısı da aynı fikirde: “the enforcement methods are hooks and permissions”. Bir hook, skill’in hooks frontmatter alanıyla o skill’e bağlanabilir ve “That hook applies from the time the skill is invoked until the session ends.” Aynı güvenlik kuralının taşınabilir biçimi bir CI kontrolüdür; değişikliği hangi araç üretmiş olursa olsun uygulanır.

Mevcut Bir Skill Klasörünü Denetlemek#

Eski sürümden yeni sürüme geçiş, paylaşılan bir skill klasörü için beş adıma genellenir. İlk adım, paylaşılan skill’lerde yerel ya da anlık bağlama benzeyen satırları tarar. Tipik bulgular URL’ler, sohbet kanalları, bulut bölgeleri ve araca özgü talimat dosyası adlarıdır. İkinci adım her bulguyu iki sorudan geçirir ve satırı evine taşır. Üçüncü adım, taşınan her bilginin yerine skill’in beklediği bilginin adını koyar ve bu adları SKILL.md dosyasının başına yakın bir yerde bir kez listeler. Dördüncü adım araca özgü dosya adlarını the project instructions ile değiştirir. Beşinci adım, aşağıda gösterildiği gibi taramayı gözden geçirilmiş bir izin listesiyle CI kontrolüne çevirir. Böylece kuralı bir makine uygular ve belgedeki bir cümleye güvenmek gerekmez.

# Paylaşılan skill'lerde yerel ya da anlık bağlama benzeyen satırlar:
# URL'ler, sohbet kanalları, bulut bölgeleri, araca özgü talimat dosyası adları
grep -rnE 'https?://|#[a-z][a-z0-9-]+|[a-z]{2}-[a-z]+-[0-9]|CLAUDE\.md|GEMINI\.md|copilot-instructions' \
  --include=SKILL.md .agents/skills

Yanlış pozitifler bekleyin: herkese açık bir belge URL’si ya da evrensel bağlamda adı geçen bir sohbet kanalı da eşleşir. Denetim sırasında iki soru bunları ayıklar. Klasör temizlendikten sonra kabul edilen bulgular, kod gibi gözden geçirilen bir izin listesine girer ve CI bunun dışındaki her bulguda başarısız olur. İzin listesi eksikse kontrol geçmez, başarısız olur:

# CI: gözden geçirilmiş izin listesinde olmayan her bulguda başarısız ol.
# İzin listesi her satırda bir sabit metin tutar, örneğin herkese açık bir belge URL'si.
hits=$(grep -rnE 'https?://|#[a-z][a-z0-9-]+|[a-z]{2}-[a-z]+-[0-9]|CLAUDE\.md|GEMINI\.md|copilot-instructions' \
  --include=SKILL.md .agents/skills | grep -vFf <(grep . .agents/context-allowlist.txt))
if [ -n "$hits" ]; then printf '%s\n' "$hits"; exit 1; fi

Varsayılan her skill için geçerlidir ve repolar ya da araçlar arasında paylaşılan bir klasörde daha da önem kazanır; bu artık olağan durumdur. İstisnalar sınırlıdır. Skill’in gittiği her yerde değişmeyen bilgiler skill’de kalabilir; references/ içindeki evrensel bağlam da öyle. Fork edilmiş bir skill ise ajanı talimat dosyasını atladığı için bilgilerini render anında getirir. Sonraki adım, yukarıdaki denetim grep’ini paylaşılan klasör üzerinde bir kez çalıştırmak.

Kaynaklar#

İlgili yazılar