# Terminalsiz Claude Code

claude -p aynı ajan döngüsünü bir kez çalıştırıp çıkıyor, böylece onu pipe'layabilir, script'leyebilir ve zamanlayabilirsiniz. Öngörülebilir kalıp kalmayacağını bayraklar belirliyor.

## Konuşma değil, komut

`claude -p "prompt"` ajanı bir kez çalıştırıp çıkıyor. Döngü, interaktif kullandığınızla aynı, araçlarıyla birlikte. Değişen tek şey, soruya cevap verecek kimsenin olmaması. Oturumun normalde soracağı her şeyin baştan karara bağlanması gerekiyor.

Başarıda 0 koduyla çıkıyor ve standart girdiyi okuyor, üst sınır 10MB. Asıl işe yarayan ikincisi:

```terminal
$ git diff main | claude -p "list risky changes in this diff"
* Diff'i stdin'den okur
* Bir kez cevap verip çıkar
# Diff'i okumak için Bash izni gerekmedi.
```

Küçük bağlamı pipe ile vermek, Claude'un onu çekmek için izin istememesi demek. Bir shell script yetmediğinde aynı döngü Python ve TypeScript Agent SDK paketleri olarak da var.

## Ne döneceğini seçmek

`--output-format` üç değer alıyor.

- `text` düz cevap.
- `json` sonucu, oturum id'sini ve model bazında maliyetlerle `total_cost_usd` değerini döndürür.
- `stream-json` olayları oluştukça satır satır akıtır.

Script'ler için genelde `json` doğru seçim. `--json-schema '{...}'` ile birlikte kullanırsanız yapılandırılmış sonuç `structured_output` içine düşüyor. Bir tuzak var: şemadaki `format` anahtar sözcüğü kabul ediliyor ama uygulanmıyor, ve bir çalıştırma geçerli yapılandırılmış çıktı üretmeden biterse alan hiç yok. Kullanmadan önce orada olup olmadığına bakın.

**Question:** Bir çalıştırma bitti ama script structured_output alanını bulamadı. Doğru okuma hangisi?

- Alan bilerek boş, bu başarı demek
- Çalıştırma geçerli yapılandırılmış çıktı üretmeden bitti, script eksik alanı ele almalı
- JSON şeması çok katıydı ve yok sayıldı
- Maliyet tahmini taştı

**Answer:** Çalıştırma geçerli yapılandırılmış çıktı üretmeden bitti, script eksik alanı ele almalı. Geçerli yapılandırılmış çıktı yoksa alan hiç bulunmaz. Script bunu varsaymamalı, kontrol etmeli.


## Çağrıları zincirlemek

json çıktısında bir `session_id` var. Onu yakalarsanız sonraki çağrı aynı konuşmadan devam ediyor:

```bash
sid=$(claude -p "review src/auth" --output-format json | jq -r .session_id)
claude -p "now fix what you found" --resume "$sid"
```

`--continue` (`-c`) en son oturumu açar, `--resume` (`-r`) bir id, isim ya da oturumun `.jsonl` dosyasının mutlak yolunu alır, `--fork-session` ise devam etmek yerine dallanır. `--no-session-persistence` arkasında oturum bırakmaz, tek seferlik işlere uygun.

## İşi sınırlı tutan bayraklar

Sonsuza dönen ya da sınırsız harcayan bir script, hiç script olmamasından kötü. Print modunda bunun korumaları var:

- `--max-turns` tur sayısını sınırlar.
- `--max-budget-usd` harcamayı sınırlar, istemci tarafı bir tahmin kullanır. İkisi de yalnızca print modunda çalışır.
- `--allowedTools` ve `--disallowedTools` Claude'un neyi kullanabileceğini belirler. `--disallowedTools` içinde yalın bir isim, aracı bağlamdan tamamen çıkarır.
- `--permission-prompts none`, sorulacak her şeyi reddeder ve Claude'a tekrar denememesini söyler.

Reddedilenler `permission_denied` olayı olarak ve sonuçtaki `permission_denials` içinde raporlanıyor, yani script neyin reddedildiğini görebiliyor. İzin sorma aracı yoksa tekrarlayan engellemeler eylemi düşürüyor ve çalıştırma durmak yerine devam ediyor.

> **-p'nin neyi yüklediğini bilin**
`--bare` olmadan `-p` güven penceresi göstermiyor ama proje hook'larını yine çalıştırıyor ve hiç güvenmediğiniz bir klasörde bile `.mcp.json` sunucularına bağlanıyor. CI'da ve script'lerde `--bare` kullanın ki her makine aynı davransın; dokümana göre bunun varsayılan olması bekleniyor. OAuth'u ya da keychain'i hiç okumaz, bu yüzden `ANTHROPIC_API_KEY` ya da bir `apiKeyHelper` gerekir.


## Temiz çıkış

Bir `-p` çalıştırması çıkmadan önce arka plan komutlarını, alt ajanları, Monitor izlemelerini ve bekleyen `/loop` uyanışlarını bekliyor. Boşta bekleme 10 dakikada kesiliyor, `CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS` ile ayarlanabiliyor.

Bir çalıştırmayı dışarıdan durdururken sinyal önemli. SIGTERM 143 koduyla çıkar ve turu yarım bırakır. SIGINT turu temiz bitirir. Birini yarıda kestiyseniz `CLAUDE_CODE_RESUME_INTERRUPTED_TURN=1` resume'da onu sürdürür.

> **Bozuk kurulumu ayıklamak**
Headless bir çalıştırma tuhaf davranıyorsa `--safe-mode` her özelleştirmeyi kapalı başlatır: CLAUDE.md, skill'ler, plugin'ler, hook'lar, MCP ve output style'lar. Sorun kaybolursa, geri gelene kadar parçaları tek tek ekleyin.


> **Maliyetini bildiren bir script yapın**
`claude -p "summarize this repo in two lines" --output-format json --max-turns 3` komutunu çalıştırın ve çıktıdan `total_cost_usd` ile `session_id` değerlerini okuyun. Sonra bu id'yi `--resume` ile bir takip sorusuna verin.


**Question:** Hangi sinyal headless bir turu temiz bitirir?

- SIGTERM
- SIGKILL
- SIGINT
- SIGHUP

**Answer:** SIGINT. SIGINT turu temiz bitirir. SIGTERM 143 koduyla çıkar ve turu yarım bırakır.
