Dukk CLI
dukk · referência
O Dukk é um agente de IA para o terminal (harness Rust, antigo "Elai Code").
Ele roda como uma REPL/TUI interativa, mas também tem um modo inline não-interativo
(dukk prompt) e subcomandos para autenticação, sessões, modelo e
inicialização de projeto. Esta página documenta todas as flags globais, subcomandos e
slash commands.
O CLI é distribuído como um único binário chamado dukk. Sem nenhum subcomando,
dukk abre a TUI interativa (REPL); com um subcomando ou com
dukk prompt, ele executa uma ação e sai. O parsing de argumentos é
hand-rolled (não usa clap): as flags globais (--model,
--permission-mode, --output-format,
--dangerously-skip-permissions, --no-tui, --swd,
flags de budget, etc.) vêm antes do subcomando.
Instalação
# macOS / Linux
curl -fsSL https://get.nexcode.live | sh
# Windows (PowerShell)
irm https://get.nexcode.live/ps | iex
O instalador coloca o binário em /usr/local/bin/dukk (ou equivalente no PATH).
Invocação
# Abre a TUI interativa (sem subcomando)
$ dukk
# Ajuda geral e por subcomando
$ dukk --help
$ dukk prompt --help
# Versão
$ dukk --version
dukk login (ou importe credenciais do
Claude Code com dukk login --import-claude-code) e, opcionalmente, inicialize
o projeto com dukk init. Hoje o init cria o diretório
.dukk/ e o arquivo de instruções ELAI.md
(legado, em migração — ainda não DUKK.md),
e indexa o código para RAG.
prompt)
dukk prompt "<texto>" roda um prompt único de forma não-interativa e sai —
ideal para scripts, pipelines e automações. Combine com as flags globais para controlar
modelo, permissões e formato de saída.
Exemplos básicos
# Prompt simples (texto na saída padrão)
$ dukk prompt "explique o que faz a função main do projeto"
# Várias palavras viram um único prompt (não precisa de aspas, mas recomenda-se)
$ dukk prompt resuma o README em 3 bullets
Escolhendo modelo e formato de saída
# Saída JSON estruturada (ótimo para parsear em scripts)
$ dukk --output-format json prompt "liste os endpoints da API"
# Saída em texto (default)
$ dukk --output-format text prompt "gere testes para o módulo de auth"
# Trocar o modelo só para esta execução (nome completo ou alias)
$ dukk --model claude-haiku-4-5-20251001 prompt "revise este diff em busca de bugs"
--output-format aceita apenas text ou json
(não há ndjson). A opção -p/--print também força saída não-interativa.
Permissões em automações
# Modo somente-leitura: o agente não modifica arquivos
$ dukk --permission-mode read-only prompt "audite a segurança do crate server"
# Workspace-write: permite escrita dentro do workspace
$ dukk --permission-mode workspace-write prompt "aplique o lint fix sugerido"
# Pula TODAS as confirmações de permissão (acesso total — use com cuidado)
$ dukk --dangerously-skip-permissions prompt "renomeie a variável foo para bar em todo o projeto"
# Forma curta de prompt one-shot (compat Elai Code): -p
$ dukk -p "explique a arquitetura do crate server"
--model, --permission-mode,
--output-format, --dangerously-skip-permissions,
--swd, flags de budget, etc.) vêm antes do subcomando.
Não existem as flags --yes, --no nem --config
no runtime atual (o parser real é o parse_args() hand-rolled em
main.rs, não o parser clap legado).
Aplicáveis a qualquer invocação do dukk, antes do subcomando.
Extraídas do parser real (parse_args() em main.rs).
| Flag | Default | Descrição |
|---|---|---|
--model <MODEL> |
dinâmico | Modelo a usar nesta execução. Aceita nome completo ou alias. O default não é fixo: vem de suggested_default_model() — escolhe conforme a credencial ativa (Anthropic → claude-haiku-4-5-20251001; OpenAI → gpt-4o-mini/gpt-5.5; xAI → grok-3; etc.). |
--permission-mode <MODE> |
config | Política de permissão de escrita. Valores: read-only, workspace-write, danger-full-access. |
--dangerously-skip-permissions |
off |
Atalho para danger-full-access: pula todas as confirmações de permissão. Use com cuidado. |
--output-format <FMT> |
text |
Formato da saída. Valores aceitos: text, json (não existe ndjson). |
-p, --print |
off |
-p "<texto>" = prompt one-shot não-interativo (compat Elai Code). --print apenas força saída em text não-interativa. |
--no-tui |
off |
Não abre a TUI ratatui; usa o REPL inline (modo texto) mesmo sem subcomando. |
--no-cache |
off |
Desabilita o cache de respostas nesta execução. |
--orchestrate |
off |
Liga o modo de orquestração (define ELAI_ORCHESTRATE=1). |
--swd <LEVEL> |
full |
Nível do Strict Write Discipline: off, partial ou full. Ver seção SWD. |
--budget-tokens <N> |
— | Teto de tokens para a execução. Avisa em 80% do limite. |
--budget-usd <F> |
— | Teto de custo em USD. |
--budget-turns <N> |
— | Teto de turnos do agente. |
--no-budget |
off |
Ignora qualquer teto de budget (sobrepõe as flags --budget-*). |
--allowedTools, --allowed-tools <CSV> |
— | Restringe as tools permitidas (lista separada por vírgula). Repetível — os valores são acumulados. |
--system-prompt <TEXT> |
— | Substitui o system prompt por completo nesta execução. |
--append-system-prompt <TEXT> |
— | Acrescenta texto ao final do system prompt padrão. |
--version, -V |
off |
Imprime a versão e sai. |
--help, -h |
off |
Mostra a ajuda e sai. |
--resume <SESSION.json> |
— | Retoma uma sessão salva a partir do snapshot JSON. |
Use dukk <subcomando> --help para o texto autoritativo de cada um.
Roda um prompt não-interativo e sai.
Argumentos
| Arg | Descrição |
|---|---|
<prompt>... | Texto do prompt (uma ou mais palavras; são unidas em um único prompt). |
$ dukk prompt "qual a arquitetura do crate server?"
$ dukk --output-format json prompt "liste as migrations pendentes"
Autentica com a Anthropic ou um provedor de terceiros. Os métodos abaixo são mutuamente exclusivos.
Flags
| Flag | Descrição |
|---|---|
--console | Login via Anthropic Console (cria uma API key). |
--claudeai | Login via claude.ai (OAuth de assinante Pro/Max/Team/Enterprise). |
--sso | Login via SSO (fluxo claude.ai com login_method=sso). |
--email <EMAIL> | Pré-preenche o e-mail na página de OAuth (login_hint). |
--api-key | Cola uma API key da Anthropic (sk-ant-...). Use --stdin para pipe; senão pergunta de forma segura. |
--token | Cola um ANTHROPIC_AUTH_TOKEN (Bearer token). Use --stdin para pipe. |
--use-bedrock | Muda para AWS Bedrock (define CLAUDE_CODE_USE_BEDROCK=1; credenciais AWS via cadeia padrão). |
--use-vertex | Muda para Google Vertex AI (define CLAUDE_CODE_USE_VERTEX=1). |
--use-foundry | Muda para Azure Foundry (define CLAUDE_CODE_USE_FOUNDRY=1). |
--no-browser | Imprime a URL de OAuth sem abrir o navegador (CI / shells remotos). |
--stdin | Lê o valor secreto do stdin (para --api-key e --token). |
--legacy-elai | Usa o fluxo OAuth legado da elai.dev (deprecated). |
--import-claude-code | Importa credenciais do Claude Code (~/.claude/credentials.json) sem interação. |
--codex-oauth | Login OAuth via Codex/OpenAI (codex login) e importa credenciais. |
--import-codex | Importa OAuth do Codex/ChatGPT de ~/.codex/auth.json (ou $CODEX_HOME/auth.json). |
$ dukk login --claudeai
$ dukk login --import-claude-code
$ echo "sk-ant-..." | dukk login --api-key --stdin
Limpa as credenciais de autenticação salvas.
$ dukk logout
Mostra ou lista métodos de autenticação.
Subcomandos
| Comando | Descrição |
|---|---|
auth status [--json] | Mostra o método ativo, validade e escopos. --json para saída estruturada. |
auth list | Lista todos os métodos de login disponíveis. |
$ dukk auth status --json
$ dukk auth list
Envia uma mensagem diretamente, sem abrir a TUI.
Argumentos e flags
| Arg/Flag | Descrição |
|---|---|
<message>... | Mensagem a enviar. Use - ou --stdin para ler do stdin. |
--wait | Aguarda a resposta completa antes de retornar (default: streaming). |
--json | Saída da resposta em JSON. |
--stdin | Lê a mensagem do stdin. |
$ dukk send "como rodar os testes do workspace?"
$ dukk send --wait --json "explique isto"
$ cat erro.log | dukk send --stdin
Visualiza o histórico de chat.
Subcomandos
| Comando | Descrição |
|---|---|
chat show [--last N] [--json] | Mostra o histórico recente. --last define o número de mensagens (default 20); --json para saída estruturada. |
$ dukk chat show --last 5
$ dukk chat show --json
Gerencia o modelo ativo.
Subcomandos
| Comando | Descrição |
|---|---|
model get | Mostra o modelo atualmente ativo. |
model set <model> | Define o modelo ativo. Nome ou alias (ex.: opus, sonnet, claude-opus-4-6). |
$ dukk model get
$ dukk model set claude-opus-4-6
Responde a uma pergunta pendente do modelo.
Argumentos e flags
| Arg/Flag | Descrição |
|---|---|
<answer>... | A resposta a fornecer. |
--stdin | Lê a resposta do stdin. |
$ dukk reply "sim, pode prosseguir"
$ echo "opção 2" | dukk reply --stdin
Mostra o status da sessão atual.
Flags
| Flag | Descrição |
|---|---|
--json | Saída em JSON. |
$ dukk status
$ dukk status --json
Inicializa o projeto: cria .dukk/ e o arquivo ELAI.md (legado, em migração), e indexa o código para RAG.
Flags
| Flag | Default | Descrição |
|---|---|---|
--backend <B> | sqlite | Backend de armazenamento vetorial: sqlite ou qdrant. |
--qdrant-url <URL> | env / 127.0.0.1:6334 | URL gRPC do Qdrant (apenas --backend qdrant). Fallback: env DUKK_QDRANT_URL. |
--embed-provider <P> | local | Provedor de embeddings: local, ollama, jina, openai, voyage. |
--embed-model <M> | — | Modelo de embedding (override do default por provider). |
--ollama-url <URL> | — | URL do Ollama (apenas --embed-provider ollama). |
--no-watcher | false | Não roda o watcher em background após o init. |
--no-index | false | Pula a indexação (apenas cria arquivos básicos + template ELAI.md). |
--reindex | false | Apaga o índice existente e reindexa do zero. |
--start-qdrant | false | Sobe (ou inicia) um container Qdrant local via Docker. |
--qdrant-port <P> | 6333 | Porta HTTP do Qdrant quando --start-qdrant está ativo. |
--qdrant-container <N> | elai-qdrant | Nome do container Docker do Qdrant quando --start-qdrant está ativo. |
$ dukk init
$ dukk init --embed-provider ollama --ollama-url http://localhost:11434
$ dukk init --backend qdrant --start-qdrant --qdrant-port 7333
Mostra estatísticas de uso de tokens e custo.
Flags
| Flag | Descrição |
|---|---|
--days <N> | Janela de dias a considerar. |
--by-model | Agrupa o uso por modelo. |
--by-project | Agrupa o uso por projeto. |
$ dukk stats --days 30 --by-model
$ dukk stats --by-project
Lista (ou inspeciona) os agents configurados. Aceita argumentos livres repassados ao subsistema de agents.
$ dukk agents
$ dukk agents <args>
Lista (ou inspeciona) as skills disponíveis. Aceita argumentos livres.
$ dukk skills
Imprime o system prompt efetivo (útil para depurar overrides).
Flags
| Flag | Descrição |
|---|---|
--cwd <PATH> | Calcula o prompt como se o cwd fosse este caminho. |
--date | Inclui a data corrente na renderização do prompt. |
$ dukk system-prompt --cwd . --date
Verifica arquivos do código contra as entradas de memória registradas.
$ dukk verify
Verifica e instala a última release do Dukk.
$ dukk update
Remove o binário e os arquivos instalados (e, no Windows, as linhas inseridas no shell RC).
$ dukk uninstall
Retoma uma sessão salva a partir de um snapshot JSON.
$ dukk --resume sessao.json
Lê as fontes TS upstream e imprime as contagens extraídas (ferramenta de desenvolvimento).
$ dukk dump-manifests
Imprime o esqueleto da fase atual de bootstrap (ferramenta de desenvolvimento).
$ dukk bootstrap-plan
Sem subcomando, o dukk abre uma TUI ratatui (REPL interativa).
Use --no-tui para forçar o REPL em modo texto. Os atalhos abaixo
valem na entrada principal da TUI (fonte: tui.rs, input.rs, app.rs).
| Atalho | Ação |
|---|---|
| Paleta & edição | |
Ctrl+K · / | Abre a paleta de slash commands (/ abre quando a entrada está vazia). |
Tab | Abre a paleta / completa o slash command em digitação. |
@ | Insere @ e abre o seletor de file-mention (referenciar arquivos). |
Shift+Enter | Insere uma quebra de linha (multilinha). |
Enter | Envia a mensagem (ou enfileira se há turno em andamento). |
Ctrl+L | Limpa a tela / histórico visível do chat. |
Ctrl+Y | Copia a última mensagem do assistente para o clipboard. |
Shift+↑ · Shift+↓ | Navega no histórico de comandos. |
| Modos & pickers | |
Ctrl+R | Entra no modo de leitura ("leitura"). |
Ctrl+T | Cicla o tema (Elai → Sunset → Dracula → Cyber → Matrix → Corp → Amber → Crimson). |
Ctrl+B | Abre o seletor de buddy (mascote). |
F2 | Abre o seletor de modelo. |
F3 | Abre o seletor de modo de permissão. |
F4 | Abre o seletor de sessão. |
| Rolagem & saída | |
PageUp · PageDown | Rola o chat 10 linhas para cima / baixo. |
Ctrl+U · Ctrl+D | Rola meia página (5 linhas) para cima / baixo. |
Ctrl+H | Alterna o cabeçalho entre completo e compacto. |
Ctrl+C | Cancela a geração; ou limpa a entrada; ou sai (com entrada vazia). |
A entrada do REPL tem um modo vim opcional (fonte: input.rs), alternado
pelo comando /vim (mostra "Vim mode enabled/disabled"). Quando ativo, o prompt
exibe o modo entre colchetes (ex.: [INSERT] ›). Modos: INSERT,
NORMAL, VISUAL e COMMAND (ex-mode com :).
h j k l (mover), i (insert), v (visual), : (command), dd (apaga a linha), yy (copia a linha), p (cola).h j k l ajustam a seleção; v volta ao NORMAL.Esc volta ao NORMAL; Shift+Enter/Ctrl+J inserem nova linha.
Camada de disciplina de escrita do Dukk (fonte: swd.rs). Controlada pela
flag global --swd off|partial|full. O default é full.
| Nível | Comportamento |
|---|---|
off | Tools de escrita rodam normalmente, sem wrapping. Sem snapshots, sem rollback, sem audit log. |
partial | Tools de escrita rodam, mas são envolvidas: snapshot SHA-256 antes/depois de cada escrita, rollback disponível em falha, e cada transação é registrada no audit log. Blocos [FILE_ACTION] não são interpretados. |
full | Tools de escrita são bloqueadas: o modelo deve emitir blocos [FILE_ACTION:Write] / [FILE_ACTION:Delete], que são interpretados e executados transacionalmente (snapshot de tudo → executa → faz rollback de tudo se qualquer ação falhar). Cada ação pode declarar um content_hash validado após a escrita. |
Os estados de resultado registrados são Verified (mudou e o hash confere),
Noop (sem mudança), Drift (hash divergente), Failed
e RolledBack. Cada transação é gravada em JSON Lines no audit log:
# Audit log (relativo ao cwd)
.dukk/swd.log
# Uma linha JSON por ação
{"ts":1234567890,"tool":"swd_full","path":"src/foo.rs","outcome":"Verified","before":"abc123…","after":"def456…"}
full, um system prompt dedicado instrui o modelo sobre o formato dos blocos
[FILE_ACTION]. Snapshots usam SHA-256 do conteúdo do arquivo; o rollback
restaura o estado anterior (ou apaga o arquivo se ele não existia antes).
Principais variáveis lidas pelo runtime. Muitas existem em par DUKK_* /
ELAI_* (ver nota de aliasing abaixo).
| Variável | Para quê |
|---|---|
| Anthropic / Claude | |
ANTHROPIC_API_KEY | API key da Anthropic. |
ANTHROPIC_AUTH_TOKEN | Bearer token (auth alternativa à API key). |
ANTHROPIC_BASE_URL | Endpoint customizado (default: https://api.anthropic.com). |
CLAUDE_CODE_USE_BEDROCK · _USE_VERTEX · _USE_FOUNDRY | Toggles que roteiam o cliente Anthropic para AWS Bedrock / Google Vertex / Azure Foundry (sem cliente HTTP próprio — ver Providers). |
| OpenAI / xAI | |
OPENAI_API_KEY | API key da OpenAI. |
XAI_API_KEY · XAI_BASE_URL | Credencial e endpoint do xAI (Grok). |
| OpenCode | |
OPENCODE_API_KEY · OPENCODE_BASE_URL | OpenCode Zen. |
OPENCODE_GO_API_KEY · OPENCODE_GO_BASE_URL | OpenCode Go. |
| Providers locais | |
OLLAMA_BASE_URL | Servidor Ollama (presença também influencia o modelo default). |
LMSTUDIO_BASE_URL | Servidor LM Studio. |
| Modelos & comportamento | |
DUKK_DEFAULT_*_MODEL · ELAI_DEFAULT_*_MODEL | Override do modelo default por provider (ANTHROPIC, OPENAI, OPENCODE_ZEN, OPENCODE_GO, OLLAMA, LMSTUDIO). |
MAX_THINKING_TOKENS | Orçamento de extended thinking (defina 0 para desabilitar). |
ELAI_ORCHESTRATE (via --orchestrate) | Liga o modo de orquestração. |
DUKK_TELEMETRY · ELAI_TELEMETRY | Telemetria; defina off para desativar. |
DUKK_* ↔ ELAI_*. Variáveis com prefixo de produto são
lidas como DUKK_<NOME> or-else ELAI_<NOME> — o prefixo
DUKK_ tem precedência; se ausente, cai no ELAI_ (legado, em migração).
CLAUDE_CODE_API_KEY_FD → ANTHROPIC_API_KEY →
ANTHROPIC_AUTH_TOKEN (ou CLAUDE_CODE_OAUTH_TOKEN) →
AuthMethod salvo (~/.dukk/auth.json, com refresh de OAuth) →
OAuth legado em credentials.json (import do Claude Code). O keychain usado é
dukk-credentials / Elai Code-credentials
(legado).
São 7 clientes HTTP reais (fonte: api/src/providers/). Anthropic tem
cliente próprio; os demais usam a camada OpenAI-compat.
| Provider | Base URL default | Credencial |
|---|---|---|
| Anthropic | https://api.anthropic.com | ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN |
| OpenAI | https://api.openai.com/v1 | OPENAI_API_KEY |
| xAI (Grok) | https://api.x.ai/v1 | XAI_API_KEY |
| Ollama | http://localhost:11434/v1 | OLLAMA_BASE_URL |
| LM Studio | http://localhost:1234/v1 | LMSTUDIO_BASE_URL |
| OpenCode Go | https://opencode.ai/zen/go/v1 | OPENCODE_GO_API_KEY |
| OpenCode Zen | https://opencode.ai/zen/v1 | OPENCODE_API_KEY |
CLAUDE_CODE_USE_BEDROCK / _USE_VERTEX /
_USE_FOUNDRY) que se apoiam sobre o cliente Anthropic: a camada HTTP não envia
auth própria — as credenciais são resolvidas pela infra do respectivo provider (AWS SDK, etc.).
Disponíveis dentro da REPL/TUI interativa, digitando / seguido do comando.
O sufixo [resume] indica que o comando também funciona com
--resume SESSION.json. Catálogo completo (39 comandos), agrupado por categoria.
| Comando | Argumento | Resumo |
|---|---|---|
| Session | ||
/help | — | Lista os slash commands disponíveis. |
/status | — | Mostra o status da sessão atual. |
/compact | — | Compacta o histórico local da sessão. |
/clear | [--confirm] | Inicia uma nova sessão local. |
/cost | — | Mostra o uso cumulativo de tokens desta sessão. |
/resume | <caminho-da-sessão> | Carrega uma sessão salva no REPL. |
/export | [arquivo] | Exporta a conversa atual para um arquivo. |
/buddy | [pick|show] | Gerencia o mascote (escolha, exibição). |
| Behavior | ||
/model | [modelo] | Mostra ou troca o modelo ativo. |
/permissions | [somente-leitura|workspace-write|acesso-total] | Mostra ou troca o modo de permissão ativo. |
/budget | [tokens] [usd] | off | Limitador de orçamento (tokens/custo em USD). |
/tools | [why] | Inspeciona a seleção de tools da sessão atual. |
/cache | [clear|stats] | Gerencia o cache de respostas. |
/locale | [pt-BR|en] | Mostra ou troca o idioma da interface. |
| Project | ||
/config | [env|hooks|model|plugins] | Inspeciona arquivos de config do Elai ou seções mescladas. |
/memory | — | Inspeciona arquivos de memória do Elai carregados. |
/init | — | Cria um ELAI.md inicial para este repositório. |
/verify | — | Verifica arquivos do código contra entradas de memória. |
/deepresearch | <query> (alias /dr) | Pesquisa profunda com agente de IA. |
| Git | ||
/diff | — | Mostra o git diff das alterações atuais do workspace. |
/branch | [list|create <nome>|switch <nome>] | Lista, cria ou troca branches do git. |
/worktree | [list|add <caminho> [branch]|remove <caminho>|prune] | Lista, adiciona, remove ou limpa worktrees do git. |
/commit | — | Gera uma mensagem de commit e cria um commit git. |
/commit-push-pr | [contexto] | Faz commit, push da branch e abre um PR. |
/pr | [contexto] | Esboça ou cria um pull request a partir da conversa. |
/issue | [contexto] | Esboça ou cria uma issue no GitHub a partir da conversa. |
| Analysis | ||
/bughunter | [escopo] | Inspeciona o código em busca de bugs prováveis. |
/ultraplan | [tarefa] | Roda um plano profundo com raciocínio multi-etapas. |
/teleport | <símbolo-ou-caminho> | Salta para um arquivo ou símbolo pesquisando o workspace. |
/debug-tool-call | — | Reexecuta a última chamada de tool com detalhes de debug. |
| System | ||
/version | — | Mostra a versão do CLI e informações de build. |
/update | — | Verifica e instala a última release do Elai Code. |
/run | <script> [--update] [args...] | Executa um script com suporte a atualização via LLM. |
| Plugins | ||
/plugin | [list|install <caminho>|enable <nome>|disable <nome>|uninstall <id>|update <id>] | Gerencia plugins do Elai Code. Aliases: /plugins, /marketplace. |
/agents | — | Lista os agents configurados. |
/skills | — | Lista as skills disponíveis. |
/dream | [--force] | Comprime entradas antigas de memória em um resumo. |
/stats | [--days N] [--by-model] [--by-project] | Mostra estatísticas de uso de tokens e custo. |
/session | [list|switch <id-da-sessão>] | Lista ou troca sessões locais gerenciadas. |
| Avançado / oculto | ||
/collection oculto | [ação] | Comando avançado de collection. Não aparece em /help nem no catálogo público (SLASH_COMMAND_SPECS); existe só no enum/parser de slash commands. |
/unlock oculto | [ação] | Comando avançado de unlock. Igualmente fora do catálogo público — disponível apenas via digitação direta na REPL. |
Os 39 comandos acima são os registrados em SLASH_COMMAND_SPECS.
/collection e /unlock são extras ocultos (não listados no catálogo).