Skip to content

Statusline

Display Bun/TypeScript

Affichage 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
SegmentDescription
🌿 main +2 ~3Branche Git + fichiers staged/unstaged
[Opus 4.6]Modèle actif (via stdin JSON)
T: 130k/200k (65%)Tokens utilisés / taille contexte (pourcentage)
$17.54Coût cumulé de la session
S: 88%Rate limit session (5h) — restant, colorisé
W: 21%Rate limit hebdomadaire (7j) — restant, colorisé
⏰ 14:35Heure courante

Installation

Ajouter dans settings.json :

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 :

json
{
  "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 :

json
{
  "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és
  • output_tokens — tokens de sortie
  • cache_creation_input_tokens — tokens écrits en cache
  • cache_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 :

CouleurUtilisationRestant
🟢 Vert≤ 50%≥ 50%
🟡 Jaune51–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 :

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 .tmp pour éviter la corruption
  • Credentials : writeCredentials() fait une mise à jour atomique en préservant les autres champs

Exemples de sortie

ScénarioSortie
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

Shingan (心眼) — Linagora