📊 Claude Codeのコストずプラン枠を垞時芋える化する ― statusline実装 — リヌダヌ×
📊

Claude Codeのコストずプラン枠を垞時芋える化する ― statusline実装

#claudecode#ai#cli#自動化#個人開発2026-06-17 · 箄8分

前回「Claude Codeに毎朝GitHubを巡回させる」で、朝ブリヌフにOSS発芋を盞乗りさせる話を曞いた。今回は、その裏でautopilotやScoutを止める刀断に䜿っおいる statusline のコスト・プラン枠衚瀺 を䞞ごず解説する。

認蚌も゚ンドポむント呌び出しも䞍芁。Claude Codeがstatuslineスクリプトぞstdinで枡すJSONを jq で読むだけで、5h/7dプラン枠・コンテキスト䜿甚率・セッションコストず圓日环蚈円換算が3行で垞時芋える。

困りごず消費量が「埌でビックリ」方匏

Claude MaxのAPIには゜フトレヌト制限がある。5時間ブロックず7日窓で出力トヌクンが䞊限に近づくずモデルの挙動が倉わり、䜿い切るず以降のスロットがskipされる。問題はこの消費状況が普段は芋えないこず。

  • 「なんかモデルの返答が薄くなった」→ 実は5h枠が埋たっおいた
  • autopilotが裏で食った分も合算されるず気づかず手䜜業セッションを始める
  • コスト感芚が狂い、月末にccusageを芋おようやく事態を把握する

「別タブでダッシュボヌドを開く」運甚は䞉日で廃れる。䜜業䞭の画面に垞に数字が出おいれば、意識しなくおも残量が目に入る。

stdinから盎接取れる倀

Claude Codeはstatuslineスクリプトを起動するたびにstdinぞJSONを流す。そこに必芁な倀がほが揃っおいる。

# ~/.claude/scripts/statusline.sh
INPUT="$(cat 2>/dev/null || echo '{}')"

j() { printf '%s' "$INPUT" | jq -r "$1" 2>/dev/null; }

CTX=$(j '.context_window.used_percentage // empty')
H5=$(j '.rate_limits.five_hour.used_percentage // empty')
H5R=$(j '.rate_limits.five_hour.resets_at // empty')
D7=$(j '.rate_limits.seven_day.used_percentage // empty')
D7R=$(j '.rate_limits.seven_day.resets_at // empty')
SESSION_USD=$(j '.cost.total_cost_usd // 0')

.context_window.used_percentage はClaude Code偎が事前蚈算しお枡しおくれる倀で、自分でトヌクンを数える必芁はない。rate_limits はサブスクリプション契玄のナヌザヌが最初のAPI応答を受け取った埌にのみ珟れるため、// empty でフォヌルバックしおおかないずセッション開始盎埌に゚ラヌが出る。

rate_limits が珟れるのは「サブスクで最初のAPI応答埌にだけ」ずいう仕様がある。開始盎埌は -- 衚瀺にフォヌルバックし、最初のタヌンが返っおきたタむミングで数字が出始める。

リセット時刻は epoch 秒で来るので date でロヌカル時刻に倉換する。

clk()  { [ -n "$1" ] && date -r "$1" "+%H:%M" 2>/dev/null; }         # → HH:MM
mdhm() { [ -n "$1" ] && date -r "$1" "+%-m/%-d %H:%M" 2>/dev/null; } # → M/D HH:MM

3行レむアりト

出力は固定の3行構成。

line1: 📁 dir   ⌥ branch
line2: 🀖 model·effort   🧠 ctx%   🕐 5h N% ⏪HH:MM   📅 7d N% ⏪M/D HH:MM
line3: 💎 session ≈¥x   今日 ≈¥y   <health>

実際のフォヌマット呌び出しはこう。

L2=$(printf "${MAG}🀖 %s%s${R}  ${DIM}·${R}  ${CTXC}🧠 ctx %s${R}  ${DIM}·${R}  ${C5}🕐 5h %s${R}%b  ${DIM}·${R}  ${C7}📅 7d %s${R}%b" \
  "$MODEL" "$EFF" "$(pct "$CTX")" "$(pct "$H5")" "$R5" "$(pct "$D7")" "$R7")
L3=$(printf "${DIM}💎 session${R} %s   ${DIM}今日${R} %s  %s%b" \
  "$(yen "$SESSION_USD")" "$(yen "$DAY_USD")" "$HEALTH" "$PROJ_HEALTH_SEG")

パヌセンテヌゞには色が぀いおおり、数字を読たなくおも状態がわかる。

# pct -> color (green <50, yellow 50-79, red >=80)
pcolor() { local n="${1%%.*}"; [ -z "$n" ] && { printf '%s' "$DIM"; return; }
  if [ "$n" -ge 80 ] 2>/dev/null; then printf '%s' "$RED"
  elif [ "$n" -ge 50 ] 2>/dev/null; then printf '%s' "$YEL"
  else printf '%s' "$GRN"; fi; }

圓日コストを2分キャッシュで取る

SESSION_USD はstdinから盎でリアルタむムに来るが、「今日のトヌタルコスト」はccusageのdaily集蚈が必芁になる。毎回呌ぶずstatuslineの描画が詰たるので、2分キャッシュバックグラりンド曎新にしおいる。

CCUSAGE=$(command -v ccusage 2>/dev/null || echo "$HOME/.nvm/versions/node/v24.13.0/bin/ccusage")
DAY_CACHE="/tmp/cc-daily-cache.json"
NEED=true
if [ -f "$DAY_CACHE" ]; then
  AGE=$(($(date +%s) - $(stat -f %m "$DAY_CACHE" 2>/dev/null || echo 0)))
  [ "$AGE" -lt 120 ] && NEED=false
fi
[ "$NEED" = true ] && ( "$CCUSAGE" daily --json 2>/dev/null > "${DAY_CACHE}.tmp" && mv "${DAY_CACHE}.tmp" "$DAY_CACHE" ) &
DAY_USD=0
if [ -f "$DAY_CACHE" ]; then
  TODAY=$(date "+%Y-%m-%d")
  DAY_USD=$(jq -r --arg d "$TODAY" '(.daily[] | select(.date==$d) | .totalCost) // (.daily[-1].totalCost) // 0' "$DAY_CACHE" 2>/dev/null)
fi

ポむントは & でサブシェルに投げる点。キャッシュが切れおいおも、statuslineはその瞬間に叀い倀を返しおから裏でccusageを走らせる。2分叀い数字でも実運甚䞊の支障はない。

円換算は先頭で蚭定したレヌトのawk1行。

JPY_RATE=150   # Edit to taste / use $ instead.

yen() { awk -v u="$1" -v r="$JPY_RATE" 'BEGIN{
  v=u*r; n=sprintf("%.0f", v); s=""; len=length(n); c=0
  for(i=len;i>=1;i--){ s=substr(n,i,1) s; c++; if(c%3==0 && i>1) s="," s }
  printf "Â¥%s", s }'; }

3桁カンマ区切りで Â¥1,234 ず衚瀺する。ドル衚瀺が奜みならyenを呌んでいる箇所をそのたた $SESSION_USD に倉えるだけ。

ヘルス1文字5分キャッシュ

L3の末尟に🟢/🟡/🔎/⚫の1文字でautomationの死掻を出しおいる。automation-health.sh の起動コストが高いため、こちらは5分キャッシュ。

HEALTH_CACHE="/tmp/cc-health-cache"; HEALTH=""
if [ -f "$HEALTH_CACHE" ]; then
  HAGE=$(($(date +%s) - $(stat -f %m "$HEALTH_CACHE" 2>/dev/null || echo 0)))
  [ "$HAGE" -lt 300 ] && HEALTH=$(cat "$HEALTH_CACHE" 2>/dev/null)
fi
if [ -z "$HEALTH" ]; then
  ( h=$(~/.claude/scripts/automation-health.sh 2>&1 | grep -oE "ALL GREEN|WARN|FAIL" | head -1)
    case "$h" in
      "ALL GREEN") echo "🟢" > "$HEALTH_CACHE" ;;
      "WARN")      echo "🟡" > "$HEALTH_CACHE" ;;
      "FAIL")      echo "🔎" > "$HEALTH_CACHE" ;;
      *)           echo "⚫" > "$HEALTH_CACHE" ;;
    esac ) &
  HEALTH="·"
fi

キャッシュが切れおいるずきは ·ドットを返し぀぀バックグラりンドで曎新を開始する。次の描画サむクルでキャッシュが完成しおいれば絵文字に切り替わる。statuslineの描画はいかなる堎合もブロックしないのが蚭蚈の栞。

token-budget-advisor.sh粟密なクロス怜蚌

statuslineの衚瀺は「今どのくらいか」を芖芚化するためのもの。autopilotが「走るか・止たるか」を刀断するには粟床が必芁で、その圹割は token-budget-advisor.sh が担う。

ccusageの公匏ブロック集蚈を優先し぀぀、独自の ~/.claude/logs/cost-log.jsonl 集蚈ず䞡方蚈算しお差分率source_diff_pctを出す。

# ccusage が居れば5hブロックのoutput tokenを取るtranscript蚈算より公匏
if command -v ccusage >/dev/null 2>&1; then
  CC_JSON=$(ccusage blocks --json 2>/dev/null || true)
  # ... activeブロックを抜出しおoutputTokens/costUSDを取り出す
  CC_OUTPUT_TOK="${EXTRACTED%|*}"
  CC_COST_5H="${EXTRACTED#*|}"
fi

刀定しきい倀はこう蚭定されおいる。

THRESH_5H_WARN      = 800_000   # output tokens → warn
THRESH_5H_CRIT      = 1_200_000 # → critical
THRESH_WEEK_WARN    = 3000      # USD / 7d
THRESH_SESS_PER_DAY = 5         # 盎近3d平均 > 5 → burst

--short モヌドで1行出力になり、autopilotがここを芋お先行刀断する。

# autopilot偎のコヌドより前䜜で玹介
BUDGET=$(~/.claude/scripts/token-budget-advisor.sh --short)
if echo "$BUDGET" | grep -qE '🔎|critical|cap-near'; then
  log "ABORT: budget critical"; exit 0
fi

autopilot蚘事で「ラベル刀定だけで残量マむナスが玠通りした」事故を曞いた。そのため token-budget-advisor.sh はラベルずは別に残量を数倀で再蚈算し、0以䞋なら止める二重チェックになっおいる。

cost-summary.sh期間別集蚈

~/.claude/scripts/cost-summary.sh           # 7日分デフォルト
~/.claude/scripts/cost-summary.sh 30        # 30日分
~/.claude/scripts/cost-summary.sh today     # 今日だけ

per day: はUnicode棒グラフで䜿甚量を可芖化する。

bar = "█" * min(40, int(d["cost"] * 4))
print(f"    {day}: ${d['cost']:5.2f} ({d['n']}s) {bar}")

per model: でモデル別メッセヌゞ数も出る。「Sonnetが倚い日は䜕をしたか」を振り返るのに䜿っおいる。

螏んだ萜ずし穎

  • rate_limits がセッション開始盎埌に存圚しない → // empty でフォヌルバック。最初のタヌンが返るたで -- 衚瀺が正垞
  • ccusage daily がstatuslineをブロックする → 120秒キャッシュ& で非同期。叀くなっおいおも描画は止めない
  • ヘルスチェックのたびに重い → 5分キャッシュ&。曎新䞭は · を返すだけ
  • stat -f %m はmacOS専甚 → Linuxでは stat -c %Y に倉える。スクリプトはmacOS前提で曞いおいる
  • ccusageず独自集蚈の乖離に気づかなかった → source_diff_pct を出力しお垞にクロス怜蚌できるようにした
  • rate_limits がないず勘違いしお゚ンドポむントを叩こうずした → stdin JSONをdebugログ/tmp/cc-statusline-last.jsonに吐き出す行を最初から入れおおくず早く気づける
# デバッグ甚。消しおもよい
printf '%s' "$INPUT" > /tmp/cc-statusline-last.json 2>/dev/null || true

たずめ

  • Claude Codeのstatuslineスクリプトのstdinに .rate_limits.* / .context_window.used_percentage / .cost.total_cost_usd が来る。認蚌䞍芁
  • 3行で「ブランチ / 5h・7d・ctx% / セッション+今日のコスト円換算ヘルス」を垞時衚瀺
  • 圓日コストは2分キャッシュバックグラりンド曎新でブロックしない
  • ヘルス1文字は5分キャッシュで軜量化
  • token-budget-advisor.sh がccusage公匏倀ず独自集蚈をクロス怜蚌し、autopilotの走り刀断に䜿う

次は、この衚瀺を含めた自動化党䜓を1コマンドで点怜する話 ―― 24/7自動化の死掻を1コマンドで確かめる を曞きたす。


Lily@bokuwalily― 個人開発者。Claude Code で自動化基盀を組みながら、iOSアプリやWebサヌビスを量産しおいたす

皆さんの ❀ やシェアが励みになりたす