Claude Code'da Status Line: Durum Çubuğunu Özelleştirme Rehberi

Claude Code ile uzun bir oturumda çalışırken aklınıza sürekli aynı sorular gelir: Bağlam penceresinin ne kadarı doldu? Şu an hangi modelle ve hangi effort seviyesiyle çalışıyorum? Bu oturum şimdiye kadar ne kadar tuttu? Hangi git dalındayım, PR'ın durumu ne? Bu soruların cevabını her seferinde /context ya da /usage gibi komutlarla aramak yerine, ekranın altında sürekli güncellenen tek bir satırda görebilirsiniz. Claude Code'un status line (durum çubuğu) özelliği tam olarak bunu yapar: sizin yazdığınız herhangi bir kabuk betiğini çalıştırır, ona oturumla ilgili zengin bir JSON verisi verir ve betiğin yazdırdığı her şeyi arayüzün altında gösterir. Bu yazıda resmi Claude Code dokümantasyonuna dayanarak status line'ı nasıl kuracağınızı, betiğinize hangi verilerin geldiğini, çok satırlı ve renkli çıktıları, tıklanabilir linkleri, subagent satırlarını, Windows yapılandırmasını ve sorun gidermeyi adım adım anlatıyorum.

Claude Code Status Line Nedir?

Status line, Claude Code arayüzünün en altında duran ve tamamen sizin tanımladığınız bir komutun çıktısını gösteren özelleştirilebilir bir çubuktur. Mantığı son derece basittir: Claude Code, belirlediğiniz komutu çalıştırır, oturum bilgilerini JSON olarak bu komutun stdin'ine yazar, komut stdout'a ne basarsa onu ekranda gösterir. Komutun Bash, Python, Node.js ya da PowerShell olması fark etmez; JSON okuyup metin yazdırabilen her şey işinizi görür.

Resmi dokümantasyon status line'ın özellikle şu durumlarda faydalı olduğunu belirtiyor:

  • Çalışırken bağlam penceresi (context window) kullanımını izlemek istediğinizde,
  • Oturum maliyetlerini takip etmeniz gerektiğinde,
  • Birden çok oturumda paralel çalışıp bunları birbirinden ayırt etmeniz gerektiğinde,
  • Git dalını ve durumunu sürekli görünür tutmak istediğinizde.

İki önemli ayrıntıyı baştan bilmekte fayda var. Birincisi, status line yerel olarak çalışır ve API token'ı tüketmez; betiğiniz modelle konuşmaz, yalnızca Claude Code'un zaten elinde olan verileri biçimlendirir. İkincisi, status line yerleşik footer rozetlerinin üstünde, kendi satırında görünür ve onların yerini almaz. Ancak özel bir status line yapılandırdığınızda Claude Code footer'daki klavye ipuçlarının çoğunu göstermeyi bırakır; esc to interrupt, ? for shortcuts ve sesli dikte için hold space to speak ipuçları bunlara dahildir. Ayrıca yardım menüsü ve izin istemleri gibi bazı arayüz etkileşimleri sırasında status line geçici olarak gizlenir.

Eğer tek ihtiyacınız konuşmada geçen bir kimliği (örneğin bir issue numarasını) footer'da tıklanabilir rozete çevirmekse, betik yazmanıza gerek yoktur: dokümantasyon bunun için footerLinksRegexes ayarını öneriyor. Status line ise çok daha genel bir araçtır — istediğiniz her şeyi gösterebilirsiniz.

Status Line Nasıl Kurulur?

Kurulumun iki yolu var: /statusline komutuyla Claude Code'a betiği yazdırmak ya da betiği kendiniz yazıp ayarlara eklemek. İkisi de aynı sonuca, yani ayar dosyanızda bir statusLine alanına çıkar.

Yol 1: /statusline komutu

/statusline komutu doğal dilde talimat kabul eder. Ne görmek istediğinizi tarif edersiniz; Claude Code ~/.claude/ altında bir betik dosyası üretir ve ayarlarınızı otomatik olarak günceller:

/statusline model adını ve bağlam yüzdesini ilerleme çubuğuyla göster

Kurulum sırasında Claude Code dosya düzenleme izni isterse bu istemleri onaylamanız gerekir.

Yol 2: Elle yapılandırma

Elle kurmak için kullanıcı ayarlarınıza (~/.claude/settings.json) ya da proje ayarlarınıza bir statusLine alanı eklersiniz. type değerini "command" yapar, command alanını bir betik yoluna veya satır içi bir kabuk komutuna yönlendirirsiniz:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}

command alanı bir kabukta çalıştığı için ayrı bir betik dosyası şart değildir. Aşağıdaki örnek, jq ile JSON'u doğrudan ayrıştırıp model adını ve bağlam yüzdesini gösterir:

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
  }
}

Status line'ı kapatmak

Status line'ı kaldırmak için yine /statusline komutunu kullanıp onu silmesini isteyebilirsiniz (örneğin /statusline delete, /statusline clear veya /statusline remove it). Alternatif olarak settings.json dosyanızdan statusLine alanını elle silmeniz yeterlidir.

statusLine Ayarının Alanları

statusLine nesnesi birkaç küçük ama işe yarar seçenek alır. Hepsini bir arada gösteren bir örnek:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 1,
    "refreshInterval": 5,
    "hideVimModeIndicator": true
  }
}
Alan Zorunlu mu? Ne işe yarar?
type Evet "command" olmalı; "bu kabuk komutunu çalıştır" anlamına gelir.
command Evet Çalıştırılacak betik yolu ya da satır içi kabuk komutu.
padding Hayır İçeriğe karakter cinsinden ek yatay boşluk ekler. Varsayılan 0. Arayüzün kendi boşluğuna ek olarak uygulanır, yani terminal kenarına mutlak uzaklığı değil göreli girintiyi ayarlar.
refreshInterval Hayır Olay tabanlı güncellemelere ek olarak komutu her N saniyede bir yeniden çalıştırır. En küçük değer 1. Ayarlanmazsa komut yalnızca olaylarda çalışır.
hideVimModeIndicator Hayır true yapıldığında istemin altındaki yerleşik -- INSERT -- metnini gizler. Vim modunu betiğinizde kendiniz gösteriyorsanız mod iki kez görünmesin diye kullanılır.

refreshInterval'ın neden var olduğunu anlamak için status line'ın ne zaman güncellendiğine bakmak gerekiyor.

Status Line Ne Zaman Güncellenir?

Betiğiniz bir oturum başladığında (devam ettirilen oturumlar dahil) bir kez çalışır. Sonrasında şu olaylardan herhangi biri gerçekleştiğinde yeniden çalışır:

  • Yeni bir asistan mesajı geldiğinde,
  • /compact tamamlandığında,
  • İzin modu değiştiğinde,
  • Vim modu açılıp kapandığında,
  • statusLine ayarındaki command değiştiğinde,
  • Ayarladıysanız refreshInterval süresi dolduğunda,
  • Betiğin son aldığı verideki bir rate-limit penceresi resets_at zamanına ulaştığında,
  • Betiğin son aldığı verideki sıcak prompt cache expires_at zamanına ulaştığında.

Claude Code güncellemeleri 300 ms ile debounce eder: art arda gelen değişiklikler birleştirilir ve betiğiniz değişiklikler durduktan sonra bir kez çalışır. Tek istisna command değerinin kendisinin değişmesidir; bu durumda debounce atlanır ve yeni komut hemen çalıştırılır. Betiğiniz hâlâ çalışırken yeni bir güncelleme tetiklenirse Claude Code çalışmakta olan betiği iptal eder. Betik dosyasını düzenlerseniz değişiklikler bir sonraki tetikleyicide görünür; ayar dosyasını kaydettiğinizde ise Claude Code ayarları otomatik olarak yeniden yükler.

Olay tabanlı tetikleyicilerin bir zayıf noktası var: ana oturum boştayken — örneğin bir koordinatör arka plandaki subagent'ları beklerken — hiçbir olay gelmeyebilir. Saat gibi zamana dayalı bir bölüm gösteriyorsanız ya da arka plandaki subagent'lar ana oturum boştayken git durumunu değiştiriyorsa, refreshInterval ile komutu sabit bir zamanlayıcıyla da çalıştırmak gerekir.

İlk Status Line Betiğinizi Adım Adım Yazmak

Aşağıdaki adımlar, /statusline komutunun arka planda sizin için yaptığı şeyin elle yapılmış halidir: model adını, çalışma dizinini ve bağlam penceresi yüzdesini gösteren bir status line. Örnekler macOS ve Linux'ta çalışan Bash betikleridir ve JSON ayrıştırmak için jq kullanır; sisteminizde yoksa kurmanız gerekebilir.

1. JSON okuyup çıktı basan betiği oluşturun

Aşağıdaki içeriği ~/.claude/statusline.sh olarak kaydedin:

#!/bin/bash
# Claude Code'un stdin'e gönderdiği JSON'u oku
input=$(cat)

# jq ile alanları çıkar
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
# "// 0", alan null ise geri dönüş değeri sağlar
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# ${DIR##*/} yalnızca klasör adını alır
echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"

2. Betiği çalıştırılabilir yapın

chmod +x ~/.claude/statusline.sh

3. Ayarlara ekleyin

~/.claude/settings.json dosyasına şu yapılandırmayı ekleyin:

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

Dosyayı kaydettiğiniz anda Claude Code ayarları yeniden yükler ve betiğinizi çalıştırır; status line arayüzün altında belirir. Betikteki // 0 ifadesi önemlidir: oturumun başında bazı alanlar henüz null olabilir ve geri dönüş değeri olmadan betik boş ya da hatalı çıktı üretir.

Betiğe Hangi Veriler Gelir? (JSON Alanları)

Status line'ın asıl gücü, betiğinize gönderilen JSON'un zenginliğindedir. Aşağıda en sık kullanılan alanların kısaltılmış bir örneği var; tam şema resmi dokümantasyonda yer alıyor:

{
  "cwd": "/current/working/directory",
  "session_id": "abc123...",
  "model": { "id": "claude-opus-5-5", "display_name": "Opus" },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory",
    "added_dirs": []
  },
  "cost": {
    "total_cost_usd": 0.01234,
    "total_duration_ms": 45000,
    "total_api_duration_ms": 2300,
    "total_lines_added": 156,
    "total_lines_removed": 23
  },
  "context_window": {
    "total_input_tokens": 15500,
    "total_output_tokens": 1200,
    "context_window_size": 200000,
    "used_percentage": 8,
    "remaining_percentage": 92
  },
  "effort": { "level": "high" },
  "rate_limits": {
    "five_hour": { "used_percentage": 23.5, "resets_at": 1738425600 },
    "seven_day": { "used_percentage": 41.2, "resets_at": 1738857600 }
  }
}

Alanları işlevlerine göre gruplayan bir özet tablo:

Grup Alanlar Açıklama
Model model.id, model.display_name Geçerli model kimliği ve görünen adı.
Çalışma alanı workspace.current_dir, workspace.project_dir, workspace.added_dirs, workspace.git_worktree, workspace.repo.* Geçerli dizin, Claude Code'un başlatıldığı dizin, /add-dir ile eklenen dizinler, bağlı git worktree adı ve origin remote'undan ayrıştırılan host/owner/name.
Maliyet ve süre cost.total_cost_usd, cost.total_duration_ms, cost.total_api_duration_ms, cost.total_lines_added, cost.total_lines_removed Tahmini oturum maliyeti, toplam duvar saati süresi, API yanıtlarını bekleme süresi ve değişen satır sayıları.
Bağlam penceresi context_window.*, exceeds_200k_tokens Token sayıları, pencere boyutu, hazır hesaplanmış kullanılan/kalan yüzdeler ve 200k eşiği bayrağı.
Oturum ayarları fast_mode, effort.level, thinking.enabled, output_style.name, vim.mode, agent.name Fast mode, canlı effort seviyesi (/effort değişiklikleri dahil), extended thinking, çıktı stili, vim modu ve --agent ile çalışan ajanın adı.
Kullanım limitleri rate_limits.five_hour.*, rate_limits.seven_day.*, rate_limits.spend_limit.* 5 saatlik ve 7 günlük pencerelerin yüzdeleri ve sıfırlanma zamanları; Claude apps gateway arkasında harcama limiti.
Prompt cache prompt_cache.* Ana konuşmanın cache istatistikleri: sıcak mı (warm), isabet oranı (hit_ratio), ıskalar ve olası nedenleri.
Kimlik session_id, session_name, prompt_id, transcript_path, version Oturum kimliği ve adı, işlenen istemin UUID'si, transcript dosyası yolu ve Claude Code sürümü.
Git / PR pr.number, pr.url, pr.review_state, pr.kind, worktree.* Geçerli dal için açık PR (GitLab'da merge request), inceleme durumu ve worktree oturumu bilgileri.

Bazı alanlar her zaman gelmez

Sağlam bir betik yazmanın anahtarı, hangi alanların eksik ya da null olabileceğini bilmektir. Dokümantasyona göre şu alanlar yalnızca belirli koşullarda JSON'da bulunur:

  • session_name: --name veya /rename ile özel bir ad verildiğinde ya da yapay zekâ tarafından üretilmiş bir oturum başlığı oluştuğunda.
  • prompt_id: ilk kullanıcı girdisinden sonra.
  • workspace.git_worktree: yalnızca bağlı (linked) bir git worktree içindeyken; workspace.repo: yalnızca origin remote'u tanımlı bir git deposunda.
  • effort: yalnızca geçerli model effort parametresini destekliyorsa.
  • vim: yalnızca vim modu açıkken; agent: yalnızca --agent bayrağıyla ya da agent ayarlarıyla çalışırken.
  • pr: geçerli dal için açık bir PR veya merge request bulunduğu sürece; birleştiğinde ya da kapandığında kaldırılır.
  • worktree: yalnızca bir worktree oturumundayken.
  • rate_limits: yalnızca claude.ai Pro ve Max aboneleri için (ya da harcama limiti koyan bir Claude apps gateway arkasında) ve oturumdaki ilk API yanıtından sonra. Her pencere bağımsız olarak eksik olabilir.
  • prompt_cache: ana konuşmanın ilk API yanıtından sonra.

Ayrıca context_window.current_usage oturumdaki ilk API çağrısından önce ve /compact'tan hemen sonra bir sonraki çağrıya kadar null'dır; used_percentage ve remaining_percentage da oturumun başında null olabilir. Bash'te jq ile // 0 ya da // empty, Python'da or 0, Node.js'te ?. ve || 0 bu durumları karşılamanın standart yollarıdır.

Bağlam yüzdesi nasıl hesaplanır?

used_percentage yalnızca girdi token'larından hesaplanır: input_tokens + cache_creation_input_tokens + cache_read_input_tokens. Çıktı token'ları (output_tokens) bu hesaba dahil değildir. Yüzdeyi current_usage nesnesinden kendiniz hesaplıyorsanız, used_percentage ile tutarlı olması için aynı formülü kullanmalısınız. context_window_size varsayılan olarak 200000'dir; genişletilmiş bağlamlı modellerde 1000000 olur. exceeds_200k_tokens bayrağı ise gerçek pencere boyutundan bağımsız olarak sabit 200k eşiğine göre çalışır.

Bağlam penceresinin neden bu kadar önemli olduğunu, token tüketimini nasıl azaltacağınızı ve /compact'ın ne zaman işe yaradığını Claude Code'da Maliyet ve Context Yönetimi: Token Optimizasyon Rehberi yazısında ayrıntılı anlatmıştım; status line bu rehberdeki alışkanlıkları sürekli görünür kılmanın en kolay yoludur.

Maliyet alanı hakkında bir uyarı

cost.total_cost_usd istemci tarafında, liste fiyatı üzerinden hesaplanan tahmini bir değerdir (bir modelPricing tablosu tanımlanmadıysa) ve gerçek faturanızdan farklı olabilir. /clear yeni bir oturum başlattığında 0 dolara sıfırlanır. cost.total_duration_ms ise devam ettirmeler boyunca birikir, oturumun çalışmadığı süreyi saymaz.

Hazır Status Line Örnekleri

Aşağıdaki örneklerin hepsi resmi dokümantasyondaki desenlerden uyarlanmıştır. Her birini kullanmak için betiği bir dosyaya (örneğin ~/.claude/statusline.sh) kaydedip chmod +x ile çalıştırılabilir yapmanız ve yolu ayarlarınıza eklemeniz yeterli.

Renkli git durumu

Bu betik git dalını, stage edilmiş ve değiştirilmiş dosya sayılarını renkli göstergelerle gösterir. \033[32m yeşil, \033[33m sarı, \033[0m ise rengi sıfırlar. Terminalinizin ANSI renklerini desteklemesi gerekir:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')

GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

    GIT_STATUS=""
    [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

    echo -e "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH $GIT_STATUS"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

Çok satırlı durum çubuğu

Betiğinizdeki her echo veya print ayrı bir satır olarak görünür. Aşağıdaki örnek birkaç tekniği birleştirir: eşik tabanlı renkler (%70 altı yeşil, %70–89 sarı, %90 ve üstü kırmızı), bir ilerleme çubuğu ve git dalı:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

# Bağlam kullanımına göre çubuk rengi
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /█}${PAD// /░}"

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"

Tıklanabilir linkler (OSC 8)

OSC 8 kaçış dizileriyle metni tıklanabilir hale getirebilirsiniz (macOS'ta Cmd+tık, Windows/Linux'ta Ctrl+tık). Bunun için iTerm2, Kitty veya WezTerm gibi hiperlink destekleyen bir terminal gerekir. Dokümantasyon, kaçış dizilerini farklı kabuklarda daha güvenilir yorumladığı için Bash'te echo -e yerine printf '%b' kullanılmasını öneriyor:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')

# git SSH URL'sini HTTPS'e çevir
REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')

if [ -n "$REMOTE" ]; then
    REPO_NAME=$(basename "$REMOTE")
    # OSC 8 biçimi: \e]8;;URL\a ardından METİN ardından \e]8;;\a
    printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"
else
    echo "[$MODEL]"
fi

Rate limit kullanımı

claude.ai aboneyseniz 5 saatlik kayan pencereyi ve haftalık pencereyi doğrudan durum çubuğunda görebilirsiniz. Bu alanlar her zaman gelmediği için // empty kullanımı kritik:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
# "// empty", rate_limits yoksa hiçbir çıktı üretmez
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
WEEK=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

LIMITS=""
[ -n "$FIVE_H" ] && LIMITS="5h: $(printf '%.0f' "$FIVE_H")%"
[ -n "$WEEK" ] && LIMITS="${LIMITS:+$LIMITS }7d: $(printf '%.0f' "$WEEK")%"

[ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"

Claude apps gateway arkasında çalışıyorsanız rate_limits.spend_limit nesnesi harcama limitinizi gösterir. used_percentage ve resets_at her yanıtla gelir; used_usd, limit_usd ve period ise ayrı bir istekle yaklaşık beş dakikada bir okunduğu için yüzdeden biraz geride kalabilir ve CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC ayarlıysa hiç gelmez. Bu alanları her zaman isteğe bağlı kabul edin.

Performans: Pahalı Komutları Önbelleğe Almak

Status line betiği aktif oturumlarda sık çalışır. git status veya git diff gibi komutlar büyük depolarda yavaş olabilir ve yavaş bir betik, bitene kadar durum çubuğunun güncellenmesini engeller. Çözüm, pahalı sonuçları geçici bir dosyada tutup belirli aralıklarla yenilemektir.

Burada ince bir nokta var: önbellek dosyasının adı aynı oturum içindeki çağrılar arasında sabit, ama farklı oturumlar arasında benzersiz olmalıdır; aksi halde farklı depolardaki eşzamanlı oturumlar birbirinin git durumunu okur. $$, os.getpid() veya process.pid gibi süreç kimlikleri her çağrıda değiştiği için önbelleği işe yaramaz hale getirir. Dokümantasyonun önerisi JSON'daki session_id'yi kullanmaktır; bu değer oturum boyunca sabittir ve oturum başına benzersizdir:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
SESSION_ID=$(echo "$input" | jq -r '.session_id')

CACHE_FILE="/tmp/statusline-git-cache-$SESSION_ID"
CACHE_MAX_AGE=5  # saniye

cache_is_stale() {
    [ ! -f "$CACHE_FILE" ] || \
    [ $(($(date +%s) - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]
}

if cache_is_stale; then
    if git rev-parse --git-dir > /dev/null 2>&1; then
        BRANCH=$(git branch --show-current 2>/dev/null)
        STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
        MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')
        echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"
    else
        echo "||" > "$CACHE_FILE"
    fi
fi

IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

if [ -n "$BRANCH" ]; then
    echo "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH +$STAGED ~$MODIFIED"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

Betikteki stat sırası bilinçlidir: Linux biçimi (stat -c %Y) önce denenir, çünkü Linux'ta macOS biçimi (stat -f %m) başarısız olmadan önce stdout'a bir dosya sistemi raporu basar ve bu çıktı aritmetiği bozar.

Terminal genişliğine göre çıktı

Claude Code betiğinizin çıktısını doğrudan terminale bağlamak yerine yakalar. Bu yüzden betik içinden tput cols ya da dilin kendi genişlik algılama yöntemleri terminal boyutunu okuyamaz. Bunun yerine Claude Code'un betiği çalıştırmadan önce geçerli terminal boyutlarına ayarladığı COLUMNS ve LINES ortam değişkenlerini kullanın. Durum çubuğunun genişliği sınırlıdır; uzun çıktılar kesilebilir ya da kötü sarılabilir, bu yüzden çıktıyı kısa tutmak ve dar terminallerde daha az bölüm göstermek iyi bir pratiktir.

Subagent Satırlarını Özelleştirmek: subagentStatusLine

Ana status line'ın yanında, istemin altındaki ajan panelinde gösterilen her subagent satırı için de özel içerik üretebilirsiniz. subagentStatusLine ayarı, varsayılan ad · açıklama · token sayısı satırının yerine kendi biçimlendirmenizi koymanızı sağlar:

{
  "subagentStatusLine": {
    "type": "command",
    "command": "~/.claude/subagent-statusline.sh"
  }
}

Bu komut her yenileme döngüsünde bir kez çalışır ve görünen tüm subagent satırlarını tek bir JSON nesnesi olarak stdin'den alır. Girdi, hook'lardaki temel ortak alanları, kullanılabilir satır genişliğini veren bir columns alanını ve her satır için bir giriş içeren tasks dizisini içerir. Her görev girişinde id, name (varsa), agentType, status (running, completed, failed, killed gibi), description, label, startTime, model, effort, contextWindowSize, tokenCount, son 16 okumayı tutan tokenSamples ve cwd gibi alanlar bulunur.

Çıktı biçimi ana status line'dan farklıdır: değiştirmek istediğiniz her satır için stdout'a bir JSON satırı yazarsınız:

{"id": "<task id>", "content": "<satır içeriği>"}

content metni ANSI renkleri ve OSC 8 linkleri dahil olduğu gibi işlenir. Bir görevin id'sini hiç yazmazsanız o satır varsayılan haliyle kalır; boş bir content yazarsanız satır gizlenir. tokenCount ile contextWindowSize'dan satır başına bağlam yüzdesi hesaplanabilir. Subagent'ların ne zaman ve nasıl kullanılacağını merak ediyorsanız Claude Code'da Subagent (Alt Ajan) Kullanımı: Kapsamlı Rehber yazısına göz atabilirsiniz.

Windows'ta Status Line Yapılandırması

Windows'ta Claude Code status line komutlarını, Git Bash kuruluysa Git Bash üzerinden, değilse PowerShell üzerinden çalıştırır. Burada sık yapılan bir hata var: Git Bash tırnaksız ters eğik çizgileri kaçış karakteri olarak yorumlar. Bu yüzden C:\Users\username\script.mjs gibi Windows tarzı bir yol ayırıcıları silinmiş halde çalıştırıcıya ulaşır ve komut görünür bir hata vermeden başarısız olur. command içindeki yolları düz eğik çizgiyle yazın; ~ kısaltması da çalışır ve Windows ev dizininize genişler.

Bir PowerShell betiğini status line olarak kullanmak için onu powershell ile çağırın; bu yöntem komut Git Bash'ten de PowerShell'den de geçse çalışır:

{
  "statusLine": {
    "type": "command",
    "command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"
  }
}
$input_json = $input | Out-String | ConvertFrom-Json
$cwd = $input_json.cwd
$model = $input_json.model.display_name
$used = $input_json.context_window.used_percentage
$dirname = Split-Path $cwd -Leaf

if ($used) {
    Write-Host "$dirname [$model] ctx: $used%"
} else {
    Write-Host "$dirname [$model]"
}

Git Bash kuruluysa bir Bash betiğini de doğrudan ~/.claude/statusline.sh yoluyla çalıştırabilirsiniz.

Gerçek Dünya Senaryosu: Günlük Kullanım İçin İki Satırlık Durum Çubuğu

Teoriyi pratiğe dökelim. Diyelim ki gün boyu birkaç depoda, bazen worktree oturumlarında, bazen bir PR üzerinde çalışıyorsunuz ve claude.ai Max aboneliği kullanıyorsunuz. Sizin için önemli olanlar şunlar: hangi model ve effort seviyesindesiniz, hangi klasör ve worktree'desiniz, açık bir PR var mı, bağlam ne kadar dolu, oturum ne kadar tuttu ve 5 saatlik limitinizin ne kadarını kullandınız.

Aşağıdaki betik, dokümantasyondaki alanları ve desenleri birleştirerek bunu iki satırda gösterir. Yalnızca var olan alanları yazdırdığı için worktree dışında, PR yokken ya da abonelik limit verisi gelmediğinde de temiz kalır:

#!/bin/bash
# ~/.claude/statusline.sh — günlük kullanım için iki satırlık durum çubuğu
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
EFFORT=$(echo "$input" | jq -r '.effort.level // empty')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
PR=$(echo "$input" | jq -r '.pr.number // empty')
WT=$(echo "$input" | jq -r '.worktree.name // empty')

GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'
if [ "$PCT" -ge 90 ]; then C="$RED"; elif [ "$PCT" -ge 70 ]; then C="$YELLOW"; else C="$GREEN"; fi

LINE1="[$MODEL${EFFORT:+ · $EFFORT}] 📁 ${DIR##*/}"
[ -n "$WT" ] && LINE1="$LINE1 | 🌳 $WT"
[ -n "$PR" ] && LINE1="$LINE1 | PR #$PR"

LINE2="${C}ctx ${PCT}%${RESET} | $(printf '$%.2f' "$COST")"
[ -n "$FIVE_H" ] && LINE2="$LINE2 | 5h: $(printf '%.0f' "$FIVE_H")%"

echo -e "$LINE1"
echo -e "$LINE2"

Bu betiği devreye almak için şu sırayı izleyin:

  1. Betiği ~/.claude/statusline.sh olarak kaydedin ve chmod +x ~/.claude/statusline.sh ile çalıştırılabilir yapın.
  2. Ayarlara eklemeden önce sahte bir girdiyle test edin (aşağıdaki "İpuçları" bölümüne bakın). Eksik alanlarda betiğin hata vermediğinden emin olun.
  3. ~/.claude/settings.json içine statusLine alanını ekleyin. Yalnızca effort ve model gibi olaylarla değişen veriler gösterdiğiniz için refreshInterval'a ihtiyacınız yok; arka plan subagent'ları git durumunu değiştiriyorsa birkaç saniyelik bir değer ekleyebilirsiniz.
  4. Büyük bir depoda git bilgisi göstermek isterseniz yukarıdaki önbellekleme desenini birleştirin; doğrudan git diff çalıştırmak durum çubuğunu yavaşlatabilir.

Bu kurulumla, bağlam %70'i geçtiğinde sarıya, %90'ı geçtiğinde kırmızıya dönen gösterge size /compact ya da yeni bir oturum için zamanın geldiğini hatırlatır; PR numarası ve worktree adı ise paralel oturumlar arasında hangi pencerenin hangi iş olduğunu bir bakışta ayırt etmenizi sağlar.

İpuçları

  • Sahte girdiyle test edin: betiği ayarlara eklemeden önce elle çalıştırın. Dokümantasyondaki örnek komut:
echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh
  • Çıktıyı kısa tutun: durum çubuğunun genişliği sınırlıdır; uzun çıktılar kesilebilir veya kötü sarılabilir.
  • Yavaş işlemleri önbelleğe alın: betik sık çalışır; git status gibi komutlar gecikmeye yol açabilir.
  • Hazır projelere bakın: dokümantasyon, temalar ve ek özellikler sunan topluluk projeleri olarak ccstatusline ve starship-claude'u anıyor.

Status Line Görünmüyorsa Ne Yapmalı? (Sorun Giderme)

Status line hiç görünmüyor

Status line'ı yapılandırdınız ama altta hiçbir şey yoksa şu kontrolleri sırayla yapın:

  • Betiğin çalıştırılabilir olduğunu doğrulayın: chmod +x ~/.claude/statusline.sh.
  • Betiğin stderr'e değil stdout'a yazdığından emin olun.
  • Betiği elle çalıştırıp çıktı ürettiğini doğrulayın.
  • Windows'ta Git Bash kuruluysa command yolundaki ters eğik çizgiler büyük olasılıkla kaçış karakteri olarak tüketiliyordur; düz eğik çizgi kullanın.
  • Managed settings dışında, ayar önceliği uygulandıktan sonra disableAllHooks true ise Claude Code yalnızca managed settings'ten gelen bir statusLine'ı çalıştırır; managed bir status line yoksa durum çubuğu devre dışı kalır.
  • Kuruluşunuz managed settings'te allowManagedHooksOnly ayarlamışsa özel status line'ınız uyarı vermeden kaybolur; yalnızca managed settings'teki statusLine değerini kullanabilirsiniz. Yöneticinize danışın.
  • claude --debug ile başlatın; bu mod betiğinizin stderr'ini her status line çağrısında, çıkış kodunu ise oturumdaki ilk çağrıda loglar.
  • Claude'dan ayar dosyanızı okuyup statusLine komutunu doğrudan çalıştırmasını isteyerek hataları ortaya çıkarabilirsiniz.
claude --debug

Workspace trust kabul edilmedi

statusLine bir kabuk komutu çalıştırdığı için Claude Code onu, ayar dosyalarındaki hook'larla aynı workspace trust kuralına tabi tutar. Klasör için güven diyaloğunu kabul edene kadar status line boş kalır; claude --debug bu durumda Status line command skipped: workspace trust not accepted mesajını loglar. Claude Code'u yeniden başlatıp diyaloğu kabul etmeniz (ya da güveni bu klasörü kapsayan bir üst dizin için kabul etmeniz) yeterlidir. Hook'ların güven ve güvenlik modeli hakkında daha fazlası için Claude Code'da Hooks: Olay Tabanlı Otomasyon Rehberi yazısına bakabilirsiniz.

Betik hata veriyor ya da takılıyor

Claude Code betiğinizin çıktısını yalnızca betik 0 çıkış koduyla sonlandıktan sonra gösterir. Sıfırdan farklı kodla çıkan ya da hiç çıktı üretmeyen betikler durum çubuğunu boşaltır. Yavaş betikler tamamlanana kadar güncellemeyi engeller; yavaş bir betik çalışırken yeni bir güncelleme tetiklenirse çalışmakta olan betik iptal edilir. Betiği ayarlara eklemeden önce sahte girdiyle bağımsız olarak test edin.

-- veya boş değerler görünüyor

İlk API yanıtı tamamlanmadan önce bazı alanlar null olabilir; betikte jq'nun // 0 gibi geri dönüş değerlerini kullanın. Birkaç mesajdan sonra değerler hâlâ boşsa Claude Code'u yeniden başlatın.

Bağlam yüzdesi /context'ten farklı

Status line son API yanıtındaki sayıları raporlar; /context ise o yanıttan sonra eklenen mesajlar için bir tahmin ekler. Bu yüzden bir sonraki yanıta kadar /context daha yüksek okuyabilir. En basit ve doğru bağlam durumu için used_percentage'ı kullanın.

OSC 8 linkleri tıklanmıyor

Terminalinizin OSC 8 desteklediğini doğrulayın (iTerm2, Kitty, WezTerm); Terminal.app tıklanabilir linkleri desteklemez. Link metni görünüyor ama tıklanmıyorsa Claude Code terminalinizde hiperlink desteğini algılamamış olabilir; algılamayı geçersiz kılmak için FORCE_HYPERLINK ortam değişkenini ayarlayın:

FORCE_HYPERLINK=1 claude

SSH ve tmux oturumları yapılandırmaya bağlı olarak OSC dizilerini silebilir. Kaçış dizileri \e]8;; gibi düz metin olarak görünüyorsa echo -e yerine printf '%b' kullanın.

Görüntü bozulmaları ve bildirimler

Karmaşık kaçış dizileri (ANSI renkler, OSC 8 linkleri) diğer arayüz güncellemeleriyle çakıştığında zaman zaman bozuk çıktıya yol açabilir; renkli çok satırlı status line'lar düz tek satırlı metne göre buna daha yatkındır. Bozuk metin görürseniz betiği sadeleştirmeyi deneyin. Ayrıca fullscreen rendering dışında Claude Code bildirimleri status line'ınızla aynı satırda gösterir: MCP sunucu hataları ve otomatik güncellemeler gibi sistem bildirimleri satırın sağında görünür, düşük bağlam uyarısı gibi geçici bildirimler de bu alanda döner. Dar terminallerde bu bildirimler status line çıktınızı kesebilir; fullscreen rendering'de ise bildirimlere ayrı bir satır verilir.

Sıkça Sorulan Sorular

Claude Code status line API token'ı tüketir mi?

Hayır. Status line tamamen yerel olarak çalışır ve API token'ı tüketmez. Betiğiniz modelle konuşmaz; Claude Code'un zaten elinde olan oturum verilerini JSON olarak stdin'den alır ve biçimlendirip stdout'a yazar.

Status line'ı nasıl kapatırım?

/statusline komutunu çalıştırıp status line'ı kaldırmasını isteyebilirsiniz (örneğin /statusline delete, /statusline clear veya /statusline remove it). Alternatif olarak settings.json dosyanızdan statusLine alanını elle silmeniz yeterlidir.

Status line neden her saniye güncellenmiyor?

Status line olay tabanlıdır: oturum başında, yeni bir asistan mesajı geldiğinde, /compact bittiğinde, izin modu veya vim modu değiştiğinde ve command ayarı değiştiğinde çalışır; güncellemeler 300 ms ile debounce edilir. Saat gibi zamana dayalı veriler göstermek ya da ana oturum boştayken güncel kalmak için statusLine ayarına refreshInterval ekleyerek komutu her N saniyede bir (en az 1) yeniden çalıştırabilirsiniz.

Rate limit alanları neden betiğime gelmiyor?

rate_limits nesnesi yalnızca claude.ai Pro ve Max aboneleri için ya da harcama limiti koyan bir Claude apps gateway arkasında, ve oturumdaki ilk API yanıtından sonra gönderilir. Her pencere (five_hour, seven_day, spend_limit) bağımsız olarak eksik olabilir; bu yüzden betikte jq ile // empty gibi geri dönüş ifadeleri kullanılmalıdır.

Status line'daki bağlam yüzdesi neden /context'ten farklı?

Status line son API yanıtındaki token sayılarını raporlar; /context ise o yanıttan sonra eklenen mesajlar için bir tahmin ekler, bu yüzden bir sonraki yanıta kadar daha yüksek okuyabilir. used_percentage yalnızca girdi token'larından (input_tokens + cache_creation_input_tokens + cache_read_input_tokens) hesaplanır, çıktı token'larını içermez.

Status line yapılandırdım ama hiçbir şey görünmüyor, neden?

En yaygın nedenler: betiğin çalıştırılabilir olmaması (chmod +x), çıktının stdout yerine stderr'e yazılması, betiğin sıfırdan farklı kodla çıkması, klasör için workspace trust diyaloğunun kabul edilmemiş olması, disableAllHooks veya managed settings'teki allowManagedHooksOnly ayarı ve Windows'ta Git Bash'in yoldaki ters eğik çizgileri tüketmesi. claude --debug ile başlatmak betiğin stderr'ini ve çıkış kodunu loglar.

Status line'ı kurduktan sonra bir sonraki adım, gösterdiği verileri aksiyona çevirmektir. Bağlam ve maliyet göstergelerinizi nasıl yorumlayacağınızı Claude Code'da Maliyet ve Context Yönetimi yazısında, subagent satırlarında gördüğünüz ajanları nasıl tasarlayacağınızı Claude Code'da Subagent Rehberi yazısında bulabilirsiniz.

Özet

Claude Code'un status line özelliği, oturumunuzun en önemli göstergelerini — model, effort, bağlam kullanımı, maliyet, rate limit'ler, git dalı, PR ve worktree — ekranın altında sürekli görünür tutmanın en hafif yoludur. /statusline ile doğal dilde tarif ederek saniyeler içinde başlayabilir ya da settings.json'a bir statusLine alanı ekleyip kendi Bash, Python, Node.js veya PowerShell betiğinizi yazabilirsiniz. Betiğiniz stdin'den JSON alır, stdout'a ne yazarsa o görünür; çok satır, ANSI renkler ve OSC 8 linkleri desteklenir. Sağlam bir betik için eksik ve null alanlara geri dönüş değerleri verin, pahalı git komutlarını session_id tabanlı bir önbellekle sınırlayın, terminal genişliği için COLUMNS'u kullanın ve sorun yaşadığınızda claude --debug ile workspace trust kontrolünü unutmayın. İsterseniz subagentStatusLine ile ajan panelindeki satırları da kendi ihtiyaçlarınıza göre biçimlendirebilirsiniz.

Bu yazı Ahmet Bilgiç tarafından ahmetbilgic.com için yazılmıştır. Diğer yazılar için: medium.com/@ahmet_bilgic07