Claude Codeのstatusline設定
statuslineの更新は300msの間隔でまとめられ、1回だけ動きます。設定の書き方、渡されるJSON、スクリプトの例が分かります。
- statusline は、自分で書いたスクリプトの出力を画面の下に表示する仕組みです。セッションの情報が JSON で stdin に渡されます。
- 入口は /statusline コマンドか、settings.json の statusLine(type、command、padding、refreshInterval)です。
- 最初の API の応答までは null のフィールドがあるので、jq では // 0 のように既定値を付けます。cost.total_cost_usd は手元の推定値です。
statusline は、Claude Code の画面の下に、自分で書いたスクリプトの出力を表示する仕組みです。Claude Code がセッションの情報を JSON にしてスクリプトの stdin に渡し、スクリプトが stdout に出したものがそのまま表示されます。この記事では、設定の入口、スクリプトに渡される JSON、最小のスクリプト、応用、うまく出ないときの確かめ方を順に説明します。編集部の検証環境(macOS、Claude Code 2.1.305、jq 1.7.1、2026年10月21日)で、スクリプトにダミーの JSON を流して出力を確かめました。Claude Code のセッションの中で表示されるところは見ていません(未実行)。
設定の入口
入口は2つあります。
1つは /statusline コマンドです。表示したい内容を文章で渡すと、Claude Code が ~/.claude/ にスクリプトを作り、設定も書き換えます。消したいときは /statusline delete のように頼みます。
/statusline show model name and context percentage with a progress bar
もう1つは、settings.json に statusLine を自分で書く方法です。ユーザーの設定(~/.claude/settings.json)かプロジェクトの設定に置きます。
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 2,
"refreshInterval": 5
}
}
| キー | 意味 |
|---|---|
type | "command" を指定する |
command | スクリプトのパスか、その場で書くシェルのコマンド |
padding | 左右に足す空白の文字数。既定は 0 |
refreshInterval | イベントとは別に、N 秒ごとに再実行する。最小は 1。省くとイベントのときだけ動く |
出典:https://code.claude.com/docs/en/statusline 、2026-10-21確認
設定ファイルの置き場所と優先順位はpermissions設定の早見表にまとめています。
スクリプトに渡される JSON
主なフィールドです。ほかにもありますが、よく使うものだけに絞りました。
| フィールド | 中身 |
|---|---|
model.id、model.display_name | 今のモデルの ID と表示名 |
workspace.current_dir | 今の作業ディレクトリ。cwd も同じ値 |
workspace.project_dir | Claude Code を起動したディレクトリ |
cost.total_cost_usd | セッションの推定コスト(ドル)。手元で定価から計算した値で、請求額とは違うことがある |
cost.total_duration_ms | セッションの経過時間(ミリ秒) |
cost.total_lines_added、cost.total_lines_removed | 足した行数、消した行数 |
context_window.used_percentage | コンテキストの使用率。入力のトークンだけから計算する |
context_window.context_window_size | コンテキストの上限のトークン数 |
rate_limits.five_hour.used_percentage | 5時間の利用枠の使用率 |
rate_limits.seven_day.used_percentage | 7日の利用枠の使用率 |
session_id、version | セッション ID と Claude Code のバージョン |
最初の API の応答が返るまでは、値が null のフィールドがあります。jq なら // 0 のように既定値を付けます。rate_limits は、claude.ai の Pro・Max の契約者か、spend limit を設定する Claude apps gateway の利用時にだけ、セッションの最初の API 応答のあとに入ります。窓ごとに無いこともあるので、jq では // empty で、無いときは何も出さないようにします。
出典:https://code.claude.com/docs/en/statusline 、2026-10-21確認
いつ更新されるか
スクリプトは、セッションの開始時(再開も含む)に1回動きます。そのあとは、次のときに動き直します。
- アシスタントの新しいメッセージが届いたとき
/compactが終わったとき- 権限モードが変わったとき
- vim モードを切り替えたとき
statusLineのcommandを変えたときrefreshIntervalを設定していて、その時間が過ぎたとき- 前回スクリプトが受け取った rate limit の窓が、
resets_atの時刻に達したとき - 前回スクリプトが受け取った prompt cache が、
expires_atの時刻に達したとき
更新は 300ms の間隔でまとめられ、変化が止まってから1回だけ動きます。command を変えたときだけは、このまとめを待たずにすぐ動きます。スクリプトの実行中に次の更新が来ると、実行中のものは取り消されます。statusline は手元で動くもので、API のトークンは使いません。
出典:https://code.claude.com/docs/en/statusline 、2026-10-21確認
最小のスクリプト
「モデル名|ディレクトリ名|git のブランチ|コンテキスト使用率」を出す例です。
#!/bin/bash
# ~/.claude/statusline.sh: model | directory | git branch | context
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
echo "[$MODEL] ${DIR##*/} | ${BRANCH:-no git} | ctx ${PCT}%"
chmod +x ~/.claude/statusline.sh で実行権限を付けます。/tmp/todo-app に git init したダミーのリポジトリを作り、ブランチ feature/due-dates に切り替えてから、そこを指す JSON を流した結果です。
$ echo '{"model":{"display_name":"Sonnet"},"workspace":{"current_dir":"/tmp/todo-app"},"context_window":{"used_percentage":23}}' | ~/.claude/statusline.sh
[Sonnet] todo-app | feature/due-dates | ctx 23%
used_percentage を null にすると ctx 0%、git のリポジトリでない /tmp では no git と出ました。どれも終了コードは 0 です。10回続けて実行すると、3回測ってどれも合計 0.246 秒でした。current_dir に ~/projects/todo-app のような ~ で始まる文字列を入れると、git -C ではチルダが展開されず、no git になりました。
応用
- 複数行:
echoを2回書くと2行になる - 色:
\033[32mのような ANSI のエスケープを使う。端末が対応している必要がある - リンク:OSC 8 のエスケープでクリックできる文字にできる。iTerm2、Kitty、WezTerm などが対応し、Terminal.app は対応しない
- 幅:スクリプトの中では
tput colsで端末の幅を取れない。Claude Code が設定するCOLUMNSとLINESを読む - 利用枠:
rate_limitsの使用率を出せる。上限に当たったときの話は利用上限に当たったらにある
重い処理は入れません。 公式は、git status や git diff が大きいリポジトリでは遅いと書き、git の結果を一時ファイルに5秒だけ残す例を載せています。キャッシュのファイル名はセッションごとに分け、session_id を使います。プロセスの ID はスクリプトを呼ぶたびに変わるので使えません。
出典:https://code.claude.com/docs/en/statusline 、2026-10-21確認
output styles とは別物
output styles は、Claude の役割、口調、応答の形をセッション全体で変える指示のまとまりです。Claude の答え方を変えるもので、画面の下の表示とは関係ありません。statusline の JSON には、今の出力スタイルの名前が output_style.name として入っているので、表示することはできます。
出典:https://code.claude.com/docs/en/output-styles 、https://code.claude.com/docs/en/statusline 、2026-10-21確認
うまく出ないとき
| 症状 | 確かめること |
|---|---|
| 何も出ない | 実行権限(chmod +x)、stdout に出しているか(stderr ではないか)、手で実行して出力があるか |
| 空になる | 終了コードが 0 以外、または出力が空だと表示されない |
| フォルダーを開いたら出ない | ワークスペースの信頼の確認に同意するまで、statusline は動かない |
値が -- や空 | 最初の応答の前は null がある。// 0 で既定値を付ける |
| ほかの原因を探す | claude --debug で、スクリプトの stderr がログに残る |
出典:https://code.claude.com/docs/en/statusline 、2026-10-21確認
編集部の検証環境では、実行権限を外したスクリプトは Permission denied で終了コード 126 でした。PATH から jq を外すと、jq: command not found が stderr に出たうえで、[] | no git | ctx % と崩れた行が終了コード 0 で出ました。jq が無い環境では、エラーにならずに表示が崩れます。スクリプトの書き方で起きる問題は、hook と同じ原因のことが多いので、hooksが動かないときの確認も参考になります。
まとめ
- statusline は、JSON を stdin で受け取ったスクリプトの stdout を、画面の下に表示する仕組み
- 設定は
/statuslineに頼むか、settings.jsonのstatusLineにtype・commandを書く - 使用率は
context_window.used_percentage、コストはcost.total_cost_usd。最初はnullがあるので既定値を付ける - 更新はイベントごとで、300ms でまとめられる。時刻のような値は
refreshIntervalで更新する - git のような重い処理はキャッシュする。キャッシュのファイル名は
session_idで分ける - 出ないときは、実行権限、stdout、終了コード 0、ワークスペースの信頼を確かめる