アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

Claude Code ステータスラインをカスタマイズする:コンテキスト使用率とレートリミットを常時表示する

Featured image of the post

Claude Code を使っていると、「今どのモデルで動いているか」「コンテキストウィンドウをどれくらい使ったか」「レートリミットまであとどれくらい余裕があるか」を作業中に把握したくなります。これらを画面下部に常時表示してくれるのが ステータスライン です。

ステータスラインは、設定したシェルスクリプトに stdin 経由でセッション情報(JSON)が渡され、スクリプトが出力したテキストがそのまま表示される仕組みです。本記事では、モデル名・作業ディレクトリ・git ブランチに加えて、コンテキスト使用率バー5 時間/週次レートリミットの使用率・リセットまでの残り時間を 2 行で表示するステータスラインを、コピペで使えるスクリプト付きで構築します。


[目次を開く]

ステータスラインとは?

一言で言うと

ステータスラインとは、Claude Code の画面下部に表示される、自作スクリプトの出力をそのまま映すカスタムバーです。API トークンを消費せずローカルで実行され、新しいアシスタントメッセージの後などに自動更新されます。

スクリプトには stdin から以下のような JSON が渡されます(一部抜粋)。

{
  "model": { "display_name": "Opus" },
  "workspace": { "current_dir": "/home/user/project" },
  "context_window": { "used_percentage": 42 },
  "rate_limits": {
    "five_hour": { "used_percentage": 18, "resets_at": 1750000000 },
    "seven_day": { "used_percentage": 6, "resets_at": 1750500000 }
  }
}

この JSON から欲しいフィールドを抜き出して整形し、標準出力に書き出すだけで、好きな情報を表示できます。

完成イメージ

本記事で作るステータスラインは、次のような 2 行構成です。

[Opus] 📁 project | 🌿 main +2 ~3
████░░░░░░ 42%   5h 18% (33m)   7d 6% (6d8h)
  • 1 行目: モデル名 / フォルダ名 / git ブランチ(ステージ済み +・変更 ~ の件数)
  • 2 行目: コンテキスト使用率バー / 5h(5 時間リミット)/ 7d(週次リミット)。( ) 内はリセットまでの残り時間
  • 使用率に応じてバーと数値が 緑(〜69%)→ 黄(70〜89%)→ 赤(90%〜) に変化

手順 1: スクリプトを作成する

~/.claude/statusline.sh を作成し、以下を貼り付けます。jq(コマンドライン JSON パーサー)を利用するため、未インストールの場合は先に導入してください。

#!/bin/bash
# Claude Code が stdin に送る JSON を読み取る
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)

# レートリミット(Pro/Max のみ・初回 API 応答後に届く。無ければ empty)
FIVE_PCT=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
FIVE_RESET=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // empty')
WEEK_PCT=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
WEEK_RESET=$(echo "$input" | jq -r '.rate_limits.seven_day.resets_at // empty')

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

# 使用率に応じた色(<70/ 70-89/ >=90 赤)
color_for() {
    if [ "$1" -ge 90 ]; then printf '%b' "$RED"
    elif [ "$1" -ge 70 ]; then printf '%b' "$YELLOW"
    else printf '%b' "$GREEN"; fi
}

# resets_at(epoch秒) → リセットまでの残り時間を "Xd Yh" / "XhYm" / "Ym" で整形
fmt_reset() {
    local target=$1 now diff d h m
    now=$(date +%s)
    diff=$((target - now))
    [ "$diff" -lt 0 ] && diff=0
    d=$((diff / 86400)); h=$(((diff % 86400) / 3600)); m=$(((diff % 3600) / 60))
    if [ "$d" -gt 0 ]; then echo "${d}d${h}h"
    elif [ "$h" -gt 0 ]; then echo "${h}h${m}m"
    else echo "${m}m"; fi
}

# コンテキスト使用率バー
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; 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// /░}"

# git 情報(リポジトリ内のときだけ表示)
GIT=""
if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')
    GIT_STATUS=""
    [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"
    GIT=" | 🌿 ${BRANCH} ${GIT_STATUS}"
fi

# レートリミット表示を組み立て
LIMITS=""
if [ -n "$FIVE_PCT" ]; then
    P=$(printf '%.0f' "$FIVE_PCT")
    C=$(color_for "$P")
    SEG="5h ${C}${P}%${RESET}"
    [ -n "$FIVE_RESET" ] && SEG="${SEG} ($(fmt_reset "$FIVE_RESET"))"
    LIMITS="$SEG"
fi
if [ -n "$WEEK_PCT" ]; then
    P=$(printf '%.0f' "$WEEK_PCT")
    C=$(color_for "$P")
    SEG="7d ${C}${P}%${RESET}"
    [ -n "$WEEK_RESET" ] && SEG="${SEG} ($(fmt_reset "$WEEK_RESET"))"
    LIMITS="${LIMITS:+$LIMITS   }$SEG"
fi
[ -z "$LIMITS" ] && LIMITS="rate limits --"

# 1 行目: モデル・ディレクトリ・git
echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}${GIT}"
# 2 行目: コンテキストバー・レートリミット
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}%   ${LIMITS}"

主に使っている入力フィールド

スクリプト内で参照している JSON フィールドは以下のとおりです。

フィールド 内容
model.display_name 現在のモデルの表示名(例: Opus)
workspace.current_dir 現在の作業ディレクトリ
context_window.used_percentage コンテキストウィンドウの使用率(事前計算済み)
rate_limits.five_hour.used_percentage / resets_at 5 時間ローリングリミットの使用率と、リセットされる Unix エポック秒
rate_limits.seven_day.used_percentage / resets_at 週次(7 日)リミットの使用率とリセット時刻
⚠️
rate_limitsClaude.ai サブスクリプション(Pro / Max) で、かつそのセッションで最初の API 応答が返った後にのみ届くフィールドです。それまでの間や対象外プランでは値が来ないため、スクリプトでは // empty でフォールバックし、rate limits -- と表示するようにしています。

手順 2: 実行権限を付与する

スクリプトをシェルが実行できるよう、実行権限を付けます。

chmod +x ~/.claude/statusline.sh

手順 3: settings.json に登録する

~/.claude/settings.jsonstatusLine フィールドを追加します。

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0,
    "refreshInterval": 60
  }
}

各フィールドの意味は次のとおりです。

フィールド 役割
type "command" 固定。「このシェルコマンドを実行する」の意味
command 実行するスクリプトのパス(インラインコマンドも可)
padding 左右の余白(文字数)。横幅に余裕を持たせたい場合は 0 にする
refreshInterval イベント更新に加え、N 秒ごとに再実行。残り時間タイマーをアイドル中も更新するために設定(最小 1)

設定は自動で再読み込みされますが、表示が反映されるのは 次に Claude Code とやり取りしたタイミング です。

動作確認(モック入力でテスト)

Claude Code を起動しなくても、モックの JSON を流し込めばスクリプト単体で動作確認できます。

echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":42},"rate_limits":{"five_hour":{"used_percentage":18,"resets_at":'$(($(date +%s)+1980))'},"seven_day":{"used_percentage":6,"resets_at":'$(($(date +%s)+549000))'}}}' | ~/.claude/statusline.sh

次のような 2 行が(ターミナルでは色付きで)出力されれば成功です。

[Opus] 📁 project
████░░░░░░ 42%   5h 18% (33m)   7d 6% (6d8h)

カスタマイズのヒント

色のしきい値を変える

color_for 関数とバー色の判定にある 90 / 70 の数値を書き換えれば、警告色に変わるタイミングを調整できます。

表示項目を増やす/減らす

コスト(cost.total_cost_usd)やセッション経過時間(cost.total_duration_ms)、PR 番号(pr.number)など、JSON には他にも多くのフィールドがあります。jq で抜き出して echo する行に足すだけで拡張できます。

自然言語で作ってもらう

ゼロから書く代わりに、Claude Code のスラッシュコマンドで丸ごと生成・設定してもらうこともできます。

/statusline モデル名とコンテキスト使用率をプログレスバーで表示して

よくあるハマりどころ

文字が右側の通知と重なる

ステータスラインの右側には MCP サーバーのエラーや自動更新などのシステム通知が表示されます。1 行が長すぎると重なって見えるため、情報を 2 行に分ける・区切りや記号を詰める・padding0 にするといった調整が有効です。本記事のスクリプトでは、レートリミットの残り時間を のような装飾記号ではなく ( ) 括弧でシンプルに表記し、重なりを避けています。

レートリミットが -- のままになる

前述のとおり rate_limits は Pro / Max かつ最初の API 応答後にのみ届きます。セッション開始直後やメッセージ送信前は rate limits -- と表示されるのが正常な挙動です。1 通目を送れば数値が表示されます。

値が -- や空になる

各フィールドは最初の API 応答が完了する前は null になり得ます。スクリプト側で // 0// empty のフォールバックを必ず入れておきましょう。

まとめ

ステータスラインをカスタマイズすると、Claude Code での作業状況を一目で把握できるようになります。

  • スクリプト + settings.json の登録だけで、好きな情報を画面下部に常時表示できる
  • コンテキスト使用率バーで残り容量を、レートリミット表示で利用枠とリセットまでの残り時間を把握できる
  • 通知との重なりは 2 行化・記号の簡素化・padding 調整 で回避できる

まずはモデル名とコンテキスト使用率だけのシンプルな構成から始め、徐々にレートリミットや git 情報を足していくのがおすすめです。

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら