Aller au contenu

Setup Claude Code Status Line

Guide pour installer la barre de statut personnalisee de Claude Code, identique a celle utilisee sur le projet MemTide.

Apercu

La status line affiche en temps reel :

  • Ligne 1 : [Modele] [Agent] + barre de contexte coloree + % utilise + cout en $ + duree de session
  • Ligne 2 : dossier courant + branche Git active

Exemple de rendu :

[Claude 4 Opus] [PURE] ████████░░ 80% | $1.23 | ⏱️ 12m 34s
📁 memtide | 🌿 dev

La barre de contexte change de couleur selon le remplissage : - Vert : < 70% - Jaune : 70-89% - Rouge : >= 90%

[PURE] s'affiche quand aucun sous-agent n'est actif, sinon le nom de l'agent apparait.


Prerequis

  • Claude Code installe (npm install -g @anthropic-ai/claude-code ou via le binaire officiel)
  • jq installe (parsing JSON) :
  • macOS : brew install jq
  • Ubuntu/Debian : sudo apt install jq
  • Windows : winget install jqlang.jq ou scoop install jq ou choco install jq
  • Windows (MSYS2) : pacman -S mingw-w64-x86_64-jq
  • Ou telecharger depuis jq releases
  • git installe (pour l'affichage de la branche)
  • Bash disponible (Git Bash sur Windows, natif sur macOS/Linux)

Etape 1 : Creer le script de la status line

Creer le fichier ~/.claude/statusline-command.sh avec le contenu exact suivant :

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')
AGENT=$(echo "$input" | jq -r '.agent.name // empty')
AGENT_DISPLAY="${AGENT:-PURE}"

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))

BLOCK=$(printf '\xe2\x96\x88')
LIGHT=$(printf '\xe2\x96\x91')

BAR=""
for ((i=0; i<FILLED; i++)); do BAR="${BAR}${BLOCK}"; done
for ((i=0; i<EMPTY; i++)); do BAR="${BAR}${LIGHT}"; done

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${CYAN}[$MODEL] [$AGENT_DISPLAY]${RESET} ${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"
echo -e "📁 ${DIR##*/}$BRANCH"

Commandes d'installation

macOS / Linux :

cat << 'SCRIPT' > ~/.claude/statusline-command.sh
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')
AGENT=$(echo "$input" | jq -r '.agent.name // empty')
AGENT_DISPLAY="${AGENT:-PURE}"

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))

BLOCK=$(printf '\xe2\x96\x88')
LIGHT=$(printf '\xe2\x96\x91')

BAR=""
for ((i=0; i<FILLED; i++)); do BAR="${BAR}${BLOCK}"; done
for ((i=0; i<EMPTY; i++)); do BAR="${BAR}${LIGHT}"; done

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${CYAN}[$MODEL] [$AGENT_DISPLAY]${RESET} ${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"
echo -e "📁 ${DIR##*/}$BRANCH"
SCRIPT

chmod +x ~/.claude/statusline-command.sh

Windows (Git Bash) :

Meme commande que ci-dessus, executee dans Git Bash. Le script sera cree a l'emplacement /c/Users/<TON_USER>/.claude/statusline-command.sh.

cat << 'SCRIPT' > /c/Users/$USERNAME/.claude/statusline-command.sh
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')
AGENT=$(echo "$input" | jq -r '.agent.name // empty')
AGENT_DISPLAY="${AGENT:-PURE}"

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))

BLOCK=$(printf '\xe2\x96\x88')
LIGHT=$(printf '\xe2\x96\x91')

BAR=""
for ((i=0; i<FILLED; i++)); do BAR="${BAR}${BLOCK}"; done
for ((i=0; i<EMPTY; i++)); do BAR="${BAR}${LIGHT}"; done

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | 🌿 $(git branch --show-current 2>/dev/null)"

COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${CYAN}[$MODEL] [$AGENT_DISPLAY]${RESET} ${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"
echo -e "📁 ${DIR##*/}$BRANCH"
SCRIPT

chmod +x /c/Users/$USERNAME/.claude/statusline-command.sh

Etape 2 : Configurer Claude Code

Editer le fichier ~/.claude/settings.json pour ajouter la cle statusLine.

Si le fichier n'existe pas encore :

cat << 'EOF' > ~/.claude/settings.json
{
  "statusLine": {
    "type": "command",
    "command": "bash ~/.claude/statusline-command.sh"
  }
}
EOF

Si le fichier existe deja, ajouter/modifier uniquement la cle statusLine :

{
  "statusLine": {
    "type": "command",
    "command": "bash ~/.claude/statusline-command.sh"
  }
}

Note Windows

Sur Windows, Claude Code ne resout pas toujours ~ correctement car le processus n'utilise pas forcement un shell bash pour interpreter le chemin. Utilisez le chemin absolu au format Unix :

"command": "bash /c/Users/MonUser/.claude/statusline-command.sh"

Le raccourci ~ peut fonctionner mais n'est pas garanti. Si la status line ne s'affiche pas, passer au chemin absolu.


Etape 3 : Verifier

  1. Relancer Claude Code (claude dans le terminal)
  2. La barre de statut devrait apparaitre en bas du terminal avec les infos en temps reel

Test manuel du script

Pour verifier que le script fonctionne independamment :

echo '{"model":{"display_name":"Claude 4 Opus"},"workspace":{"current_dir":"/home/user/project"},"cost":{"total_cost_usd":0.42,"total_duration_ms":185000},"context_window":{"used_percentage":35.7},"agent":{}}' | bash ~/.claude/statusline-command.sh

Resultat attendu :

[Claude 4 Opus] [PURE] ███░░░░░░░ 35% | $0.42 | ⏱️ 3m 5s
📁 project

Comment ca marche

Claude Code appelle le script a chaque rafraichissement de la status line. Il envoie un JSON sur stdin contenant l'etat courant de la session. Le script :

  1. Lit le JSON depuis stdin (cat)
  2. Extrait les champs avec jq :
  3. .model.display_name : nom du modele actif
  4. .workspace.current_dir : repertoire de travail
  5. .cost.total_cost_usd : cout cumule de la session
  6. .context_window.used_percentage : pourcentage de contexte utilise
  7. .cost.total_duration_ms : duree totale en millisecondes
  8. .agent.name : nom du sous-agent actif (vide si aucun)
  9. Construit une barre de progression avec des blocs Unicode ( = rempli, = vide)
  10. Colore la barre selon le niveau de remplissage (vert/jaune/rouge)
  11. Detecte la branche Git courante
  12. Affiche le tout sur 2 lignes avec des codes ANSI

Champs JSON disponibles (reference)

Le JSON envoye par Claude Code sur stdin contient ces champs utilisables :

Chemin jq Description
.model.display_name Nom affiche du modele (ex: "Claude 4 Opus")
.workspace.current_dir Repertoire de travail courant
.cost.total_cost_usd Cout total de la session en USD
.cost.total_duration_ms Duree totale de la session en ms
.context_window.used_percentage % de la fenetre de contexte utilise
.context_window.total_tokens Tokens max de la fenetre
.agent.name Nom du sous-agent actif (vide si main)

Depannage

Probleme Solution
Pas de status line Verifier que statusLine est dans ~/.claude/settings.json (pas dans un settings projet)
jq: command not found Installer jq (voir prerequis)
Caracteres casses Verifier que le terminal supporte UTF-8 et les emojis
Script non execute chmod +x ~/.claude/statusline-command.sh (necessaire aussi sous Git Bash Windows)
Branche Git non affichee Normal si le dossier courant n'est pas un repo Git
Status line vide sous Windows Remplacer ~ par le chemin absolu /c/Users/MonUser/.claude/statusline-command.sh dans settings.json
jq installe mais introuvable Sous Windows, verifier que le dossier de jq.exe est dans le PATH du terminal utilise par Claude Code