# Context Mode: Ajanın Masasına Dosya Değil, Not Gelsin

> context-mode, ajanın ham araç çıktısını bağlam penceresine sokmadan ayrı bir süreçte işleyip yalnızca sonucu getiriyor. 484 KB'lık bir PHP günlüğünde 809 bayt döndü; ama arama saymıyor, sayaç kendini abartıyor ve "sandbox" bir işletim sistemi sandbox'ı değil.

- Yazar: [Halit Yeşil](https://halityesil.com/hakkimda/)
- Yayın tarihi: 2026-10-15
- Dil: Türkçe
- Kaynak adres: https://halityesil.com/context-mode-baglam-penceresi/
- İngilizce sürümü: https://halityesil.com/en/context-mode-context-window-mcp.md
- Kategori: Yapay Zeka / AI
- Etiketler: AI Ajanları, Bağlam Penceresi, Claude Code, Codex, context-mode, Cursor, MCP, php, token optimizasyonu
- Lisans: https://creativecommons.org/licenses/by-nc/4.0/
- Atıf: Halit Yeşil. “Context Mode: Ajanın Masasına Dosya Değil, Not Gelsin”. halityesil.com, 2026-10-15. https://halityesil.com/context-mode-baglam-penceresi/

---

Bir ajanın bağlam penceresini çalışma masası gibi düşünün. Masa ne kadar büyük olursa olsun, üstüne arşivdeki bütün klasörleri dökerseniz asıl işin kâğıdı altta kalır. İyi bir kâtip klasörü arşivde bırakır, masaya üç satırlık bir not getirir: "29 tane fatal var, hepsi aynı dosyanın 27. satırından."

[PHP 8.5 yükseltmesini yazarken](https://halityesil.com/php-surum-yukseltme-8-1-den-8-5-e/) yarım saatte 568 satır deprecation birikmişti, hepsi aynı cümle. Bir ajana o günlüğü "oku bakalım" diye verseydim 568 satırın tamamı masaya gelecekti. Bu haftanın radarındaki context-mode tam bu kâtip işini üstlenmeye çalışıyor. Bu sefer gerçekten kurdum, PHP-FPM tarzı bir günlükle ölçtüm ve beklemediğim iki şey buldum.

## Context Mode nedir?

**Tek cümleyle:** Kodlama ajanının ham araç çıktısını (günlük, test sonucu, API yanıtı, web sayfası) bağlam penceresine sokmadan ayrı bir alt süreçte işleyen, modele yalnızca o sürecin yazdırdığını gönderen, büyük çıktıları da SQLite FTS5 ile aranabilir bir dizine koyan bir MCP sunucusu ve kanca (hook) paketi.

Araç belirli bir ajana bağlı değil. [README'deki listeye göre](https://github.com/mksglu/context-mode) Anthropic'in Claude Code'u, OpenAI'ın Codex CLI'ı, Google'ın Gemini CLI ve Antigravity'si, Cursor, GitHub Copilot, OpenCode ve Zed dahil on sekiz istemciyi destekliyor. Destek derinliği aynı değil, birazdan oraya geleceğiz.

## Nasıl çalışıyor: çıktıyı değil sonucu getir

Fikrin özü projenin "Think-in-Code" dediği şey: ajan 500 KB'lık dosyayı okuyup kafasında saymaz, dosyayı sayan kodu yazar ve yalnızca sonucu görür. Bunun için on bir MCP aracı var; işin yükünü üçü taşıyor:

- `ctx_execute`: Verilen kodu (JavaScript, Python, PHP, shell ve başka dillerde) ayrı bir süreçte çalıştırır, yalnızca stdout döner.
- `ctx_execute_file`: Dosyayı `FILE_CONTENT` değişkenine yükler, sizin kodunuz onun üstünde çalışır.
- `ctx_search`: Dizine alınmış büyük çıktılarda BM25 ile arar.

Kancalar da ajan kendi araçlarıyla (shell komutu, web isteği) büyük çıktı çekmeye kalktığında araya girip onu bu araçlara yönlendiriyor.

## Denedim: 484 KB'lık bir PHP günlüğü

Kurulum Claude Code tarafında iki eğik çizgi komutu, Codex'te bir CLI satırı (README kancalar için ayrıca `config.toml`'a `[features]` altında `plugin_hooks = true` ve `hooks = true` eklenmesini istiyor):

```text
# Claude Code içinde
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode
/context-mode:ctx-doctor
```

```bash
# Codex CLI
codex plugin marketplace add mksglu/context-mode

# Yalnızca MCP, kancasız (Claude Code örneği)
claude mcp add context-mode -- npx -y context-mode
```

Ben ölçümü bir ajanın içinden yapmadım. npm'den v1.0.169'u kurdum (Node 22, PHP 8.3 CLI), MCP sunucusunu küçük bir JSON-RPC istemcisiyle doğrudan çağırdım. Yani araçların ne döndürdüğünü ölçtüm, kancaların bir ajanı ne kadar iyi yönlendirdiğini değil.

Test verisi sentetik: sabit tohumla ürettiğim 3.000 satırlık, 495.838 baytlık bir PHP-FPM hata günlüğü. İçinde PHP 8.5 yazısındaki o tanıdık "Using null as an array offset" satırı da var. Aynı soruyu dört yoldan sordum: "Burada ne var, fatal'lar nereden geliyor?"

| Yol | Modele dönen | Ne gördü |
| --- | --- | --- |
| Dosyayı doğrudan okutmak | 495.838 bayt | Her şeyi |
| `ctx_execute_file` + PHP özet kodu | 809 bayt (203 ms) | Beş kaynak, 29 fatal, tam sayılarla |
| `ctx_execute` + `intent` ("PHP Fatal error PDOException") | 1.561 bayt | 5 önizleme, ikisi fatal |
| `ctx_execute`, `intent` olmadan | 268 bayt | Yalnızca "dizine eklendi" |

`ctx_execute_file`'a gönderdiğim gövde şu (`FILE_CONTENT` araç tarafından doldurulur; komut satırında denemek için başına `<?php` ve `$FILE_CONTENT = file_get_contents($argv[1]);` ekleyin, `php -l`'den geçti):

```php
$satirlar = explode("\n", trim($FILE_CONTENT));
$say = [];
foreach ($satirlar as $s) {
    if (preg_match("/\] (PHP [A-Za-z ]+?):\s+(.+?) in (\S+?)(?: on line |:)(\d+)/", $s, $m)) {
        $anahtar = $m[1] . " | " . basename($m[3]) . ":" . $m[4];
        $say[$anahtar] = ($say[$anahtar] ?? 0) + 1;
    }
}
arsort($say);
echo count($satirlar), " satir, ", count($say), " farkli kaynak\n";
foreach ($say as $k => $n) { echo str_pad((string)$n, 6, " ", STR_PAD_LEFT), "  ", $k, "\n"; }
```

Masaya gelen not:

```text
3000 satir, 5 farkli kaynak
  2065  PHP Deprecated | Memo.php:88
   548  PHP Warning | Liste.php:41
   281  PHP Notice | Csv.php:112
    77  PHP Warning | Servis.php:54
    29  PHP Fatal error | Baglanti.php:27
```

495.838 bayttan 809 bayta. Ama bu sayının asıl kahramanı araç değil, o on bir satırlık PHP. Kâtip notu ancak ona doğru soruyu sorduğunuzda doğru yazıyor.

## Ne zaman işe yarar, ne zaman yaramaz?

**Gerçek:** Uzun test çıktısı, büyük JSON yanıtları, sunucu günlükleri, dokümantasyon sayfaları. Oturum uzadıkça fark büyüyor, çünkü masaya gelmeyen her bayt sonraki adımlarda yer kaplamıyor. [Lokal LLM bölümünde](https://halityesil.com/vibe-coder-3-3-lokal-llm/) anlattığım 4.096 tokenlik pencereyle çalışıyorsanız bu fark daha da hissedilir.

**Gerçek:** Düzenleyeceğiniz dosyada işe yaramaz. Ajanın dosyayı değiştirmesi için tam metni görmesi gerekiyor; aracın kendi açıklaması da bunu söylüyor.

**Acı Gerçek 1, arama saymaz:** `intent` yolunda BM25 bana beş önizleme getirdi; ikisi fatal, ikisi deprecation, biri notice. Kaç fatal olduğunu söylemedi, söyleyemez de. Sayım, gruplama, toplam gibi işler kodla yapılmalı. Arama "nerede geçiyor" sorusuna cevap verir, "kaç tane" sorusuna değil.

**Acı Gerçek 2, sessiz dizin:** `intent` vermeden büyük çıktı üretirseniz model yalnızca "1 bölüm dizine eklendi, ctx_search ile sorgulayın" cümlesini görüyor. Ajan aramayı akıl etmezse bilgi masaya hiç gelmiyor.

**Acı Gerçek 3, sayaç kendi mesaisini yazıyor:** Dört çağrıdan sonra `ctx_stats` bana "974 KB tasarruf, %99,5 azalma, yaklaşık 1,24 dolar (Opus)" dedi. Ortada 484 KB'lık tek bir dosya vardı; sayaç her çağrıyı "bu araç olmasaydı ne gelirdi" diye ayrı ayrı topluyor. Rakamı kendi kanıtınız saymayın, kendi oturumunuzda ölçün. README'deki "315 KB'tan 5,4 KB'a, %98" de projenin kendi ölçümü.

**Dikkat, "sandbox" kelimesi:** README'nin güvenlik bölümü açıkça yazıyor: `ctx_execute` keyfi kod çalıştırır ve sürecin dosya sistemi erişimini devralır; bu tam bir işletim sistemi sandbox'ı değil. `gh`, `aws` gibi CLI'lar kimlik bilgilerini de devralıyor. `ctx_execute_file` proje kökünün dışına okuma yapmıyor, ama bu yalnızca dosya okuma aracı için geçerli. Çalıştırma onayını keyfi kod onayı gibi düşünün.

**Kanca yoksa rica var:** Cursor, Codex ve Claude Code'da kancalarla çalışıyor, ama derinlik farklı. Codex'in PreToolUse kancası şimdilik yalnızca reddetme kuralı destekliyor, girdiyi yeniden yazamıyor. Cursor'ın doğrulayıcısı `sessionStart` kancasını reddettiği için oturum geri yükleme orada yok. Zed ve Antigravity IDE'de kanca hiç yok; yönlendirme yalnızca AGENTS.md ya da GEMINI.md'deki talimata kalıyor ve README bunun için "yaklaşık %60 uyum" diyor. [Vibe Coder #4.2](https://halityesil.com/vibe-coder-4-2-agents-md-claude-md/)'de "kural dosyası bağlamdır, kapıyı tutan kancadır" demiştim; bu yüzde o cümlenin sayıyla yazılmış hâli.

## Bakım durumu ve emeğin sahibi

| Konu | Durum (13 Ekim 2026) |
| --- | --- |
| Lisans | Elastic License 2.0 (ELv2); OSI'nin onaylı lisans listesinde yok |
| Son sürüm | v1.0.169 (npm, 29 Haziran 2026) |
| Geliştirme | `next` dalında son commit 28 Eylül 2026; `main`'de yalnızca otomatik istatistik commit'leri |
| Yıldız | yaklaşık 26,9 bin |
| Açık issue / PR | 173 / 174 |
| Gereksinim | Node.js 22.5 ve üstü (ya da Bun); Linux'ta 22.5 altı desteklenmiyor |
| Veri | README "telemetri yok" diyor; ekip panosu için `platform.json` yapılandırırsanız her olay o adrese gönderiliyor |

Projeyi [Mert Köseoğlu](https://github.com/mksglu) geliştiriyor ve sürdürüyor; LICENSE'taki telif de onun adına. ELv2 şunu söylüyor: kendi işinizde kullanmak, değiştirmek, dağıtmak serbest; yazılımı üçüncü kişilere barındırılan ya da yönetilen bir hizmet olarak sunmak yasak. Kaynak kodu açık ama "açık kaynak" tanımına girmiyor; müşteri projesine koyacaksanız bu ayrım önemli. Ekipler için ayrıca barındırılan bir analitik panosu (Insight) sunuluyor.

## Alternatiflerle kısa karşılaştırma

| Araç | Katman | Lisans | Son sürüm |
| --- | --- | --- | --- |
| context-mode | MCP + kancalar, kodu ayrı süreçte çalıştırır, büyük çıktıyı dizine alır | ELv2 | v1.0.169 (29.06.2026) |
| [RTK](https://github.com/rtk-ai/rtk) | Shell komutunu yeniden yazan Rust CLI proxy'si, komut çıktısını süzer | Apache-2.0 | v0.51.0 (02.10.2026) |
| [Headroom](https://github.com/headroomlabs-ai/headroom) | Kütüphane, proxy ve MCP; araç çıktısını sıkıştırır, orijinali yerelde saklar | Apache-2.0 | v0.40.0 (05.10.2026) |
| [claude-mem](https://github.com/thedotmack/claude-mem) | Oturumlar arası hafıza (kancalar, SQLite, vektör arama) | Apache-2.0 | v13.37.0 (12.10.2026) |

Net önerim: derdiniz `git`, `composer`, `phpunit` gibi komutların gürültüsüyse RTK daha dar kapsamlı ve tek bir ikili dosyadan ibaret. Derdiniz ajanın büyük veriyi okuyup kafadan hesap yapmasıysa context-mode'un "kodu yaz, sonucu getir" yaklaşımı tam o işe oturuyor. Lisans hassasiyetiniz varsa üç alternatifin üçü de Apache-2.0.

## Sahada: benim işimde nereye oturur?

Benim günlük malzemem tam bu aracın sevdiği türden: PHP-FPM günlükleri, [MariaDB'nin ANALYZE FORMAT=JSON çıktıları](https://halityesil.com/mariadb-index-optimizasyonu/), uzun PHPUnit koşuları. Deneyeceksem ilk sırada günlük okuma olurdu, çünkü orada yanlış özet en pahalısı. Ama iki şartla: çalıştırma araçlarını otomatik onaya almadan ve sayaca değil kendi ölçümüme bakarak.

Kâtibin değeri getirdiği notun doğruluğunda. Arşivin anahtarını da ona verdiğinizi unutmayın.
