Claude Codeのstatus lineは表示専用に見えるが、JSONを受け取ってローカルで実行される。ただ表示するだけではもったいない。必要な値を小さなファイルへ書いておけば、シェルや別のCLIからも同じ状態を読める。
ここでは5時間・7日間のrate limitを例にする。Claude Codeはstatus lineの標準入力へrate_limits.five_hourとrate_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を扱えばよい。