Barre de contexte segmentée pour Claude Code
Remplace le pourcentage brut de la statusline par une barre visuelle segmentée en couleurs. Tu vois en un coup d’œil ce qui consomme ton contexte : conversation, cache MCP, contexte chargé, ou tokens de sortie. Le pourcentage global passe du vert au jaune à 50 %, puis au rouge à 80 %.
#!/bin/bash
# Claude Code status line — barre de contexte segmentée
# Par David Perrot — legeek.tech
input=$(cat)
used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
ctx_size=$(echo "$input" | jq -r '.context_window.context_window_size // empty')
input_tokens=$(echo "$input" | jq -r '.context_window.current_usage.input_tokens // empty')
cache_read=$(echo "$input" | jq -r '.context_window.current_usage.cache_read_input_tokens // empty')
cache_write=$(echo "$input" | jq -r '.context_window.current_usage.cache_creation_input_tokens // empty')
output_tokens=$(echo "$input" | jq -r '.context_window.current_usage.output_tokens // empty')
model=$(echo "$input" | jq -r '.model.display_name // empty')
cwd=$(echo "$input" | jq -r '.workspace.current_dir // empty')
RST="\033[0m"; BLD="\033[1m"; DIM="\033[2m"
FG_GRN="\033[32m"; FG_YEL="\033[33m"; FG_RED="\033[31m"; FG_CYN="\033[36m"
BG_CYN="\033[46m"; BG_MAG="\033[45m"; BG_GRN="\033[42m"; BG_YEL="\033[43m"
BG_DIM="\033[100m"; DARK="\033[30m"; WHT="\033[97m"
pct_of() {
local val="$1"
[ -z "$val" ] || [ "$val" = "null" ] || [ "$val" = "0" ] && echo "0" && return
[ -z "$ctx_size" ] || [ "$ctx_size" = "0" ] && echo "0" && return
echo "scale=0; $val * 100 / $ctx_size" | bc
}
# Render segment: n chars wide, bg color, short label, full label
bar_seg() {
local n="$1" bg="$2" short="$3" full="$4"
[ "$n" -le 0 ] && return
# Choose label that fits
local lbl=""
if [ "$n" -ge "${#full}" ]; then lbl="$full"
elif [ "$n" -ge "${#short}" ]; then lbl="$short"
elif [ "$n" -ge 2 ] ; then lbl="${short:0:$n}"
fi
local ll=${#lbl}
local pad=$(( n - ll ))
local pl=$(( pad / 2 ))
local pr=$(( pad - pl ))
printf "${bg}${DARK}"
[ "$pl" -gt 0 ] && printf '%*s' "$pl" ''
printf '%s' "$lbl"
[ "$pr" -gt 0 ] && printf '%*s' "$pr" ''
printf "${RST}"
}
if [ -z "$used_pct" ]; then
printf "${FG_CYN}%s${RST} %s" "$model" "$(basename "$cwd")"
else
used_int=$(printf "%.0f" "$used_pct")
pct_conv=$(pct_of "$input_tokens")
pct_mcp=$(pct_of "$cache_write")
pct_ctxt=$(pct_of "$cache_read")
pct_out=$(pct_of "$output_tokens")
# Global color
if [ "$used_int" -ge 80 ] 2>/dev/null; then gc="$FG_RED"
elif [ "$used_int" -ge 50 ] 2>/dev/null; then gc="$FG_YEL"
else gc="$FG_GRN"; fi
printf "${BLD}${gc}%3d%%${RST} " "$used_int"
BAR_W=48
# Used portion in chars
used_w=$(( used_int * BAR_W / 100 ))
[ "$used_w" -lt 1 ] && used_w=0
# Raw segment widths proportional within the used portion
if [ "$used_int" -gt 0 ]; then
w_conv=$(( pct_conv * used_w / used_int ))
w_mcp=$(( pct_mcp * used_w / used_int ))
w_ctxt=$(( pct_ctxt * used_w / used_int ))
w_out=$(( pct_out * used_w / used_int ))
else
w_conv=0; w_mcp=0; w_ctxt=0; w_out=0
fi
# Enforce minimum 2 chars for any non-zero segment
MIN=2
bump=0
for v in pct_conv pct_mcp pct_ctxt pct_out; do
eval "pv=\$$v"
eval "wv=w_$(echo $v | sed 's/pct_//')"
eval "wval=\$$wv"
if [ "$pv" -gt 0 ] && [ "$wval" -lt "$MIN" ]; then
eval "$wv=$MIN"
bump=$(( bump + MIN - wval ))
fi
done
# Steal bump from the largest segment
largest="w_conv"
lval=$w_conv
for ww in w_mcp w_ctxt w_out; do
eval "tv=\$$ww"
if [ "$tv" -gt "$lval" ]; then lval=$tv; largest=$ww; fi
done
eval "$largest=$(( $lval - bump ))"
eval "[ \$$largest -lt 0 ] && $largest=0"
# Recompute totals
filled=$(( w_conv + w_mcp + w_ctxt + w_out ))
diff=$(( used_w - filled ))
w_conv=$(( w_conv + diff ))
[ "$w_conv" -lt 0 ] && w_conv=0
unused_w=$(( BAR_W - used_w ))
[ "$unused_w" -lt 0 ] && unused_w=0
# Render: CONV | MCP | CTXT | OUT | unused
bar_seg "$w_conv" "$BG_CYN" "CONV" "CONV ${pct_conv}%"
bar_seg "$w_mcp" "$BG_MAG" "MCP" "MCP ${pct_mcp}%"
bar_seg "$w_ctxt" "$BG_GRN" "CTXT" "CTXT ${pct_ctxt}%"
bar_seg "$w_out" "$BG_YEL" "OUT" "OUT ${pct_out}%"
if [ "$unused_w" -gt 0 ]; then
printf "${BG_DIM}${DARK}%*s${RST}" "$unused_w" ''
fi
fi
Installation
- Ouvre ton terminal. Le dossier de config de Claude Code est caché dans ton home :
~/.claude/. Si tu ne le vois pas dans ton explorateur de fichiers, c’est normal — les dossiers qui commencent par un point sont masqués par défaut. - Crée le fichier du script :
nano ~/.claude/statusline-command.sh
Colle le script complet copié ci-dessus, puis sauvegarde avec Ctrl+O, Enter, Ctrl+X. - Rends le fichier exécutable — sans ça, Claude Code ne pourra pas le lancer :
chmod +x ~/.claude/statusline-command.sh - Ouvre (ou crée) le fichier de settings de Claude Code :
nano ~/.claude/settings.json
Ajoute cette ligne dans le JSON :"statusline": { "command": "bash ~/.claude/statusline-command.sh" }
Si le fichier existe déjà avec d’autres réglages, ajoute cette clé à côté des autres (sans oublier la virgule de séparation). - Ferme et relance Claude Code. La barre segmentée apparaît en bas de ton terminal.
jq doit être installé (traitement JSON en ligne de commande).Sur Mac :
brew install jq · Sur Ubuntu/Debian : sudo apt install jq