Claude Codeのステータスラインをカスタマイズして、レート制限・コンテキスト残量を常時表示する

Claude Code HUD - タイトル

Claude Codeを使っていると、ふとした瞬間に気になることがあります。

「今、レート制限どのくらい残ってるんだっけ。」
「このまま話し続けてコンテキストウィンドウが詰まったら困るな。」
「エフォートレベル、highのままだっけ。」

これ、いちいち確認しにいくのが地味にストレスでした。

見えないストレス

Zennで同じような設定をしている記事を見かけて、自分も試してみることにしました。結論、思っていたより簡単で、作業体験がかなり改善しました。

目次

できあがったもの

ターミナル下部のステータスラインに、こんな表示が常時出るようになりました。

Opus 4.7 (high) | 5h ████░░░░░░ 10% | 7d █░░░░░░░░░ 6% | ctx ███░░░░░░░ 33% | my-project

ステータスラインの解剖図

表示している情報は5つです。

  1. モデル名+エフォートレベル — 今どのモデルで、どの思考レベルで動いているか
  2. 5時間のトークン使用率 — レート制限の短期的な残量
  3. 7日間のトークン使用率 — 週単位の残量。リセット前後に見ると分かりやすい
  4. コンテキスト使用率 — 現在の会話がどのくらい詰まっているか
  5. カレントディレクトリ名 — 今どのプロジェクトで作業しているか

使用率に応じてバーの色が変わります。

  • 緑(0〜30%): 余裕あり
  • 黄(30〜70%): 中盤
  • 赤(70%以上): 警戒

行動のトリガー

コンテキストが赤くなったら /clear(完全リセット)か /compact(会話を要約して圧縮)を検討するサイン。/clear は会話履歴をすべて消してまっさらな状態に戻す。/compact は履歴を要約した上で会話を続けるので、作業の流れを保ちつつコンテキストを節約したいときに使えます。状況に応じて使い分けています。

必要な環境

注意: この設定はClaude.aiのサブスクリプション(ProまたはMaxプラン)ユーザー向けです。
レート制限のデータ(rate_limits)はClaude.ai経由のセッションでのみ取得できます。APIキーで直接利用している場合、5h・7dのバーは表示されません(他の情報は表示されます)。

  • jq(JSONパーサー)
  • awk

macOSにはデフォルトで awk が入っています。jq は Homebrew で入れられます。

brew install jq

設定方法

0. 実は自分で書かなくてもいい

実装のショートカット

実はこの設定、自分でゼロから書いたわけではありません。

Claude Code本人に「ステータスラインにレート制限とコンテキスト使用率を表示したい。色で残量がわかるようにしてほしい」と伝えたら、スクリプトの作成から settings.json への設定追記まで全部やってくれました。

自分でシェルスクリプトを書く必要はなくて、「こういうふうに表示したい」とイメージを伝えるだけで実装してくれます。この記事は「何を設定しているか」の解説として読んでもらえれば十分で、実際にやってみるときはClaude Codeに相談するのが一番早いです。

1. シェルスクリプトを配置する

~/.claude/statusline-command.sh を作成します。以下がスクリプト全体です。

#!/bin/sh

# 使用率に応じたANSIカラーコードを返す関数
color_for_pct() {
  pct=$1
  if [ "$(echo "$pct" | awk '{print ($1 < 30)}')" = "1" ]; then
    printf '\033[32m'   # 緑: 0〜30%
  elif [ "$(echo "$pct" | awk '{print ($1 < 70)}')" = "1" ]; then
    printf '\033[33m'   # 黄: 30〜70%
  else
    printf '\033[31m'   # 赤: 70%〜
  fi
}

# プログレスバーを生成する関数(10マスで表現)
make_bar() {
  pct=$1
  filled=$(echo "$pct" | awk '{printf "%d", $1 / 10}')
  empty=$((10 - filled))
  bar=""
  i=0
  while [ $i -lt $filled ]; do
    bar="${bar}█"
    i=$((i + 1))
  done
  i=0
  while [ $i -lt $empty ]; do
    bar="${bar}░"
    i=$((i + 1))
  done
  echo "$bar"
}

input=$(cat)

# モデル名
model=$(echo "$input" | jq -r '.model.display_name // .model.id // "Unknown"')

# エフォートレベル: ~/.claude/settings.json の effortLevel フィールドから読み取る
effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null)

# モデル名にエフォートを付加(取得できた場合のみ)
if [ -n "$effort" ]; then
  model_display="${model} (${effort})"
else
  model_display="${model}"
fi

# 5時間レート制限
five_pct=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')

# 7日レート制限
week_pct=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

# コンテキスト使用率
ctx_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')

# カレントディレクトリ名
folder=$(echo "$input" | jq -r '.workspace.current_dir // .cwd // ""' | xargs basename 2>/dev/null)

# 出力を組み立て
output="$model_display"

RESET='\033[0m'

if [ -n "$five_pct" ]; then
  five_int=$(printf "%.0f" "$five_pct")
  five_bar=$(make_bar "$five_int")
  five_color=$(color_for_pct "$five_int")
  output="${output} | 5h ${five_color}${five_bar} ${five_int}%${RESET}"
fi

if [ -n "$week_pct" ]; then
  week_int=$(printf "%.0f" "$week_pct")
  week_bar=$(make_bar "$week_int")
  week_color=$(color_for_pct "$week_int")
  output="${output} | 7d ${week_color}${week_bar} ${week_int}%${RESET}"
fi

if [ -n "$ctx_pct" ]; then
  ctx_int=$(printf "%.0f" "$ctx_pct")
  ctx_bar=$(make_bar "$ctx_int")
  ctx_color=$(color_for_pct "$ctx_int")
  output="${output} | ctx ${ctx_color}${ctx_bar} ${ctx_int}%${RESET}"
fi

if [ -n "$folder" ]; then
  output="${output} | $folder"
fi

printf "%b" "$output"

スクリプトを保存したら実行権限を付与します。

chmod +x ~/.claude/statusline-command.sh

2. settings.json に設定を追記する

~/.claude/settings.json を開いて、以下を追加します。

{
  "statusLine": {
    "type": "command",
    "command": "bash /Users/あなたのユーザー名/.claude/statusline-command.sh"
  }
}

type: "command"command の2フィールドが必要です。パスはフルパスで書く必要があります。~/ の展開がうまくいかないことがあるため、ユーザー名を直接書いておくのが確実です。

設定後、Claude Codeを再起動すると反映されます。

注意: セッション開始直後はレート制限が表示されないことがあります。
rate_limits のデータは最初のAPIレスポンスが返って初めて取得できる仕様です。セッション開始後1〜2ターンは5h・7dのバーが表示されず、空欄になることがあります。「動いていないのかな?」と思ったらまずひと言話しかけてみてください。

ハマったポイント

2つの落とし穴

エフォートレベルはJSONに含まれない

ステータスラインのスクリプトには、Claude CodeがJSON形式でコンテキスト情報を渡してきます。最初、エフォートレベルもこのJSONに含まれていると思っていたのですが、実際には入っていませんでした。

公式ドキュメントにも記載がなく、少し調べた結果、~/.claude/settings.jsoneffortLevel フィールドを直接読みに行くことで取得できました。

effort=$(jq -r '.effortLevel // empty' ~/.claude/settings.json 2>/dev/null)

スクリプトに渡ってくるJSONで取得できる主なフィールドは以下の通りです。

フィールド 内容
model.display_name モデルの表示名
model.id モデルID(display_nameがない場合のフォールバック)
rate_limits.five_hour.used_percentage 5時間レート制限の使用率(%)
rate_limits.seven_day.used_percentage 7日間レート制限の使用率(%)
context_window.used_percentage コンテキストウィンドウの使用率(%)
workspace.current_dir 現在の作業ディレクトリのフルパス

printf "%b" を使う理由

スクリプト末尾の出力部分で printf "%b" を使っています。

%s を使うと、ANSIエスケープシーケンス(\033[32m など)が文字列リテラルのまま出力されてしまい、色が付かずコードがそのまま表示されてしまいます。%b はバックスラッシュエスケープを解釈するので、ターミナルが色として認識してくれます。echo -e でも同じ結果になりますが、shの移植性を考えると printf "%b" の方が安全です。

トラブルシュート

トラブルシューティング

表示がうまくいかないときのチェックリストです。

  • 何も表示されない → スクリプトに実行権限が付いているか確認(chmod +x ~/.claude/statusline-command.sh
  • settings.json が読まれていないcommand のパスがフルパスになっているか確認(~/ ではなく /Users/ユーザー名/... と書く)
  • 設定を変えたのに反映されない → Claude Codeを完全に再起動する
  • 色が出ない・文字化けする → ターミナルが256色・ANSIカラーに対応しているか確認(iTerm2やWezTermなら問題ないはず)
  • 5h・7dだけ表示されない → セッション開始直後の可能性あり。1〜2ターン会話してから確認する

使ってみた感想

新しい習慣

一番変わったのは「コンテキストの管理意識」です。

以前は会話が詰まっているかどうか意識しないまま作業を続けて、気づいたら応答が鈍くなっていた、ということが何度かありました。常時表示されることで、「ctx が60%超えてきたな、そろそろ区切りのいいところで /clear しよう」という判断が自然にできるようになりました。

レート制限の残量も同様で、「5h の使用率が高いから、ここは Sonnet に切り替えておこう」という判断がすぐできます。

カスタマイズのヒント

このスクリプトはそのままでも使えますが、いじれる箇所はたくさんあります。

  • 色の閾値を変える — 30%・70%の境界を自分のペース感に合わせて調整できます
  • バー文字を変える█░ の代わりに ▰▱●○ など好みの記号にできます
  • 表示する情報を追加する — gitブランチ名・現在時刻・バッテリー残量なども同じ仕組みで追加できます

「この部分こう変えたい」とClaude Codeに伝えれば、スクリプトの修正から反映まで一緒にやってくれます。

参考

コメント

コメントする

CAPTCHA


目次