Ferramenta de engenharia builtin para ler, editar, patchar e executar tarefas com rollback.
O @coder e a suite de engenharia usada pelo Modo Coder (/coder). Ele fornece ações para ler/procurar arquivos, aplicar patches com segurança, rodar comandos e reverter alterações.
O @coder e um plugin builtin — já vem embutido no binario do ChatCLI e funciona imediatamente, sem instalação. Se precisar de uma versão customizada, basta colocar o binario em ~/.chatcli/plugins/ e ele prevalece sobre o builtin. Ao remove-lo, o builtin volta automaticamente no próximo /plugin reload.
<!-- Escrever arquivo novo (texto) --><tool_call name="@coder" args='{"cmd":"write","args":{"file":"hello.txt","content":"Hello, World!"}}'/><!-- Escrever com conteúdo em base64 --><tool_call name="@coder" args='{"cmd":"write","args":{"file":"data.bin","content":"SGVsbG8gV29ybGQ=","encoding":"base64"}}'/><!-- Adicionar ao final de um arquivo --><tool_call name="@coder" args='{"cmd":"write","args":{"file":"notes.txt","content":"\nNova linha adicionada","append":true}}'/>
Use --encoding base64 para conteúdo que contenha caracteres especiais, quebras de linha complexas ou dados binarios. Isso evita problemas de escape no JSON.
patch -- Aplicar Patches
Aplica alterações a um arquivo existente. Suporta dois modos: search/replace (substitui um trecho especÃfico) e unified diff (aplica um patch no formato diff).
O modo base64 e fortemente recomendado para patches, especialmente quando o conteúdo contem aspas, barras invertidas ou múltiplas linhas. Isso elimina problemas de escape no JSON.
tree -- Estrutura de Diretorios
Lista a estrutura de diretorios no formato arvore. Util para entender a organizacao do projeto.
<!-- Busca simples --><tool_call name="@coder" args='{"cmd":"search","args":{"term":"TODO","dir":"."}}'/><!-- Busca em arquivos Go com mais contexto --><tool_call name="@coder" args='{"cmd":"search","args":{"term":"func main","dir":".","glob":"*.go","context":5}}'/><!-- Busca com limite de resultados --><tool_call name="@coder" args='{"cmd":"search","args":{"term":"error","dir":"./pkg","max-results":20}}'/>
<!-- Todos os arquivos alterados --><tool_call name="@coder" args='{"cmd":"git-changed","args":{}}'/><!-- Apenas arquivos staged --><tool_call name="@coder" args='{"cmd":"git-changed","args":{"staged":true}}'/>
Quando uma refatoração precisa tocar vários arquivos como uma unidade (renomear identificador propagado por 5 arquivos, atualizar import em todos os consumidores, etc.), use multipatch em vez de uma cadeia de patch. O contrato:
1
Phase 1 — validação (sem escrita)
Para cada edição na ordem declarada, o engine carrega o arquivo, simula o search→replace em memória, e verifica que o search continua presente após edições anteriores ao mesmo arquivo. Falha em qualquer edição aborta a transação antes de qualquer escrita ao disco.
2
Phase 2 — commit
Snapshot de cada arquivo afetado em memória + escrita do conteúdo final. Falha em qualquer escrita restaura todos os arquivos a partir do snapshot.
3
Concorrência
Mutex por arquivo (chave: path absoluto), aquisição em ordem ordenada — duas transações que tocam o mesmo par de arquivos nunca deadlockam. Permissões do arquivo (chmod) são preservadas.
O @coder implementa um sistema de backup automático para proteger contra alterações indesejadas.
1
Escrita ou Patch
Quando você executa write ou patch, o plugin verifica se o arquivo-alvo já existe.
2
Criacao do Backup
Se o arquivo existe, uma copia e salva com a extensao .bak (ex: main.go -> main.go.bak).
3
Aplicação da Alteracao
O conteúdo novo e escrito (ou o patch e aplicado) no arquivo original.
4
Rollback DisponÃvel
A qualquer momento, você pode usar rollback --file main.go para restaurar a versão anterior a partir do .bak.
5
Limpeza
Use clean para remover todos os arquivos .bak quando não precisar mais dos backups.
O backup e sobrescrito a cada nova operação de write ou patch no mesmo arquivo. Se você fizer múltiplas alterações, apenas a versão imediatamente anterior estara disponÃvel para rollback.
O @coder aplica diversas validações de segurança em todos os caminhos de arquivo:
Limite de Workspace
Todos os caminhos são resolvidos relativamente ao diretório de trabalho (workspace). Tentativas de acessar arquivos fora do workspace são bloqueadas (ex: ../../etc/passwd).
Resolução de Symlinks
Symlinks são resolvidos antes da validação. Um symlink que aponte para fora do workspace será rejeitado, mesmo que o caminho aparente esteja dentro do diretório permitido.
Caminhos Sensiveis
Caminhos para arquivos sensiveis do sistema (ex: /etc/shadow, /etc/passwd) são bloqueados por padrão, impedindo leitura ou escrita.
Comandos Perigosos
O subcomando exec filtra padroes destrutivos conhecidos como rm -rf /, dd, fork bombs e outros. Esses comandos são rejeitados antes da execução.
No modo /coder, o assistente responde com um bloco reasoning e em seguida um tool_call. Aqui está um fluxo completo de engenharia:
<!-- 1. Entender a estrutura do projeto --><tool_call name="@coder" args='{"cmd":"tree","args":{"dir":".","glob":"*.go"}}'/><!-- 2. Buscar onde uma função e definida --><tool_call name="@coder" args='{"cmd":"search","args":{"term":"func HandleRequest","dir":".","glob":"*.go"}}'/><!-- 3. Ler o arquivo relevante --><tool_call name="@coder" args='{"cmd":"read","args":{"file":"handler.go","start":15,"end":45}}'/><!-- 4. Aplicar uma correcao --><tool_call name="@coder" args='{"cmd":"patch","args":{"file":"handler.go","search":"return nil","replace":"return fmt.Errorf(\"missing parameter: %s\", name)"}}'/><!-- 5. Rodar os testes --><tool_call name="@coder" args='{"cmd":"test","args":{"dir":".","timeout":60}}'/><!-- 6. Verificar o que mudou --><tool_call name="@coder" args='{"cmd":"git-diff","args":{}}'/><!-- 7. Se algo deu errado, reverter --><tool_call name="@coder" args='{"cmd":"rollback","args":{"file":"handler.go"}}'/>
O @coder outorga poder de leitura/escrita em arquivos e execução de comandos, tudo passivel de rollback quando solicitado. Use em repositorios confiaveis.
Por ser builtin, o @coder aparece em /plugin list com a tag [builtin]. Não e possivel desinstala-lo via /plugin uninstall.
Use --search/--replace para substituicoes simples e pontuais em um único local do arquivo. Use --diff quando precisar aplicar múltiplas alterações ao mesmo tempo ou quando a alteracao envolve adicao/remocao de linhas em diferentes trechos do arquivo. O diff pode ser codificado em text ou base64.
O exec e perigoso?
O @coder exec bloqueia padroes perigosos por padrão, como rm -rf /, dd em alvos de disco e fork bombs. A proteção e automática e não precisa ser configurada.
O que acontece se eu fizer write duas vezes no mesmo arquivo?
O backup .bak e sobrescrito a cada operação. Apenas a versão imediatamente anterior a ultima escrita estara disponÃvel para rollback. Se precisar de histórico completo, use git para gerenciar versões.
Posso usar @coder fora do modo /coder?
Sim. O plugin @coder pode ser invocado em qualquer modo que suporte tool_calls. O modo /coder simplesmente configura o system prompt para guiar o modelo a usar @coder como ferramenta principal.
Como substituir o @coder builtin por uma versão customizada?
Coloque um binario com o mesmo nome no diretório ~/.chatcli/plugins/. Ele prevalecera sobre o builtin. Para voltar ao builtin, remova o binario customizado e execute /plugin reload.
O --encoding base64 e necessário?
Não e obrigatório, mas e fortemente recomendado para write e patch quando o conteúdo contem caracteres especiais, aspas, barras invertidas ou múltiplas linhas. O base64 elimina completamente problemas de escape no JSON.