CLI iugu
A CLI iugu é a linha de comando do Console para desenvolvedores e seus agentes de código: cria, configura, testa e publica aplicativos, pede credenciais, acompanha aprovações e chama ações de apps provedores — no terminal ou dentro de uma sessão do Claude Code, Codex, Cursor e similares. Toda saída tem um modo --json estável e códigos de saída com significado, e as mudanças sensíveis passam pelo mesmo circuito de aprovação humana do Console (veja Agentes e aprovações).
O código é aberto (MIT) em github.com/iugu/cli; as releases são assinadas e publicadas em quatro canais.
Instalar
brew install iugu/tap/iugu # macOS e Linux (Homebrew)
curl -fsSL https://raw.githubusercontent.com/iugu/cli/main/install.sh | sh # qualquer Unix
scoop bucket add iugu https://github.com/iugu/scoop-bucket && scoop install iugu # Windows
npx @iugu/cli --help # via npm, sem instalar
Info
Cada release é construída pelo GitHub Actions a partir de uma tag do repositório, assinada com cosign (sem chaves, via OIDC do GitHub) e acompanhada de um SBOM por arquivo. install.sh, o Homebrew e o pacote npm conferem o binário baixado contra o checksums.txt assinado. Para verificar manualmente:
cosign verify-blob --certificate checksums.txt.pem --signature checksums.txt.sig --certificate-identity-regexp 'github.com/iugu/cli' --certificate-oidc-issuer https://token.actions.githubusercontent.com checksums.txt
Confira com iugu --version. Os binários são para macOS, Linux e Windows (amd64 e arm64); completions para bash, zsh e fish acompanham o Homebrew e o arquivo da release.
Entrar
iugu login # abre o navegador: login no Console + consentimento (escopos × áreas de trabalho)
iugu login --no-browser # imprime a URL para abrir em outra máquina
iugu auth status --json # quem está logado, escopos, áreas de trabalho consentidas
iugu me # a pessoa e suas áreas de trabalho
iugu workspace use <id> # área de trabalho padrão dos comandos seguintes
iugu logout # revoga o consentimento no servidor e esquece a credencial local
O login é um fluxo OAuth 2.1 com PKCE contra https://identity.iugu.com; o token de atualização fica no chaveiro do sistema operacional (macOS Keychain, Secret Service, Gerenciador de Credenciais do Windows) e, onde não há chaveiro — Linux sem sessão gráfica, contêineres — em ~/.config/iugu/credentials.json com permissão 0600 (a CLI avisa uma vez). IUGU_TOKEN=<token de deploy> no ambiente vence qualquer login gravado e nunca toca o disco.
| Preciso de… | Faça |
|---|---|
| Vários logins ou outra instância do Console | Perfis: iugu --profile dev login --api https://api.console.<host>; depois --profile dev ou IUGU_PROFILE=dev em cada comando. O perfil padrão continua apontando para a produção. |
| Ampliar o consentimento (nova área de trabalho, novo escopo) | iugu login --workspace <id> ou iugu login --scopes "<lista>"; o Console mescla no consentimento existente. |
| Um login só deste projeto (por exemplo, para um agente) | IUGU_CONFIG_DIR=.iugu iugu login — a pasta .iugu/ é adicionada ao .gitignore; prefixe os comandos seguintes com a mesma variável. |
Cada instalação da CLI é um portador de credencial próprio: aparece em Agentes conectados com o nome da máquina e pode ser revogada individualmente.
Cinco minutos
iugu login
iugu me
iugu app init --name "Acme Invoices" --workspace <id da área de trabalho de desenvolvimento>
# → cria o app (privado, rascunho), instala na área de trabalho, pede uma credencial restrita a ela
# (uma aprovação humana: saída 5 com approval.url) e escreve iugu.toml
iugu changeset wait <id> --write-env .env.local # espera a aprovação; o segredo vai para .env.local (0600)
iugu app permissions set --implemented invoice.create,invoice.read --grant-scopes informations
iugu test-principal create --name qa # principal temporário com papéis ⊆ os seus, 1 h
iugu verify --principal temp:… --action acme-invoices:invoice.create
iugu app env --format fly # variáveis não secretas para o alvo de deploy
iugu changeset create --op 'oauth.update:{"url":"https://acme.example","callbacks":["https://acme.example/oauth/callback"]}' \
--op 'listing.publish:{"public":true,"draft":false}' --submit --wait
O passo a passo comentado — pelo Console e pela CLI — está em Criar um aplicativo.
Comandos
| Comando | Para quê |
|---|---|
login, logout, auth status, auth token, me |
Sessão e identidade. |
workspace list, workspace use <id> |
Áreas de trabalho consentidas e a padrão do perfil. |
app init, app list, app get, app update, app publish, app discard |
O ciclo de vida do app. publish e discard geram aprovação. |
app install, app uninstall, app resync |
Instalações: imediatas para apps próprios, aprovação para apps de terceiros; resync aceita permissões alteradas. |
app permissions get\|set, app entitlements set, app agreements list\|publish, app images … |
Permissões, privilégios, contratos e imagens (Tier 0). |
app oauth set, app credentials list\|create\|rotate\|revoke, app certificates …, app ip-whitelist set\|test, app deploy-tokens … |
Segurança do app — escritas geram aprovação; segredos são entregues uma única vez. |
app token, app env --format dotenv\|fly\|railway\|netlify\|vercel\|json |
Um token curto do app para testes; o ambiente de integração para o alvo de deploy. |
app actions list\|call |
O manifesto de ações do app como o Console o leu, e uma chamada de teste com o token do próprio app. |
call <app> <ação> --arg k=v … \| --input '{…}' |
Chama uma ação de um app provedor como você (Central de Cobranças: planos, preços, publicação, relatórios). |
changeset create\|show\|submit\|wait\|secrets\|withdraw\|list, approvals list\|open\|wait |
Conjuntos de mudanças e aprovações. |
verify, test-principal create\|list\|delete |
Testar autorização sem usuários reais. |
gia roles\|policies\|members\|invites … |
Leituras imediatas; escritas viram aprovação (console:gia.write). |
catalog actions --q <texto> |
Ações consumíveis dos apps instalados. |
agent setup, docs [tópico], completion |
Configurar assistentes de IA, ler o roteiro embutido, completions de shell. |
Flags globais: --json, --jq <expressão>, --api, --profile, --credentials-store keyring|file|ephemeral, --idempotency-key, --yes, --agent auto|yes|no. Os comandos que geram aprovação aceitam --wait, --timeout, --write-env <arquivo> e --exec "<comando> {secret}".
Códigos de saída
| Código | Significado | O que fazer |
|---|---|---|
0 |
Sucesso | |
1 |
Erro | Leia error.code e error.message no JSON. |
2 |
Uso incorreto ou cancelado | |
4 |
Login necessário | iugu login (ou iugu login --non-interactive por um agente, entregando a URL a uma pessoa). |
5 |
Aprovação necessária | O payload traz approval.url, change_set_id e next_step; uma pessoa aprova no navegador e iugu changeset wait <id> continua de onde parou. |
6 |
Recurso desatualizado ou conflito | Releia e repita. |
7 |
A pessoa precisa agir no consentimento | O payload traz url: verificar a identidade (elevação de 15 min) ou ampliar o consentimento; depois, o mesmo comando. |
Para agentes de código
A CLI carrega o seu próprio roteiro para agentes: iugu docs imprime a skill completa (o caminho recomendado, o que exige uma pessoa, como esperar aprovações, política de segredos, alvos de deploy, rotação de credenciais, sandboxes) e iugu docs --llms um resumo curto; iugu docs <tópico> mostra uma seção (golden-path, tiers, secrets, deploying, rotation, integration, actions, billing, sandboxes, exit-codes, approval-policy).
iugu agent setup --all # escreve a entrada do Iugu for AI (MCP) e a skill para Claude Code, Codex, OpenCode, Cursor e VS Code
iugu agent setup --print # mostra os trechos sem gravar
Regras que a skill ensina ao agente — e que valem para qualquer automação:
- chamar sempre com
--jsone decidir pelo código de saída e porerror.code; - nunca pedir um segredo à pessoa nem ecoá-lo:
--write-env <arquivo>grava com0600,--exec "<comando> {secret}"substitui em processo; - entregar
approval.urlà pessoa e esperar comchangeset wait— a aprovação é dela, não do agente; - um comando por chamada de shell, para que o próprio harness veja o código de saída.
Deploy e CI
iugu app env --format railway # ou fly, netlify, vercel, dotenv, json: as variáveis públicas do app
iugu changeset wait <id> --exec 'fly secrets set IUGU_CLIENT_SECRET={secret}' # o segredo vai direto ao cofre do alvo
iugu app deploy-tokens create --scope oauth,rotate_self --expires 24h # token para o pipeline (aprovação)
IUGU_TOKEN=<token> iugu app credentials rotate --id <credencial> --wait --exec '…' # no CI: rotação sem janela
Um token de deploy age sobre um único app e só para URL e callbacks (oauth), filtro por IPs (ip_whitelist) e rotacionar a própria credencial (rotate_self).
Contrato e compatibilidade
As formas do --json seguem o contrato publicado da Lifecycle API — api-v1.yaml — e a skill embutida é atualizada a cada mudança do contrato. Antes da versão 1.0 as formas podem mudar entre releases; as notas de cada release em github.com/iugu/cli/releases listam as mudanças. Problemas de segurança: veja o SECURITY.md do repositório.