Statusline
Display Bun/TypeScriptAffichage temps réel en bas de Claude Code montrant les informations de session : branche Git, modèle, tokens, coût, et rate limits Anthropic avec coloration ANSI.
Aperçu
🌿 main +2 ~3 | [Opus 4.6] T: 130k/200k (65%) | $17.54 | S: 88% | W: 21% | ⏰ 14:35| Segment | Description |
|---|---|
🌿 main +2 ~3 | Branche Git + fichiers staged/unstaged |
[Opus 4.6] | Modèle actif (via stdin JSON) |
T: 130k/200k (65%) | Tokens utilisés / taille contexte (pourcentage) |
$17.54 | Coût cumulé de la session |
S: 88% | Rate limit session (5h) — restant, colorisé |
W: 21% | Rate limit hebdomadaire (7j) — restant, colorisé |
⏰ 14:35 | Heure courante |
Installation
Ajouter dans settings.json :
{
"statusLine": {
"type": "command",
"command": "bun ~/.claude/scripts/statusline/src/index.ts",
"padding": 0
}
}Sources de données
Stdin JSON (fourni par Claude Code)
Claude Code envoie un JSON via stdin à chaque rafraîchissement :
{
"model": { "display_name": "Opus 4.6" },
"cost": { "total_cost_usd": 17.54, "total_duration_ms": 7497744 },
"context_window": {
"context_window_size": 200000,
"used_percentage": 65,
"remaining_percentage": 35,
"current_usage": {
"input_tokens": 3,
"output_tokens": 249,
"cache_creation_input_tokens": 1055,
"cache_read_input_tokens": 128992
}
},
"session_id": "abc-123"
}Anthropic OAuth Usage API
Les valeurs S: et W: proviennent de l'API api.anthropic.com/api/oauth/usage, pas d'un calcul local. L'API retourne un utilization (0-100%) pour chaque limite. La statusline affiche remaining = 100 - utilization.
Réponse API :
{
"five_hour": { "utilization": 12, "resets_at": "2026-03-13T20:00:00Z" },
"seven_day": { "utilization": 78, "resets_at": "2026-03-16T00:00:00Z" },
"seven_day_sonnet": { "utilization": 13 },
"seven_day_opus": { "utilization": 45 }
}Les résultats sont cachés 3 minutes (30s en cas d'erreur).
Calcul des tokens
Le segment T: additionne tous les champs current_usage du stdin :
input_tokens— tokens d'entrée non-cachésoutput_tokens— tokens de sortiecache_creation_input_tokens— tokens écrits en cachecache_read_input_tokens— tokens lus depuis le cache
Le formatage utilise des suffixes : 45k, 2M, etc.
Coloration ANSI
Les segments S: et W: sont colorisés selon l'utilisation :
| Couleur | Utilisation | Restant |
|---|---|---|
| 🟢 Vert | ≤ 50% | ≥ 50% |
| 🟡 Jaune | 51–89% | 11–49% |
| 🔴 Rouge | ≥ 90% | ≤ 10% |
Architecture
Le script est divisé en deux fichiers pour la testabilité :
lib.ts — Helpers purs + API
Contient toute la logique métier :
- Types :
StdinData,RateLimits,UsageCache - Formatage :
formatTokens(),sanitize(),sumCurrentUsage(),formatContextWindow() - Coloration :
clampPct(),colorize(),formatRateLimit() - Credentials :
readCredentials(),writeCredentials()— lit/écrit~/.claude/.credentials.json - Cache :
readUsageCache(),writeUsageCache(),isCacheValid()— cache fichier avec TTL - API :
fetchUsageApi(),refreshAccessToken(),getUsage()— orchestration complète
index.ts — Point d'entrée
Lit le stdin, appelle les helpers, assemble les segments et affiche la ligne.
Authentification
Le script lit les credentials OAuth depuis ~/.claude/.credentials.json :
{
"claudeAiOauth": {
"accessToken": "sk-ant-oat01-...",
"refreshToken": "sk-ant-ort01-...",
"expiresAt": 1773415495860
}
}Si le token est expiré, un refresh est tenté via platform.claude.com/v1/oauth/token.
Sécurité
- Sanitization : les noms de modèle passent par
sanitize()qui supprime les séquences ANSI (CSI, OSC, contrôles C1) et tronque à 30 caractères — protection contre l'injection ANSI - Écriture atomique : le cache utilise un pattern
.tmppour éviter la corruption - Credentials :
writeCredentials()fait une mise à jour atomique en préservant les autres champs
Exemples de sortie
| Scénario | Sortie |
|---|---|
| Données complètes | 🌿 main +2 ~3 | [Opus 4.6] T: 130k/200k (65%) | $17.54 | S: 88% | W: 21% | ⏰ 14:35 |
| Sans stdin | 🌿 main | S: 88% | W: 21% | ⏰ 14:35 |
| Partiel (sans contexte) | 🌿 main | [Opus 4.6] | $0.42 | S: 88% | W: 21% | ⏰ 14:35 |
| Sans credentials | 🌿 main | [Opus 4.6] T: 130k/200k (65%) | $17.54 | ⏰ 14:35 |
TIP
Les valeurs S: et W: sont colorisées avec des codes ANSI dans le terminal (vert/jaune/rouge).
Tests
Le script dispose d'une suite de tests complète (statusline.test.ts) couvrant :
- Formatage des tokens et de la fenêtre de contexte
- Clamping et colorisation des pourcentages
- Parsing des réponses API
- Lecture/écriture des credentials (structures nested et flat)
- Cache avec TTL (succès et erreur)
- Sanitization ANSI (CSI, OSC, contrôles C1)
- Tests d'intégration bout en bout
