Build This Now
Build This Now
Atalhos de TecladoGuia da Status Line
Guia de HooksHooks Multiplataforma para o Claude CodeHooks de Setup do Claude CodeStop HooksAgentes Claude Code Auto-ValidantesHooks de Ciclo de Vida de Sessão do Claude CodeHooks de Backup de Contexto para o Claude CodeHook de Ativação de SkillsHook de Permissões do Claude Code
speedy_devvkoen_salo
Blog/Toolkit/Hooks/Claude Code Session Hooks

Hooks de Ciclo de Vida de Sessão do Claude Code

Quatro hooks de ciclo de vida de sessão do Claude Code: executa init a pedido, injeta contexto do projeto no SessionStart, faz backup de transcripts e regista limpeza no exit do SessionEnd.

Pare de configurar. Comece a construir.

Templates SaaS com orquestração de IA.

Published Feb 12, 2026Toolkit hubHooks index

Problema: Cada nova sessão começa às cegas. Voltas a explicar o branch em que estás, a fila de tarefas, e as env vars que os teus scripts precisam. Quando a sessão termina, a limpeza que devia acontecer nunca acontece.

Solução Rápida: Cola isto no settings.json. O contexto Git aparece no chat em cada início:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '## Git' && git branch --show-current && git status --short | head -10"
          }
        ]
      }
    ]
  }
}

Cada sessão abre agora com contexto. Zero configuração manual.

Os Quatro Hooks de Ciclo de Vida de Sessão

O comportamento da sessão é conduzido por quatro tipos de hook:

HookQuando DisparaPode Bloquear?Caso de Uso
SetupCom --init ou --maintenanceNÃOConfiguração única, migrações
SessionStartCada início/retoma de sessãoNÃOCarregar contexto, definir env vars
PreCompactAntes da compactação de contextoNÃOBackup de transcripts
SessionEndSessão terminaNÃOLimpeza, logging

SessionStart: Carrega Contexto de Cada Vez

O SessionStart corre sempre que uma sessão começa ou retoma. Usa-o quando algo deve estar sempre na cabeça do Claude.

Injeção de Contexto Básica

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '## Project State' && cat .claude/tasks/session-current.md 2>/dev/null || echo 'No active session'"
          }
        ]
      }
    ]
  }
}

Com Output JSON

Para injeção de contexto estruturado:

#!/usr/bin/env python3
import json
import sys
import subprocess
 
def get_project_context():
    try:
        branch = subprocess.check_output(
            ['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
            text=True, stderr=subprocess.DEVNULL
        ).strip()
        status = subprocess.check_output(
            ['git', 'status', '--porcelain'],
            text=True, stderr=subprocess.DEVNULL
        ).strip()
        changes = len(status.split('\n')) if status else 0
    except:
        branch, changes = "unknown", 0
 
    return f"""=== SESSION CONTEXT ===
Git Branch: {branch}
Uncommitted Changes: {changes}
=== END ===""".strip()
 
output = {
    "hookSpecificOutput": {
        "hookEventName": "SessionStart",
        "additionalContext": get_project_context()
    }
}
print(json.dumps(output))
sys.exit(0)

Matchers do SessionStart

Aponta para eventos de sessão específicos:

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "startup",
        "hooks": [{ "type": "command", "command": "echo 'Fresh session'" }]
      },
      {
        "matcher": "resume",
        "hooks": [{ "type": "command", "command": "echo 'Resumed session'" }]
      },
      {
        "matcher": "compact",
        "hooks": [{ "type": "command", "command": "echo 'Post-compaction'" }]
      }
    ]
  }
}
  • startup - Nova sessão
  • resume - De --resume, --continue, ou /resume
  • clear - Após /clear
  • compact - Após compactação

Persistir Variáveis de Ambiente

O SessionStart tem acesso a CLAUDE_ENV_FILE para definir variáveis de ambiente para a sessão toda:

#!/bin/bash
 
# Persist environment changes from nvm, pyenv, etc.
ENV_BEFORE=$(export -p | sort)
 
# Setup commands that modify environment
source ~/.nvm/nvm.sh
nvm use 20
 
if [ -n "$CLAUDE_ENV_FILE" ]; then
  ENV_AFTER=$(export -p | sort)
  comm -13 <(echo "$ENV_BEFORE") <(echo "$ENV_AFTER") >> "$CLAUDE_ENV_FILE"
fi
 
exit 0

Tudo o que for escrito em CLAUDE_ENV_FILE aparece em cada comando bash que Claude correr depois disso.

Setup: Operações Únicas

Os hooks Setup só correm quando invocas explicitamente --init, --init-only, ou --maintenance. Bom para trabalho que não queres disparado em cada nova sessão.

Quando Usar Setup vs SessionStart

OperaçãoUsa SetupUsa SessionStart
Instalar dependênciasSimNão
Correr migrações de base de dadosSimNão
Carregar estado gitNãoSim
Definir variáveis de ambienteSimSim
Injetar contexto do projetoNãoSim
Limpar ficheiros temporáriosSim (maintenance)Não

Configuração do Setup

{
  "hooks": {
    "Setup": [
      {
        "matcher": "init",
        "hooks": [
          {
            "type": "command",
            "command": "npm install && npm run db:migrate"
          }
        ]
      },
      {
        "matcher": "maintenance",
        "hooks": [
          {
            "type": "command",
            "command": "npm prune && npm dedupe && rm -rf .cache"
          }
        ]
      }
    ]
  }
}

Invoca com:

claude --init          # Runs 'init' matcher
claude --init-only     # Runs 'init' matcher, then exits
claude --maintenance   # Runs 'maintenance' matcher

Os hooks Setup também podem escrever em CLAUDE_ENV_FILE para persistir variáveis de ambiente.

PreCompact: Antes da Perda de Contexto

O PreCompact dispara mesmo antes da compactação, quer o utilizador a tenha disparado com /compact ou ela tenha arrancado automaticamente quando a janela encheu.

Backup de Transcripts

#!/usr/bin/env python3
import json
import sys
import shutil
from pathlib import Path
from datetime import datetime
 
input_data = json.load(sys.stdin)
transcript_path = input_data.get('transcript_path', '')
trigger = input_data.get('trigger', 'unknown')
 
if transcript_path and Path(transcript_path).exists():
    backup_dir = Path('.claude/backups')
    backup_dir.mkdir(parents=True, exist_ok=True)
 
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    backup_name = f"transcript_{trigger}_{timestamp}.jsonl"
    shutil.copy2(transcript_path, backup_dir / backup_name)
 
    # Keep only last 10 backups
    backups = sorted(backup_dir.glob('transcript_*.jsonl'))
    for old_backup in backups[:-10]:
        old_backup.unlink()
 
sys.exit(0)

Matchers do PreCompact

{
  "hooks": {
    "PreCompact": [
      {
        "matcher": "auto",
        "hooks": [{ "type": "command", "command": "echo 'Auto-compacting...'" }]
      },
      {
        "matcher": "manual",
        "hooks": [{ "type": "command", "command": "echo 'Manual /compact'" }]
      }
    ]
  }
}
  • auto - Janela de contexto encheu, compactação automática
  • manual - Utilizador correu /compact

Criar Marcadores de Recuperação

Combina PreCompact com SessionStart para reconstruir o contexto após um evento de compactação. Um padrão que funciona: um módulo backup-core partilhado, um monitor de statusline que dispara triggers baseados em threshold, e um handler PreCompact, todos a coordenar através de um ficheiro de estado para que nada se perca entre sessões. Vê o guia Context Recovery Hook para o percurso completo.

SessionEnd: Limpeza

O SessionEnd corre quando uma sessão está a terminar. Não pode bloquear o encerramento, mas pode fazer limpeza.

Registar Estatísticas da Sessão

#!/usr/bin/env python3
import json
import sys
from pathlib import Path
from datetime import datetime
 
input_data = json.load(sys.stdin)
session_id = input_data.get('session_id', 'unknown')
reason = input_data.get('reason', 'unknown')
 
log_dir = Path('.claude/logs')
log_dir.mkdir(parents=True, exist_ok=True)
 
log_entry = {
    "session_id": session_id,
    "ended_at": datetime.now().isoformat(),
    "reason": reason
}
 
with open(log_dir / 'session-history.jsonl', 'a') as f:
    f.write(json.dumps(log_entry) + '\n')
 
sys.exit(0)

Razões do SessionEnd

O campo reason diz-te porque a sessão terminou:

  • clear - Utilizador correu /clear
  • logout - Utilizador fez logout
  • prompt_input_exit - Utilizador saiu enquanto o prompt estava visível
  • other - Outras razões de saída

Exemplo Completo de Ciclo de Vida

Uma configuração completa de ciclo de vida ligada de ponta a ponta:

{
  "hooks": {
    "Setup": [
      {
        "matcher": "init",
        "hooks": [
          {
            "type": "command",
            "command": "npm install && echo 'Dependencies installed'"
          }
        ]
      }
    ],
 
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '## Context' && git status --short && echo '## Tasks' && cat .claude/tasks/session-current.md 2>/dev/null | head -20"
          }
        ]
      }
    ],
 
    "PreCompact": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "cp \"$CLAUDE_TRANSCRIPT_PATH\" .claude/backups/last-transcript.jsonl 2>/dev/null || true"
          }
        ]
      }
    ],
 
    "SessionEnd": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo \"Session ended: $(date)\" >> .claude/logs/sessions.log"
          }
        ]
      }
    ]
  }
}

Payloads de Entrada

Entrada do SessionStart

{
  "session_id": "abc123",
  "hook_event_name": "SessionStart",
  "source": "startup",
  "model": "claude-sonnet-4-20250514",
  "cwd": "/path/to/project"
}

Entrada do Setup

{
  "session_id": "abc123",
  "hook_event_name": "Setup",
  "trigger": "init",
  "cwd": "/path/to/project"
}

Entrada do PreCompact

{
  "session_id": "abc123",
  "hook_event_name": "PreCompact",
  "transcript_path": "~/.claude/projects/.../transcript.jsonl",
  "trigger": "auto",
  "custom_instructions": ""
}

Entrada do SessionEnd

{
  "session_id": "abc123",
  "hook_event_name": "SessionEnd",
  "reason": "clear",
  "cwd": "/path/to/project"
}

Boas Práticas

  1. Mantém o SessionStart rápido - Corre em cada sessão. Empurra o trabalho pesado para o Setup.

  2. Usa Setup para trabalho único - Instalação de dependências, migrações, bootstrap inicial do projeto.

  3. Faz backup antes da compactação - O PreCompact é a tua última oportunidade de capturar o transcript.

  4. Regista os fins de sessão - O SessionEnd é útil para analytics e depuração.

  5. Usa matchers com cuidado - Comportamentos diferentes para startup vs resume vs compact evitam surpresas.

Próximos Passos

  • Configura o Guia de Hooks principal para todos os 12 hooks
  • Configura Context Recovery para sobreviver à compactação
  • Usa Stop Hooks para aplicação de tarefas
  • Explora Skill Activation para carregamento automático de skills

Continue in Hooks

  • Hooks de Setup do Claude Code
    Combina scripts, agentes e documentação em hooks de setup do Claude Code. Um comando corre um script determinístico, passa o output para um agente de diagnóstico, e regista documentação viva.
  • Hooks de Backup de Contexto para o Claude Code
    Um hook de backup de contexto do Claude Code baseado em StatusLine. Escreve snapshots estruturados a cada 10K tokens para que a compactação automática nunca apague erros, assinaturas nem decisões.
  • Hooks Multiplataforma para o Claude Code
    Hooks do Claude Code multiplataforma: elimina wrappers .cmd, .sh e .ps1 e invoca node diretamente para que um único ficheiro .mjs corra em macOS, Linux e Windows por toda a equipa.
  • Guia de Hooks
    Hooks do Claude Code do princípio ao fim: exit codes, output JSON, comandos assíncronos, endpoints HTTP, matchers PreToolUse e PostToolUse, padrões para produção.
  • Hook de Permissões do Claude Code
    Instala um hook de permissões em três camadas para o Claude Code: aprovação instantânea para chamadas seguras, recusa instantânea para as perigosas, e verificação LLM para a zona cinzenta. Sem flag de skip.
  • Agentes Claude Code Auto-Validantes
    Agentes Claude Code auto-validantes: liga hooks PostToolUse de lint, hooks Stop e sub-agentes revisores em modo só-leitura às definições dos agentes para que output de má qualidade nunca seja entregue.

More from Toolkit

  • Atalhos de Teclado
    Configure o keybindings.json do Claude Code: 17 contextos, sintaxe de teclas, sequências de acordes, combinações de modificadores e como desvincular qualquer atalho padrão instantaneamente.
  • Guia da Status Line
    Configure uma status line no Claude Code para ver o nome do modelo, branch do git, custo da sessão e uso do contexto. Configuração via settings.json, input JSON, scripts em bash, Python e Node.js.
  • Otimização de SEO e GEO com IA
    Um resumo sobre Generative Engine Optimization: como fazer com que o teu conteúdo seja citado dentro das respostas do ChatGPT, Claude e Perplexity, em vez de apenas aparecer no Google.
  • Claude Code vs Cursor em 2026
    Uma comparação lado a lado entre Claude Code e Cursor em 2026: modelos de agente, janelas de contexto, planos de preço e como cada ferramenta se encaixa em diferentes fluxos de trabalho.

Pare de configurar. Comece a construir.

Templates SaaS com orquestração de IA.

On this page

Os Quatro Hooks de Ciclo de Vida de Sessão
SessionStart: Carrega Contexto de Cada Vez
Injeção de Contexto Básica
Com Output JSON
Matchers do SessionStart
Persistir Variáveis de Ambiente
Setup: Operações Únicas
Quando Usar Setup vs SessionStart
Configuração do Setup
PreCompact: Antes da Perda de Contexto
Backup de Transcripts
Matchers do PreCompact
Criar Marcadores de Recuperação
SessionEnd: Limpeza
Registar Estatísticas da Sessão
Razões do SessionEnd
Exemplo Completo de Ciclo de Vida
Payloads de Entrada
Entrada do SessionStart
Entrada do Setup
Entrada do PreCompact
Entrada do SessionEnd
Boas Práticas
Próximos Passos

Pare de configurar. Comece a construir.

Templates SaaS com orquestração de IA.