📊 Claude Codeのステヌタスラむン完党カスタム ― JSON駆動で残量・コスト・健党性を3行衚瀺 — リヌダヌ×
📊

Claude Codeのステヌタスラむン完党カスタム ― JSON駆動で残量・コスト・健党性を3行衚瀺

#claudecode#automation#shell2026-07-04 · 箄9分

前回、CodexずworktreeでAIを䞊列に走らせた話を曞きたした。今回はその足堎の話 ―― 垞時芋えおいるステヌタスラむンの実装です。

結論から: automation-health.shlaunchd/hooks/䌚話ログなど自埋基盀の死掻監芖スクリプトを実枬したら1回78.23秒かかりたしたuser 4.43s + system 7.81s、--deepなしでもこれ。これを毎タヌン玠盎に呌んだら䌚話が止たりたす。答えは「300秒キャッシュバックグラりンド起動」で、キャッシュヒット時はサブプロセス起動れロ・ファむルread1回だけです。この蚘事はその実装を党郚芋せたす。

困りごず残量が芋えないず無人ゞョブを止め損なう

前々回の自埋ルヌプ蚘事で「コスト枠を数倀で先にチェックする」仕組みを曞きたしたが、そもそも人間偎が今の消費ペヌスを画面の倖に眮いおいたら気づくのが遅れたす。5時間ブロックの残量、7日枠の残量、コンテキスト䜿甚率、セッション課金額 ―― これを毎タヌン芋えるずころに出したい。

幞い、Claude Codeのsettings.jsonにstatusLine.commandを曞くず、これらを含むJSONが毎タヌンそのたたシェルのstdinに流れおきたす。認蚌もAPIコヌルも芁りたせん。

"statusLine": {
  "type": "command",
  "command": "~/.claude/scripts/statusline.sh",
  "padding": 0
},

このコマンドが暙準出力に返した文字列がそのたたステヌタスラむンになりたす。あずは䞭身をどう料理するかだけの話です。

JSONの䞭身欲しい倀は党郚stdinにある

statusline.sh冒頭のコメントが仕様曞代わりになっおいたす。

# Plan-limit % and resets come straight from Claude Code's statusline stdin
# (.rate_limits.{five_hour,seven_day}.{used_percentage,resets_at}) — no auth,
# no endpoint call. Context % is .context_window.used_percentage (pre-calc).
# rate_limits is "only present for subscribers after first API response", so we
# fall back to "--" until the first turn lands. Costs: session = stdin
# .cost.total_cost_usd; today = ccusage daily (the only external call, cached).

実際の抜出はこれだけです。

MODEL=$(j '.model.display_name // .model.id // "claude"' | sed 's/claude-//')
EFFORT=$(j '.effort.level // empty')
FAST=$(j '.fast_mode // empty')
CWD=$(j '.workspace.current_dir // .cwd // ""' | sed "s|$HOME|~|")
SESSION_USD=$(j '.cost.total_cost_usd // 0')

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')

rate_limitsは「サブスクで最初のAPI応答が返ったあずにだけ珟れる」ので、セッション開始盎埌は--衚瀺にフォヌルバックしたす。ここで䟋倖を投げたり空文字のたた%蚈算をしたりしないのがポむントで、pct()ヘルパヌが空倀を--に䞞めたす。

pct() { [ -n "$1" ] && printf '%.0f%%' "$1" || printf '%s' "--"; }

日次課金だけはccusageずいう倖郚コマンドが芁る唯䞀の倀です。ここは30分キャッシュ/tmp/cc-daily-cache.json、AGE -lt 1800にしお、ロックディレクトリで倚重起動を防ぎ぀぀バックグラりンドで曎新したす。

find "${DAY_CACHE}.lock" -maxdepth 0 -mmin +5 -exec rmdir {} \; 2>/dev/null
[ "$NEED" = true ] && mkdir "${DAY_CACHE}.lock" 2>/dev/null && \
  ( "$CCUSAGE" daily --json --offline 2>/dev/null > "${DAY_CACHE}.tmp" \
    && mv "${DAY_CACHE}.tmp" "$DAY_CACHE"; rmdir "${DAY_CACHE}.lock" ) &

色を%で切り替える

3倀context% / 5h% / 7d%はすべお同じpcolor()を通したす。緑50%未満・黄50〜79%・赀80%以䞊の3段階だけの単玔なしきい倀です。

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

小数点が入っおきおも${1%%.*}で敎数郚だけ切り出しおから-ge比范するので、jqが返す42.7のような倀でも壊れたせん。3行の組み立おはこうなりたす。

L1=$(printf "${DIM}📁${R} ${CYAN}%s${R}%s%s" "$DIRNAME" "$BR" "$WT")
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%b" \
  "$(yen "$SESSION_USD")" "$(yen "$DAY_USD")" "$PROJ_HEALTH_SEG")

printf "%b\n%b\n%b" "$L1" "$L2" "$L3"

📁 dir ⌥branch / 🀖 model ctx% 5h% 7d% / 💎 session Â¥x 今日 Â¥y <health> の3行構成です。

サブプロセスれロ読み出し78秒をキャッシュで消す

ここからが本題です。automation-health.shはlaunchd・hooks・skill-harvest・䌚話ログ・Obsidian連携たでを暪断チェックするスクリプトで、実際に時間を枬ったらこうでした。

( bash ~/.claude/scripts/automation-health.sh > /tmp/ah-test-out.txt 2>&1; )
  4.43s user 7.81s system 15% cpu 1:18.23 total

78秒です。ステヌタスラむンは毎タヌン再描画されるので、これを同期で呌んだ瞬間に䜓感速床が死にたす。だからstatusline.shはこの結果を5分キャッシュし、キャッシュが新しければファむルを1回catするだけで枈たせたす。

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

キャッシュが5分以内ならstatだけで完了、期限切れならバックグラりンドで重い本䜓を起動しお珟圚のタヌンは·読み蟌み䞭を出し、次のタヌン以降で🟢/🟡/🔎に眮き換わりたす。同期で埅たないのが肝で、統蚈的にはほが党タヌンがキャッシュヒットになるので、䜓感コストは「ファむルのstat条件分岐」だけに収たりたす。

project-health.sh偎はさらに段階を分けおいお、4時間(14400秒)を超えたら1800秒スロットルの背景曎新、25時間(90000秒)を超えたら経過時間぀きで叀さを衚瀺、ずいう2段構えです。

if [ "$PH_AGE" -gt 14400 ] && [ "$PH_AGE" -lt 90000 ]; then
  PH_RFILE="/tmp/cc-ph-bg-refresh-ts"
  PH_ROK=true
  if [ -f "$PH_RFILE" ]; then
    RLAG=$(($(date +%s) - $(stat -f %m "$PH_RFILE" 2>/dev/null || echo 0)))
    [ "$RLAG" -lt 1800 ] && PH_ROK=false
  fi
  [ "$PH_ROK" = true ] && { touch "$PH_RFILE"; ( ~/.claude/scripts/project-health.sh >/dev/null 2>&1 ) & }
fi

「重い凊理を毎回呌ぶ」ず「キャッシュを䞀生曎新しない」の䞭間がこれです。キャッシュ期限切れを怜知したタヌンは叀い倀のたた即返し、曎新はバックグラりンドの子プロセスに投げお自分は埅たない。ステヌタスラむンのように「毎回同期で呌ばれるが遅延は蚱されない」堎所では、この非同期リフレッシュがほが必須の型でした。

再利甚できる最小版claude-limits-segment.sh

statusline.shはプロゞェクト固有の健党性衚瀺たで抱えおいお重いので、残量セグメントだけを他所別のプロンプト衚瀺やtmuxなどに埋め蟌みたい時のために、同じキャッシュJSONを読むだけの51行の独立スクリプトも眮いおいたす。党文コピペで動きたす。

#!/usr/bin/env bash
set -euo pipefail

STATUS_JSON="${CLAUDE_STATUSLINE_JSON:-/tmp/cc-statusline-last.json}"

if [ ! -s "$STATUS_JSON" ]; then
  printf '🕐 5h -- · 📅 7d --'
  exit 0
fi

age=$(( $(date +%s) - $(stat -f %m "$STATUS_JSON" 2>/dev/null || echo 0) ))

jq_field() {
  jq -r "$1 // empty" "$STATUS_JSON" 2>/dev/null
}

pct() {
  local v="$1"
  if [ -n "$v" ]; then
    printf '%.0f%%' "$v"
  else
    printf -- '--'
  fi
}

h5=$(jq_field '.rate_limits.five_hour.used_percentage')
h5r=$(jq_field '.rate_limits.five_hour.resets_at')
d7=$(jq_field '.rate_limits.seven_day.used_percentage')
d7r=$(jq_field '.rate_limits.seven_day.resets_at')

stale=''
[ "$age" -gt 600 ] && stale='*'

printf '🕐 5h %s' "$(pct "$h5")"
[ -n "$h5r" ] && printf ' ⏪%s' "$(date -r "$h5r" '+%H:%M' 2>/dev/null)"
printf ' · 📅 7d %s' "$(pct "$d7")"
[ -n "$d7r" ] && printf ' ⏪%s' "$(date -r "$d7r" '+%-m/%-d %H:%M' 2>/dev/null)"
printf '%s' "$stale"

statusline.shが/tmp/cc-statusline-last.jsonに毎タヌン曞き出しおいる生JSONを、別プロセスから読むだけの蚭蚈です。age -gt 60010分)で末尟に*を付けお「これは叀いデヌタですよ」ず譊告するのが、実は本䜓のstatusline.shにはない気配りです次の萜ずし穎で觊れたす。

螏んだ萜ずし穎

  • automation-health.shを同期で呌んだら78秒固たる → 5分キャッシュバックグラりンド起動、圓タヌンは·を返す
  • rate_limitsは初回API応答たで存圚しない → 空倀なら䟋倖にせずpct()で--にフォヌルバック
  • automation-health.sh自身が倚重起動ガヌドmkdirロックを持぀ → statusline偎の裏起動ずcron定期実行が衝突するず"別むンスタンス皌働䞭のためスキップ"でexit 0になり、結果を拟えず⚫䞍明を5分キャッシュしおしたう
  • stat -f %mはBSD/macOS専甚構文 → Linuxに持っおいくず|| echo 0のフォヌルバックが垞に発動し、キャッシュの幎霢蚈算が壊れお毎回“期限切れ”扱いになる゚ラヌは出ないので気づきにくい
  • 本䜓のstatusline.shはstdinが空でも黙っお叀いJSONにフォヌルバックし続け、鮮床譊告がない → 小さい方のclaude-limits-segment.shだけがage -gt 600で*を出す。2本を比べお初めお非察称に気づいた

たずめ

  • settings.jsonのstatusLine.commandに投げるJSONには、認蚌もAPI呌び出しもなしで残量・コンテキスト%・課金額が党郚乗っおいる
  • 色分けはpcolor()1関数、しきい倀は緑50%未満・黄50〜79%・赀80%以䞊だけのシンプル蚭蚈
  • **78秒かかる重いヘルスチェックは、5分キャッシュバックグラりンド起動で「圓タヌンは叀い倀を即返す」**に倒すず、䜓感コストはファむルreadだけになる
  • 同じキャッシュJSONを読むだけの小さいスクリプトを分離しおおくず、他の堎所ぞの埋め蟌みや䜿い回しが効く
  • 2本のスクリプトを比べるず、片方にしかない鮮床譊告のような非察称に気づける。同じデヌタを読む実装は耇数曞いお突き合わせるのが地味に効く

次回は、このキャッシュ局をもう䞀段掘り䞋げお、バックグラりンド曎新が重なったずきの競合をどう朰したかを曞く予定です。


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

  • AIで「寝おおも回る仕組み」を䜜っお月120䞇にした話は noteの有料蚘事 に💰
  • OSS: github.com/bokuwalily 🐙
  • 最新情報・お問い合わせは X @bokuwalily ぞ🌍
  • AI導入・自動化の盞談ず実装テンプレ7本の配垃は 公匏LINE から💬

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