SpyBara
Go Premium

statusline.md 2026-09-08 20:00 UTC to 2026-09-09 22:58 UTC

This page contains 132 additions and 37 deletions.

2026
Wed 9 22:58 Sat 12 03:02 Fri 18 23:58 Tue 22 23:59 Fri 25 23:58

Sesuaikan baris status Anda

Konfigurasikan bilah status khusus untuk memantau penggunaan jendela konteks, biaya, dan status git di Claude Code

Baris status adalah bilah yang dapat disesuaikan di bagian bawah Claude Code yang menjalankan skrip shell apa pun yang Anda konfigurasikan. Skrip menerima data sesi JSON di stdin dan menampilkan apa pun yang dicetak skrip Anda, memberikan Anda tampilan yang persisten dan sekilas dari penggunaan konteks, biaya, status git, atau apa pun yang ingin Anda lacak.

Baris status berguna ketika Anda:

  • Ingin memantau penggunaan jendela konteks saat bekerja
  • Perlu melacak biaya sesi
  • Bekerja di berbagai sesi dan perlu membedakannya
  • Ingin cabang git dan status selalu terlihat

Baris status dirender di baris tersendiri di atas lencana footer bawaan dan tidak menggantikannya. Dengan baris status khusus yang dikonfigurasi, Claude Code berhenti menampilkan sebagian besar petunjuk keyboard footer, termasuk esc to interrupt, fallback ? for shortcuts, dan petunjuk voice dictation hold space to speak. Untuk menambahkan lencana tautan yang dapat diklik ke footer ketika ID muncul dalam percakapan, tanpa menulis skrip, konfigurasikan footerLinksRegexes sebagai gantinya.

Berikut adalah contoh baris status multi-baris yang menampilkan informasi git di baris pertama dan bilah konteks berkode warna di baris kedua.

Baris status multi-baris yang menampilkan nama model, direktori, cabang git di baris pertama, dan bilah kemajuan penggunaan konteks dengan biaya dan durasi di baris kedua

Halaman ini memandu Anda melalui pengaturan baris status dasar, menjelaskan bagaimana aliran data dari Claude Code ke skrip Anda, mencantumkan semua bidang yang dapat Anda tampilkan, dan menyediakan contoh siap pakai untuk pola umum seperti status git, pelacakan biaya, dan bilah kemajuan.

Atur baris status

Gunakan perintah /statusline untuk membuat Claude Code menghasilkan skrip untuk Anda, atau buat skrip secara manual dan tambahkan ke pengaturan Anda.

Gunakan perintah /statusline

Perintah /statusline menerima instruksi bahasa alami yang menjelaskan apa yang ingin Anda tampilkan. Claude Code menghasilkan file skrip di ~/.claude/ dan memperbarui pengaturan Anda secara otomatis:

/statusline show model name and context percentage with a progress bar

Setujui prompt edit file jika Claude Code meminta izin selama pengaturan.

Konfigurasikan baris status secara manual

Tambahkan bidang statusLine ke pengaturan pengguna Anda (~/.claude/settings.json, di mana ~ adalah direktori home Anda) atau pengaturan proyek. Atur type ke "command" dan arahkan command ke jalur skrip atau perintah shell inline. Untuk panduan lengkap membuat skrip, lihat Bangun baris status langkah demi langkah.

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

Bidang command berjalan di shell, jadi Anda juga dapat menggunakan perintah inline alih-alih file skrip. Contoh ini menggunakan jq untuk mengurai input JSON dan menampilkan nama model dan persentase konteks:

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

Bidang padding opsional menambahkan spasi horizontal ekstra (dalam karakter) ke konten baris status. Default ke 0. Padding ini selain spasi bawaan antarmuka, jadi mengontrol indentasi relatif daripada jarak absolut dari tepi terminal.

Bidang refreshInterval opsional menjalankan kembali perintah Anda setiap N detik selain pembaruan berbasis peristiwa. Minimum adalah 1. Atur ini ketika baris status Anda menampilkan data berbasis waktu seperti jam, atau ketika subagen latar belakang mengubah keadaan git sementara sesi utama menganggur. Biarkan tidak diatur untuk hanya berjalan pada peristiwa.

Bidang hideVimModeIndicator opsional menekan teks -- INSERT -- bawaan di bawah prompt. Atur ini ke true ketika skrip Anda merender vim.mode itu sendiri, sehingga mode tidak ditampilkan dua kali.

Nonaktifkan baris status

Jalankan /statusline dan minta untuk menghapus atau menghapus baris status Anda (misalnya, /statusline delete, /statusline clear, /statusline remove it). Anda juga dapat secara manual menghapus bidang statusLine dari settings.json Anda.

Bangun baris status langkah demi langkah

Panduan ini menunjukkan apa yang terjadi di balik layar dengan membuat baris status secara manual yang menampilkan model saat ini, direktori kerja, dan persentase penggunaan jendela konteks.

Contoh-contoh ini menggunakan skrip Bash, yang berfungsi di macOS dan Linux. Di Windows, lihat Konfigurasi Windows untuk contoh PowerShell dan Git Bash.

Baris status yang menampilkan nama model, direktori, dan persentase konteks
1

Buat skrip yang membaca JSON dan mencetak output

Claude Code mengirim data JSON ke skrip Anda melalui stdin. Skrip ini menggunakan jq, pengurai JSON baris perintah yang mungkin perlu Anda instal, untuk mengekstrak nama model, direktori, dan persentase konteks, kemudian mencetak baris yang diformat.

Simpan ini ke ~/.claude/statusline.sh (di mana ~ adalah direktori home Anda, seperti /Users/username di macOS atau /home/username di Linux):

#!/bin/bash
# Read JSON data that Claude Code sends to stdin
input=$(cat)

# Extract fields using jq
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
# The "// 0" provides a fallback if the field is null
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# Output the status line - ${DIR##*/} extracts just the folder name
echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"
2

Buat dapat dieksekusi

Tandai skrip sebagai dapat dieksekusi sehingga shell Anda dapat menjalankannya:

chmod +x ~/.claude/statusline.sh
3

Tambahkan ke pengaturan

Beri tahu Claude Code untuk menjalankan skrip Anda sebagai baris status. Tambahkan konfigurasi ini ke ~/.claude/settings.json, yang menetapkan type ke "command" (berarti "jalankan perintah shell ini") dan menunjuk command ke skrip Anda:

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

Baris status Anda muncul di bagian bawah antarmuka. Claude Code memuat ulang pengaturan secara otomatis dan menjalankan skrip Anda segera setelah Anda menyimpan file.

Bagaimana baris status bekerja

Claude Code menjalankan skrip Anda dengan data sesi JSON pada stdin dan menampilkan apa pun yang dicetak skrip ke stdout.

Kapan itu diperbarui

Skrip Anda berjalan sekali ketika sesi dimulai, termasuk ketika Anda melanjutkannya. Setelah itu, skrip berjalan lagi ketika:

  • Pesan asisten baru tiba
  • /compact selesai
  • Mode izin berubah
  • Vim mode beralih
  • Anda mengubah command dalam pengaturan statusLine Anda
  • Timer refreshInterval berlalu, jika Anda menetapkannya
  • Jendela rate-limit dalam data yang terakhir diterima skrip Anda mencapai waktu resets_at
  • prompt cache yang hangat dalam data yang terakhir diterima skrip Anda mencapai waktu expires_at

Claude Code melakukan debounce pembaruan pada 300ms, jadi perubahan cepat dikumpulkan bersama dan skrip Anda berjalan sekali setelah perubahan berhenti. Perubahan pada command itu sendiri melewati debounce: Claude Code menjalankan perintah baru segera. Jika pembaruan baru dipicu saat skrip Anda masih berjalan, Claude Code membatalkan skrip yang sedang berlangsung. Jika Anda mengedit skrip Anda, perubahan muncul saat pemicu pembaruan menjalankannya kembali.

Pemicu yang didorong oleh peristiwa dapat menjadi senyap ketika sesi utama menganggur, misalnya saat koordinator menunggu subagen latar belakang. Untuk menjaga segmen berbasis waktu atau bersumber eksternal tetap terkini selama periode menganggur, atur refreshInterval untuk juga menjalankan kembali perintah pada timer tetap.

Apa yang dapat dicetak skrip Anda

Mengukur output ke terminal

Claude Code menangkap output skrip Anda alih-alih menghubungkannya langsung ke terminal, jadi tput cols dan deteksi lebar tingkat bahasa tidak dapat membaca ukuran terminal dari dalam skrip. Baca variabel lingkungan COLUMNS dan LINES sebagai gantinya. Claude Code menetapkan ini ke dimensi terminal saat ini sebelum menjalankan skrip Anda.

Data yang tersedia

Claude Code mengirim bidang JSON berikut ke skrip Anda melalui stdin:

Bidang Deskripsi
model.id, model.display_name Pengidentifikasi model saat ini dan nama tampilan
cwd, workspace.current_dir Direktori kerja saat ini. Kedua bidang berisi nilai yang sama; workspace.current_dir lebih disukai untuk konsistensi dengan workspace.project_dir.
workspace.project_dir Direktori tempat Claude Code diluncurkan, yang mungkin berbeda dari cwd jika direktori kerja berubah selama sesi
workspace.added_dirs Direktori tambahan yang ditambahkan melalui /add-dir atau --add-dir. Array kosong jika tidak ada yang telah ditambahkan
workspace.git_worktree Nama git worktree ketika direktori saat ini berada di dalam linked worktree yang dibuat dengan git worktree add. Tidak ada di main working tree. Diisi untuk git worktree apa pun, tidak seperti worktree.*, yang hanya ada saat sesi berada dalam sesi worktree
workspace.repo.host, workspace.repo.owner, workspace.repo.name Identitas repositori yang diuraikan dari remote origin, misalnya "github.com", "anthropics", "claude-code". Tidak ada di luar repositori git atau ketika tidak ada remote origin yang dikonfigurasi
cost.total_cost_usd Perkiraan biaya sesi dalam USD, dihitung sisi klien dengan harga daftar kecuali tabel modelPricing berlaku. Mungkin berbeda dari tagihan aktual Anda. Direset ke $0 ketika /clear memulai sesi baru. Sebelum v2.1.211, total dibawa setelah /clear
cost.total_duration_ms Total waktu dinding jam sejak sesi dimulai, dalam milidetik
cost.total_api_duration_ms Total waktu yang dihabiskan menunggu respons API dalam milidetik
cost.total_lines_added, cost.total_lines_removed Baris kode yang diubah
context_window.total_input_tokens, context_window.total_output_tokens Jumlah token saat ini dalam jendela konteks, dari respons API terbaru. Input mencakup pembacaan dan penulisan cache
context_window.context_window_size Ukuran jendela konteks maksimum dalam token. 200000 secara default, atau 1000000 untuk model dengan konteks diperpanjang.
context_window.used_percentage Persentase jendela konteks yang digunakan yang telah dihitung sebelumnya
context_window.remaining_percentage Persentase jendela konteks yang tersisa yang telah dihitung sebelumnya
context_window.current_usage Jumlah token dari panggilan API terakhir, dijelaskan dalam bidang jendela konteks
exceeds_200k_tokens Apakah jumlah token total (input, cache, dan output token digabungkan) dari respons API terbaru melebihi 200k. Ini adalah ambang batas tetap terlepas dari ukuran jendela konteks aktual.
fast_mode Apakah fast mode diaktifkan untuk sesi
effort.level Tingkat upaya penalaran saat ini (low, medium, high, xhigh, atau max). Mencerminkan nilai sesi langsung, termasuk perubahan /effort pertengahan sesi. Ultracode bukan tingkat yang berbeda dan melaporkan sebagai xhigh. Tidak ada ketika model saat ini tidak mendukung parameter upaya
thinking.enabled Apakah pemikiran diperpanjang diaktifkan untuk sesi
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentage Persentase batas laju 5 jam atau 7 hari yang dikonsumsi, dari 0 hingga 100
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_at Detik epoch Unix ketika jendela batas laju 5 jam atau 7 hari direset
rate_limits.spend_limit.used_percentage, rate_limits.spend_limit.resets_at Di balik gateway aplikasi Claude, persentase yang digunakan dari batas pengeluaran yang berlaku untuk Anda, dan detik epoch Unix ketika periodenya direset. Persentase berjalan dari 0 hingga 100, atau di atas 100 setelah Anda melampaui batas. Memerlukan Claude Code v2.1.251 atau lebih baru
prompt_cache Statistik prompt cache sesi untuk percakapan utama: rasio hit, misses, dan apakah cache hangat. Lihat bidang prompt cache untuk setiap bidang. Tidak ada sampai respons API pertama percakapan utama. Memerlukan Claude Code v2.1.251 atau lebih baru
session_id Pengidentifikasi sesi unik
session_name Nama sesi. Menggunakan nama khusus yang ditetapkan dengan bendera --name atau /rename ketika ada, jika tidak judul sesi yang dihasilkan AI. Nama tampilan default, seperti my-app-3f, tidak mengisi bidang ini. Tidak ada ketika sesi tidak memiliki nama khusus atau judul yang dihasilkan AI
prompt_id UUID yang mengidentifikasi prompt pengguna yang sedang diproses. Cocok dengan atribut prompt.id pada acara OpenTelemetry. Tidak ada sampai input pengguna pertama. Memerlukan Claude Code v2.1.196 atau lebih baru
transcript_path Jalur ke file transkrip percakapan
version Versi Claude Code
output_style.name Nama gaya output saat ini
vim.mode Mode vim saat ini (NORMAL, INSERT, VISUAL, atau VISUAL LINE) ketika vim mode diaktifkan
agent.name Nama agen saat menjalankan dengan bendera --agent atau pengaturan agen dikonfigurasi
pr.number, pr.url Buka permintaan tarik untuk cabang saat ini. Mencerminkan lencana PR di footer. Di repositori dengan remote GitLab, Claude Code mengisi bidang ini dari merge request terbuka cabang, jadi pr.number adalah nomor merge request. Data merge request memerlukan Claude Code v2.1.234 atau lebih baru. Tidak ada ketika tidak dalam repositori git, sampai permintaan tarik atau merge request ditemukan, atau setelah digabungkan atau ditutup
pr.review_state Status tinjauan PR terbuka: approved, pending, changes_requested, atau draft. Mungkin secara independen tidak ada bahkan ketika pr ada
pr.kind mr ketika pr menjelaskan merge request GitLab. Tidak ada untuk permintaan tarik GitHub, jadi skrip yang ditulis sebelum bidang ini terus bekerja. Untuk merge request, Claude Code menetapkan review_state ke approved ketika GitLab melaporkan dapat digabungkan, pending untuk status terbuka lainnya, dan draft untuk draft. Memerlukan Claude Code v2.1.234 atau lebih baru
worktree.name Nama worktree aktif. Hadir hanya saat sesi berada dalam sesi worktree
worktree.path Jalur absolut ke direktori worktree
worktree.branch Nama cabang Git untuk worktree (misalnya, "worktree-my-feature"). Tidak ada untuk worktree berbasis hook
worktree.original_cwd Direktori tempat Claude berada sebelum memasuki worktree
worktree.original_branch Cabang Git yang diperiksa sebelum memasuki worktree. Tidak ada untuk worktree berbasis hook
Skema JSON lengkap

Perintah baris status Anda menerima struktur JSON ini melalui stdin:

{
"cwd": "/current/working/directory",
"session_id": "abc123...",
"session_name": "my-session",
"prompt_id": "550e8400-e29b-41d4-a716-446655440000",
"transcript_path": "/path/to/transcript.jsonl",
"model": {
"id": "claude-opus-5",
"display_name": "Opus"
},
"workspace": {
"current_dir": "/current/working/directory",
"project_dir": "/original/project/directory",
"added_dirs": [],
"git_worktree": "feature-xyz",
"repo": {
"host": "github.com",
"owner": "anthropics",
"name": "claude-code"
}
},
"version": "2.1.90",
"output_style": {
"name": "default"
},
"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,
"current_usage": {
"input_tokens": 8500,
"output_tokens": 1200,
"cache_creation_input_tokens": 5000,
"cache_read_input_tokens": 2000
}
},
"exceeds_200k_tokens": false,
"prompt_cache": {
"warm": true,
"caching_observed": true,
"ttl": "1h",
"expires_at": 1738429200,
"requests": 14,
"misses": 2,
"expected_rebuilds": 1,
"hit_ratio": 0.91,
"cache_write_tokens": 352000,
"miss_recache_tokens": 310200,
"last_miss_at": 1738425230,
"last_miss_cause": {
"causes": ["tools_changed"],
"tools_added": 2,
"tools_removed": 0
},
"miss_causes": {
"tools_changed": 2
},
"recache_tokens_if_cold": 45000
},
"fast_mode": false,
"effort": {
"level": "high"
},
"thinking": {
"enabled": true
},
"rate_limits": {
"five_hour": {
"used_percentage": 23.5,
"resets_at": 1738425600
},
"seven_day": {
"used_percentage": 41.2,
"resets_at": 1738857600
},
"spend_limit": {
"used_percentage": 62.8,
"resets_at": 1740787200
}
},
"vim": {
"mode": "NORMAL"
},
"agent": {
"name": "security-reviewer"
},
"pr": {
"number": 1234,
"url": "https://github.com/anthropics/claude-code/pull/1234",
"review_state": "pending"
},
"worktree": {
"name": "my-feature",
"path": "/path/to/.claude/worktrees/my-feature",
"branch": "worktree-my-feature",
"original_cwd": "/path/to/project",
"original_branch": "main"
}
}

Bidang yang mungkin tidak ada (tidak ada dalam JSON):

  • session_name: muncul ketika nama khusus telah ditetapkan dengan --name atau /rename, atau setelah judul sesi yang dihasilkan AI ada. Nama tampilan default, seperti my-app-3f, tidak mengisinya
  • prompt_id: muncul hanya setelah input pengguna pertama
  • workspace.git_worktree: muncul hanya ketika direktori saat ini berada di dalam linked git worktree
  • workspace.repo: muncul hanya di dalam repositori git dengan remote origin yang dikonfigurasi
  • effort: muncul hanya ketika model saat ini mendukung parameter upaya penalaran
  • vim: muncul hanya ketika vim mode diaktifkan
  • agent: muncul hanya saat menjalankan dengan bendera --agent atau pengaturan agen dikonfigurasi
  • pr: muncul hanya saat PR terbuka atau merge request GitLab ditemukan untuk cabang saat ini, dan dihapus setelah digabungkan atau ditutup. pr.review_state dan pr.kind mungkin secara independen tidak ada
  • worktree: muncul hanya saat sesi berada dalam sesi worktree. Ketika ada, branch dan original_branch juga mungkin tidak ada untuk worktree berbasis hook
  • rate_limits: muncul hanya untuk pelanggan Claude.ai Pro dan Max, atau di balik gateway aplikasi Claude yang menetapkan batas pengeluaran untuk Anda, dan hanya setelah respons API pertama dalam sesi. Setiap jendela (five_hour, seven_day, spend_limit) mungkin secara independen tidak ada, dan Claude Code menghapus jendela setelah waktu resets_at berlalu. Gunakan jq -r '.rate_limits.five_hour.used_percentage // empty' untuk menangani ketiadaan dengan anggun.
  • prompt_cache: muncul setelah respons API pertama percakapan utama. Lihat bidang prompt cache

Bidang yang mungkin null:

  • context_window.current_usage: null sebelum panggilan API pertama dalam sesi, dan lagi setelah /compact sampai panggilan API berikutnya mengisinya kembali
  • context_window.used_percentage, context_window.remaining_percentage: mungkin null awal dalam sesi

Tangani bidang yang hilang dengan akses bersyarat dan nilai null dengan default fallback dalam skrip Anda.

Bidang jendela konteks

Objek context_window menjelaskan jendela konteks langsung dari respons API terbaru.

  • Total gabungan (total_input_tokens, total_output_tokens): token saat ini dalam jendela konteks. total_input_tokens adalah jumlah dari input_tokens, cache_creation_input_tokens, dan cache_read_input_tokens; total_output_tokens adalah token output dari respons terbaru. Keduanya adalah 0 sebelum respons API pertama.
  • Penggunaan per komponen (current_usage): jumlah token yang sama dipecah menurut kategori. Gunakan ini ketika Anda memerlukan cache hits terpisah dari input segar.

Objek current_usage berisi:

  • input_tokens: token input dalam konteks saat ini
  • output_tokens: token output yang dihasilkan
  • cache_creation_input_tokens: token yang ditulis ke cache
  • cache_read_input_tokens: token yang dibaca dari cache

Untuk apa arti bidang cache dan bagaimana cara penagihan, lihat periksa kinerja cache.

Bidang used_percentage dihitung dari token input saja: input_tokens + cache_creation_input_tokens + cache_read_input_tokens. Itu tidak termasuk output_tokens.

Jika Anda menghitung persentase konteks secara manual dari current_usage, gunakan formula input-only yang sama untuk mencocokkan used_percentage.

Objek current_usage adalah null sebelum panggilan API pertama dalam sesi, dan lagi segera setelah /compact sampai panggilan API berikutnya mengisinya kembali.

Bidang prompt cache

Objek prompt_cache merangkum bagaimana percakapan utama sesi menggunakan prompt cache. Claude Code menghitungnya dari jumlah token cache dalam respons API, jadi berfungsi di setiap penyedia.

Objek muncul setelah respons API pertama percakapan utama. Claude Code tidak menghitung permintaan subagen dalam statistik ini. Memerlukan Claude Code v2.1.251 atau lebih baru.

Tabel mencantumkan setiap bidang dengan artinya. Stempel waktu adalah detik epoch Unix, unit yang sama dengan rate_limits.*.resets_at. Baris status pendek biasanya menunjukkan satu atau dua dari ini; warm dan hit_ratio merangkum status cache paling langsung.

Bidang Deskripsi
warm Apakah awalan cache masih dalam TTL-nya. false ketika respons terakhir tidak melaporkan token cache, bahkan saat caching_observed adalah true
caching_observed Apakah respons apa pun sesi ini melaporkan token cache. false berarti prompt caching dimatikan, atau penyedia atau gateway Anda tidak melaporkannya
ttl Masa hidup cache dari awalan cache saat ini: "5m" atau "1h"
expires_at Ketika awalan cache meninggalkan TTL-nya dan menjadi dingin, dalam detik epoch. null ketika respons terakhir tidak melaporkan token cache
requests Permintaan API yang dicatat untuk percakapan utama sesi ini
misses Permintaan yang memproses ulang konten yang sudah dipegang cache: lebih dari 5% dan setidaknya 2.000 token dari apa yang bisa dibaca permintaan dari cache, tanpa pemadatan atau pembersihan hasil alat untuk menjelaskan kekurangan dalam pembacaan cache
expected_rebuilds Pembangunan ulang cache yang mengikuti pemadatan atau pembersihan hasil alat lama
hit_ratio Token pembacaan cache sebagai fraksi dari semua token input sesi ini, dari 0 hingga 1. Penyebut menghitung pembacaan cache, penulisan cache, dan input tanpa cache. null saat jumlah tersebut semuanya nol
cache_write_tokens Semua token yang ditulis ke cache sesi ini, penulisan awal permintaan pertama disertakan
miss_recache_tokens Token yang ditulis ke cache oleh permintaan yang dihitung sebagai misses
last_miss_at Ketika miss terakhir terjadi, dalam detik epoch. null saat sesi tidak memiliki misses
last_miss_cause Apa yang Claude Code identifikasi sebagai kemungkinan penyebab miss terakhir, dijelaskan di bawah Penyebab miss terakhir. Memerlukan Claude Code v2.1.260 atau lebih baru
miss_causes Berapa banyak misses terdiagnosis sesi ini yang memiliki setiap penyebab, dikunci dengan nama penyebab yang sama dengan last_miss_cause. Memerlukan Claude Code v2.1.260 atau lebih baru
recache_tokens_if_cold Token yang diminta berikutnya re-cache jika cache telah menjadi dingin pada saat itu. null tepat setelah pemadatan atau pembersihan hasil alat lama, sampai permintaan berikutnya mencatat ukuran percakapan yang ditulis ulang

Claude Code menunjukkan statistik yang sama di terminal, pada baris Prompt cache (main) perintah /usage.

Penyebab miss terakhir

Objek last_miss_cause melaporkan apa yang Claude Code identifikasi sebagai kemungkinan penyebab miss paling baru. Array causes menyimpan satu atau lebih nama penyebab, seperti tools_changed, system_prompt_changed, ttl_expired_5m, atau likely_server_side. Objek adalah null sampai miss pertama sesi, dan lagi kapan pun Claude Code tidak dapat mengidentifikasi penyebab miss paling baru. Memerlukan Claude Code v2.1.260 atau lebih baru.

Dua penyebab menambahkan jumlah ke objek:

  • tools_added dan tools_removed: dengan tools_changed, berapa banyak alat yang ditambahkan ke atau dihapus dari permintaan
  • system_char_delta: dengan system_prompt_changed, perubahan dalam panjang prompt sistem, dalam karakter

Contoh

Contoh-contoh ini menunjukkan pola baris status umum. Untuk menggunakan contoh apa pun:

  1. Simpan skrip ke file seperti ~/.claude/statusline.sh (atau .py/.js)
  2. Buat dapat dieksekusi: chmod +x ~/.claude/statusline.sh
  3. Tambahkan jalur ke pengaturan Anda

Contoh Bash menggunakan jq untuk mengurai JSON. Python dan Node.js memiliki penguraian JSON bawaan.

Penggunaan jendela konteks

Tampilkan model saat ini dan penggunaan jendela konteks dengan bilah kemajuan visual. Setiap skrip membaca JSON dari stdin, mengekstrak bidang used_percentage, dan membangun bilah 10 karakter di mana blok yang diisi (▓) mewakili penggunaan:

Baris status yang menampilkan nama model dan bilah kemajuan dengan persentase
#!/bin/bash
# Read all of stdin into a variable
input=$(cat)

# Extract fields with jq, "// 0" provides fallback for null
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# Build progress bar: printf -v creates a run of spaces, then
# ${var// /▓} replaces each space with a block character
BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"

echo "[$MODEL] $BAR $PCT%"

Status git dengan warna

Tampilkan cabang git dengan indikator berkode warna untuk file yang dipentingkan dan dimodifikasi. Skrip ini menggunakan kode escape ANSI untuk warna terminal: \033[32m adalah hijau, \033[33m adalah kuning, dan \033[0m mengatur ulang ke default.

Baris status yang menampilkan model, direktori, cabang git, dan indikator berkode warna untuk file yang dipentingkan dan dimodifikasi

Setiap skrip memeriksa apakah direktori saat ini adalah repositori git, menghitung file yang dipentingkan dan dimodifikasi, dan menampilkan indikator berkode warna:

#!/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

Pelacakan biaya dan durasi

Lacak biaya API sesi dan waktu yang telah berlalu. Bidang cost.total_cost_usd mengakumulasi biaya semua panggilan API dalam sesi saat ini. Bidang cost.total_duration_ms mengukur total waktu yang telah berlalu sejak sesi dimulai, sementara cost.total_api_duration_ms melacak hanya waktu yang dihabiskan menunggu respons API.

Setiap skrip memformat biaya sebagai mata uang dan mengonversi milidetik ke menit dan detik:

Baris status yang menampilkan nama model, biaya sesi, dan durasi
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

COST_FMT=$(printf '$%.2f' "$COST")
DURATION_SEC=$((DURATION_MS / 1000))
MINS=$((DURATION_SEC / 60))
SECS=$((DURATION_SEC % 60))

echo "[$MODEL] 💰 $COST_FMT | ⏱️ ${MINS}m ${SECS}s"

Tampilkan beberapa baris

Skrip Anda dapat menampilkan beberapa baris untuk membuat tampilan yang lebih kaya.

Baris status multi-baris yang menampilkan nama model, direktori, cabang git di baris pertama, dan bilah kemajuan penggunaan konteks dengan biaya dan durasi di baris kedua

Contoh ini menggabungkan beberapa teknik: warna berbasis ambang batas (hijau di bawah 70%, kuning 70-89%, merah 90%+), bilah kemajuan, dan informasi cabang git. Setiap pernyataan print atau echo membuat baris terpisah:

#!/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'

# Pick bar color based on context usage
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"

Contoh ini membuat tautan yang dapat diklik ke repositori GitHub Anda. Tahan Cmd (macOS) atau Ctrl (Windows/Linux) dan klik untuk membuka tautan di browser Anda.

Baris status yang menampilkan tautan yang dapat diklik ke repositori GitHub

Setiap skrip mendapatkan URL remote git, mengonversi format SSH ke HTTPS, dan membungkus nama repo dalam kode escape OSC 8. Versi Bash menggunakan printf '%b' yang menginterpretasikan escape backslash lebih andal daripada echo -e di berbagai shell:

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

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

# Convert git SSH URL to HTTPS
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 format: \e]8;;URL\a then TEXT then \e]8;;\a
# printf %b interprets escape sequences reliably across shells
printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"
else
echo "[$MODEL]"
fi

Penggunaan batas laju

Tampilkan penggunaan batas laju langganan Claude.ai dalam baris status. Objek rate_limits berisi jendela bergulir five_hour dan jendela mingguan seven_day. Setiap jendela menyediakan used_percentage, dari 0 hingga 100, dan resets_at, detik epoch Unix ketika jendela direset.

Di balik gateway aplikasi Claude dengan batas pengeluaran, rate_limits membawa spend_limit dengan dua bidang yang sama untuk batas pengeluaran yang berlaku untuk Anda, kecuali bahwa used_percentage-nya dapat melebihi 100 setelah Anda melampaui batas. Memerlukan Claude Code v2.1.251 atau lebih baru.

Objek rate_limits hanya ada untuk pelanggan Claude.ai Pro dan Max, atau di balik gateway aplikasi Claude dengan batas pengeluaran, dan hanya setelah respons API pertama. Setiap skrip menangani bidang yang tidak ada dengan anggun:

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

MODEL=$(echo "$input" | jq -r '.model.display_name')
# "// empty" produces no output when rate_limits is absent
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]"

Cache operasi yang mahal

Skrip baris status Anda berjalan sering selama sesi aktif. Perintah seperti git status atau git diff dapat lambat, terutama di repositori besar. Contoh ini menyimpan informasi git ke file temp dan hanya menyegarkannya setiap 5 detik.

Nama file cache perlu stabil di seluruh invokasi baris status dalam sesi, tetapi unik di seluruh sesi sehingga sesi bersamaan di repositori berbeda tidak membaca keadaan git cache satu sama lain. Pengidentifikasi berbasis proses seperti $$, os.getpid(), atau process.pid berubah pada setiap invokasi dan mengalahkan cache. Gunakan session_id dari input JSON sebagai gantinya: itu stabil untuk seumur hidup sesi dan unik per sesi.

Setiap skrip memeriksa apakah file cache hilang atau lebih lama dari 5 detik sebelum menjalankan perintah git:

#!/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  # seconds

cache_is_stale() {
[ ! -f "$CACHE_FILE" ] || \
# stat -c %Y (Linux) or stat -f %m (macOS) prints the file's last-modified
# time. The Linux form must run first: on Linux, the macOS form prints a
# filesystem report to stdout before failing, and that output would be
# captured by the command substitution and break the arithmetic.
[ $(($(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

Konfigurasi Windows

Di Windows, Claude Code menjalankan perintah baris status melalui Git Bash ketika Git Bash diinstal, atau melalui PowerShell ketika Git Bash tidak ada.

Git Bash memperlakukan backslash yang tidak dikutip sebagai karakter escape, jadi jalur gaya Windows seperti C:\Users\username\script.mjs mencapai runner skrip dengan pemisahnya dihapus dan perintah gagal tanpa kesalahan yang terlihat. Tulis jalur file dalam string command dengan garis miring ke depan, seperti yang ditunjukkan dalam contoh di bawah ini. Pintasan ~ juga berfungsi dan berkembang ke direktori home Windows Anda.

Untuk menjalankan skrip PowerShell sebagai baris status Anda, panggil melalui powershell. Ini berfungsi apakah Claude Code merutekan perintah melalui Git Bash atau PowerShell:

{
"statusLine": {
"type": "command",
"command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"
}
}

Atau, ketika Git Bash diinstal, jalankan skrip Bash secara langsung:

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

Baris status subagen

Pengaturan subagentStatusLine merender badan baris khusus untuk setiap subagen yang ditampilkan di panel agen di bawah prompt. Gunakan untuk mengganti baris default name · description · token count dengan pemformatan Anda sendiri.

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

Perintah berjalan sekali per tick refresh dengan semua baris subagen yang terlihat diteruskan sebagai objek JSON tunggal di stdin. Input mencakup bidang hook umum, bidang columns dengan lebar baris yang dapat digunakan, dan array tasks. Setiap tugas memiliki id, name, type, status, description, label, startTime, model, effort, contextWindowSize, tokenCount, tokenSamples, dan cwd.

Bidang model per-tugas adalah ID model yang diselesaikan tempat tugas berjalan. contextWindowSize adalah jendela konteks model tersebut dalam token, dihitung dengan cara yang sama seperti context_window.context_window_size baris status utama, sehingga Anda dapat merender persentase per-baris dari tokenCount. Kedua bidang memerlukan Claude Code v2.1.205 atau lebih baru dan dihilangkan untuk tugas yang modelnya belum diselesaikan.

Bidang effort per-tugas adalah upaya penalaran yang ditetapkan untuk subagen tersebut, dalam frontmatter definisinya atau pada invokasi individual. Nilainya adalah salah satu dari string tingkat upaya low, medium, high, xhigh, atau max, atau anggaran token numerik. Bidang melaporkan nilai yang dikonfigurasi seperti yang ditulis: jika model tidak mendukung tingkat tersebut, upaya yang sebenarnya diterapkan Claude Code mungkin berbeda. Bidang memerlukan Claude Code v2.1.214 atau lebih baru dan tidak ada ketika subagen mewarisi tingkat upaya sesi.

Tulis satu baris JSON ke stdout per baris yang ingin Anda ganti, dalam bentuk {"id": "<task id>", "content": "<row body>"}. String content dirender apa adanya, termasuk warna ANSI dan hyperlink OSC 8. Hilangkan id tugas untuk menjaga rendering default untuk baris itu; keluarkan string content kosong untuk menyembunyikannya.

Gerbang kepercayaan, disableAllHooks, dan allowManagedHooksOnly yang sama yang berlaku untuk statusLine berlaku di sini. Plugin dapat mengirimkan subagentStatusLine default dalam settings.json mereka, tetapi tidak seperti hooks, nilai plugin tidak berjalan di bawah allowManagedHooksOnly bahkan ketika plugin dipaksa diaktifkan dalam pengaturan terkelola enabledPlugins.

Tips

  • Uji dengan input mock: echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh
  • Jaga output tetap pendek: bilah status memiliki lebar terbatas, jadi output panjang mungkin dipotong atau membungkus dengan canggung
  • Cache operasi lambat: skrip Anda berjalan sering selama sesi aktif, jadi perintah seperti git status dapat menyebabkan lag. Lihat contoh caching untuk cara menangani ini.

Proyek komunitas seperti ccstatusline dan starship-claude menyediakan konfigurasi pra-bangun dengan tema dan fitur tambahan.

Troubleshooting

Baris status tidak muncul

  • Verifikasi skrip Anda dapat dieksekusi: chmod +x ~/.claude/statusline.sh
  • Periksa bahwa skrip Anda menampilkan ke stdout, bukan stderr
  • Jalankan skrip Anda secara manual untuk memverifikasi itu menghasilkan output
  • Di Windows dengan Git Bash terinstal, garis miring terbalik dalam jalur command kemungkinan besar dikonsumsi sebagai karakter escape sebelum skrip berjalan. Gunakan garis miring ke depan dalam jalur. Lihat Konfigurasi Windows.
  • Jika disableAllHooks adalah true di luar pengaturan terkelola setelah precedence pengaturan diterapkan, Claude Code hanya menjalankan statusLine dari pengaturan terkelola, dan tanpa statusLine terkelola baris status dinonaktifkan. Hapus pengaturan, atau atur ke false dalam file yang mengaturnya, untuk mengaktifkan kembali. Lihat disableAllHooks.
  • Jika organisasi Anda mengatur allowManagedHooksOnly dalam pengaturan terkelola, baris status kustom Anda hilang tanpa peringatan: Anda hanya dapat mendapatkan baris status dari nilai statusLine dalam pengaturan terkelola tersebut. Lihat apa yang berjalan di bawah allowManagedHooksOnly untuk perilaku lengkap, dan tanyakan kepada administrator Anda apakah pengaturan ini berlaku untuk Anda.
  • Jalankan claude --debug untuk mencatat kode keluar dan stderr dari invokasi baris status pertama dalam sesi
  • Minta Claude untuk membaca file pengaturan Anda dan jalankan perintah statusLine secara langsung untuk mengungkap kesalahan

Baris status menampilkan -- atau nilai kosong

  • Bidang mungkin null sebelum respons API pertama selesai
  • Tangani nilai null dalam skrip Anda dengan fallback seperti // 0 dalam jq
  • Mulai ulang Claude Code jika nilai tetap kosong setelah beberapa pesan

Persentase konteks menampilkan nilai yang tidak terduga

  • Gunakan used_percentage untuk keadaan konteks yang paling akurat dan sederhana
  • Persentase konteks mungkin berbeda dari output /context karena kapan masing-masing dihitung

Tautan OSC 8 tidak dapat diklik

  • Verifikasi terminal Anda mendukung hyperlink OSC 8 (iTerm2, Kitty, WezTerm)

  • Terminal.app tidak mendukung tautan yang dapat diklik

  • Jika teks tautan muncul tetapi tidak dapat diklik, Claude Code mungkin tidak mendeteksi dukungan hyperlink di terminal Anda. Atur variabel lingkungan FORCE_HYPERLINK untuk mengganti deteksi sebelum meluncurkan Claude Code:

    FORCE_HYPERLINK=1 claude
    

    Di PowerShell, atur variabel dalam sesi saat ini terlebih dahulu:

    $env:FORCE_HYPERLINK = "1"; claude
    
  • Sesi SSH dan tmux mungkin menghapus urutan OSC tergantung pada konfigurasi

  • Jika urutan escape muncul sebagai teks literal seperti \e]8;;, gunakan printf '%b' alih-alih echo -e untuk penanganan escape yang lebih andal

Glitch tampilan dengan urutan escape

  • Urutan escape kompleks (warna ANSI, tautan OSC 8) dapat sesekali menyebabkan output berantakan jika tumpang tindih dengan pembaruan UI lainnya
  • Jika Anda melihat teks yang rusak, coba sederhanakan skrip Anda ke output teks biasa
  • Baris status multi-baris dengan kode escape lebih rentan terhadap masalah rendering daripada teks biasa satu baris

Kepercayaan ruang kerja diperlukan

  • Karena statusLine mengeksekusi perintah shell, Claude Code menjalankannya di bawah aturan kepercayaan ruang kerja yang sama seperti hooks dalam file pengaturan. Menerima dialog untuk folder, atau untuk direktori induk yang kepercayaannya meluas ke dalamnya, sudah cukup.
  • Sampai saat itu, baris status tetap kosong, dan claude --debug mencatat Status line command skipped: workspace trust not accepted. Mulai ulang Claude Code dan terima dialog kepercayaan untuk mengaktifkannya.

Kesalahan skrip atau hang

  • Skrip yang keluar dengan kode non-nol atau tidak menghasilkan output menyebabkan baris status menjadi kosong
  • Skrip lambat memblokir baris status dari pembaruan sampai selesai. Jaga skrip tetap cepat untuk menghindari output basi.
  • Jika pembaruan baru dipicu saat skrip lambat berjalan, skrip yang sedang berlangsung dibatalkan
  • Uji skrip Anda secara independen dengan input mock sebelum mengonfigurasinya

Notifikasi berbagi baris status

Di luar rendering fullscreen, Claude Code menampilkan notifikasi pada baris yang sama dengan baris status Anda. Dalam rendering fullscreen, Claude Code memberikan notifikasi baris mereka sendiri.

  • Notifikasi sistem seperti kesalahan server MCP dan pembaruan otomatis ditampilkan di sisi kanan baris. Notifikasi sementara seperti peringatan konteks-rendah juga bersiklus melalui area ini.
  • Mengaktifkan mode verbose menambahkan penghitung token ke area ini
  • Di terminal sempit, notifikasi ini mungkin memotong output baris status Anda