Detecção do Canal de Instalação
A detecção roda localmente (sem rede), combinando o caminho real do binário, os metadados de build do Go e o carimbo de versão injetado pelo CI de release:O check do Homebrew roda primeiro de propósito: o bottle instalado pelo tap é o mesmo asset carimbado publicado na release do GitHub — só o caminho
Cellar distingue os dois canais.Por que builds locais nunca são auto-atualizados
Um binário compilado localmente pode carregar patches não commitados. Substituí-lo por um artefato de release destruiria esse trabalho em silêncio, então o ChatCLI apenas indica o caminho:O Comando /update
O/update puro é um pedido explícito: quando existe release mais nova num canal automatizável, ele aplica na hora — a mesma semântica do brew upgrade.
/update check mostra o mesmo status, mas nunca aplica nada.
O comando também está disponível na palette interativa e no completer de tab, e o /config update mostra a política resolvida a qualquer momento.
Self-Replace Verificado
Quando o binário veio direto de uma release do GitHub, o ChatCLI o atualiza no lugar com um pipeline endurecido:- Baixa o
checksums.txtda release alvo. - Faz streaming do asset da plataforma para um arquivo de staging no mesmo diretório do binário (garantindo rename atômico no mesmo filesystem) enquanto calcula o SHA-256.
- Recusa a instalação em qualquer divergência de checksum — o download é descartado e o binário atual jamais é tocado.
- Troca atomicamente: um rename simples no macOS/Linux (o processo em execução continua no inode antigo), ou o dance de renomear para
.oldno Windows, com rollback automático se a ativação falhar. Restos são limpos no próximo boot.
/usr/local/bin do root), o updater degrada para um comando pronto para copiar:
Auto-Update em Background (Staging)
DefinaCHATCLI_AUTO_UPDATE para controlar o comportamento no boot:
O modo auto usa staging, o mesmo modelo do Claude Code: o processo em execução nunca é reiniciado nem interrompido. O binário novo pousa no disco enquanto você trabalha, e o próximo start já abre na versão nova — anunciada uma única vez na tela de boas-vindas:
notify (o default), a tela de boas-vindas mostra o convite:
O Homebrew fica deliberadamente fora do update silencioso em background. O
brew upgrade pega o lock global do Homebrew e pode disparar um brew update completo; o ChatCLI só o executa quando você roda /update explicitamente. Processos ChatCLI concorrentes se coordenam por lock file — só um faz o update em background.