Skip to main content
A partir da v1.125, todas as cores do ChatCLI vêm de uma única fonte da verdade: o pacote ui/theme. Ele define uma paleta semântica (cores nomeadas por papel, não por matiz), detecta a capacidade de cor do terminal e expõe 12 temas prontos (dark, light, grafite + 9 da comunidade) que reskinam a interface inteira — chat, cards do /coder e /agent, bordas, markdown, code blocks e spinners — sem precisar reiniciar.
O tema é estado global do processo. Trocar de tema vale na próxima renderização, sem restart. Diferente do CHATCLI_CODER_UI (estilo de timeline), que o renderer relê do ambiente a cada chamada.

Trocar de tema em runtime

Autocomplete completo: digite /config ui theme <TAB> (ou /config theme <TAB>) e aparecem todos os temas: dark · light · grafite · dracula · nord · tokyo-night · solarized-dark · solarized-light · gruvbox · catppuccin-mocha · monokai · one-dark.
O painel de status (/config ui) mostra o tema ativo, a origem do valor (variável de ambiente vs. padrão), o perfil de cor detectado e a lista de temas com o ativo marcado por →.

Temas disponíveis

São 12 temas no total. Cada faixa mostra o nome e as cores reais da paleta, na ordem modelo · accent (raciocínio) · ok · aviso · erro: Tema dark — padrão, terminais de fundo escuro Tema light — terminais de fundo claro Tema grafite — dark sóbrio de grafite: accents em azul calmo, cromo discreto Tema dracula — alto contraste roxo/rosa/ciano Tema nord — ártico frio, baixa saturação Tema tokyo-night — azul-noturno moderno Tema solarized-dark — Solarized na base escura Tema solarized-light — mesmos tons em fundo claro Tema gruvbox — retrô, quente, alto contraste Tema catppuccin-mocha — pastel suave (Mocha) Tema monokai — clássico de editor sobre carvão Tema one-dark — azul/cinza do Atom, accents suaves
dark e light são variantes calibradas do ChatCLI; os outros nove são adaptações das paletas clássicas da comunidade mapeadas nos papéis semânticos do ChatCLI (mesma estrutura, cores diferentes). Todos degradam para 256 e 16 cores mantendo os papéis distinguíveis.
A troca aplica a paleta a tudo de uma vez porque Colorize e o conversor ansiColorToLip roteiam pelo tema ativo — não há churn nos call-sites.

Paleta semântica

As cores são nomeadas pelo papel que cumprem, não pelo matiz. É isso que permite trocar o tema inteiro mexendo só na paleta:

A linha de entrada e o dropdown de autocomplete

O prompt do REPL é desenhado pelo go-prompt, que tem o próprio laço de render e nunca vê as strings ANSI que o resto da interface monta. Até a v1.199 suas cores eram literais — o texto que você digita estava fixado em branco — então um tema claro num terminal claro imprimia branco no branco. Agora todas essas cores saem da paleta ativa: A tinta é sempre escolhida contra o fundo em que ela cai, nunca contra o terminal — Background é o próprio chão do tema, então é a tinta legível sobre uma linha saturada tanto numa paleta escura quanto numa clara.
O go-prompt copia essas cores para o renderer na construção do prompt e nunca as relê, então o /config ui theme reconstrói o prompt na hora. É a única superfície em que a troca de tema faz mais do que esperar o próximo render.

Contrato de legibilidade

Toda paleta embutida é verificada automaticamente contra um piso, para que “opinativa quanto ao matiz” nunca vire “ilegível”:
  • Texto de corpo (Text, TextStrong) passa de 4.5:1 contra o próprio chão do tema; Muted — texto secundário — passa de 3:1.
  • Num terminal de 16 cores, uma paleta clara nunca entra na faixa bright (9–15, pintada para fundo escuro), e uma paleta escura nunca usa o índice 0.
  • Cada par fundo/tinta do dropdown passa de 3:1 e nunca colapsa no mesmo índice de 16 cores.
Border fica de fora do piso de contraste de propósito: Nord, Solarized, Catppuccin e One Dark definem seu tom de borda como um preenchimento quase igual ao fundo por design, e elevá-lo trocaria a identidade da paleta pela nossa.

Markdown temático

O markdown é renderizado pelo glamour com um StyleConfig derivado da paleta (substituindo o antigo glamour.WithStandardStyle("dark")), então as cores do markdown e dos code blocks compartilham os tons da UI. Realce de sintaxe via chroma e uma chip de linguagem acima de cada bloco de código. O documento é renderizado inteiro (não bloco a bloco), de modo que reference links, footnotes e espaçamento de parágrafo resolvem corretamente.

Perfil de cor e degradação graciosa

O ChatCLI detecta a capacidade do terminal e degrada com elegância. Em pipes, CI ou terminais dumb, a saída vira texto limpo sem códigos de cor. A detecção honra os sinais usuais (NO_COLOR, CLICOLOR_FORCE, TERM, COLORTERM). O tema dark mantém o índice ANSI16 = 10 para o verde, então terminais de 16 cores ficam idênticos ao comportamento legado.

Persistência

A troca em runtime vale só para o processo atual. Para fixar um padrão entre sessões, adicione ao seu .env:
O mutator emite essa dica logo após cada troca. O ChatCLI nunca reescreve seu .env sozinho. Veja CHATCLI_THEME na referência de variáveis de ambiente.
Mudança paralela na v1.125: o envelope de resposta do chat ganhou um footer com custo por turno e uso de contexto, e os spinners foram unificados em um único spinner braille temático, exibido só quando há terminal.