AI CLI Araçlarında Statusline: Tek Satırda Model, Limit ve Context

Claude Code, agy, Codex ve Grok için statusline: hangi CLI hangi alanları verir, settings dosyaları, jq'li payload çıkarma ve limit hesabı.

9 dk okuma
ibrahimsql
1.710 kelime

AI CLI Araçlarında Statusline#

Terminal tabanlı AI araçlarında altta tek satır görmeyi alışkanlık haline getirdim: hangi modelle çalışıyorum, 5 saatlik limitin ne kadarını yaktım, context penceresi ne kadar dolu. 4 araçta da bunu yapan bir statusline düzeni var.

Neden Statusline?#

Uzun oturumlarda iki şeyi gözden kaçırmak kolay: limitin ne kadarı kaldı ve context'in dolması. İkisini de terminal altyazısında sabit tutarsan, model cevap vermeye başlamadan önce "şimdi duralım mı, yeni oturum mu açalım" kararını elinden alırsın.

Üçüncü bir fayda da var: model değişince (Opus'tan Sonnet'e düşüp düşmediğini, effort seviyesinin "high"da kalıp kalmadığını anlamak) satırdan anında görürsün. Aksi halde cevap tarzından tahmin etmek zorunda kalırsın.

Gereksinimler#

Tüm script'lerin tek zorunluluğu jq. Yoksa:

# macOS brew install jq # Debian/Ubuntu sudo apt-get install -y jq # Fedora sudo dnf install -y jq # Arch sudo pacman -S jq # Doğrulama jq --version # jq-1.7.x beklenir

Ek olarak gawk veya sistem awk'sı ve date gerekiyor; macOS ve Linux'ta ikisi de standart gelir. Linux'taki date sürümü epoch'tan tarih üretmek için farklı bayrak ister, bunu aşağıda her script'te shim olarak çözdüm.

Bir de shellcheck öneririm; script'leri değiştirdikten sonra taramak için:

brew install shellcheck shellcheck ~/.claude/statusline-command.sh

Payload Yapısı (Genel)#

Dört aracın da ortak fikri şu: statusline komutu stdin'den tek satırlık bir JSON alır, sen bunu jq ile çözümler, tek satırlık bir metin basarsın. Fark alan adlarında:

AraçModelEffortContextRate limit
Claude Code.model.display_name.effort.level.context_window.used_percentage.rate_limits.five_hour.*, .rate_limits.daily.*, .rate_limits.seven_day.*
agy (Antigravity).model.display_name.model.effort.context_window.used_percentage.quota["gemini-5h"].remaining_fraction, .reset_in_seconds
Codexhazır alan (model-with-reasoning)hazır alancontext-usedfive-hour-limit, weekly-limit
Grok.model.display_name.effort.level.context_window.used_percentageyok - .cost.total_cost_usd

Payload şeması araç sürümleriyle değişebiliyor. Script'leri yazarken alanları // empty ve // "?" fallback'leriyle çek, böylece bir sürüm yükseltmesinde statusline kırılmak yerine ? göstersin.

Alanları görmek için önce ham payload'ı logla:

# Claude Code / Grok / agy payload'larını yakalamak için geçici log echo "$input" | tee /tmp/statusline-payload.json | jq .

Claude Code#

~/.claude/settings.json:

{ "statusLine": { "type": "command", "command": "bash ~/.claude/statusline-command.sh" } }

~/.claude/statusline-command.sh - payload'u stdin'den okuyup jq ile çözen tam script:

#!/usr/bin/env bash set -euo pipefail input=$(cat) model_name=$(echo "$input" | jq -r '.model.display_name // "?"') effort_level=$(echo "$input" | jq -r '.effort.level // empty') used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1) five_pct=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty') five_resets=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty') daily_pct=$(echo "$input" | jq -r '.rate_limits.daily.used_percentage // empty') weekly_pct=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty') now_str="" if [[ -n "$five_resets" && "$five_resets" != "null" ]]; then if date -r "$five_resets" "+%H:%M" >/dev/null 2>&1; then now_str=$(date -r "$five_resets" "+%H:%M") else now_str=$(date -d "@$five_resets" "+%H:%M") fi fi effort_s="" if [[ -n "$effort_level" && "$effort_level" != "null" ]]; then effort_s=" ($effort_level)" fi parts="${model_name}${effort_s}" if [[ -n "$five_pct" && "$five_pct" != "null" ]]; then parts+=" 5h:${five_pct}%" fi if [[ -n "$now_str" ]]; then parts+="(~${now_str})" fi if [[ -n "$daily_pct" && "$daily_pct" != "null" ]]; then parts+=" d:${daily_pct}%" fi if [[ -n "$weekly_pct" && "$weekly_pct" != "null" ]]; then parts+=" w:${weekly_pct}%" fi parts+=" ctx:${used_pct}%" printf '%s\n' "$parts"

Çalıştırılabilir yap:

chmod +x ~/.claude/statusline-command.sh

Çıktı örneği: Opus 4.6 (high) 5h:34%(~14:20) d:12% w:40% ctx:61%. Oturumun beş saatlik limiti dolmadan önce reset zamanını lokal saate çevirmek için resets_at epoch'unu date -r ile biçimlendirmek yeterli.

Limit yüzdesi yerine kalan yüzdeyi göstermek istersen:

remaining=$(awk -v u="$five_pct" 'BEGIN{printf "%.0f", 100 - u}') echo "5h kalan: ${remaining}%"

Antigravity CLI (agy)#

~/.gemini/antigravity-cli/settings.json:

{ "statusLine": { "type": "command", "command": "bash ~/.gemini/antigravity-cli/statusline-command.sh" } }

Payload alan adları farklı: .model.display_name, .model.effort, .context_window.used_percentage, plus .quota objesi (gemini-5h / claude-5h gibi provider anahtarlarıyla).

~/.gemini/antigravity-cli/statusline-command.sh:

#!/usr/bin/env bash set -euo pipefail input=$(cat) model_name=$(echo "$input" | jq -r '.model.display_name // "?"') effort=$(echo "$input" | jq -r '.model.effort // empty') used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1) provider=$(echo "$input" | jq -r '.quota.provider // "gemini-5h"') remaining=$(echo "$input" | jq -r --arg p "$provider" '.quota[$p].remaining_fraction // empty') reset_sec=$(echo "$input" | jq -r --arg p "$provider" '.quota[$p].reset_in_seconds // empty') used_quota="" if [[ -n "$remaining" && "$remaining" != "null" ]]; then used_quota=$(awk -v r="$remaining" 'BEGIN{printf "%.0f", (1 - r) * 100}') fi reset_time="" if [[ -n "$reset_sec" && "$reset_sec" != "null" ]]; then now=$(date +%s) epoch=$(( now + ${reset_sec%.*} )) if date -r "$epoch" "+%H:%M" >/dev/null 2>&1; then reset_time=$(date -r "$epoch" "+%H:%M") else reset_time=$(date -d "@$epoch" "+%H:%M") fi fi effort_s="" [[ -n "$effort" && "$effort" != "null" ]] && effort_s=" ($effort)" parts="${model_name}${effort_s}" [[ -n "$used_quota" ]] && parts+=" 5h:${used_quota}%" [[ -n "$reset_time" ]] && parts+="(~${reset_time})" parts+=" ctx:${used_pct}%" printf '%s\n' "$parts"

Kalan azalma yüzdesinden kullanılanı üretmek için (1 - remaining_fraction) * 100 hesabı, reset saniyesini şimdiki zamana ekleyip date -r ile biçimlendirmek yeterli:

five_epoch=$(( now + ${five_reset_sec%.*} )) five_time=$(date -r "$five_epoch" "+%H:%M")

Provider nesnesini elle görmek için:

echo "$input" | jq '.quota' # Örnek çıktı: # { "gemini-5h": { "remaining_fraction": 0.66, "reset_in_seconds": 14230 } }

Codex#

Codex bunu script değil, ayar anahtarıyla yapıyor: ~/.codex/config.toml

[tui] status_line = ["model-with-reasoning", "five-hour-limit", "weekly-limit", "context-used"]

Ekstra kurulum yok, dört hazır alan. Hazır alan adlarının tam listesi için codex --help çıktısındaki tui bölümünü kontrol et; sürüm yükseltmelerinde alan adları değişirse config'i güncellemek gerekir.

Eski sürümde script yolunu zorunlu kılan bir kurulum varsa aynı mantıkla ~/.codex/statusline.sh yaz:

#!/usr/bin/env bash set -euo pipefail input=$(cat) model=$(echo "$input" | jq -r '.model.display_name // "?"') used=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1) five=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty') weekly=$(echo "$input" | jq -r '.rate_limits.weekly.used_percentage // empty') out="${model}" [[ -n "$five" && "$five" != "null" ]] && out+=" 5h:${five}%" [[ -n "$weekly" && "$weekly" != "null" ]] && out+=" w:${weekly}%" out+=" ctx:${used}%" printf '%s\n' "$out"

Grok#

~/.grok/config.toml + bir script. Diğerlerinden farkı: Grok rate-limit verisi vermiyor, onun yerine oturum maliyeti geliyor (.cost.total_cost_usd):

[statusline] command = "bash ~/.grok/statusline.sh" padding = 0

~/.grok/statusline.sh:

#!/usr/bin/env bash set -euo pipefail input=$(cat) model_name=$(echo "$input" | jq -r '.model.display_name // "?"') effort_level=$(echo "$input" | jq -r '.effort.level // empty') used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1) cost_usd=$(echo "$input" | jq -r '.cost.total_cost_usd // empty') turns=$(echo "$input" | jq -r '.session.turn_count // empty') effort_s="" [[ -n "$effort_level" && "$effort_level" != "null" ]] && effort_s=" ($effort_level)" cost_s="" if [[ -n "$cost_usd" && "$cost_usd" != "null" ]]; then cost_s=" cost:\$$(printf "%.2f" "$cost_usd")" fi turns_s="" [[ -n "$turns" && "$turns" != "null" ]] && turns_s=" t:${turns}" parts="${model_name}${effort_s}${cost_s}${turns_s} ctx:${used_pct}%" printf '%s\n' "$parts"

Örnek çıktı: Grok 4 (high) cost:$1.37 t:12 ctx:44%.

Maliyetten limit tahmini yapmak istersen o günkü oturum toplamını ayrı bir dosyaya ekleyebilirsin; statusline script'i içinde mutation yapma, her render'da dosyayı şişirir:

# Ayrı, elle çağrılan özet komutu git_daily_log() { tail -n 500 ~/.grok/session-costs.log | awk -F',' '{s+=$2} END{printf "toplam: $%.2f\n", s}' }

Tüm Araçlar İçin Settings Örnekleri#

Tek yerde görmek için:

// ~/.claude/settings.json { "statusLine": { "type": "command", "command": "bash ~/.claude/statusline-command.sh" } }
// ~/.gemini/antigravity-cli/settings.json { "statusLine": { "type": "command", "command": "bash ~/.gemini/antigravity-cli/statusline-command.sh" } }
# ~/.codex/config.toml [tui] status_line = ["model-with-reasoning", "five-hour-limit", "weekly-limit", "context-used"]
# ~/.grok/config.toml [statusline] command = "bash ~/.grok/statusline.sh"

JSON'da // yorumları geçersiz - bunları sadece özet tablosunda gösteriyorum; gerçek dosyalarda yazma.

Makefile ile Alias'lar#

Dört script'i de aynı Makefile'dan test etmek ve kurmak için:

CLAUDE_SH := ~/.claude/statusline-command.sh AGY_SH := ~/.gemini/antigravity-cli/statusline-command.sh GROK_SH := ~/.grok/statusline.sh CODEX_SH := ~/.codex/statusline.sh SAMPLE_CLAUDE := '{"model":{"display_name":"Opus 4.6"},"effort":{"level":"high"},"context_window":{"used_percentage":61},"rate_limits":{"five_hour":{"used_percentage":34,"resets_at":1891234567},"daily":{"used_percentage":12},"seven_day":{"used_percentage":40}}}' SAMPLE_AGY := '{"model":{"display_name":"Gemini 3 Pro","effort":"high"},"context_window":{"used_percentage":55},"quota":{"provider":"gemini-5h","gemini-5h":{"remaining_fraction":0.66,"reset_in_seconds":14230}}}' SAMPLE_GROK := '{"model":{"display_name":"Grok 4"},"effort":{"level":"high"},"context_window":{"used_percentage":44},"cost":{"total_cost_usd":1.37},"session":{"turn_count":12}}' .PHONY: statusline-test install lint sample-claude sample-agy sample-grok sample-claude: @echo $(SAMPLE_CLAUDE) | bash $(CLAUDE_SH) sample-agy: @echo $(SAMPLE_AGY) | bash $(AGY_SH) sample-grok: @echo $(SAMPLE_GROK) | bash $(GROK_SH) statusline-test: sample-claude sample-agy sample-grok lint: shellcheck $(CLAUDE_SH) $(AGY_SH) $(GROK_SH) $(CODEX_SH) install: chmod +x $(CLAUDE_SH) $(AGY_SH) $(GROK_SH) $(CODEX_SH)

make statusline-test ile üç satır örnek çıktı görürsün:

Opus 4.6 (high)  5h:34%(~14:20)  d:12%  w:40%  ctx:61%
Gemini 3 Pro (high)  5h:34%(~17:55)  ctx:55%
Grok 4 (high)  cost:$1.37  t:12  ctx:44%

Ne Zaman Hangisi?#

İhtiyaçTercihSebep
Claude içindeyken rate limit ve effort takibiClaude Code + scriptresets_at ile sıfırlama zamanı tam geliyor
Gemini ekosisteminde quota görmekagy + scriptremaining_fraction ile kalan tam hesaplanıyor
Minimum kurulum, sıfır maintenanceCodexHazır 4 alan, script yok
Maliyet takibi (oturum bazlı harcama)GrokTek araç maliyet alanı veriyor
Hepsinde tutarlı satır biçimiDördü de scriptliAynı format: model (effort) 5h/cost ctx:n%
Linux + macOS karışık makinelerShim'li script'lerdate -r / date -d farkını yutuyor

PR Workflow Notları#

Bu script'leri paylaşılan bir repoda tutuyorsan:

  1. Payload fixture'ları ekle. tests/fixtures/*.json altına her araç için bir örnek payload koy; script'i CI'da make statusline-test ile koştur. Payload şeması sessizce değişirse test kırmızıya dönsün.
  2. shellcheck gate'i koy. CI'da make lint çalıştır; set -euo pipefail ve tırnaksız genişletme gibi hataları yakalar.
  3. Fixture'ları gerçek veriden anonimize et. Payload'da session_id, e-posta veya yol sızmasın; jq 'del(.session_id, .user)' ile temizle.
  4. Sürüm notu düş. Her script başına # v2026-10: agy quota.provider eklendi gibi tek satır sürüm notu; araç güncellemesinde hangi alanın değiştiğini hatırlamak README'de kalır.
  5. PR açıklamasına örnek çıktıyı kopyala. Reviewer'ın script'i kurmadan satırı görmesi için ## Örnek Çıktı bölümü.
  6. Macros/PR template: PR gövdesine `## Test
  • make statusline-test geçti
  • shellcheck temiz
  • fixture güncellendi` listesi koy.

Pratik Notlar#

  • Tüm script'lerde tek zorunluluk: jq. Yoksa brew install jq.
  • macOS'ta epoch'tan tarih üretmek date -r <epoch> "+%H:%M"; Linux'ta date -d "@<epoch>" "+%H:%M". Linux kullanıyorsam coherentluk için script'e bir shim yazıyorum:
fmt_epoch() { if date -r "$1" "+%H:%M" >/dev/null 2>&1; then date -r "$1" "+%H:%M" else date -d "@$1" "+%H:%M" fi }
  • Basit tut: model + 5h + ctx en kritik üç alan. Günlük/haftalık limit eklemek satırı uzatır ama uzun oturumlarda gerçekten lazım olur.
  • Script'i her render'da çalıştırıyor; uzak API çağrısı veya ağır işlem koyma. jq + awk yeterli hızda.
  • Çıktıyı 80 sütunu geçmeyecek şekilde kısalt: cut -c1-78 ile kes, wrap olmasın.

// RAPOR SONU Etiketler: CLI / Claude Code / Codex / Grok / Statusline

---
Bu yazıyı paylaş:
TwitterLinkedInFacebook

Ne düşünüyorsun?

Tepki bırakarak geri bildirim ver

İlgili Yazılar