Claude Code statusLine Ayarı Nasıl Yapılır?
Claude Code statusLine ayarı ile terminalde hostname, dizin ve git bilgilerini görüntüleyin. settings.json dosyasında script tanımlayarak yanlış sunucuda işlem yapmayı önleyin.
Claude Code durum satırı ne gösterir
Claude Code durum satırı, yazdığınız bir betiğin çıktısını görüntüleyen, istemin altındaki bir satırdır. Bir statusLine bloğunu settings.json içine ekleyip bir komuta yönlendirirsiniz. Claude Code bu komutu çalıştırır, oturum durumunu standart girdi (stdin) üzerinden JSON olarak gönderir ve komutun standart çıktıya (stdout) yazdığı her şeyi yazdırır.
Tüm sözleşme bundan ibarettir. Betiğiniz stdin üzerinden JSON okur ve stdout üzerine metin yazdırır. Kendi makinenizde çalışır ve yazdırdığı hiçbir şey modele gönderilmez, bu nedenle token maliyeti oluşturmaz.
Tek bir projeye sahip bir dizüstü bilgisayarda bu sadece bir süslemedir. Üç sunucuda ise bir güvenlik önlemidir. Her Claude Code oturumu her terminalde aynı görünür; bu nedenle etiketsiz dört SSH penceresi, bir taşıma işleminin yanlış sunucuda gerçekleşmesine neden olabilir. Hostname ile başlayan bir durum satırı, bu tür hataları tamamen ortadan kaldırır.
statusLine ayarının settings.json içinde bulunduğu yer
Bu ayarı, o makinedeki her projeye uygulanan ~/.claude/settings.json içindeki kullanıcı ayarlarınıza ekleyin. Bir depo içindeki .claude/settings.json konumunda bulunan proje ayarları da çalışır ve ilgili dizin için önceliklidir.
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}type her zaman "command" değerindedir. command değeri bir kabuk (shell) üzerinden çalıştırılır; bu nedenle bir betik yolu veya doğrudan bir komut olabilir. Herhangi bir betik yazmadan önce bağlantının çalıştığını doğrulayın:
{
"statusLine": {
"type": "command",
"command": "hostname -s"
}
}Claude Code uygulamasını başlatın ve bir mesaj gönderin. İstemin altındaki çubukta artık sunucunun kısa ana makine adı (hostname) görünür. Eğer boş kalıyorsa, sorun betiğinizde değil, ayarda veya güven iletişim kutusundadır. Aşağıdaki "statusline neden boş kalıyor" bölümünü okuyun.
Ağustos 2026 itibarıyla üç isteğe bağlı anahtar mevcuttur. padding karakter cinsinden yatay boşluk ekler ve varsayılan değeri 0'dur. refreshInterval, normal tetikleyicilere ek olarak komutu her N saniyede bir yeniden çalıştırır; minimum değer 1'dir ve bu ayar yalnızca satırda bir saat veya oturum boşta dururken değişen bir veri gösterildiğinde gereklidir. hideVimModeIndicator, kendi betiğiniz zaten vim modunu işliyorsa yerleşik -- INSERT -- metnini gizler.
Statusline betiği hangi verileri alır?
Bu sayfa dahil olmak üzere herhangi bir yerde okuduğunuz alan listesine güvenmeyin. Sürümünüzün gönderdiği gerçek nesneyi yakalayın. stdin içeriğini bir dosyaya kaydeden geçici bir betik yazın:
cat > ~/.claude/statusline-capture.sh <<'EOF'
#!/bin/bash
cat > /tmp/statusline-input.json
echo "captured"
EOF
chmod +x ~/.claude/statusline-capture.shstatusLine.command değerini bu dosyaya yönlendirin, bir oturum başlatın ve bir mesaj gönderin. Çubuk captured değerini okur. Şimdi gelen veriye bakın:
jq . /tmp/statusline-input.jsonYapınız için tam şekle sahipsiniz ve bir güncelleme bir şeyi değiştirdiğinde bunu istediğiniz zaman tekrarlayabilirsiniz.
Ağustos 2026 itibarıyla belgelendiği üzere kararlı kısımlar, düz anahtarlar yerine iç içe geçmiş nesnelerdir. model, id ve display_name değerlerini tutar. workspace, current_dir ve project_dir değerlerini tutar: current_dir oturumun şu anki konumudur, project_dir ise başlatıldığı konumdur; çalışma dizini oturum ortasında değiştiğinde bu ikisi farklılaşır. En üst düzeydeki cwd, workspace.current_dir ile aynı değeri taşır. context_window, token sayılarını ve önceden hesaplanmış bir used_percentage değerini tutar. cost, total_cost_usd ve süre sayaçlarını tutar. session_id, oturum süresince kararlıdır ve oturumlar arasında benzersizdir; bu durum daha sonra önbelleğe alma işlemleri için önemlidir.
Üç kural, bir betiği şema değişiklikleri boyunca canlı tutar.
Bazı anahtarlar boş (null) değil, mevcut değildir. vim, agent, pr, worktree ve effort yalnızca ilgili özellik aktif olduğunda görünür. Vim modu kapalıyken .vim.mode değerini jq -r ile okumak, tam olarak null dizisini yazdırır ve çubuğunuz kullanıcıya null değerini gösterir. Eksik bir anahtarın hiçbir şey yazdırmaması için her seçiciye // empty ekleyin.
Bazı değerler başlangıçta boştur (null). context_window.used_percentage ve context_window.current_usage, ilk API yanıtından önce boştur; current_usage ise /compact sonrasında, bir sonraki çağrı verileri yeniden doldurana kadar boş değerine döner. Bu nedenle çubuk üzerindeki bir bağlam yüzdesi // 0 gerektirir, aksi takdirde her oturumun ilk saniyelerinde null değerini okur. Bu sayıyı çubuğa koymadan önce, bağlam penceresinin aslında nasıl dolduğunu bilmek faydalıdır.
Git dalı JSON içinde yer almaz. Hiçbir alan bunu raporlamaz. Çubuğunuzdaki herhangi bir dal, betiğinizin bizzat git komutunu çalıştırmasından gelir.
Hata vermek yerine işlevselliğini koruyan bir durum satırı betiği
Bu, kopyalayıp yapıştırabileceğiniz sürümdür. Hostname, çalışma dizini, git branch ve model adını yazdırır. Her alanın bir yedeği vardır, bu nedenle boş bir JSON nesnesi bile kullanılabilir bir satır üretir.
#!/bin/bash
# ~/.claude/statusline.sh
input=$(cat)
# Read one field. Prints nothing when the key is missing or null.
field() { printf '%s' "$input" | jq -r "$1 // empty" 2>/dev/null; }
HOST=$(hostname -s 2>/dev/null)
[ -z "$HOST" ] && HOST="host"
DIR=$(field '.workspace.current_dir')
[ -z "$DIR" ] && DIR=$(field '.cwd')
[ -z "$DIR" ] && DIR="$PWD"
MODEL=$(field '.model.display_name')
[ -z "$MODEL" ] && MODEL="claude"
SHORT="$DIR"
if [ -n "$HOME" ]; then
case "$DIR" in
"$HOME") SHORT="~" ;;
"$HOME"/*) SHORT="~/${DIR#"$HOME"/}" ;;
esac
fi
BRANCH=""
if git -C "$DIR" rev-parse --git-dir >/dev/null 2>&1; then
BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
[ -z "$BRANCH" ] && BRANCH="detached"
fi
CYAN=$'\033[36m'
YELLOW=$'\033[33m'
DIM=$'\033[2m'
RESET=$'\033[0m'
LINE="${CYAN}${HOST}${RESET} ${SHORT}"
[ -n "$BRANCH" ] && LINE="${LINE} ${YELLOW}${BRANCH}${RESET}"
LINE="${LINE} ${DIM}${MODEL}${RESET}"
printf '%s\n' "$LINE"Her okuma işlemi, // empty ekleyen field üzerinden gerçekleşir; bu sayede yeniden adlandırılan veya kaldırılan bir anahtar boş bir dizge üretir ve bir sonraki satır varsayılan değeri sağlar. Dizin bilgisi workspace.current_dir üzerinden cwd ve $PWD değerlerine yedeklenir. Branch bilgisi, doğrudan git yerine git -C "$DIR" üzerinden alınır; böylece branch bilgisi her zaman çubuğun gösterdiği dizinle eşleşir.
Dosyayı kaydedin ve ardından çalıştırılabilir hale getirin:
chmod +x ~/.claude/statusline.shÇalıştırma izni (execute bit) isteğe bağlı değildir. Claude Code komutu bir shell üzerinden çalıştırır, bu nedenle +x iznine sahip olmayan bir betik Permission denied hatasıyla başarısız olur, stdout çıktısı üretmez ve satır görünür bir hata olmaksızın boş kalır.
jq komut satırında JSON ayrıştırması yapar ve temiz bir Ubuntu sunucusunda yüklü değildir:
sudo apt update && sudo apt install -y jqArdından, yukarıdaki ilk settings.json bloğunu kullanarak ayarı betiğe yönlendirin.
Betik güvenilirliğini test etme
Betiği manuel olarak iki kez çalıştırın. İlk olarak normal bir oturum nesnesi ile:
echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/api"},"session_id":"t1"}' | ~/.claude/statusline.shAna makine adını, ardından /srv/api ve son olarak Opus değerini alırsınız. Makinenizdeki /srv/api muhtemelen bir git deposu olmadığı için herhangi bir dal adı görünmez.
İkinci olarak, insanların genellikle atladığı bozulma testini gerçekleştirin:
echo '{}' | ~/.claude/statusline.shBoş bir nesne, şema değişikliğinin size sunabileceği en kötü durumdur. Satır yine de ana makine adını, $PWD üzerinden mevcut dizini ve model adının gelmesi gereken yerde claude kelimesini yazdırır. Hiçbir şey çökmez ve null çıktısı alınmaz. Bu testi geçen bir betik, bir alanın yeniden adlandırılması durumunda da çalışmaya devam eder; çünkü betiğiniz için yeniden adlandırılmış bir alan ile eksik bir alan aynı olaydır.
Ne görmelisiniz
Durum satırı, yerleşik alt bilgi rozetlerinin üzerinde kendi satırında oluşturulur ve bunların yerini almaz. Çalışan bir kurulumda bu tek bir satırdır: camgöbeği renginde kısa ana makine adı, ardından ev dizininizin ~ olarak daraltıldığı çalışma dizini, dizin bir git deposu olduğunda sarı renkte dal adı ve ardından soluk renkte model adı. Bu dört parçanın renkli olduğu web-01 ~/api main Opus ifadesine yakın bir görüntü oluşur.
Satır; bir oturum başladığında (yeniden başlatma dahil), yeni bir asistan mesajı geldiğinde, /compact tamamlandıktan sonra, izin modu değiştiğinde, vim modu değiştirildiğinde ve ayarladıysanız bir refreshInterval işareti geldiğinde betiğinizi yeniden çalıştırır. Güncellemeler 300 ms ile sınırlandırılmıştır (debounced), bu nedenle bir dizi değişiklik betiği bir kez çalıştırır. Çubuk; otomatik tamamlama, yardım menüsü ve izin istemleri sırasında gizlenir, ardından geri döner.
Sunucu adının neden en başta yer alması gerektiği
Birden fazla sunucuda agent çalıştırdığınızda, bulunduğunuz yeri size söyleyen tek şey terminaldir ve terminaller yanıltıcı olabilir. Bir ssh bağlantısını bir tmux bölmesi içinden açtığınızda, pencere başlığı genellikle eski adı korur; çünkü başlık, yer değiştirdiğini öğrenemeyen bir kabuk tarafından ayarlanır. Claude Code'u bir VPS üzerinde ayrılmış bir tmux oturumunda çalışır durumda bırakıp bir gün sonra tekrar bağlandığınızda, ekrandaki hiçbir şey build sunucusunu üretim sunucusundan ayırt etmenizi sağlamaz.
Durum satırı farklıdır çünkü bu satır, Claude Code'un kendisi tarafından, oturum başına ve o oturumun tuttuğu verilerden oluşturulur. Yanlış bir bölmeden devralınamaz veya yenilenmemiş bir kabuk istemi tarafından güncelliğini yitirmiş halde bırakılamaz. Durum satırında yazan şey, agent'ın dosyaları yazdığı sunucudur.
Her sunucuya kendi rengini atayın; böylece okumadan önce sunucuyu tanırsınız. LINE= atamasının üzerine eklenen iki satır:
CODE=$(printf '%s' "$HOST" | cksum | cut -d' ' -f1)
HOST_COLOR=$(printf '\033[%dm' "$((31 + CODE % 6))")Ardından ${CYAN} yerine ${HOST_COLOR} kullanın. cksum, sunucu adının bir sağlama toplamını (checksum) yazdırır; böylece belirli bir ad, 31 ile 36 arasındaki (kırmızıdan camgöbeğine kadar) aralıkta her zaman aynı renkle eşleşir. Aynı betiği her sunucuya kopyaladığınızda, her biri kendini etiketlemiş olur.
Dizin de aynı nedenden dolayı yerini hak eder. /srv/api ve /srv/api-staging, bir ssh komutunda tek bir tuş vuruşu kadar yakın, ancak etki bakımından koca bir olay (incident) kadar uzaktır. Model ve branch, genişliği hak eden diğer iki öğedir: model, hangi oturumu devam ettirdiğinizi söyler; branch ise agent'ın main üzerine commit yapıp yapmayacağını gösterir.
Küçük bir ekran tüm bunları daha belirgin hale getirir, çünkü güvenebileceğiniz bir pencere başlığı yoktur. Kurulumunuz bu şekildeyse, Claude Code'u telefondan yönetme konusuna göz atın.
Betik performansını koruyun
Betiğiniz her asistan mesajında çalışır ve Claude Code yeni bir güncelleme geldiğinde devam eden çalışmayı iptal eder. Bu nedenle yavaş bir betik, güncel olmayan metinlerin görüntülenmesine veya hiç metin görüntülenmemesine neden olur.
Her jq çağrısı birkaç milisaniye sürer. git yavaşlayan kısımdır: git status, soğuk önbelleğe sahip büyük bir depoda yüzlerce milisaniye sürebilir. Yukarıdaki betik, git status kullanımından özellikle kaçınır ve .git/HEAD dosyasını okuyup anında geri dönen git branch --show-current komutunu çağırır.
Daha ağır bir işlem eklerseniz, bunu bir dosyada önbelleğe alın ve birkaç saniyede bir yenileyin. Dosyayı oturuma göre anahtarlayın:
CACHE="/tmp/statusline-$(field '.session_id')"$$ yerine session_id kullanın. $$, betiğinizin her çağrıda farklı olan işlem kimliğidir (PID); bu nedenle bu kimliğe göre anahtarlanan bir önbellek asla isabet etmez ve her seferinde tam maliyeti ödersiniz. session_id tüm oturum boyunca sabittir ve oturumlar arasında farklılık gösterir; böylece iki farklı depodaki iki Claude Code oturumu birbirinin önbelleğe alınmış dal adını okuyamaz.
Bilinmesi gereken bir diğer sınır: tput cols bir durum satırı (statusline) betiği içinde çalışmaz. Claude Code, betiğinizi terminale bağlamak yerine çıktıyı yakalar, bu nedenle genişlik algılama mekanizmasının ölçecek bir verisi olmaz. Claude Code, v2.1.153 ve sonraki sürümlerde komutu çalıştırmadan önce COLUMNS ve LINES ortam değişkenlerini ayarlar; bu nedenle ne kadar çıktı yazdıracağınıza karar vermeniz gerektiğinde $COLUMNS değişkenini okuyun.
Durum satırının boş kalmasının nedenleri
Hiçbir şey görünmüyor. ls -l ~/.claude/statusline.sh ile çalıştırma (execute) bitini kontrol edin, ardından yukarıdaki örnek girdiyle betiği manuel olarak çalıştırın. Eğer çıktı kabukta görünüyor ancak Claude Code içinde görünmüyorsa, oturumun ilk durum satırı çalışmasının çıkış kodunu ve stderr çıktısını kaydeden claude --debug ile başlayın.
Hata ayıklama günlüğü Status line command skipped: workspace trust not accepted diyor. Durum satırı bir kabuk komutu çalıştırır, bu nedenle kancalarla (hooks) aynı çalışma alanı güvenliği denetimine tabidir. O dizin için güven iletişim kutusunu onaylayana kadar komut çalışmaz. Bu durum, her yeni kopyanın Claude Code tarafından daha önce görülmemiş bir dizin olduğu VPS ortamlarında yaygındır. Claude Code'u o dizinde yeniden başlatın ve iletişim kutusunu onaylayın.
Her şey boş ve disableAllHooks ayarlı. settings.json içindeki "disableAllHooks": true, aynı kabuk yürütme denetimine tabi olduğu için durum satırını da devre dışı bırakır. Bu ayarı kaldırın veya false olarak ayarlayın.
Satır null yazdırıyor. Bir jq seçicisi eksik veya null olan bir anahtara ulaştı; jq -r ise null değerini null karakterleri olarak yazdırır. Metin için // empty, sayılar için // 0 ekleyin.
Betiği düzenledikten hemen sonra satır boşalıyor. Sıfırdan farklı bir değerle çıkan veya hiçbir şey yazdırmayan bir komut, satırı boşaltır. Bunun yaygın nedeni, dal boş olduğunda 1 değeriyle çıkan ve tüm betiğin çıkış kodunu etkileyen [ -n "$BRANCH" ] && LINE="..." gibi bir son satırdır. En sona printf ekleyin veya exit 0 kullanın.
Kaçış kodları (escape codes) çubuk üzerinde \e]8;; gibi düz metin olarak görünüyor. echo -e yerine printf '%b' kullanın. Tıklanabilir OSC 8 bağlantıları, bunları destekleyen bir terminal gerektirir; tmux veya SSH bu dizileri kaldırabilir, bu nedenle uzak sunucularda düz renk kullanımı daha güvenli bir tercihtir.
Satırın sağ tarafı kesiliyor. Sistem bildirimleri ve ayrıntılı mod (verbose-mode) belirteç sayacı, o satırı sağ taraftan paylaşır; dar bir terminalde çakışma nedeniyle veri kaybı yaşanır. Çıktıyı kısa tutun. Çubuk üzerindeki bir sayı yerine kullanımın gerçek bir dökümü için bkz. Claude Code belirteçleri nasıl sayar.
FAQ
Claude Code durum satırı ayarı nerede bulunur?
settings.json içerisinde, type değeri "command" olarak ayarlanmış ve command değeri bir betik yolu veya shell komutu olarak tanımlanmış bir statusLine bloğu olarak yer alır. Kullanıcı ayarları ~/.claude/settings.json konumundadır ve o makinedeki tüm projeler için geçerlidir. Proje ayarları ise deponun içindeki .claude/settings.json konumundadır ve ilgili dizin için önceliklidir. Ayarlar otomatik olarak yeniden yüklenir, ancak bir değişiklik yalnızca bir sonraki güncelleme tetikleyicisinde (örneğin bir sonraki mesajınızda) görünür hale gelir.
Claude Code durum satırım neden boş?
Neredeyse tüm durumlar dört nedenden kaynaklanır. Betikte çalıştırma izni (execute bit) eksiktir, bu nedenle shell Permission denied döndürür ve stdout'a hiçbir şey ulaşmaz. Çalışma alanı güven diyaloğu onaylanmamıştır ve claude --debug, Status line command skipped: workspace trust not accepted şeklinde log tutar. disableAllHooks değeri true olarak ayarlanmıştır; bu da aynı kısıtlama nedeniyle durum satırını devre dışı bırakır. Veya betik sıfırdan farklı bir değerle sonlanır ve bu da satırı boşaltır. Önce manuel olarak test edin: echo '{}' | ~/.claude/statusline.sh bir çıktı üretmelidir.
Durum satırı JSON verisi git dalını içeriyor mu?
Hayır. JSON verisi model, çalışma alanı dizinleri, bağlam penceresi sayıları ve maliyet gibi oturum durumlarını taşır. İçerisinde git bilgisini raporlayan bir veri yoktur. Çubuğunuzdaki bir dal bilgisi, kendi betiğinizin git branch --show-current komutunu çağırmasından gelir. JSON'dan gelen dizini git -C "$DIR" ile iletin; böylece dal bilgisi her zaman çubuğun gösterdiği dizinle eşleşir.
Durum satırı token harcar mı veya oturumu yavaşlatır mı?
Token harcamaz, çünkü betik yerel olarak çalışır ve çıktısı asla modele gönderilmez. Hız sizin sorumluluğunuzdadır. Komut, her asistan mesajında 300 ms gecikme (debounce) ile çalışır ve yeni bir güncelleme geldiğinde Claude Code devam eden çalışmayı iptal eder; bu nedenle bir saniye süren bir betik eski metni gösterir. Büyük depolarda git status kullanmaktan kaçının ve yavaş olan her şeyi session_id anahtarıyla bir dosyada önbelleğe alın.
Her sunucuda farklı bir durum satırını nasıl gösteririm?
Tek bir betik tutun ve makineyi okumasını sağlayın. Yukarıdaki betik, yedek olarak hostname -s ile $HOSTNAME değerini yazdırır; böylece her kutuya kopyalanan aynı dosya her birini doğru şekilde etiketler ve checksum renk hilesi her hostname'e kendi rengini verir. Eğer bir sunucu farklı bir düzen gerektiriyorsa, o kutuda üzerinde çalıştığınız deponun proje ayarları içerisine bir statusLine bloğu ekleyin; çünkü proje ayarları o dizin için kullanıcı ayarlarını geçersiz kılar.