Pular para o conteúdo principal

Documentation Index

Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt

Use this file to discover all available pages before exploring further.

A linha de status é uma barra personalizável na parte inferior do Claude Code que executa qualquer script de shell que você configurar. Ela recebe dados de sessão JSON em stdin e exibe tudo o que seu script imprime, oferecendo uma visualização persistente e rápida do uso de contexto, custos, status do git ou qualquer outra coisa que você queira rastrear. As linhas de status são úteis quando você:
  • Quer monitorar o uso da janela de contexto enquanto trabalha
  • Precisa rastrear custos de sessão
  • Trabalha em várias sessões e precisa distingui-las
  • Quer que a ramificação git e o status estejam sempre visíveis
Aqui está um exemplo de uma linha de status de múltiplas linhas que exibe informações do git na primeira linha e uma barra de contexto codificada por cores na segunda.
Uma linha de status de múltiplas linhas mostrando nome do modelo, diretório, ramificação git na primeira linha, e uma barra de progresso de uso de contexto com custo e duração na segunda linha
Esta página orienta você sobre configurar uma linha de status básica, explica como os dados fluem do Claude Code para seu script, lista todos os campos que você pode exibir e fornece exemplos prontos para usar para padrões comuns como status do git, rastreamento de custos e barras de progresso.

Configurar uma linha de status

Use o comando /statusline para fazer com que o Claude Code gere um script para você, ou crie manualmente um script e adicione-o às suas configurações.

Use o comando /statusline

O comando /statusline aceita instruções em linguagem natural descrevendo o que você quer exibir. O Claude Code gera um arquivo de script em ~/.claude/ e atualiza suas configurações automaticamente:
/statusline show model name and context percentage with a progress bar

Configure manualmente uma linha de status

Adicione um campo statusLine às suas configurações de usuário (~/.claude/settings.json, onde ~ é seu diretório inicial) ou configurações de projeto. Defina type como "command" e aponte command para um caminho de script ou um comando de shell inline. Para um passo a passo completo de criação de um script, consulte Construir uma linha de status passo a passo.
{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}
O campo command é executado em um shell, então você também pode usar comandos inline em vez de um arquivo de script. Este exemplo usa jq para analisar a entrada JSON e exibir o nome do modelo e a porcentagem de contexto:
{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
  }
}
O campo padding opcional adiciona espaçamento horizontal extra (em caracteres) ao conteúdo da linha de status. O padrão é 0. Este preenchimento é além do espaçamento integrado da interface, então controla o recuo relativo em vez da distância absoluta da borda do terminal. O campo refreshInterval opcional executa novamente seu comando a cada N segundos além das atualizações orientadas por eventos. O mínimo é 1. Defina isto quando sua linha de status exibir dados baseados em tempo, como um relógio, ou quando subagentes em segundo plano alterarem o estado do git enquanto a sessão principal está ociosa. Deixe sem definir para executar apenas em eventos. O campo hideVimModeIndicator opcional suprime o texto integrado -- INSERT -- abaixo do prompt. Defina isto como true quando seu script renderizar vim.mode em si, para que o modo não seja exibido duas vezes.

Desabilitar a linha de status

Execute /statusline e peça para remover ou limpar sua linha de status (por exemplo, /statusline delete, /statusline clear, /statusline remove it). Você também pode excluir manualmente o campo statusLine do seu settings.json.

Construir uma linha de status passo a passo

Este passo a passo mostra o que está acontecendo nos bastidores criando manualmente uma linha de status que exibe o modelo atual, diretório de trabalho e porcentagem de uso da janela de contexto.
Executar /statusline com uma descrição do que você quer configura tudo isso automaticamente para você.
Estes exemplos usam scripts Bash, que funcionam no macOS e Linux. No Windows, consulte Configuração do Windows para exemplos de PowerShell e Git Bash.
Uma linha de status mostrando nome do modelo, diretório e porcentagem de contexto
1

Crie um script que leia JSON e imprima a saída

O Claude Code envia dados JSON para seu script via stdin. Este script usa jq, um analisador JSON de linha de comando que você pode precisar instalar, para extrair o nome do modelo, diretório e porcentagem de contexto, depois imprime uma linha formatada.Salve isto em ~/.claude/statusline.sh (onde ~ é seu diretório inicial, como /Users/username no macOS ou /home/username no Linux):
#!/bin/bash
# Read JSON data that Claude Code sends to stdin
input=$(cat)

# Extract fields using jq
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
# The "// 0" provides a fallback if the field is null
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# Output the status line - ${DIR##*/} extracts just the folder name
echo "[$MODEL] 📁 ${DIR##*/} | ${PCT}% context"
2

Torne-o executável

Marque o script como executável para que seu shell possa executá-lo:
chmod +x ~/.claude/statusline.sh
3

Adicione às configurações

Diga ao Claude Code para executar seu script como a linha de status. Adicione esta configuração a ~/.claude/settings.json, que define type como "command" (significando “execute este comando de shell”) e aponta command para seu script:
{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}
Sua linha de status aparece na parte inferior da interface. As configurações são recarregadas automaticamente, mas as alterações não aparecerão até sua próxima interação com o Claude Code.

Como as linhas de status funcionam

O Claude Code executa seu script e envia dados de sessão JSON para ele via stdin. Seu script lê o JSON, extrai o que precisa e imprime texto para stdout. O Claude Code exibe tudo o que seu script imprime. Quando é atualizado Seu script é executado após cada nova mensagem do assistente, após /compact terminar, quando o modo de permissão muda ou quando o modo vim alterna. As atualizações são debounced em 300ms, significando que mudanças rápidas são agrupadas e seu script é executado uma vez que as coisas se estabilizam. Se uma nova atualização for acionada enquanto seu script ainda está em execução, a execução em andamento é cancelada. Se você editar seu script, as alterações não aparecerão até que sua próxima interação com o Claude Code acione uma atualização. Estes gatilhos podem ficar silenciosos quando a sessão principal está ociosa, por exemplo enquanto um coordenador aguarda subagentes em segundo plano. Para manter segmentos baseados em tempo ou de origem externa atualizados durante períodos ociosos, defina refreshInterval para também executar novamente o comando em um temporizador fixo. O que seu script pode exibir
A linha de status é executada localmente e não consome tokens de API. Ela se oculta temporariamente durante certas interações da interface, incluindo sugestões de preenchimento automático, o menu de ajuda e prompts de permissão.

Dados disponíveis

O Claude Code envia os seguintes campos JSON para seu script via stdin:
CampoDescrição
model.id, model.display_nameIdentificador do modelo atual e nome de exibição
cwd, workspace.current_dirDiretório de trabalho atual. Ambos os campos contêm o mesmo valor; workspace.current_dir é preferido para consistência com workspace.project_dir.
workspace.project_dirDiretório onde o Claude Code foi iniciado, que pode diferir de cwd se o diretório de trabalho mudar durante uma sessão
workspace.added_dirsDiretórios adicionais adicionados via /add-dir ou --add-dir. Array vazio se nenhum foi adicionado
workspace.git_worktreeNome da git worktree quando o diretório atual está dentro de uma worktree vinculada criada com git worktree add. Ausente na worktree principal. Preenchido para qualquer git worktree, diferentemente de worktree.* que se aplica apenas a sessões --worktree
cost.total_cost_usdCusto total estimado da sessão em USD, calculado no lado do cliente. Pode diferir de sua fatura real
cost.total_duration_msTempo total decorrido desde o início da sessão, em milissegundos
cost.total_api_duration_msTempo total gasto aguardando respostas de API em milissegundos
cost.total_lines_added, cost.total_lines_removedLinhas de código alteradas
context_window.total_input_tokens, context_window.total_output_tokensContagens de tokens atualmente na janela de contexto, da resposta de API mais recente. A entrada inclui leituras e escritas de cache. Antes da v2.1.132, estas eram totais cumulativos de sessão
context_window.context_window_sizeTamanho máximo da janela de contexto em tokens. 200000 por padrão, ou 1000000 para modelos com contexto estendido.
context_window.used_percentagePorcentagem pré-calculada da janela de contexto usada
context_window.remaining_percentagePorcentagem pré-calculada da janela de contexto restante
context_window.current_usageContagens de tokens da última chamada de API, descritas em campos de janela de contexto
exceeds_200k_tokensSe a contagem total de tokens (tokens de entrada, cache e saída combinados) da resposta de API mais recente excede 200k. Este é um limite fixo independentemente do tamanho real da janela de contexto.
effort.levelNível de esforço de raciocínio atual (low, medium, high, xhigh ou max). Reflete o valor da sessão em tempo real, incluindo mudanças de /effort durante a sessão. Ausente quando o modelo atual não suporta o parâmetro de esforço
thinking.enabledSe o pensamento estendido está habilitado para a sessão
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentagePorcentagem do limite de taxa de 5 horas ou 7 dias consumida, de 0 a 100
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_atSegundos de época Unix quando a janela de limite de taxa de 5 horas ou 7 dias é redefinida
session_idIdentificador único de sessão
session_nameNome de sessão personalizado definido com a flag --name ou /rename. Ausente se nenhum nome personalizado foi definido
transcript_pathCaminho para o arquivo de transcrição de conversa
versionVersão do Claude Code
output_style.nameNome do estilo de saída atual
vim.modeModo vim atual (NORMAL, INSERT, VISUAL ou VISUAL LINE) quando modo vim está habilitado
agent.nameNome do agente ao executar com a flag --agent ou configurações de agente configuradas
worktree.nameNome da worktree ativa. Presente apenas durante sessões --worktree
worktree.pathCaminho absoluto para o diretório da worktree
worktree.branchNome da ramificação git para a worktree (por exemplo, "worktree-my-feature"). Ausente para worktrees baseadas em hook
worktree.original_cwdO diretório em que o Claude estava antes de entrar na worktree
worktree.original_branchRamificação git verificada antes de entrar na worktree. Ausente para worktrees baseadas em hook
Seu comando de linha de status recebe esta estrutura JSON via stdin:
{
  "cwd": "/current/working/directory",
  "session_id": "abc123...",
  "session_name": "my-session",
  "transcript_path": "/path/to/transcript.jsonl",
  "model": {
    "id": "claude-opus-4-7",
    "display_name": "Opus"
  },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory",
    "added_dirs": [],
    "git_worktree": "feature-xyz"
  },
  "version": "2.1.90",
  "output_style": {
    "name": "default"
  },
  "cost": {
    "total_cost_usd": 0.01234,
    "total_duration_ms": 45000,
    "total_api_duration_ms": 2300,
    "total_lines_added": 156,
    "total_lines_removed": 23
  },
  "context_window": {
    "total_input_tokens": 15500,
    "total_output_tokens": 1200,
    "context_window_size": 200000,
    "used_percentage": 8,
    "remaining_percentage": 92,
    "current_usage": {
      "input_tokens": 8500,
      "output_tokens": 1200,
      "cache_creation_input_tokens": 5000,
      "cache_read_input_tokens": 2000
    }
  },
  "exceeds_200k_tokens": false,
  "effort": {
    "level": "high"
  },
  "thinking": {
    "enabled": true
  },
  "rate_limits": {
    "five_hour": {
      "used_percentage": 23.5,
      "resets_at": 1738425600
    },
    "seven_day": {
      "used_percentage": 41.2,
      "resets_at": 1738857600
    }
  },
  "vim": {
    "mode": "NORMAL"
  },
  "agent": {
    "name": "security-reviewer"
  },
  "worktree": {
    "name": "my-feature",
    "path": "/path/to/.claude/worktrees/my-feature",
    "branch": "worktree-my-feature",
    "original_cwd": "/path/to/project",
    "original_branch": "main"
  }
}
Campos que podem estar ausentes (não presentes em JSON):
  • session_name: aparece apenas quando um nome personalizado foi definido com --name ou /rename
  • workspace.git_worktree: aparece apenas quando o diretório atual está dentro de uma git worktree vinculada
  • effort: aparece apenas quando o modelo atual suporta o parâmetro de esforço de raciocínio
  • vim: aparece apenas quando o modo vim está habilitado
  • agent: aparece apenas ao executar com a flag --agent ou configurações de agente configuradas
  • worktree: aparece apenas durante sessões --worktree. Quando presente, branch e original_branch também podem estar ausentes para worktrees baseadas em hook
  • rate_limits: aparece apenas para assinantes Claude.ai (Pro/Max) após a primeira resposta de API na sessão. Cada janela (five_hour, seven_day) pode estar independentemente ausente. Use jq -r '.rate_limits.five_hour.used_percentage // empty' para lidar com ausência graciosamente.
Campos que podem ser null:
  • context_window.current_usage: null antes da primeira chamada de API em uma sessão, e novamente após /compact até que a próxima chamada de API a repopule
  • context_window.used_percentage, context_window.remaining_percentage: podem ser null no início da sessão
Trate campos ausentes com acesso condicional e valores nulos com padrões de fallback em seus scripts.

Campos de janela de contexto

O objeto context_window descreve a janela de contexto em tempo real da resposta de API mais recente. A partir da v2.1.132, total_input_tokens e total_output_tokens refletem o uso de contexto atual, não totais cumulativos de sessão.
  • Totais combinados (total_input_tokens, total_output_tokens): tokens atualmente na janela de contexto. total_input_tokens é a soma de input_tokens, cache_creation_input_tokens e cache_read_input_tokens; total_output_tokens são os tokens de saída da resposta mais recente. Ambos são 0 antes da primeira resposta de API.
  • Uso por componente (current_usage): as mesmas contagens de tokens divididas por categoria. Use isto quando você precisar de acertos de cache separados da entrada fresca.
O objeto current_usage contém:
  • input_tokens: tokens de entrada no contexto atual
  • output_tokens: tokens de saída gerados
  • cache_creation_input_tokens: tokens escritos no cache
  • cache_read_input_tokens: tokens lidos do cache
O campo used_percentage é calculado apenas a partir de tokens de entrada: input_tokens + cache_creation_input_tokens + cache_read_input_tokens. Ele não inclui output_tokens. Se você calcular a porcentagem de contexto manualmente a partir de current_usage, use a mesma fórmula apenas de entrada para corresponder a used_percentage. O objeto current_usage é null antes da primeira chamada de API em uma sessão, e novamente imediatamente após /compact até que a próxima chamada de API a repopule.

Exemplos

Estes exemplos mostram padrões comuns de linha de status. Para usar qualquer exemplo:
  1. Salve o script em um arquivo como ~/.claude/statusline.sh (ou .py/.js)
  2. Torne-o executável: chmod +x ~/.claude/statusline.sh
  3. Adicione o caminho às suas configurações
Os exemplos de Bash usam jq para analisar JSON. Python e Node.js têm análise JSON integrada.

Uso da janela de contexto

Exiba o modelo atual e o uso da janela de contexto com uma barra de progresso visual. Cada script lê JSON de stdin, extrai o campo used_percentage e constrói uma barra de 10 caracteres onde blocos preenchidos (▓) representam o uso:
Uma linha de status mostrando nome do modelo e uma barra de progresso com porcentagem
#!/bin/bash
# Read all of stdin into a variable
input=$(cat)

# Extract fields with jq, "// 0" provides fallback for null
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# Build progress bar: printf -v creates a run of spaces, then
# ${var// /▓} replaces each space with a block character
BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"

echo "[$MODEL] $BAR $PCT%"

Status do git com cores

Mostre a ramificação git com indicadores codificados por cores para arquivos preparados e modificados. Este script usa códigos de escape ANSI para cores de terminal: \033[32m é verde, \033[33m é amarelo e \033[0m redefine para padrão.
Uma linha de status mostrando modelo, diretório, ramificação git e indicadores coloridos para arquivos preparados e modificados
Cada script verifica se o diretório atual é um repositório git, conta arquivos preparados e modificados e exibe indicadores codificados por cores:
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')

GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

    GIT_STATUS=""
    [ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

    echo -e "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH $GIT_STATUS"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

Rastreamento de custo e duração

Rastreie os custos de API e o tempo decorrido da sua sessão. O campo cost.total_cost_usd acumula o custo estimado de todas as chamadas de API na sessão atual. O campo cost.total_duration_ms mede o tempo total decorrido desde o início da sessão, enquanto cost.total_api_duration_ms rastreia apenas o tempo gasto aguardando respostas de API. Cada script formata o custo como moeda e converte milissegundos em minutos e segundos:
Uma linha de status mostrando nome do modelo, custo da sessão e duração
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

COST_FMT=$(printf '$%.2f' "$COST")
DURATION_SEC=$((DURATION_MS / 1000))
MINS=$((DURATION_SEC / 60))
SECS=$((DURATION_SEC % 60))

echo "[$MODEL] 💰 $COST_FMT | ⏱️ ${MINS}m ${SECS}s"

Exibir múltiplas linhas

Seu script pode exibir múltiplas linhas para criar uma exibição mais rica. Cada instrução echo produz uma linha separada na área de status.
Uma linha de status de múltiplas linhas mostrando nome do modelo, diretório, ramificação git na primeira linha, e uma barra de progresso de uso de contexto com custo e duração na segunda linha
Este exemplo combina várias técnicas: cores baseadas em limite (verde abaixo de 70%, amarelo 70-89%, vermelho 90%+), uma barra de progresso e informações de ramificação git. Cada instrução print ou echo cria uma linha separada:
#!/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')

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

# Pick bar color based on context usage
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))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /█}${PAD// /░}"

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)"

echo -e "${CYAN}[$MODEL]${RESET} 📁 ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | ⏱️ ${MINS}m ${SECS}s"
Este exemplo cria um link clicável para seu repositório GitHub. Ele lê a URL remota do git, converte o formato SSH para HTTPS com sed e envolve o nome do repositório em códigos de escape OSC 8. Mantenha Cmd (macOS) ou Ctrl (Windows/Linux) pressionado e clique para abrir o link em seu navegador.
Uma linha de status mostrando um link clicável para um repositório GitHub
Cada script obtém a URL remota do git, converte o formato SSH para HTTPS e envolve o nome do repositório em códigos de escape OSC 8. A versão Bash usa printf '%b' que interpreta escapes de barra invertida de forma mais confiável que echo -e em diferentes shells:
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')

# Convert git SSH URL to HTTPS
REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')

if [ -n "$REMOTE" ]; then
    REPO_NAME=$(basename "$REMOTE")
    # OSC 8 format: \e]8;;URL\a then TEXT then \e]8;;\a
    # printf %b interprets escape sequences reliably across shells
    printf '%b' "[$MODEL] 🔗 \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"
else
    echo "[$MODEL]"
fi

Uso de limite de taxa

Exiba o uso do limite de taxa de assinatura Claude.ai na linha de status. O objeto rate_limits contém five_hour (janela móvel de 5 horas) e seven_day (janelas semanais). Cada janela fornece used_percentage (0-100) e resets_at (segundos de época Unix quando a janela é redefinida). Este campo está presente apenas para assinantes Claude.ai (Pro/Max) após a primeira resposta de API. Cada script trata o campo ausente graciosamente:
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
# "// empty" produces no output when rate_limits is absent
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
WEEK=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

LIMITS=""
[ -n "$FIVE_H" ] && LIMITS="5h: $(printf '%.0f' "$FIVE_H")%"
[ -n "$WEEK" ] && LIMITS="${LIMITS:+$LIMITS }7d: $(printf '%.0f' "$WEEK")%"

[ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"

Cache de operações caras

Seu script de linha de status é executado frequentemente durante sessões ativas. Comandos como git status ou git diff podem ser lentos, especialmente em repositórios grandes. Este exemplo armazena em cache informações do git em um arquivo temporário e apenas as atualiza a cada 5 segundos. O nome do arquivo de cache precisa ser estável em invocações de linha de status dentro de uma sessão, mas único em sessões para que sessões simultâneas em repositórios diferentes não leiam o estado git em cache uma da outra. Identificadores baseados em processo como $$, os.getpid() ou process.pid mudam a cada invocação e derrotam o cache. Use o session_id da entrada JSON em vez disso: é estável para a vida útil de uma sessão e único por sessão. Cada script verifica se o arquivo de cache está ausente ou mais antigo que 5 segundos antes de executar comandos git:
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
SESSION_ID=$(echo "$input" | jq -r '.session_id')

CACHE_FILE="/tmp/statusline-git-cache-$SESSION_ID"
CACHE_MAX_AGE=5  # seconds

cache_is_stale() {
    [ ! -f "$CACHE_FILE" ] || \
    # stat -f %m is macOS, stat -c %Y is Linux
    [ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]
}

if cache_is_stale; then
    if git rev-parse --git-dir > /dev/null 2>&1; then
        BRANCH=$(git branch --show-current 2>/dev/null)
        STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
        MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')
        echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"
    else
        echo "||" > "$CACHE_FILE"
    fi
fi

IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

if [ -n "$BRANCH" ]; then
    echo "[$MODEL] 📁 ${DIR##*/} | 🌿 $BRANCH +$STAGED ~$MODIFIED"
else
    echo "[$MODEL] 📁 ${DIR##*/}"
fi

Configuração do Windows

No Windows, o Claude Code executa comandos de linha de status através do Git Bash quando o Git Bash está instalado, ou através do PowerShell quando o Git Bash está ausente. Para executar um script PowerShell como sua linha de status, invoque-o via powershell; isso funciona a partir de qualquer shell:
{
  "statusLine": {
    "type": "command",
    "command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"
  }
}
Ou execute um script Bash diretamente quando o Git Bash está instalado:
{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

Linhas de status de subagente

A configuração subagentStatusLine renderiza um corpo de linha personalizado para cada subagente mostrado no painel de agente abaixo do prompt. Use-a para substituir a linha padrão name · description · token count pela sua própria formatação.
{
  "subagentStatusLine": {
    "type": "command",
    "command": "~/.claude/subagent-statusline.sh"
  }
}
O comando é executado uma vez por tick de atualização com todas as linhas de subagente visíveis passadas como um único objeto JSON em stdin. A entrada inclui os campos de hook base mais columns (a largura de linha utilizável) e um array tasks, onde cada tarefa tem id, name, type, status, description, label, startTime, tokenCount, tokenSamples e cwd. Escreva uma linha JSON para stdout por linha que você queira substituir, na forma {"id": "<task id>", "content": "<row body>"}. A string content é renderizada como está, incluindo cores ANSI e hiperlinks OSC 8. Omita o id de uma tarefa para manter a renderização padrão para essa linha; emita uma string content vazia para ocultá-la. Os mesmos portões de confiança e disableAllHooks que se aplicam a statusLine se aplicam aqui. Plugins podem enviar um subagentStatusLine padrão em seu settings.json.

Dicas

  • Teste com entrada simulada: echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh
  • Mantenha a saída curta: a barra de status tem largura limitada, então saída longa pode ser truncada ou quebrada de forma estranha
  • Cache de operações lentas: seu script é executado frequentemente durante sessões ativas, então comandos como git status podem causar atraso. Consulte o exemplo de cache para saber como lidar com isso.
Projetos comunitários como ccstatusline e starship-claude fornecem configurações pré-construídas com temas e recursos adicionais.

Solução de problemas

Linha de status não aparecendo
  • Verifique se seu script é executável: chmod +x ~/.claude/statusline.sh
  • Verifique se seu script produz saída para stdout, não stderr
  • Execute seu script manualmente para verificar se produz saída
  • Se disableAllHooks estiver definido como true em suas configurações, a linha de status também será desabilitada. Remova esta configuração ou defina-a como false para reabilitar.
  • Execute claude --debug para registrar o código de saída e stderr da primeira invocação de linha de status em uma sessão
  • Peça ao Claude para ler seu arquivo de configurações e executar o comando statusLine diretamente para descobrir erros
Linha de status mostra -- ou valores vazios
  • Os campos podem ser null antes da primeira resposta de API ser concluída
  • Trate valores nulos em seu script com fallbacks como // 0 em jq
  • Reinicie o Claude Code se os valores permanecerem vazios após várias mensagens
Porcentagem de contexto mostra valores inesperados
  • Use used_percentage para o estado de contexto mais simples e preciso
  • A porcentagem de contexto pode diferir da saída /context devido a quando cada uma é calculada
Links OSC 8 não clicáveis
  • Verifique se seu terminal suporta hiperlinks OSC 8 (iTerm2, Kitty, WezTerm)
  • Terminal.app não suporta links clicáveis
  • Se o texto do link aparecer mas não for clicável, o Claude Code pode não ter detectado suporte a hiperlink em seu terminal. Isto afeta comumente Windows Terminal e outros emuladores não na lista de detecção automática. Defina a variável de ambiente FORCE_HYPERLINK para substituir a detecção antes de iniciar o Claude Code:
    FORCE_HYPERLINK=1 claude
    
    No PowerShell, defina a variável na sessão atual primeiro:
    $env:FORCE_HYPERLINK = "1"; claude
    
  • Sessões SSH e tmux podem remover sequências OSC dependendo da configuração
  • Se sequências de escape aparecerem como texto literal como \e]8;;, use printf '%b' em vez de echo -e para manipulação de escape mais confiável
Falhas de exibição com sequências de escape
  • Sequências de escape complexas (cores ANSI, links OSC 8) podem ocasionalmente causar saída corrompida se se sobrepuserem com outras atualizações da interface
  • Se você vir texto corrompido, tente simplificar seu script para saída de texto simples
  • Linhas de status de múltiplas linhas com códigos de escape são mais propensas a problemas de renderização do que texto simples de linha única
Confiança do espaço de trabalho necessária
  • O comando de linha de status só é executado se você aceitou o diálogo de confiança do espaço de trabalho para o diretório atual. Como statusLine executa um comando de shell, ele requer a mesma aceitação de confiança que hooks e outras configurações que executam shell.
  • Se a confiança não for aceita, você verá a notificação statusline skipped · restart to fix em vez da saída da sua linha de status. Reinicie o Claude Code e aceite o prompt de confiança para habilitá-lo.
Erros de script ou travamentos
  • Scripts que saem com códigos diferentes de zero ou não produzem saída fazem a linha de status ficar em branco
  • Scripts lentos bloqueiam a linha de status de atualizar até que sejam concluídos. Mantenha scripts rápidos para evitar saída obsoleta.
  • Se uma nova atualização for acionada enquanto um script lento está em execução, o script em andamento é cancelado
  • Teste seu script independentemente com entrada simulada antes de configurá-lo
Notificações compartilham a linha de status
  • Notificações do sistema como erros de servidor MCP e atualizações automáticas são exibidas no lado direito da mesma linha que sua linha de status. Notificações transitórias como o aviso de contexto baixo também circulam por esta área.
  • Habilitar modo verbose adiciona um contador de tokens a esta área
  • Em terminais estreitos, essas notificações podem truncar sua saída de linha de status