Customize your status line
概要
Claude Code の下部に表示されるカスタマイズ可能なバー。設定したシェルスクリプトを実行し、stdin で JSON のセッションデータを受け取り、スクリプトが出力した内容を表示する。
仕様
設定
/statuslineコマンドに自然言語で指示すると、~/.claude/にスクリプトを生成し設定を自動更新する- 手動設定は user settings(
~/.claude/settings.json)または project settings にstatusLineフィールドを追加する。typeを"command"にし、commandにスクリプトパスまたはインラインのシェルコマンドを指定する commandはシェルで実行されるため、スクリプトファイルの代わりにインラインコマンドも使える
| フィールド | 説明 |
|---|---|
type | "command" |
command | スクリプトパスまたはインラインのシェルコマンド |
padding | ステータスライン内容に追加する水平方向のスペース(文字数)。既定 0。UI 組み込みのスペースに追加される相対的なインデント |
refreshInterval | イベント駆動の更新に加えて N 秒ごとにコマンドを再実行する。最小 1。未設定ならイベント時のみ実行される |
hideVimModeIndicator | プロンプト下の組み込みの -- INSERT -- 表示を抑止する。スクリプトが自分で vim.mode を描画する場合に true にする |
- 無効化するには
/statuslineに削除を依頼する(/statusline deleteなど)か、settings からstatusLineフィールドを消す - ステータスラインは組み込みのフッターバッジの上に独自の行として描画され、フッターを置き換えない。カスタムステータスライン設定時、フッターのキーボードヒント(
esc to interrupt、? for shortcuts、hold space to speak)の多くは表示されなくなる
動作
スクリプトはセッション開始時(resume を含む)に 1 回実行され、その後は次のときに再実行される。
-
新しいアシスタントメッセージが届いたとき
-
/compactが完了したとき -
permission mode が変わったとき
-
vim mode が切り替わったとき
-
refreshIntervalのタイマーが経過したとき(設定した場合) -
更新は 300ms でデバウンスされ、急な変化はまとめられて変化が止まった後に 1 回実行される
-
スクリプト実行中に新しい更新がトリガーされると、実行中のスクリプトはキャンセルされる
-
スクリプトを編集した場合、次の更新トリガーで再実行されたときに反映される
-
v2.1.216 より前は、セッションの resume でコマンドが短時間に 2 回実行されていた
出力:
-
複数行:
echo/printごとに別の行として表示される -
色:
\033[32mのような ANSI escape code(ターミナルの対応が必要) -
リンク: OSC 8 escape sequence でクリック可能にする(macOS は Cmd+click、Windows/Linux は Ctrl+click)。iTerm2 / Kitty / WezTerm など対応ターミナルが必要
-
Claude Code はスクリプト出力を捕捉するため、
tput colsや言語レベルの幅検出はスクリプト内からターミナルサイズを読めない。代わりにCOLUMNSとLINES環境変数を読む。Claude Code はスクリプト実行前にこれらを現在のターミナル寸法に設定する。v2.1.153 以降が必要 -
ステータスラインはローカルで動き、API トークンを消費しない。オートコンプリート候補、ヘルプメニュー、permission prompt など一部の UI 操作中は一時的に隠れる
stdin で渡される JSON フィールド
| フィールド | 説明 |
|---|---|
model.id, model.display_name | 現在のモデル識別子と表示名 |
cwd, workspace.current_dir | 現在の作業ディレクトリ。両者は同じ値で、workspace.project_dir との一貫性のため workspace.current_dir が推奨 |
workspace.project_dir | Claude Code を起動したディレクトリ |
workspace.added_dirs | /add-dir または --add-dir で追加したディレクトリ。無ければ空配列 |
workspace.git_worktree | git worktree add で作った linked worktree 内にいるときの worktree 名。メイン作業ツリーでは存在しない |
workspace.repo.host, workspace.repo.owner, workspace.repo.name | origin remote から解析したリポジトリ識別。git リポジトリ外や origin 未設定では存在しない |
cost.total_cost_usd | クライアント側で計算したセッションの推定コスト(USD)。実際の請求と異なりうる。/clear で $0 にリセットされる |
cost.total_duration_ms | セッション開始からの実時間(ミリ秒) |
cost.total_api_duration_ms | API 応答待ちの合計時間(ミリ秒) |
cost.total_lines_added, cost.total_lines_removed | 変更行数 |
context_window.total_input_tokens, context_window.total_output_tokens | 直近の API 応答時点でコンテキストウィンドウにあるトークン数。input は cache の読み書きを含む |
context_window.context_window_size | 最大コンテキストウィンドウサイズ。既定 200000、extended context のモデルでは 1000000 |
context_window.used_percentage | 使用率(計算済み) |
context_window.remaining_percentage | 残量率(計算済み) |
context_window.current_usage | 直近の API 呼び出しのトークン数 |
exceeds_200k_tokens | 直近の API 応答の合計トークン数(input・cache・output の合計)が 200k を超えたか。実際のコンテキストウィンドウサイズに関わらず固定の閾値 |
fast_mode | セッションで fast mode が有効か |
effort.level | 現在の reasoning effort(low / medium / high / xhigh / max)。セッション中の /effort 変更も反映する。ultracode は独立した水準ではなく xhigh として報告される。モデルが effort をサポートしない場合は存在しない |
thinking.enabled | extended thinking が有効か |
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentage | 5 時間・7 日のレート制限の消費率(0〜100) |
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_at | 各ウィンドウがリセットされる Unix epoch 秒 |
session_id | セッション識別子 |
session_name | セッション名。--name や /rename で設定したカスタム名、無ければ AI 生成のタイトル。my-app-3f のような既定の表示名はこのフィールドを埋めない |
prompt_id | 現在処理中のユーザープロンプトを識別する UUID。OpenTelemetry イベントの prompt.id 属性と一致する。最初のユーザー入力までは存在しない。v2.1.196 以降が必要 |
transcript_path | 会話トランスクリプトファイルのパス |
version | Claude Code のバージョン |
output_style.name | 現在の output style 名 |
vim.mode | vim mode 有効時の現在のモード(NORMAL / INSERT / VISUAL / VISUAL LINE) |
agent.name | --agent フラグまたは agent 設定で動いているときの agent 名 |
pr.number, pr.url | 現在のブランチの open な pull request。PR が見つかるまで、git リポジトリ外、PR がマージ・クローズされた後は存在しない |
pr.review_state | open な PR のレビュー状態(approved / pending / changes_requested / draft)。pr があっても独立して欠けうる |
worktree.name | アクティブな worktree 名。--worktree セッションでのみ存在する |
worktree.path | worktree ディレクトリの絶対パス |
worktree.branch | worktree の git ブランチ名(例: "worktree-my-feature")。hook ベースの worktree では存在しない |
worktree.original_cwd | worktree に入る前にいたディレクトリ |
worktree.original_branch | worktree に入る前に checkout していたブランチ。hook ベースの worktree では存在しない |
欠けうるフィールド: session_name、prompt_id、workspace.git_worktree、workspace.repo、effort、vim、agent、pr、worktree、rate_limits(rate_limits は Claude.ai サブスクライバー(Pro/Max)で、セッション最初の API 応答後にのみ現れる。five_hour と seven_day は独立して欠けうる)。
null になりうるフィールド: context_window.current_usage(セッション最初の API 呼び出し前と、/compact 後から次の API 呼び出しまで)、context_window.used_percentage と remaining_percentage(セッション初期)。
context_window フィールドの詳細
total_input_tokensはinput_tokens+cache_creation_input_tokens+cache_read_input_tokensの合計。total_output_tokensは直近応答の output token。どちらも最初の API 応答前は0current_usageは同じトークン数をカテゴリ別に分けたもの。input_tokens/output_tokens/cache_creation_input_tokens/cache_read_input_tokensを持つused_percentageは input のみから計算される(input_tokens + cache_creation_input_tokens + cache_read_input_tokens)。output_tokensは含まない
subagentStatusLine
- agent パネルに表示される各 subagent 行の本文をカスタムで描画する。既定の
name · description · token countを置き換える - コマンドはリフレッシュのたびに 1 回実行され、表示中の全 subagent 行を 1 つの JSON オブジェクトとして stdin で受け取る
- 入力には base hook fields、使用可能な行幅の
columnsフィールド、tasks配列が含まれる。各 task はid、name、type、status、description、label、startTime、model、effort、contextWindowSize、tokenCount、tokenSamples、cwdを持つ modelは task が動く解決済みモデル ID。contextWindowSizeはそのモデルのコンテキストウィンドウ(トークン)で、メインのcontext_window.context_window_sizeと同じ方法で計算される。どちらも v2.1.205 以降が必要で、モデルが未解決の task では省略されるeffortはその subagent に設定された reasoning effort(定義の frontmatter か個別の呼び出し)。値は effort level 文字列(low/medium/high/xhigh/max)か数値のトークン予算。設定値をそのまま報告するため、モデルがその水準に対応していない場合、実際に適用される effort とは異なりうる。v2.1.214 以降が必要で、セッションの effort を継承する場合は存在しない- 上書きしたい行ごとに
{"id": "<task id>", "content": "<row body>"}の形式で stdout に 1 行ずつ JSON を書く。contentは ANSI 色と OSC 8 ハイパーリンクを含めそのまま描画される。task のidを省くとその行は既定描画のまま、空のcontentを出すと非表示になる statusLineと同じ trust とdisableAllHooksのゲートが適用される。Plugin はsettings.jsonで既定のsubagentStatusLineを配布できる
Windows
- Git Bash がインストールされていれば Git Bash 経由、無ければ PowerShell 経由でコマンドを実行する
- Git Bash は引用符無しのバックスラッシュをエスケープ文字として扱うため、
C:\Users\username\script.mjsのような Windows 形式パスは区切りが失われてエラー表示なく失敗する。command文字列のパスはスラッシュで書く。~も Windows のホームディレクトリに展開される - PowerShell スクリプトを使うには
powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1のように呼び出す
設定
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 2
}
}
{
"statusLine": {
"type": "command",
"command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
}
}
{
"subagentStatusLine": {
"type": "command",
"command": "~/.claude/subagent-statusline.sh"
}
}
#!/bin/bash
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' | cut -d. -f1)
echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"
制約・注意点
- スクリプトは実行可能にする(
chmod +x) - 出力は stdout に書く(stderr ではない)
- ステータスラインのコマンドは、現在のディレクトリの workspace trust ダイアログを承認している場合のみ実行される。未承認だとステータスラインは空のままで、
claude --debugにStatus line command skipped: workspace trust not acceptedが記録される - settings で
disableAllHooksがtrueのとき、ステータスラインも無効になる - 非ゼロ終了コードや出力なしのスクリプトはステータスラインを空にする
- 遅いスクリプトは完了までステータスラインの更新をブロックする
- ステータスバーの幅は限られており、長い出力は切り詰められたり折り返されたりする
- スクリプトは頻繁に実行されるため、
git statusのような遅いコマンドはラグを生む。キャッシュする場合、キャッシュファイル名にはセッション中一定で他セッションと衝突しないsession_idを使う($$/os.getpid()/process.pidは毎回変わりキャッシュが機能しない) - コンテキスト率は計算タイミングの違いにより
/contextの出力と異なりうる - OSC 8 リンクは対応ターミナル(iTerm2 / Kitty / WezTerm)が必要。Terminal.app は非対応。検出に失敗する場合は
FORCE_HYPERLINK環境変数で上書きする。SSH と tmux は設定によって OSC シーケンスを取り除くことがある - エスケープシーケンスが
\e]8;;のようにリテラル表示される場合はecho -eではなくprintf '%b'を使う - 複雑なエスケープシーケンスは他の UI 更新と重なると出力が乱れることがある。複数行 + エスケープコードは単一行のプレーンテキストより描画上の問題が起きやすい
- MCP サーバーエラーや自動更新などのシステム通知は同じ行の右側に表示される。verbose モードを有効にするとトークンカウンタもこの領域に加わる。狭いターミナルではステータスライン出力が切り詰められうる
関連
facts/claude-code/settings.mdfacts/claude-code/commands.mdfacts/claude-code/sub-agents.mdfacts/claude-code/hooks.mdfacts/claude-code/context-window.mdfacts/claude-code/costs.mdfacts/claude-code/interactive-mode.mdfacts/claude-code/plugins.md