iuri-cli
v0.1.6
Published
Agente/CLI estilo Claude Code que dirige ChatGPT/Gemini/Grok/DeepSeek pelo navegador (sem API paga), com TUI, modo plano, imagens e modelo auxiliar local.
Downloads
1,174
Maintainers
Readme
iuri
Usa o ChatGPT web (sua conta, login Google) como um CLI estilo claude/codex
— sem a API, sem custo por token. Um daemon mantém um Chrome logado (oculto) e
expõe uma API HTTP local; o comando iuri é o cliente.
Automatiza a UI web do ChatGPT (Playwright). Fere o ToS da OpenAI — uso pessoal, baixo volume. Use por sua conta e risco.
Pré-requisitos
- Node.js 24+ (o código é TypeScript; o Node 24 roda
.tsnativo) e Google Chrome instalados. - Uma conta no ChatGPT (login feito uma vez via
iuri login).
Instalação (inclusive em outro PC)
Pela npm (recomendado — como qualquer pacote):
npm i -g iuri-cli # publicado no npm; o comando instalado é `iuri`
iuri login # abre o Chrome p/ você logar (só na 1ª vez)
iuri "olá" # o comando `iuri` funciona de qualquer pastaInstala do registry (tarball flat, com o dist/ já compilado) — requer Node 24 + Chrome.
Ou clone + instalador (bom p/ desenvolver no repo):
git clone https://github.com/iurivilarinho/cli-ia.git
cd cli-ia
./install.ps1 # checa Node/Chrome, faz npm install + npm link
iuri loginSem o script, manualmente: npm install → npm link → iuri login.
O dist/ (JS compilado) já vem versionado, então não precisa buildar — o npm link
aponta o iuri pro dist/bin/iuri.js (o Node não roda .ts sob node_modules, por isso o JS pronto).
Desenvolvendo: o iuri global (via npm link) aponta pro dist/. Depois de editar src/,
rode npm run build (ou deixe npm run watch numa aba) pra recompilar o dist/ — ou use
npm run dev / node bin/iuri.ts pra rodar o source .ts direto sem build.
A sessão fica salva em profile*/ (gitignored, por PC/usuário — cada máquina loga a sua).
Credenciais de banco (db_query) ficam em db.json (gitignored — nunca versione).
Gestão (modelos, padrão, status)
iuri --provider gemini "..." # usa outra IA nesta chamada
iuri config default gemini # define a IA padrão (salvo em ~/.iuri/config.json)
iuri config # ver padrão + IAs disponíveis
iuri status # painel: quais IAs estão no ar/logadas
iuri status --watch # painel atualizando ao vivo
iuri stop # encerra o daemon ativoUso
iuri # agente interativo: lê/edita arquivos, roda comandos
iuri "tarefa" # tarefa única no modo agente (em terminal)
iuri --chat "pergunta" # chat puro (sem ferramentas), com streaming
echo dados | iuri "..." # chat puro com stdin junto
iuri --continue "..." # emenda na última conversa (chat puro)
iuri -p "..." # modo print (sem streaming, p/ scripts)
iuri --schema f.json "tx" # extrai JSON validado contra um JSON Schema
iuri login # abre a janela do Chrome p/ (re)autenticar
iuri --provider gemini ... # escolhe a IA: chatgpt (padrão)·gemini·deepseek·grok
iuri status [--watch] # painel de status de todos os provedores
iuri --status # estado do daemon ativo (JSON)
iuri stop # encerra o daemon
iuri help # ajudaProvedores (multi-IA)
Cada provedor tem daemon, porta e perfil próprios. Escolha com --provider <id>.
Trocar de provedor é também a melhor recuperação se uma conta/IP cair no anti-ban.
| Provedor | Status |
|---|---|
| ChatGPT | ✅ testado (logado) e funciona anônimo |
| Gemini | ✅ testado — funciona até anônimo (sem login) |
| DeepSeek | ✅ testado (logado) — input/resposta ok (envia com Enter) |
| Grok | ✅ testado (logado) — o consentimento de cookies interceptava o envio; resolvido pelo predismiss (aceita cookies + remove o SDK + passa o portão de idade) |
Seletores ficam em src/providers/<id>.js — é lá que se conserta se a UI mudar.
Contas e modo anônimo
Cada combinação provedor + conta/anônimo tem seu próprio login (perfil separado).
iuri login # loga a conta padrão do provedor atual
iuri logout # desloga (apaga a sessão) — depois 'iuri login' p/ OUTRA conta
iuri --account trabalho "..." # usa uma conta nomeada (perfil próprio); troque à vontade
iuri --account trabalho login # loga uma conta específica nesse slot
iuri --anon "..." # MODO ANÔNIMO: usa sem login, enquanto o provedor deixar
iuri reset-anon # esgotou o anônimo? zera (cookies + user-agent) → quota novaA troca de sessão é automática: pedir --anon ou --account X reinicia o daemon na
sessão certa. Recuperação quando esgota: reset-anon (nova identidade anônima),
trocar de conta (--account), ou trocar de IA (--provider).
Anti-ban
Automação de UI fere o ToS — não há garantia contra ban. Mitigações: digitação
humanizada + jitter, gap mínimo entre envios (IURI_MIN_GAP_MS), teto/h
(IURI_MAX_PER_HOUR), e detecção de limite → back-off (recua em vez de martelar).
Se cair: troque de provedor/conta ou IP. O Chrome roda off-screen (não headless —
headless apanha do Cloudflare).
Segurança em operações de máquina
O agente pode instalar/limpar/baixar/configurar via PowerShell, mas comandos
destrutivos/de sistema (netsh, Remove-Item -Recurse, format, reg delete...)
SEMPRE pedem confirmação — mesmo em --bypass. Para liberar em modo não-interativo:
IURI_ALLOW_DANGER=1 (use com cuidado).
O daemon sobe sozinho na primeira chamada (não precisa iniciar nada).
A sessão fica salva em profile/ — só precisa de iuri login na 1ª vez ou
quando a sessão expirar.
Modo agente
Em terminal interativo, iuri vira um agente como o Claude Code: o modelo pede
ações num protocolo JSON e o CLI executa de verdade no seu PC, em loop, até a
resposta final. Ferramentas:
| Ferramenta | Args | O que faz |
|---|---|---|
| list_dir | path | lista arquivos/pastas |
| read_file | path, start?, end? | lê arquivo (intervalo de linhas numeradas) |
| glob | pattern | lista caminhos por padrão |
| grep | pattern, path, glob?, flags? | busca regex no conteúdo (pula node_modules/.git) |
| write_file | path, content | cria/sobrescreve arquivo inteiro |
| edit_file | path, old, new, replace_all? | troca trecho único (com checagem de unicidade) |
| edit_lines | path, start, end, new | troca linhas N..M (confiável p/ código) |
| delete | path, recursive? | apaga arquivo/pasta |
| git | args (lista), cwd? | roda git (status/log/diff não pedem confirmação) |
| run | command | executa no PowerShell |
| db_query | database, sql, server?, connection? | roda SQL num banco e devolve as linhas |
Bancos de dados (db_query)
Credenciais ficam em db.json (local, gitignored) — o modelo só manda o SQL,
nunca vê senha. Para os bancos configurados, o agente usa só {database, sql} e a
ferramenta abre o túnel SSH sozinha quando o Postgres não é exposto.
Para um banco ad-hoc, o agente passa connection inline:
// Postgres/MySQL (com túnel SSH opcional)
{"engine":"postgres","host":"localhost","port":5432,"user":"u","password":"p",
"ssl":true,"ssh":{"host":"1.2.3.4","user":"root","password":"..."}}
// SQLite
{"engine":"sqlite","file":"C:/caminho/base.db"}Engines nativos: postgres, mysql/mariadb, sqlite. Outros (mssql, etc.)
carregam o driver sob demanda (npm install <driver>). SQL que altera dados
(insert/update/delete) pede confirmação [s/N].
Para adicionar um banco fixo, edite db.json:
{
"servers": {
"meu-server": {
"ssh": {"host":"1.2.3.4","user":"root","password":"..."},
"pg": {"host":"localhost","port":5432,"user":"dev","password":"...","ssl":true},
"databases": ["app1","app2"]
}
},
"default": "meu-server"
}--agentforça o modo agente (mesmo fora de terminal);--chat/-pvoltam ao chat puro, sem ferramentas.- Caminhos usam barra normal (
C:/dev). O agente vê o sistema de arquivos real.
Permissões (estilo Claude Code)
Ações que mexem no disco/banco (write_file, edit_file, delete, run, git
mutante, db_query não-leitura) pedem confirmação 3-vias:
permitir rodar: npm install?
[s] só agora · [a] sempre nesta sessão (run) · [N] não ›[a]lembra aquele tipo de ação pelo resto da sessão (não pergunta de novo).- Bypass (nunca pergunta): inicie com
iuri --bypass(ou--yes), use/bypassno REPL, ou simplesmente diga "não precisa pedir permissão" / "pode fazer sem pedir" — ele entende e para de perguntar (/bypass offou "volte a pedir" desliga).
Codar
Rode iuri dentro da pasta do projeto — o agente carrega o contexto automaticamente:
- lê
CLAUDE.md/AGENTS.md/.claude/CLAUDE.md/.cursorrulese segue as convenções; - lista as skills em
.claude/skills/(lê oSKILL.mdda relevante); - conhece os
scriptsdopackage.json.
Fluxo de código embutido: ler → editar cirúrgico (edit_lines) → rodar testes/build
(run) → corrigir até passar. O agente é instruído a verificar com npm test/build
antes de dizer que terminou, e a escrever testes quando pedido. Caminhos podem ser
relativos à pasta atual.
Contexto (memória da conversa)
No REPL o agente mantém o contexto entre as mensagens — pode dizer "agora
implemente aquilo", "e a população dela?", etc., que ele lembra do que veio antes.
/new começa uma conversa limpa.
Mudou o código do agente/ferramentas? Reabra o
iuri— o REPL carrega o código uma vez no início da sessão.
Integração com outras apps
Bata direto na API HTTP local (http://127.0.0.1:4179):
| Rota | Corpo | Retorno |
|------|-------|---------|
| GET /status | — | { ready, state, loggedIn, mode } |
| POST /chat | { message, continue? } | { reply } |
| POST /chat/stream | { message, continue? } | SSE: event: delta / done |
| POST /extract | { text, schema } | { data, attempts } |
| POST /login | — | { ok, state } |
| POST /shutdown | — | { ok } |
Estado da sessão (state): ready · login (deslogado) · challenge
(Cloudflare) · loading. Quando não está ready, /chat e /extract
respondem 409 com mensagem clara; rode iuri login.
Arquitetura
bin/iuri.js CLI cliente (node:http, encerra limpo no Windows)
src/daemon.js servidor HTTP local + fila serial (1 prompt por vez)
src/browser.js Chrome persistente; modos hidden/visible/headless; getState()
src/chat.js enviar / esperar stream / ler resposta (ask, askStream)
src/extract.js texto -> JSON validado (ajv) com retry
src/selectors.js seletores do DOM — ÚNICO ponto a corrigir se a UI mudar
schemas/ JSON Schemas dos extratoresModos do navegador
hidden(padrão): Chrome real fora da tela — passa pelo Cloudflare e não mostra janela. É o que faz parecer "headless" sem ser bloqueado.visible: janela normal (usado noiuri login).headless: sem janela de verdade — costuma ser bloqueado pelo Cloudflare, evite. (IURI_CLI_MODE=headlesspara forçar.)
Notas
- É automação da UI web → fere o ToS da OpenAI. Uso pessoal, baixo volume.
- Se a OpenAI mudar a interface, ajuste
src/selectors.js. - Iniciar no boot (opcional): crie uma tarefa no Agendador de Tarefas que rode
node C:\dev\iuri\src\daemon.jsno logon. Sem isso, o auto-spawn já cobre.
