Claude Code を使っていると、
- 今どのモデルで動いているか
- コンテキスト残量
-
/compactを実行するタイミング
を確認したくなることがあります。
毎回 /context を実行すれば確認できますが、開発中に何度も確認するのは少し面倒です。
そこで Claude Code の statusLine を使って、画面下部に 現在のモデル名 と コンテキスト使用率 を常時表示するようにしました。
完成イメージ
表示例
◆ Opus 4.6 │ ██░░░░░░ 42K/200K (21%)
コンテキスト使用率が 80% を超えると警告アイコンも表示します。
◆ Opus 4.6 │ ██████░░ 165K/200K (83%) ⚠
すぐ使いたい人向け
以下を ~/.local/bin/statusline.sh として保存してください。
#!/usr/bin/env bash
set -uo pipefail
# --- stdin の JSON を読み込む(これが本体)-----------------------------------
input="$(cat)"
# --- jq の存在確認 -----------------------------------------------------------
if ! command -v jq >/dev/null 2>&1; then
echo "◆ statusline: jq が見つかりません (brew install jq / apt install jq)"
exit 0
fi
jq_get() {
# $1: jq フィルタ, $2: フォールバック値
local val
val="$(printf '%s' "$input" | jq -r "$1" 2>/dev/null)"
if [[ -z "$val" || "$val" == "null" ]]; then
printf '%s' "$2"
else
printf '%s' "$val"
fi
}
# --- フィールド抽出 -----------------------------------------------------------
# モデル名は display_name が既に整形済み(例: "Opus 4.6")なのでそのまま使う
model="$(jq_get '.model.display_name' "$(jq_get '.model.id' 'unknown')")"
# コンテキスト使用率(真実の値。/context と一致する)
used_pct_raw="$(jq_get '.context_window.used_percentage' '0')"
ctx_size="$(jq_get '.context_window.context_window_size' '200000')"
# --- 数値の正規化 -------------------------------------------------------------
# used_percentage は小数のことがある(例: 12.4)ので整数に丸める
pct="$(awk -v p="$used_pct_raw" 'BEGIN { printf "%d", (p < 0 ? 0 : (p > 100 ? 100 : p)) + 0.5 }')"
# 表示用トークン数は used_percentage × context_window_size から導出する。
# (context_window.total_input_tokens 等はセッション累計でズレるため使わない)
tokens="$(awk -v p="$used_pct_raw" -v s="$ctx_size" 'BEGIN { printf "%d", (p/100)*s }')"
# --- 数値を K / M 表記に整形 --------------------------------------------------
human() {
local n="$1"
if (( n >= 1000000 )); then awk -v n="$n" 'BEGIN { printf "%.1fM", n/1000000 }'
elif (( n >= 1000 )); then echo "$(( n / 1000 ))K"
else echo "$n"
fi
}
token_display="$(human "$tokens")"
max_display="$(human "$ctx_size")"
# --- プログレスバー -----------------------------------------------------------
bar_width=8
filled=$(( pct * bar_width / 100 ))
(( filled > bar_width )) && filled=$bar_width
empty=$(( bar_width - filled ))
bar=""
for (( i=0; i<filled; i++ )); do bar+="█"; done
for (( i=0; i<empty; i++ )); do bar+="░"; done
# --- 警告表示 -----------------------------------------------------------------
warn=""
(( pct >= 80 )) && warn=" ⚠"
# --- 出力 ---------------------------------------------------------------------
echo "◆ ${model} │ ${bar} ${token_display}/${max_display} (${pct}%)${warn}"
実行権限を付与します。
chmod +x ~/.local/bin/statusline.sh
~/.claude/settings.json に以下を設定します。
{
"statusLine": {
"type": "command",
"command": "~/.local/bin/statusline.sh"
}
}
これで Claude Code 起動時に statusLine が表示されます。
ここから先は、「なぜこうなっているのか」を解説します。
Claude Code の statusLine とは
Claude Code の statusLine は、画面下部に任意の情報を表示できる仕組みです。
公式ドキュメントはこちらです。
~/.claude/settings.json に statusLine.command を設定すると、Claude Code がそのコマンドを実行し、標準出力に出した文字列をステータスラインとして表示してくれます。
Claude Code の statusLine は stdin で情報を渡してくる
Claude Code は statusLine 用のコマンドを実行する際、現在のセッション情報を stdin の JSON として渡してきます。
つまり流れは次のようになります。
Claude Code
↓ JSON を stdin に渡す
statusline.sh
↓ 文字列を stdout に出す
Claude Code の画面下部に表示
その JSON の中に、モデル名やコンテキスト使用率などの情報が含まれています。
{
"context_window": {
"used_percentage": 21.4,
"context_window_size": 200000
}
}
そのため statusLine のスクリプトでは、まず stdin を読む必要があります。
input="$(cat)"
これを忘れると、モデル名やコンテキスト使用率を取得できません。
ポイント
Claude Code が stdin に渡してくれる JSON には、context_window.used_percentage という値があります。
これはコンテキストウィンドウの使用率です。
今回のスクリプトでは、この値を「コンテキスト使用率の基準」として扱います。
{
"context_window": {
"used_percentage": 21.4,
"context_window_size": 200000
}
}
表示しているトークン数は厳密なトークン会計ではなく、次の値から算出した推定値です。
used tokens ≒ used_percentage × context_window_size
used_pct_raw="$(jq_get '.context_window.used_percentage' '0')"
ctx_size="$(jq_get '.context_window.context_window_size' '200000')"
tokens="$(awk -v p="$used_pct_raw" -v s="$ctx_size" 'BEGIN { printf "%d", (p/100)*s }')"
正確なトークン数を表示したいというより、
そろそろコンテキストが詰まってきたな
を素早く把握することを目的にしています。
そのため、used_percentage を基準にするのがシンプルで分かりやすいと考えました。
実行権限を付ける
chmod +x ~/.local/bin/statusline.sh
jq が入っていない場合はインストールします。
macOS なら Homebrew で入れられます。
brew install jq
Ubuntu / Debian 系なら次のように入れます。
sudo apt install jq
Claude Code の settings.json に設定する
~/.claude/settings.json に statusLine を追加します。
{
"statusLine": {
"type": "command",
"command": "~/.local/bin/statusline.sh"
}
}
これで Claude Code を起動すると、画面下部に statusLine が表示されます。
モック JSON で動作確認する
Claude Code 上で試す前に、ターミナルから直接確認できます。
echo '{"model":{"display_name":"Opus 4.6"},"context_window":{"used_percentage":25,"context_window_size":200000}}' \
| ~/.local/bin/statusline.sh
出力例です。
◆ Opus 4.6 │ ██░░░░░░ 50K/200K (25%)
80% を超えた場合も確認できます。
echo '{"model":{"display_name":"Opus 4.6"},"context_window":{"used_percentage":83,"context_window_size":200000}}' \
| ~/.local/bin/statusline.sh
出力例です。
◆ Opus 4.6 │ ██████░░ 166K/200K (83%) ⚠
注意点
jq が必要
このスクリプトは JSON のパースに jq を使っています。
jq がない場合は、statusLine 上に次のようなメッセージを出して終了します。
◆ statusline: jq が見つかりません (brew install jq / apt install jq)
Claude Code 側を壊さないように、エラー終了ではなく exit 0 にしています。
古い Claude Code ではフィールドがない可能性がある
context_window.used_percentage などのフィールドは、Claude Code のバージョンによって利用できる内容が変わる可能性があります。
うまく表示されない場合は、Claude Code をアップデートしてから確認するとよさそうです。
claude update
また、初回応答前など、タイミングによって値が null になる可能性もあるため、スクリプト側ではフォールバック値を用意しています。
jq_get '.context_window.used_percentage' '0'
statusLine のスクリプトは軽くする
statusLine のコマンドは繰り返し実行されます。
そのため、重い処理やネットワークアクセスを入れると体感が悪くなる可能性があります。
今回のスクリプトは、stdin の JSON を読んで jq と awk で整形するだけにしています。
さらに発展させるなら
statusLine には他にも色々な情報を表示できます。
例えば次のような項目を追加しても面白そうです。
- Git ブランチ
- カレントディレクトリ
- セッションコスト
- Rate Limit
- Vim モード
- 使用中モデルの切り替え状況
ただし statusLine は常時表示されるため、情報を詰め込みすぎると逆に見づらくなります。
個人的には、まずはコンテキスト使用率だけ表示する構成がおすすめです。
まとめ
Claude Code の statusLine を使うと、作業中に見たい情報を画面下部に常時表示できます。
今回のスクリプトでは、次のような表示を作りました。
◆ Opus 4.6 │ ██░░░░░░ 42K/200K (21%)
ポイントは次の3つです。
- Claude Code は statusLine コマンドに JSON を stdin で渡す
- コンテキスト使用率は
context_window.used_percentageを使う - statusLine は常に表示されるので、短く軽くする
毎回 /context を打つのが面倒な人には、かなり便利です。
自分の場合は、コンテキストが 80% を超えたら「そろそろ整理するか」という目安にしています。
是非、自分専用のstatuslineを育成してみてください!
