Personnalisez Claude Code avec une ligne de statut personnalisée qui s’affiche en bas de l’interface Claude Code, similaire au fonctionnement des invites de terminal (PS1) dans les shells comme Oh-my-zsh.

Créer une ligne de statut personnalisée

Vous pouvez soit :

  • Exécuter /statusline pour demander à Claude Code de vous aider à configurer une ligne de statut personnalisée. Par défaut, il essaiera de reproduire l’invite de votre terminal, mais vous pouvez fournir des instructions supplémentaires sur le comportement que vous souhaitez à Claude Code, comme /statusline afficher le nom du modèle en orange

  • Ajouter directement une commande statusLine à votre .claude/settings.json :

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // Optionnel : définir à 0 pour laisser la ligne de statut aller jusqu'au bord
  }
}

Comment ça fonctionne

  • La ligne de statut est mise à jour lorsque les messages de conversation sont mis à jour
  • Les mises à jour s’exécutent au maximum toutes les 300ms
  • La première ligne de stdout de votre commande devient le texte de la ligne de statut
  • Les codes de couleur ANSI sont pris en charge pour styliser votre ligne de statut
  • Claude Code transmet des informations contextuelles sur la session actuelle (modèle, répertoires, etc.) sous forme de JSON à votre script via stdin

Structure d’entrée JSON

Votre commande de ligne de statut reçoit des données structurées via stdin au format JSON :

{
  "hook_event_name": "Status",
  "session_id": "abc123...",
  "transcript_path": "/path/to/transcript.json",
  "cwd": "/current/working/directory",
  "model": {
    "id": "claude-opus-4-1",
    "display_name": "Opus"
  },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory"
  }
}

Exemples de scripts

Ligne de statut simple

#!/bin/bash
# Lire l'entrée JSON depuis stdin
input=$(cat)

# Extraire les valeurs en utilisant jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}"

Ligne de statut avec prise en charge Git

#!/bin/bash
# Lire l'entrée JSON depuis stdin
input=$(cat)

# Extraire les valeurs en utilisant jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# Afficher la branche git si dans un dépôt git
GIT_BRANCH=""
if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    if [ -n "$BRANCH" ]; then
        GIT_BRANCH=" | 🌿 $BRANCH"
    fi
fi

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}$GIT_BRANCH"

Exemple Python

#!/usr/bin/env python3
import json
import sys
import os

# Lire JSON depuis stdin
data = json.load(sys.stdin)

# Extraire les valeurs
model = data['model']['display_name']
current_dir = os.path.basename(data['workspace']['current_dir'])

# Vérifier la branche git
git_branch = ""
if os.path.exists('.git'):
    try:
        with open('.git/HEAD', 'r') as f:
            ref = f.read().strip()
            if ref.startswith('ref: refs/heads/'):
                git_branch = f" | 🌿 {ref.replace('ref: refs/heads/', '')}"
    except:
        pass

print(f"[{model}] 📁 {current_dir}{git_branch}")

Exemple Node.js

#!/usr/bin/env node

const fs = require('fs');
const path = require('path');

// Lire JSON depuis stdin
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // Extraire les valeurs
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // Vérifier la branche git
    let gitBranch = '';
    try {
        const headContent = fs.readFileSync('.git/HEAD', 'utf8').trim();
        if (headContent.startsWith('ref: refs/heads/')) {
            gitBranch = ` | 🌿 ${headContent.replace('ref: refs/heads/', '')}`;
        }
    } catch (e) {
        // Pas un dépôt git ou impossible de lire HEAD
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

Approche avec fonctions d’aide

Pour des scripts bash plus complexes, vous pouvez créer des fonctions d’aide :

#!/bin/bash
# Lire l'entrée JSON une fois
input=$(cat)

# Fonctions d'aide pour les extractions courantes
get_model_name() { echo "$input" | jq -r '.model.display_name'; }
get_current_dir() { echo "$input" | jq -r '.workspace.current_dir'; }
get_project_dir() { echo "$input" | jq -r '.workspace.project_dir'; }
get_version() { echo "$input" | jq -r '.version'; }

# Utiliser les fonctions d'aide
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

Conseils

  • Gardez votre ligne de statut concise - elle devrait tenir sur une ligne
  • Utilisez des emojis (si votre terminal les prend en charge) et des couleurs pour rendre les informations facilement lisibles
  • Utilisez jq pour l’analyse JSON dans Bash (voir les exemples ci-dessus)
  • Testez votre script en l’exécutant manuellement avec une entrée JSON fictive : echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • Considérez la mise en cache des opérations coûteuses (comme le statut git) si nécessaire

Dépannage

  • Si votre ligne de statut n’apparaît pas, vérifiez que votre script est exécutable (chmod +x)
  • Assurez-vous que votre script sort vers stdout (pas stderr)