Claude Codeで「コンテキスト使用率バー」を表示して、回答の劣化を見える化する
「さっきまで良い感じだったClaude Codeが、急に的外れなことを言い出した」——長時間の作業でそんな経験はありませんか?
それ、コンテキストウィンドウがパンパンになっているサインかもしれません。
TL;DR
- Claude Codeの
statusLine機能を使うと、会話がどれだけコンテキストウィンドウを消費しているかを、画面下部に常時バー表示できる - 長時間・大量のやり取りをするとコンテキストが逼迫し、応答の質が落ちたと感じる場面が増える
-
/statuslineコマンド一発、または~/.claude/settings.jsonへの数行の設定で導入できる
なぜコンテキスト使用率を可視化したいのか
Claude Codeに限らず、LLMを使ったCLIツールやエージェントは「コンテキストウィンドウ」という上限のあるメモリの中で会話・コード・ツール実行結果をすべて保持しながら動いています。
会話が長くなったり、大きなファイルを何度も読み込んだり、サブエージェントの出力を大量に受け取ったりすると、このコンテキストウィンドウはどんどん消費されていきます。
一般的に、長文コンテキストのLLMでは以下のような傾向が知られています。
- コンテキストの中盤に置かれた情報を見落としやすくなる(いわゆる "lost in the middle" 現象)
- コンテキストが埋まってくると、直近の指示より前の方針を忘れたような回答になることがある
- 無関係な情報(過去の試行錯誤のログなど)が溜まることで、ノイズに引っ張られた回答が増える
これらは公式に数値化された保証があるわけではありませんが、実際にClaude Codeで長時間作業していると「あれ、さっき言ったことを踏まえてくれない」「的外れなファイルを読みに行く」といった体感の劣化に遭遇することは少なくないと思います。
そこで、今どれくらいコンテキストを使っているかを常時可視化しておき、閾値を超えたら/compactや/clearで仕切り直す判断材料にする、というのが今回のモチベーションです。
Claude Codeのステータスライン機能とは
Claude Codeには、画面下部に任意のシェルスクリプトの出力を表示できるstatusLineという設定項目があります。
スクリプトは以下のタイミングで自動的に再実行され、標準入力(stdin)からセッション情報がJSONで渡されます。
- 新しいアシスタントの応答が返ってきたとき
-
/compactが完了したとき - パーミッションモードが変わったとき
- その他、設定したリフレッシュ間隔が経過したとき
このJSONの中に、まさに欲しかったcontext_windowというフィールドがあります。
"context_window": {
"total_input_tokens": 15500,
"total_output_tokens": 1200,
"context_window_size": 200000,
"used_percentage": 8,
"remaining_percentage": 92
}
used_percentageが、コンテキストウィンドウに対する使用率(%)そのものです。これをシェルスクリプトで読み取ってバーとして描画すればOKです。
導入方法
方法1: /statuslineコマンドで自動生成(おすすめ)
Claude CodeのCLIチャット上で、自然言語で指示するだけでスクリプトの生成〜設定までを自動でやってくれます。
/statusline show context percentage with a progress bar
これだけで~/.claude/配下にスクリプトが生成され、settings.jsonにも自動で登録されます。手っ取り早く試したい人はこちらで十分です。
方法2: 手動でスクリプトを設置する
中身を理解した上で自分でカスタマイズしたい場合は、以下の手順で設定します。
1. ~/.claude/statusline.shを作成
#!/bin/bash
# Claude Codeからセッション情報のJSONがstdinで渡される
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'
# 使用率に応じてバーの色を変える(70%で黄色、90%で赤)
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi
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 -e "[$MODEL] ${BAR_COLOR}${BAR}${RESET} ${PCT}% context"
2. 実行権限を付与
chmod +x ~/.claude/statusline.sh
3. ~/.claude/settings.jsonに設定を追加
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}
保存すると即座に反映され、画面下部に以下のようなバーが常時表示されるようになります。
[Sonnet] ▓▓░░░░░░░░ 20% context
使用率が70%を超えると黄色、90%を超えると赤に変わるので、一目で「そろそろ危ない」と判断できます。
運用してみて
- 使用率が体感50〜60%を超えたあたりから、こまめに
/compact(要約による圧縮)を挟むようにすると、話が噛み合わなくなる感覚が減った - 逆に言うと、可視化していなかった頃は「気づいたら90%超えていた」ということが普通にあった
- サブエージェント(Task/Agent機能)を多用するタスクほど、想像より早くコンテキストを食うので、こういうタスクの時ほどバーの存在がありがたい
まとめ
Claude CodeのstatusLineは、context_window.used_percentageというフィールドを介して、今の会話がコンテキストウィンドウをどれだけ消費しているかを取得できます。これを常時バー表示しておくことで、
- コンテキストの逼迫に気づかず作業を続けて回答品質が落ちる、という事態を避けやすくなる
-
/compactや/clearのタイミングを勘ではなく数値で判断できるようになる
といったメリットがあります。設定は/statuslineコマンド一発、あるいは数行のシェルスクリプトで完結するので、長時間Claude Codeを使う人にはぜひおすすめしたい設定です。