Claude Code Usage Anzeige in der CLI
Da ich viel Claude Code in der CLI nutze, wollte ich einmal herausfinden, wie ich mir die Limits dauerhaft anzeigen lassen kann. Das habe ich Opus schnell prüfen und skripten lassen. Ob ich das Terminal in iTerm oder in Rider nutze ist egal, denn es funktioniert in beiden Fällen.
Nachmachen auf eigene Gefahr, besser ein Backup der settings.json vorher anlegen 😉
Getestet ist das Verhalten nur mit Abo, was ohne Abo passiert, ist ungetestet und muss ggf. angepasst werden.
Hier das vorläufige Ergebnis, mit Modell- und Ordneranzeige:

Um diese Anzeige zu erhalten, habe ich im ~/.claude/ Ordner eine statusline-limits.py mit folgendem Inhalt angelegt:
#!/usr/bin/env python3
# Statusline für Claude Code: zeigt das 5-Stunden- und das Wochenlimit an.
# Claude Code übergibt die Sitzungsdaten als JSON auf stdin, siehe
# https://code.claude.com/docs/en/statusline (Abschnitt "rate_limits").
#
# Alle Fenster teilen sich ihre Werte über SHARED_FILE. Welcher Wert neuer ist,
# entscheidet nicht die Ankunftszeit, sondern: späterer Reset gewinnt, bei gleichem
# Reset der höhere Prozentwert (der Verbrauch steigt bis zum Reset nur an).
import json
import os
import subprocess
import sys
import time
from datetime import datetime
SHARED_FILE = os.path.expanduser("~/.claude/limits-latest.json")
GREEN, YELLOW, RED, DIM, RESET = "\033[32m", "\033[33m", "\033[31m", "\033[2m", "\033[0m"
WEEKDAYS = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
def newer(a, b):
if not a:
return b
if not b:
return a
return max(a, b, key=lambda w: (w["resets_at"], w["used_percentage"]))
def format_window(label, window, with_weekday):
pct = window["used_percentage"]
color = RED if pct >= 95 else YELLOW if pct >= 80 else GREEN
reset = datetime.fromtimestamp(window["resets_at"])
reset_text = reset.strftime("%H:%M")
if with_weekday:
reset_text = f"{WEEKDAYS[reset.weekday()]} {reset_text}"
return f"{label}: {color}{pct:.0f}%{RESET} (Reset {reset_text})"
def git_branch(directory):
try:
result = subprocess.run(["git", "-C", directory, "branch", "--show-current"],
capture_output=True, text=True, timeout=2)
return result.stdout.strip()
except (OSError, subprocess.TimeoutExpired):
return ""
data = json.load(sys.stdin)
own = data.get("rate_limits") or {}
try:
with open(SHARED_FILE) as f:
shared = json.load(f)
except (OSError, ValueError):
shared = {}
now = time.time()
limits = {}
for key in ("five_hour", "seven_day"):
window = newer(own.get(key), shared.get(key))
if window and window["resets_at"] > now:
limits[key] = window
if limits != shared:
tmp_file = f"{SHARED_FILE}.{os.getpid()}.tmp"
with open(tmp_file, "w") as f:
json.dump(limits, f)
os.replace(tmp_file, SHARED_FILE)
parts = []
model = (data.get("model") or {}).get("display_name")
if model:
parts.append(model)
effort = (data.get("effort") or {}).get("level")
if effort:
parts.append(effort)
directory = (data.get("workspace") or {}).get("current_dir") or data.get("cwd")
if directory:
branch = git_branch(directory)
folder = os.path.basename(directory.rstrip("/"))
parts.append(f"{folder} {DIM}({branch}){RESET}" if branch else folder)
if parts:
print(" - ".join(parts))
parts = []
if "five_hour" in limits:
parts.append(format_window("5h", limits["five_hour"], with_weekday=False))
if "seven_day" in limits:
parts.append(format_window("Woche", limits["seven_day"], with_weekday=True))
if not limits:
parts.append("Limits: noch keine Daten")
print(" - ".join(parts))
Das Skript legt außerdem selbst die Datei limits-latest.json an, anlegen muss man sie nicht. Über diese Datei gleichen alle offenen Fenster alle 10 Sekunden ihre Werte ab. Neue Zahlen gibt es aber nur, wenn Claude in irgendeinem Fenster antwortet.
Als letztes dann noch unter ~/.claude/ in der settings.json einen Zusatz anlegen:
"statusLine": {
"type": "command",
"command": "python3 ~/.claude/statusline-limits.py",
"refreshInterval": 10
}
Den Block innerhalb der äußeren geschweiften Klammern einfügen und mit einem Komma vom Eintrag davor oder danach trennen, damit das Json valide bleibt.
Die 10 Sekunden aus dem Abgleich oben stellt refreshInterval ein.
Falls jemand noch eine coolere Möglichkeit kennt, schreibt mir gerne einen Kommentar.
Kommentare (0)
Kommentar schreiben