📊「返答が薄い」の正䜓は5h枠。ダッシュボヌドを3日で捚お、残量を3行で垞時衚瀺した

bokuwalily
bokuwalily

@bokuwalily ・ 106本

サムネむル

前䜜のautopilot蚘事で暎走察策を曞いたずき、「プラン枠をstatuslineに出す」郚分は䞀段萜で流しおしたいたした。今回はその䞭身を党郚出したす。

仕組みは拍子抜けするくらい単玔です。認蚌も゚ンドポむント呌び出しもいりたせん。Claude Codeがstatuslineスクリプトぞstdinで枡しおくるJSONを、jqで読むだけです。それで5h/7dのプラン枠、コンテキスト䜿甚率、セッションコストず圓日环蚈円換算が、3行でずっず画面に出おいたす。非゚ンゞニアの僕でも「倀を抜いお䞊べる」だけで組めたした。

「返答が薄い」の正䜓は5h枠だった

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

僕が実際に螏んだのは次の3぀です。

  • 「なんか返答が薄くなった」ず銖をひねりながら䜜業を続けおいたら、5h枠が埋たっおいた
  • autopilotが裏で䜿った分も合算されるのを忘れお、手䜜業のセッションを始めおしたう
  • コスト感芚がずれたたた月末にccusageを開き、そこで初めお䜿いすぎを知る

3぀ずも、数字さえ芋えおいれば起きなかったこずです。最初は別タブでダッシュボヌドを開く運甚にしたのですが、3日で開かなくなりたした笑。䜜業しおいる画面そのものに数字があれば、芋ようずしなくおも目に入りたす。それでstatuslineに眮くこずにしたした。

💬 集客・導線蚭蚈ず、AI導入・自動化のご盞談はこちら

stdinのJSONに、欲しい倀がほが党郚入っおいた

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 でフォヌルバックしおおかないず、セッション開始盎埌に゚ラヌになりたす。開始盎埌は -- 衚瀺で、最初のタヌンが返っおきたら数字が出始めたす。これで正垞です。

リセット時刻は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>

パヌセンテヌゞには色を぀けおいたす。数字を読たなくおも、緑・黄・赀で状態がわかりたす。

# 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分前の数字でも、実際に䜿っおいお困った堎面はありたせんでした。

円換算は、先頭で決めたレヌトを䜿っおawkで蚈算したす。

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 }'; }

Â¥1,234 のように3桁カンマで出たす。ドル衚瀺が奜みなら、yen を呌んでいる箇所を $SESSION_USD に眮き換えるだけです。

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

3行目の末尟には、🟢/🟡/🔎/⚫の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の描画は、どんな堎合も止めない。2分ず5分、2぀のキャッシュはどちらもこの1点のために入れおいたす。

走るか止たるかは、別スクリプトで粟床を䞊げる

token-budget-advisor.shで2぀の集蚈を突き合わせる

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の棒グラフで出たす。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に芋圓たらなかったので「これは枡されないんだ」ず決め぀け、゚ンドポむントを叩く方向で考え始めおいたした。実際は、開始盎埌に珟れないだけでした stdinのJSONをファむルに吐いお䞀床䞭身を芋おいれば、すぐ気づけた話です。なので今は、この1行を最初から入れおいたす。

# デバッグ甚。消しおもよい
printf '%s' "$INPUT" > /tmp/cc-statusline-last.json 2>/dev/null || true

たずめ

  • 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の走る・止たるを決める

ダッシュボヌドは3日で開かなくなりたしたが、statuslineは毎日目に入っおいたす。「返答が薄い」ず銖をひねる前に、たず画面の䞋の数字を芋る。それだけで迷う時間がなくなりたした。

📕 この蚘事の内容を、実装たで党郚たずめた有料蚘事がありたす 手順・コヌド・テンプレをそのたた枡しおいたす AIで「寝おおも回る仕組み」をれロから30日で組む党手順