GClaude Indexer
O indexador de documentos offline agora instala sem terminal — e o bug que me custou três rodadas
Quando publiquei aqui, instalar o GClaude Indexer significava abrir o
PowerShell e rodar um script. Recebi a mesma resposta de várias pessoas:
"parece útil, mas não consigo instalar". O projeto serve pra quem tem
acervo de documento pra organizar, que quase nunca é quem tem intimidade
com terminal.
A 1.3.0 resolve isso. É um instalador gráfico do Windows que baixa e
instala as cinco dependências sozinho, com barra de progresso, e uma tela
onde você marca o que quer: Tesseract e Ghostscript travados (sem OCR o
programa não faz o que existe pra fazer) e Ollama, modelo de 3,2 GB,
bibliotecas de sensor e atalho opcional à sua escolha.
O que eu queria registrar, porque me custou três rodadas de correção, é
como um instalador consegue mentir que instalou.
O comando era montado assim:
cmd /c ""powershell.exe" -File ""C:\Program Files\GClaude Indexer\install.ps1"" ..."
As aspas dobradas são exigência do cmd, que come um nível delas. Só que o
PowerShell não recebe o resultado limpo: ele via -File 'C:\Program',
recusava o arquivo por não ter extensão .ps1, e — isso é o detalhe cruel —
caía no modo interativo, imprimindo o banner de copyright. A pessoa via uma
janela preta aberta e supunha que era o instalador pedindo alguma coisa.
Só funcionava em caminho sem espaço. A pasta padrão do Windows tem espaço.
O que escondeu isso por três versões foi o sinal de conclusão:
& echo %ERRORLEVEL% > done.txt
O & do cmd roda o segundo comando independentemente do primeiro. Então o
arquivo aparecia, o instalador lia um número, e seguia para a tela de
sucesso — sobre uma instalação em que nenhuma dependência tinha sido
instalada. Três pessoas diferentes me disseram "instalou, mas falta tudo",
e eu procurei o problema nos downloads.
A correção foi tirar o cmd.exe do caminho: o instalador escreve um .ps1 em
%TEMP% com os caminhos já embutidos como literais do PowerShell e executa
aquele arquivo. Um arquivo não tem aspas pra errar no meio do caminho. E o
sinal de conclusão passou a ser escrito pelo próprio script, depois de ter
rodado — que é a versão honesta do que o echo fingia ser.
Lição que eu levo: um valor de retorno que é produzido mesmo quando o
trabalho não aconteceu não é um valor de retorno, é um enfeite. Vale pra
exit code, pra sentinela em arquivo e pro código de saída do winget, que
também me enganou nessa mesma fase — ele relata sucesso para uma
desinstalação que deixou o pacote no lugar.
GPL-3.0, offline, sem telemetria, 600 testes:
https://github.com/alexccastilho/gclaude-indexer