·tips

Claude Code の statusline を使って外部から rate limit を確認する

status lineに渡されるrate limit情報をファイルへ保存し、別プロセスから読む

2 min read
Writing style

Claude Codeのstatus lineは表示専用に見えるが、JSONを受け取ってローカルで実行される。ただ表示するだけではもったいない。必要な値を小さなファイルへ書いておけば、シェルや別のCLIからも同じ状態を読める。

ここでは5時間・7日間のrate limitを例にする。Claude Codeはstatus lineの標準入力へrate_limits.five_hourrate_limits.seven_dayを渡す。これはClaude Codeが表示のために渡す正規の入力であり、非公式APIを呼ぶ必要はない。

status lineで最新値を保存する

既存のstatus lineスクリプトに、次を足す。

config_dir="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"

if jq -e '.rate_limits.five_hour? or .rate_limits.seven_day?' >/dev/null <<<"$input"; then
  umask 077
  tmp=$(mktemp "$config_dir/.rate-limit.json.XXXXXX")
  jq -c --arg observed_at "$(date -u +%Y-%m-%dT%H:%M:%SZ)" '{
    observed_at: $observed_at,
    five_hour: .rate_limits.five_hour?,
    seven_day: .rate_limits.seven_day?
  }' <<<"$input" >"$tmp"
  mv "$tmp" "$config_dir/rate-limit.json"
fi

$inputはstatus lineの先頭でinput=$(cat)として受け取ったJSON。mvで置き換えるので、読む側が途中まで書かれたJSONを読むことはない。ファイルには取得時刻、消費率、リセット時刻だけを残す。

読む側はただのjqでよい。

jq '{observed_at, five_hour, seven_day}' ~/.claude/rate-limit.json

status lineはセッション開始時と、アシスタントの応答後などに再実行される。これはポーリングではなく、Claude Codeがすでに持っている最新値をローカルへ写すだけの仕組みだ。

複数アカウントでは保存先も分ける

CLAUDE_CONFIG_DIRはClaude Codeの設定・セッション履歴・プラグインの保存先を切り替える。アカウントごとに設定ディレクトリを分けて起動すれば、status lineが書くrate-limit.jsonも自然に分かれる。

CLAUDE_CONFIG_DIR="$HOME/.claude-work" claude
CLAUDE_CONFIG_DIR="$HOME/.claude-personal" claude

このとき保存先はそれぞれ~/.claude-work/rate-limit.json~/.claude-personal/rate-limit.jsonになる。後から各ファイルを読めば、複数アカウントのrate limitを一か所で表示できる。キャッシュファイルだけはsymlinkで共有しない。

rate limit以外でも、status lineに渡されるコンテキスト使用率、セッション情報、コストなどに同じやり方を使える。UIにある値を、必要なプロセスへ渡すための小さな出口としてstatus lineを扱えばよい。

ref