本記事は macOS / Linux 環境を前提に書いています。
Windows の場合は Git Bash など bash が利用できる環境を利用することで動作します。
こんにちは、トライベック株式会社の鈴木です。
Claude Codeを使っていると、今何のモデルを使っているのか、後どのくらいトークンが使えるのかが気になることがよくあります。
その都度 /modelや/statusを打つのは面倒です。
そこで今回は、Claude Code のステータスラインをカスタマイズして、
- 現在利用中のモデル
- トークン消費量
- コンテキスト使用量
などを常時表示できるようにしてみました。
特にコンテキスト残量を常時確認できるのが便利で、
「そろそろ新しいセッションに切り替えた方がいいな」
を判断しやすくなりました。
完成イメージ
完成したものがこちら!
必要な情報を常に確認できるようになり、かなり快適になりました。
以下の配置で表示しています。
📁 ディレクトリ名 | 🌿 ブランチ名
🤖 モデル名 | 💪 Effortレベル | 📚 コンテキスト占有量 | 🕔 トークン使用量
ステータスラインの設定方法
※本記事は Claude Code v2.1.142 で動作確認しています。
Claude Code のチャット欄下部には、自由にカスタマイズできるステータスラインがあります。
ここには設定したシェルスクリプトが出力したものをそのまま表示することができます。
公式ドキュメント
https://code.claude.com/docs/ja/statusline
Windows ユーザーの方へ
ステータスラインのスクリプトは Bash で実行されるため、PowerShellやコマンドプロンプトでは動作しません。
Git Bash など Bash が利用できる環境を事前にインストールしてください。
以降の説明はBash環境を前提に記載しています。
1. スクリプトファイルを作成する
~/.claude/ ディレクトリにシェルスクリプトを作成します。
作成したスクリプトを Claude Code から実行できるように、権限も変更しておきます。
touch ~/.claude/statusline-command.sh
chmod +x ~/.claude/statusline-command.sh
2. jqのインストール
JSON 処理ツールのjq を使用しています。
インストールされていない場合は下記のコマンドで導入してください。
今回は Homebrew を使ってインストールします。
brew install jq
Windowsの場合(※筆者未検証)
windowsの場合は、winget または Scoop を使うと簡単に導入できるようです。
winget の場合
winget install jqlang.jq
Scoop の場合
※別途scoopをインストールする必要があります
scoop install jq
3. スクリプトの内容を書く
作成したファイルに以下の内容を書き込みます。
#!/bin/bash
# Claude Code ステータスライン — stdin に渡される JSON を表示するだけ(公式: https://code.claude.com/docs/ja/statusline )
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
EFFORT=$(echo "$input" | jq -r '.effort.level // "—"')
# コンテキスト使用割合(0–100)。バーと % はこの値から生成。
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';
# コンテキスト使用状況に基づいてバーの色を選択(50%から劣化が始まるため早めに警告)
if [ "$PCT" -ge 70 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 50 ]; 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// /░}"
# --- 5 時間ローリングのレート制限 ---
# used_percentage: 窓内の消費率。resets_at: その窓が切り替わる Unix 時刻(秒)。
# どちらも「最初の API 応答の後」に現れ、サブスク条件を満たさないと欠ける。
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
FIVEH_RESET=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty')
FIVEH_SHOW="—"
FIVEH_UNTIL=""
if [ -n "$FIVE_H" ]; then
FIVEH_INT=$(printf '%.0f' "$FIVE_H")
if [ "$FIVEH_INT" -ge 90 ]; then FH_COL="$RED"
elif [ "$FIVEH_INT" -ge 70 ]; then FH_COL="$YELLOW"
else FH_COL="$GREEN"; fi
FIVEH_SHOW="${FH_COL}${FIVEH_INT}%${RESET}"
fi
if [ -n "$FIVEH_RESET" ] && [ "$FIVEH_RESET" != "null" ]; then
NOW=$(date +%s)
DELTA=$((FIVEH_RESET - NOW))
[ "$DELTA" -lt 0 ] && DELTA=0
RH=$((DELTA / 3600))
RM=$(((DELTA % 3600) / 60))
if [ "$RH" -gt 0 ] && [ "$RM" -gt 0 ]; then UNTIL_TXT="あと${RH}h${RM}m"
elif [ "$RH" -gt 0 ]; then UNTIL_TXT="あと${RH}h"
elif [ "$RM" -gt 0 ]; then UNTIL_TXT="あと${RM}m"
else UNTIL_TXT="まもなく"; fi
FIVEH_UNTIL=" · ${UNTIL_TXT}${RESET}"
fi
BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"
# 1 行目: カレントのフォルダ名 + git ブランチ
echo -e "📁 ${DIR##*/}$BRANCH"
# 2 行目: モデル | effort | コンテキスト | 5h 制限(% + リセットまでの残り)
echo -e "🤖 ${MODEL}${RESET} | 💪 ${EFFORT}${RESET} | 📚 ${BAR_COLOR}${BAR}${RESET} ${PCT}% | 🕔 5h ${FIVEH_SHOW}${FIVEH_UNTIL}"
ポイントは input=$(cat) で stdin から JSON を受け取る ことです。
Claude Code はステータスライン更新のたびにこのスクリプトを呼び出し、状態情報を JSON として渡してきます。
4. settings.json に登録する
~/.claude/settings.json を開き、以下を追加します。
{
"statusLine": {
"type": "command",
"command": "bash /Users/<your-username>/.claude/statusline-command.sh",
"refreshInterval": 60
}
}
<your-username> は実際のユーザー名に置き換えてください。
refreshInterval はステータスラインの更新間隔(秒)です。
上記では 60 秒ごとにスクリプトが再実行され、最新の状態へ自動更新されます。
Windows ユーザーの場合、command のパス形式が異なります。
"command": "bash C:/Users/<your-username>/.claude/statusline-command.sh"
5. Claude Code を再起動して確認する
設定を反映させるため、Claude Code を一度終了して再起動します。
チャット欄の下部にステータスラインが表示されれば設定完了です。
※表示されない場合はターミナルを再起動してみてください。
Claude Code 起動時はコンテキスト使用量と5h制限の情報は表示されないので、何か一言投げかけてみましょう。
すべての情報が表示されました!
設定内容の解説
ここからは細かく設定内容を解説していきます。
スクリプト全体の構成
スクリプトは大きく以下のブロックに分かれています。
① JSON の受け取り
② 各値の取り出し
③ 表示色の定義
④ コンテキストバーの生成
⑤ 5時間レート制限の処理
⑥ Git ブランチの取得
⑦ 出力
順番に見ていきましょう。
① JSON の受け取り
input=$(cat)
Claude Code はステータスライン更新のたびにこのスクリプトを標準入力(stdin)経由で JSON を渡して起動します。
cat で stdin をそのまま読み込み、変数 input に格納しています。
渡される JSON の構造に関しては公式ドキュメントに記載があります。
② 各値の取り出し
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
EFFORT=$(echo "$input" | jq -r '.effort.level // "—"')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
jq -r で JSON から値を取り出しています。-r は raw モード(クォートなしで文字列を出力)です。
| 変数 | 取得元 | 内容 |
|---|---|---|
MODEL |
.model.display_name |
モデル名(例: Sonnet 4.6) |
DIR |
.workspace.current_dir |
作業ディレクトリのフルパス |
EFFORT |
.effort.level |
Effortレベル(low / normal / high など) |
PCT |
.context_window.used_percentage |
コンテキスト使用率(0〜100の整数) |
// "—" は jq のフォールバック演算子です。値が null や存在しない場合に代わりの値を返します。EFFORT が取得できないときは — を表示、PCT が取得できないときは 0 を使います。
cut -d. -f1 は小数点以下を切り捨てて整数にしています。
③ 表示色の定義
GREEN='\033[32m'
YELLOW='\033[33m'
RED='\033[31m'
RESET='\033[0m'
ANSI エスケープコードで色を定義しています。echo -e と組み合わせることでターミナルに色付きテキストを出力できます。
④ コンテキストバーの生成
if [ "$PCT" -ge 70 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 50 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi
コンテキスト使用率が高くなると、一般的に生成精度が低下しやすくなるため、早めに警告を出すようにしています。
コンテキスト使用率に応じて色を切り替える設定をします。
| 使用率 | 色 | 意味 |
|---|---|---|
| 70% 以上 | 🔴 赤 | 生成精度の低下に注意 |
| 50〜69% | 🟡 黄 | セッションを切り替えるタイミング |
| 50% 未満 | 🟢 緑 | 余裕あり |
FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /█}${PAD// /░}"
バーは 10マスで100% を表しています。
-
FILLED: 埋まっているマス数(例: PCT=42 → 4マス) -
EMPTY: 空のマス数(例: 10 - 4 = 6マス) -
printf -v FILL "%${FILLED}s": 空白をFILLED個生成し変数に格納 -
${FILL// /█}: 空白をすべて█(全角ブロック)に置換
最終的に BAR は ████░░░░░░ 42% のような見た目になります。
⑤ 5時間レート制限の処理
Claude Code のサブスクリプションプランには 「5時間ごとの利用上限」があります。
このブロックではその使用状況と、制限がリセットされるまでの残り時間を表示しています。
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
FIVEH_RESET=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty')
// empty は値が存在しない場合に何も出力しない(空文字)という jq の書き方です。// "—" と違い、後続の if [ -n "$FIVE_H" ] で「値があるかどうか」を判定するために空文字を使っています。
if [ -n "$FIVE_H" ]; then
FIVEH_INT=$(printf '%.0f' "$FIVE_H")
if [ "$FIVEH_INT" -ge 90 ]; then FH_COL="$RED"
elif [ "$FIVEH_INT" -ge 70 ]; then FH_COL="$YELLOW"
else FH_COL="$GREEN"; fi
FIVEH_SHOW="${FH_COL}${FIVEH_INT}%${RESET}"
fi
-n は「変数が空でない」の条件です。レート制限情報が JSON に含まれている場合のみ処理を行います。
printf '%.0f' で小数点以下を四捨五入して整数化しています(cut -d. -f1 の切り捨てとは異なります)。
if [ -n "$FIVEH_RESET" ] && [ "$FIVEH_RESET" != "null" ]; then
NOW=$(date +%s)
DELTA=$((FIVEH_RESET - NOW))
[ "$DELTA" -lt 0 ] && DELTA=0
RH=$((DELTA / 3600))
RM=$(((DELTA % 3600) / 60))
if [ "$RH" -gt 0 ] && [ "$RM" -gt 0 ]; then UNTIL_TXT="あと${RH}h${RM}m"
elif [ "$RH" -gt 0 ]; then UNTIL_TXT="あと${RH}h"
elif [ "$RM" -gt 0 ]; then UNTIL_TXT="あと${RM}m"
else UNTIL_TXT="まもなく"; fi
FIVEH_UNTIL=" · ${UNTIL_TXT}${RESET}"
fi
resets_at は Unix タイムスタンプ(秒)なので、現在時刻 date +%s との差分を取ることでリセットまでの残り時間を計算しています。
| 残り時間 | 表示例 |
|---|---|
| 1時間30分 | あと1h30m |
| 45分 | あと45m |
| 2時間ちょうど | あと2h |
| ほぼ0 | まもなく |
⑥ Git ブランチの取得
BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"
git rev-parse --git-dir は 現在のディレクトリが Git リポジトリかどうかを確認するコマンドです。
-
> /dev/null 2>&1: 標準出力・標準エラー出力を両方捨てる(エラーメッセージを画面に出さない) -
&&: 前のコマンドが成功した場合のみ右辺を実行
Git リポジトリ外のディレクトリでは BRANCH は空文字のままなので、ブランチ表示は出ません。
⑦ 出力
echo -e "📁 ${DIR##*/}$BRANCH"
echo -e "🤖 ${MODEL}${RESET} | 💪 ${EFFORT}${RESET} | 📚 ${BAR_COLOR}${BAR}${RESET} ${PCT}% | 🕔 5h ${FIVEH_SHOW}${FIVEH_UNTIL}"
echo -e は \033[32m などのエスケープコードを有効にするオプションです。
${DIR##*/} は Bash のパラメータ展開で、フルパスからディレクトリ名だけを取り出す記法です。
DIR="/Users/suzuki/myproject"
echo ${DIR##*/} # → myproject
##*/ は「先頭から最後の / までを削除する」という意味です。
以上が各コマンドの説明になります。
おわりに
現在のAI駆動開発では、コンテキストの管理がとても重要です。
コンテキスト残量を常に表示しておくことで長時間の作業でじわじわと減っていくのが視覚的にわかって、セッション管理の意識が高まりました。
シェルスクリプトで自由に拡張できるので、たとえば現在時刻やTODO件数を表示するなど、工夫次第で自由にカスタマイズできます。興味があればぜひ試してみてください。


