Claude Codeã®ã³ã¹ããšãã©ã³æ ãåžžæèŠããåãã â statuslineå®è£
ååã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ãµãŒãã¹ãéç£ããŠããŸã
- äœã£ãã¢ããªã¯ ããŒããã©ãªãª ã«ãŸãšããŠããŸãð±
- æ°çã»éçºã®è£åŽã¯ X @bokuwalily ã§çºä¿¡ããŠããŸãð
- OSS: github.com/bokuwalily ð
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ