Ub-mode: como instalar a skill do Uncle Bob no OpenCode (e Claude Code) ✅ yoDEV Tested

ub-mode, a skill de Robert C. Martin (Uncle Bob) para que seu agente programe com TDD e clean code, se instala no OpenCode copiando um único arquivo em ~/.config/opencode/skills/ub-mode/. Se você já a tem no Claude Code, o OpenCode a detecta sem nenhum passo extra. A testamos no OpenCode 1.19.5 e 2.0.29, incluindo uma sessão real com DeepSeek V4 Pro.

:white_check_mark: yoDEV Tested · 1º de novembro de 2026
Instalamos ub-mode de cinco formas no OpenCode 1.19.5 e a testamos em uma sessão real no OpenCode 2.0.29 com DeepSeek V4 Pro, com e sem a regra no AGENTS.md. Os resultados que reportamos como nossos saem desse teste.

O README do repositório só indica caminhos de instalação para Claude Code, Cursor e Grok. A resposta para OpenCode veio da comunidade: a issue #6, “Add to OpenCode”, reuniu três métodos em dois dias, entre eles uma configuração completa que seu autor descreve como verificada. Aqui tem o que faz essa configuração, o que confirmamos nós e a única parte que não conseguimos executar.

O que é ub-mode, a skill de clean code de Uncle Bob?

ub-mode é um único arquivo SKILL.md de 152 linhas que diz ao seu agente de código como trabalhar cada vez que toca código. Martin o publicou no 25 de outubro e explica que se baseia livremente em parte das regras de @poteto (poteto-mode / pstack), recortadas e combinadas com ferramentas determinísticas. Funciona em três fases:

  • First Make it Work: escrever o teste que falha antes de mudar o código, definir bem a forma dos dados antes da lógica, tirar complexidade antes de agregar nada, validar os dados onde entram no sistema e confiar neles dentro, e fazer que as operações sejam idempotentes.
  • Then Make it Right: reproduzir um bug antes de corrigi-lo, testar comportamento e não implementação, refatorar só com o comportamento fixado por testes, e passar três controles de qualidade.
  • Practice: levar um registro de cada ação e seu motivo, manter pequena a janela de contexto principal e fazer commits pequenos e ordenados.

O que a distingue da maioria das skills de “código limpo” são esses controles de qualidade. ub-mode indica ao agente que execute três ferramentas que Martin também publicou:

Ferramenta O que mede Limite em ub-mode
crapper CRAP score por função (complexidade ciclomática × falta de cobertura de testes) toda função abaixo de 10
dryer Duplicação estrutural entre funções eliminar pares com similaridade de 0,8 ou mais
mutator Mutation testing: mutantes que seus testes não detectam cobrir o não coberto, matar sobreviventes, deletar código morto

As três suportam Clojure, Java, Go, TypeScript, Rust e Python, e precisam de Python 3.11 ou superior para executar.

ub-mode funciona no OpenCode?

Sim, tanto em 1.x quanto em 2.x. OpenCode lê skills de sua própria pasta e também das pastas do Claude Code e de agentes genéricos, então o mesmo SKILL.md funciona sem mudanças. A instalamos de cinco formas distintas em um ambiente limpo do OpenCode 1.19.5 e comprovamos cada uma com opencode debug skill, que lista todas as skills que o OpenCode pode carregar. ub-mode apareceu em todos os casos:

Método de instalação Onde fica o arquivo Resultado
curl (issue #6) ~/.config/opencode/skills/ub-mode/SKILL.md :white_check_mark:
Instalação existente do Claude Code ~/.claude/skills/ub-mode/SKILL.md :white_check_mark:
git clone + mover (issue #6) ~/.config/opencode/skills/ub-mode/ :white_check_mark:
Só no projeto .opencode/skills/ub-mode/SKILL.md :white_check_mark:
npx skills add ~/.agents/skills/ub-mode/SKILL.md :white_check_mark:

No OpenCode 2.0.29 testamos a rota de projeto (.opencode/skills/) com uma sessão real do agente: carregou a skill, como você verá mais abaixo.

Como instalar skills no OpenCode?

A instalação global da issue #6 são dois comandos:

mkdir -p ~/.config/opencode/skills/ub-mode
curl -fsSL https://raw.githubusercontent.com/unclebob/ub-mode/master/SKILL.md \
  -o ~/.config/opencode/skills/ub-mode/SKILL.md

Para um só projeto, coloque o arquivo em .opencode/skills/ub-mode/SKILL.md dentro do repositório.

Se preferir um gerenciador de pacotes, o CLI de skills a instala para OpenCode de forma global e sem perguntas:

npx skills add unclebob/ub-mode@ub-mode -g -a opencode -y

Copia a skill em ~/.agents/skills/ub-mode, uma pasta que OpenCode lê. O próprio CLI te lembra que as skills se executam com todas as permissões de seu agente, algo que convém ter presente com esta em particular (mais abaixo te explicamos por quê).

E se você já seguiu o README para Claude Code, não tem que fazer nada: OpenCode carrega ~/.claude/skills/ automaticamente. As mesmas claude code skills servem nos dois agentes.

Como comprovar que OpenCode vê a skill?

No OpenCode 1.x, execute:

opencode debug skill

Imprime em JSON a lista de skills que pode carregar. Deveria ver uma entrada chamada ub-mode com o caminho onde a instalou. OpenCode lê a configuração ao arrancar, então reinicie qualquer sessão aberta depois de instalar.

Esse comando só existe no OpenCode 1.x. Na 2.0.29, opencode debug oferece agents, config e paths, sem listado de skills. Na v2, a comprovação prática é pedir ao agente que carregue ub-mode em uma sessão nova.

Como fazer que OpenCode use a skill em cada mudança de código?

Por padrão não vai fazer. A descrição da própria skill diz que se use quando o usuário executa /ub-mode ou pede os princípios, e OpenCode decide qual skill carregar lendo essa descrição. Então o agente só recorre a ub-mode quando você pede.

A configuração da issue #6 resolve isso com uma regra em AGENTS.md, o arquivo que OpenCode lê como instruções permanentes. Este é o texto que usamos, tirado da issue:

Every time you write, modify, refactor, or fix code — in any session, without waiting for a command —
first load skill `ub-mode` (skill tool, id: `ub-mode`) and follow its rules:
First Make it Work → Then Make it Right → Practice.

O mesmo usuário sugere também editar o campo description do SKILL.md para que a skill se apresente como obrigatória em toda mudança de código.

Essa regra marca a diferença. Executamos duas vezes o mesmo pedido no OpenCode 2.0.29 com DeepSeek V4 Pro, em um repositório novo com ub-mode instalada a nível de projeto: “adicione uma função subtract a calc.py, sem commit nem push”.

Execução Configuração ¿Carregou ub-mode? Ferramentas que usou
A Skill instalada, sem regra Não read, edit
B Skill + regra em AGENTS.md Sim read, skill, shell, edit

Sem a regra, o agente ignorou a skill completamente. Com ela, chamou por sua conta a ferramenta skill do OpenCode para carregar ub-mode, fez a mudança e a verificou executando Python.

Testamos a regra em um AGENTS.md na raiz do projeto. Para uma regra global, a documentação do OpenCode indica ~/.config/opencode/AGENTS.md como o arquivo que se aplica a todas as sessões.

O agente faz TDD de verdade com ub-mode?

Não do todo, ao menos em nosso teste. Na execução B, o agente verificou a mudança com um comando de Python em linha em vez de escrever primeiro um teste, que é justamente a primeira regra de ub-mode. A regra em AGENTS.md consegue que a skill se carregue; quanto de rigor no cumprimento depende do modelo. Se o TDD é o que mais te importa, peça de forma explícita no mesmo AGENTS.md.

Como instalar crapper, dryer e mutator?

Esta é a parte onde mais gente vai se equivocar. Há duas condições, e as duas verificamos no código fonte das ferramentas:

  1. mutator precisa de crapper como pasta irmã. Se crapper não está instalado como pacote, mutator a busca em ../crapper, junto a seu próprio diretório, e se detém com um erro que te pede cloná-la aí. Por isso convém clonar as três na mesma pasta:
mkdir -p ~/.local/share/ub-tools && cd ~/.local/share/ub-tools
git clone https://github.com/unclebob/crapper
git clone https://github.com/unclebob/dryer
git clone https://github.com/unclebob/mutator
  1. Use scripts envolvedores no seu PATH, não enlaces simbólicos. O lançador de cada ferramenta cria seu ambiente virtual no diretório desde o que se executa. Se você o chama através de um symlink, esse diretório passa a ser sua pasta bin e não o da ferramenta. Um envolvedor de duas linhas o evita; crie um por ferramenta, chamados crapper, dryer e mutator:
#!/bin/sh
exec "$HOME/.local/share/ub-tools/crapper/crapper" "$@"

A primeira execução de cada ferramenta cria seu .venv e a instala. A issue #6 sugere testá-las com crapper --help, dryer e mutator --scan <arquivo>. Não conseguimos executá-las em nosso ambiente de teste: as duas condições anteriores saem de ler seus lançadores e seu código.

Sem essas ferramentas no PATH, ub-mode segue funcionando como conjunto de princípios, mas o agente gastará turnos buscando comandos que não existem, como assinala a issue #3.

Que riscos tem ub-mode?

Duas regras da skill deixam que o agente atue sem você. A issue #2 as assinala: a seção “Commit and Push” termina com um push à branch principal, e “Worktree Cleanup” deixa que o agente decida o que é seguro apagar para liberar disco. Se não quer nenhuma das duas, diga no mesmo AGENTS.md onde ativa a skill: por exemplo, que o agente faça commit mas nunca push, e que liste o que apagaria e espere sua confirmação.

Há duas coisas mais que dependem da data. No momento de publicar esta nota (1º de novembro de 2026):

  • O repositório não tem licença. A issue #5 pergunta qual se planeja e ainda não tem resposta. Importa se pensa usá-la dentro de uma empresa.
  • O arquivo pode mudar de lugar. O pull request #1, ainda aberto, move SKILL.md a skills/ub-mode/SKILL.md. Se se integra, a URL de curl de cima vai dar erro 404; em esse caso, a rota de npx skills add é a que você deve usar.

ub-mode ou Superpowers?

Resolvem o mesmo problema a distinta escala. Superpowers é um framework completo de skills e fluxos de trabalho que impede que o agente programe antes de planejar. ub-mode é um só arquivo de regras mais três ferramentas de medição: menos processo, mas com limites numéricos (CRAP abaixo de 10, nada de duplicação acima de 0,8, nenhum mutante sobrevivente) que o agente não pode esquivar com argumentos. Se você já usa Superpowers, os controles de ub-mode são a peça que vale a pena somar.


E você? Que regra exige sempre a seu agente antes de deixá-lo tocar seu código?

Seu agente escreve testes antes de mudar código?
  • Sim, exijo sempre
  • Só quando peço
  • Não, os testes os escrevo eu
  • Prefiro outra opção (conta-nos qual)
0 votantes

Comente abaixo ou, se este artigo chegou para você por email, responda direto ao email: sua resposta se publica aqui.

Relacionado: As melhores skills para agentes de IA: 21 que fazem codear sua IA como um senior