概要
Claude Code v2.1.80 で statusline スクリプトに渡される JSON に新しいフィールドが追加された。これを機にステータスラインの表示を見直して、コスト表示の正確性向上とレート制限情報の追加を行った。
v2.1.80 で追加された主なフィールド
rate_limits(claude.ai Pro/Max のみ)
rate_limits.five_hour.used_percentage— 5時間ローリングウィンドウの使用率 (0-100)rate_limits.five_hour.resets_at— リセット時刻(Unix epoch)rate_limits.seven_day.used_percentage— 7日ウィンドウの使用率rate_limits.seven_day.resets_at— リセット時刻
cost(正確なコスト情報)
cost.total_cost_usd— セッションの実コスト(USD、キャッシュ割引反映済み)cost.total_duration_ms— セッション経過時間cost.total_api_duration_ms— API待ち時間cost.total_lines_added/total_lines_removed— 追加/削除行数
その他
workspace.project_dir/workspace.current_dirsession_id,transcript_path,versionoutput_style.nameworktree.*(worktree 使用時)
ステータスラインのアップデート
Before
Opus 4.6 ctx [#####---------------] 25% cost $0.5400
コストは input/output トークン数から Opus 4 の料金($15/M input, $75/M output)で自前計算していた。キャッシュ割引は考慮されず、概算値だった。レート制限情報は表示なし。
#!/usr/bin/env bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
total_input=$(echo "$input" | jq -r '.context_window.total_input_tokens // 0')
total_output=$(echo "$input" | jq -r '.context_window.total_output_tokens // 0')
# Build progress bar (20 chars wide)
if [ -n "$used_pct" ]; then
filled=$(echo "$used_pct" | awk '{printf "%d", ($1 * 20 / 100) + 0.5}')
empty=$((20 - filled))
bar=""
for i in $(seq 1 $filled); do bar="${bar}#"; done
for i in $(seq 1 $empty); do bar="${bar}-"; done
context_str="[${bar}] ${used_pct}%"
else
context_str="[--------------------] --%"
fi
# Estimate cost using Claude Opus 4 pricing
cost=$(awk -v i="$total_input" -v o="$total_output" 'BEGIN {
cost = (i / 1000000 * 15) + (o / 1000000 * 75)
printf "$%.4f", cost
}')
printf "%s ctx %s cost %s" "$model" "$context_str" "$cost"
After
Opus 4.6 ctx [#####---------------] 25% cost $0.5400 5h: 12% 7d: 3%
変更点:
- コスト: トークンからの自前計算 →
cost.total_cost_usdに変更。キャッシュ割引も反映された正確な値になった - レート制限:
rate_limitsから 5時間 / 7日の使用率を末尾に追加。Pro/Max 以外の環境ではフィールドが存在しないため自動的に非表示になる
#!/usr/bin/env bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
# Build progress bar (20 chars wide)
if [ -n "$used_pct" ]; then
filled=$(echo "$used_pct" | awk '{printf "%d", ($1 * 20 / 100) + 0.5}')
empty=$((20 - filled))
bar=""
for i in $(seq 1 $filled); do bar="${bar}#"; done
for i in $(seq 1 $empty); do bar="${bar}-"; done
context_str="[${bar}] ${used_pct}%"
else
context_str="[--------------------] --%"
fi
# Format cost
cost_str=$(awk -v c="$cost" 'BEGIN { printf "$%.4f", c }')
# Rate limits (claude.ai Pro/Max only)
rate_str=""
five_h=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
seven_d=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
if [ -n "$five_h" ] && [ -n "$seven_d" ]; then
rate_str=$(printf " 5h: %s%% 7d: %s%%" "$five_h" "$seven_d")
fi
printf "%s ctx %s cost %s%s" "$model" "$context_str" "$cost_str" "$rate_str"