Como fazer o Claude Code respeitar o design system do projeto e parar de inventar componentes

Componente inventado, cor fora da paleta e espaçamento aleatório não são falta de talento do modelo, é falta de instrução persistente. Para o Claude Code respeitar o design system do projeto, rode /init uma vez, escreva as regras de UI no ./CLAUDE.md versionado (curto, porque arquivo curto gera mais aderência), mova a convenção pesada pro .claude/rules/ com paths no frontmatter, empacote o fluxo repetido como skill em .claude/skills/, confira com /memory o que entrou na sessão e feche o ciclo com um hook PostToolUse no matcher Edit|Write chamando o linter
Fala aí, beleza? Você pede um botão e vem um componente novo, com uma cor que não existe na paleta e um espaçamento que ninguém no time nunca usou
Aí você abre o arquivo e descobre um Button.tsx recém nascido morando do lado do Button que já existia há dois anos 😅
O problema aqui não é o modelo "não saber desenhar"
O problema é que o Claude Code não recebeu as convenções do seu repositório como instrução persistente
Ele não adivinha onde moram seus tokens, quais componentes já existem nem que criar peça nova é proibido sem conversa antes
Enquanto isso não estiver escrito em algum lugar que ele lê no começo da sessão, cada conversa começa do zero e o resultado vira sorte
Bora resolver isso?
O que você precisa antes de começar
Nada de PC da Nasa aqui, o setup é simples:
- Claude Code instalado e rodando no diretório do projeto
- um design system que exista de fato no código: tokens de cor, espaçamento e tipografia, mais uma biblioteca de componentes
- saber onde vive a pasta de UI, porque você vai escrever globs apontando pra ela
Esse terceiro item importa mais do que parece
O Claude Code procura os arquivos de memória subindo a árvore de diretórios a partir do diretório de trabalho atual, checando CLAUDE.md e CLAUDE.local.md em cada nível
Ou seja: abrir o terminal na raiz certa faz diferença
Se você abre o Claude Code dentro de apps/web/ e sua regra está na raiz do monorepo, tudo bem, ele sobe e acha
Agora se a regra está numa pasta irmã, fora do caminho que ele varre, ela simplesmente não entra na sessão e você fica achando que o modelo te ignorou
Se você ainda está montando o fluxo do primeiro projeto ao deploy, vale ajustar isso antes: memória bem posicionada resolve metade das dores de padrão
Domine o Claude Code do básico ao avançado
Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!
Passo a passo para o Claude Code respeitar seu design system
1. Rode /init uma vez no repositório
O /init faz o Claude ler a estrutura do projeto e escrever um CLAUDE.md com comandos de build, arquitetura e convenções
É o esqueleto, e você faz isso uma vez por repositório
O erro comum deste passo: rodar /init e achar que acabou
Ele mapeia o que consegue enxergar sozinho, mas a regra de "não invente componente" é decisão sua, não dedução dele
2. Escreva as regras de design no ./CLAUDE.md do projeto
Esse é o arquivo versionado no repo, então vale pra você e pra qualquer pessoa que clonar
Algo nessa linha já muda o jogo:
## Design system
- Tokens de cor, espaçamento e tipografia: `src/styles/tokens.ts`
- Componentes de UI existentes: `src/components/ui/`
- Antes de criar qualquer componente, procure o equivalente em `src/components/ui/` e reutilize
- Nunca escreva cor ou espaçamento na mão, sempre use o token
- Se realmente faltar uma peça, pare e pergunte antes de criar
Repare que não tem filosofia ali, só endereço e proibição
O erro comum deste passo: escrever um CLAUDE.md gigante
Os arquivos de memória são carregados por inteiro, não importa o tamanho, MAS arquivos mais curtos produzem melhor aderência às regras
Manifesto de design de 400 linhas não vira obediência, vira ruído
3. Separe o que é seu do que é do time
A memória tem escopos diferentes e cada um resolve uma coisa:
./CLAUDE.md: memória de projeto, versionada, vale pra quem clonar o repo~/.claude/CLAUDE.md: memória de usuário, vale em todos os seus projetos- e ainda existe o escopo gerenciado, de política da organização
Sua mania pessoal ("sempre me explique o diff antes") vai pro arquivo de usuário
A convenção de UI do produto vai pro arquivo do projeto
O erro comum deste passo: deixar a regra do time no arquivo pessoal e descobrir, semanas depois, que o resto da equipe nunca teve aquilo carregado
4. Mova a convenção pesada de UI pro .claude/rules/
Regras com escopo por caminho ficam em .claude/rules/
Uma regra sem o campo paths no frontmatter carrega no início da sessão, igualzinho ao CLAUDE.md
Já uma regra COM paths só carrega quando o Claude lê um arquivo que casa com o glob
---
paths: "src/components/**/*.tsx"
---
Nesta pasta:
- toda cor vem dos tokens, nada de hex escrito na mão
- todo espaçamento sai da escala definida, nada de valor solto
- componente novo só com aprovação explícita
O ganho é contexto: o carregamento condicional por glob só entra quando ele toca nos arquivos que casam com o padrão
Se você conhece aquele lint que só roda na pasta que importa, é a mesma ideia
O erro comum deste passo: glob errado
Se o padrão não casa com o arquivo que ele abriu, a regra não carrega e você jura que configurou tudo certo
5. Importe o doc de design com @caminho, se ele já existir
O CLAUDE.md pode importar outros arquivos com a sintaxe @caminho/do/arquivo
Útil quando o time já tem um documento de UI escrito e você não quer duplicar o conteúdo
As convenções visuais completas estão em @docs/ui-conventions.md
O erro comum deste passo: achar que importar economiza contexto
Não economiza
Os arquivos importados carregam no início da sessão do mesmo jeito, então importar um calhamaço tem o mesmo custo de colar o calhamaço
6. Empacote o fluxo repetido como skill
Quando "criar tela nova" sempre segue os mesmos passos, isso vira skill
Skills de projeto ficam em .claude/skills/<nome>/SKILL.md e são versionadas com o time
Skills pessoais ficam em ~/.claude/skills/<nome>/SKILL.md e valem em todos os projetos
Todo SKILL.md tem duas partes: frontmatter YAML entre os marcadores ---, com name e description dizendo QUANDO usar aquilo, e as instruções em Markdown
---
name: nova-tela
description: Use ao criar ou alterar telas e componentes de UI deste projeto
paths: "src/components/**"
---
1. Leia os tokens do projeto
2. Liste os componentes já existentes na pasta de UI
3. Monte a tela só com o que já existe
4. Se faltar peça, proponha alterar o componente existente antes de criar um novo
O campo paths também vale aqui: com ele, a skill carrega sozinha quando o Claude trabalha em arquivos que casam com o glob
O erro comum deste passo: description vaga
É ela que diz quando a skill deve entrar, então "regras de UI" ajuda menos do que "use ao criar ou alterar telas e componentes"
7. Confira com /memory o que entrou de verdade
Esse passo é o mais pulado e o mais útil
O /memory lista os arquivos de memória carregados na sessão (CLAUDE.md, CLAUDE.local.md e regras), deixa você abrir cada um e ainda liga ou desliga a auto memory
Antes de brigar com o modelo, olha ali e confirma que a sua regra está na lista
Já me ferrei uma vez por causa disso: regra linda, escrita no lugar errado, nunca carregada 🙂
8. Feche o ciclo com um hook depois das edições
O evento de hook PostToolUse com o matcher Edit|Write roda só depois das ferramentas que editam arquivo, e ele é configurado no .claude/settings.json
Aí você pluga o seu linter ali, aquele que já reclama de cor fora do token
Tome cuidado com a expectativa: um hook PostToolUse não desfaz a ação, porque a ferramenta já rodou
O que acontece é melhor do que parece: a saída do linter volta como texto que o Claude lê e pode corrigir
Ou seja, ele erra, o linter grita, ele conserta, tudo dentro do mesmo turno
Ele criou um componente novo sem necessidade: como reagir
Acontece
Sintoma: apareceu um Button.tsx novo em folha do lado do botão que já existia, com estilo próprio e nenhuma relação com os tokens
Causa provável: a instrução de reuso não estava carregada NAQUELE momento
Os suspeitos de sempre:
- regra com
pathscujo glob não casou com o arquivo aberto CLAUDE.mdlongo demais, com a regra afogada no meio- arquivo de memória fora da árvore que ele varre a partir do diretório atual
Solução imediata: aponte o componente existente pelo caminho e peça a troca, sem rodeio
Depois promova a correção a regra escrita
Correção que fica só no chat morre no fim da sessão, correção que vira linha no .claude/rules/ sobrevive
Como prevenir: modo plano
Ele é acionado com Shift+Tab, que cicla entre default, acceptEdits e plan, ou prefixando um único prompt com /plan
Nele o Claude lê arquivos, explora e escreve um plano sem editar o código fonte
E é justamente aí que a intenção de "vou criar um novo componente de botão" aparece escrita, enquanto ainda dá pra vetar
Isso vale ouro quando você está refatorando um projeto legado, onde inventar peça nova é o caminho mais fácil e o mais errado
A segunda camada é um subagente de revisão de UI
Subagentes customizados ficam em .claude/agents/ (projeto) e ~/.claude/agents/ (usuário), como arquivos Markdown com frontmatter
E tem a auto memory, que é o sistema complementar ao CLAUDE.md: são notas que o próprio Claude grava a partir das suas correções e preferências, carregadas no início da conversa
Então aquela bronca que você dá toda semana tende a virar nota
Se você prefere controlar isso na mão, o /memory liga ou desliga a auto memory
Design system fora do editor: o que vi no Claude Design
Tem um caminho diferente de "descrever o sistema em texto": levar o sistema pra uma canvas
O comando /design-sync é usado dentro do Claude Code pra importar o design system que vive no código (por exemplo uma biblioteca de componentes React) pro Claude Design, e também devolver o estado atual do código pra canvas
A sincronização vai nos dois sentidos, então não é só exportar e rezar
No Claude Design dá pra trazer o design system de um repositório GitHub, de arquivos de design, de uploads brutos ou do codebase local, e o Claude passa a construir com os componentes reais do sistema
A diferença conceitual é essa: em vez de você explicar o padrão por escrito, o padrão vira insumo
E fora do editor eu já testei um fluxo com essa mesma pegada de canvas, no Open Design
Clonei o repositório, entrei na pasta e segui os comandos que o próprio README indica, e digo com sinceridade: a documentação de lá explica bem o processo
Tomei um erro de permissão no terminal do VS Code durante a instalação, e o que funcionou na minha máquina foi abrir o terminal como administrador na pasta do projeto e repetir o comando
A instalação das dependências terminou com um warning, que eu avaliei como inofensivo pro uso da ferramenta
Depois de subir a versão web, a tela de setup detectou sozinha quais agentes eu já tinha instalados e ainda ofereceu a opção de usar API
Eu segui com o Claude Code mesmo
O que mais me chamou atenção: ao criar um projeto, dá pra escolher um design system inicial e o nível de fidelidade, de um frame simples até algo próximo da versão final, antes mesmo de escrever o prompt
Partir de um design system pronto evita ter que planejar tipografia e paleta do zero, e adianta MUITO o trabalho quando você quer se espelhar em uma marca de referência
Antes de gerar, a ferramenta fez uma entrevista curta comigo: superfície principal (desktop ou mobile), público, tom visual com limite de escolhas e direção visual
Na minha leitura é isso que reduz aquele resultado padronizado de IA que todo mundo já reconhece de longe
Detalhe prático: eu precisei escrever nas observações que o site deveria estar em português, porque na minha experiência essas ferramentas às vezes entregam em inglês
A tela mostra o consumo em tempo real, e como eu estava conectado pela assinatura o gasto saía da cota dela
ver esse número é bem mais útil quando você usa API
Durante a geração o agente continuou fazendo perguntas pontuais e foi anunciando as seções entregues até fechar a primeira versão
No fim eu abri o resultado no navegador: uma landing page funcional em HTML, com opção de ver o código, comentar e pedir alteração pontual
Dá pra exportar o código pra continuar o projeto na IDE ou publicar direto, e eu testei também a criação de uma apresentação, onde o fluxo de perguntas e a interface se repetem
No vídeo acima você vê o caminho inteiro rodando na minha máquina, do setup travado no erro de permissão até a página aberta no navegador
Onde cada mecanismo faz sentido
Não sai aplicando tudo de uma vez, beleza? Cada peça resolve um tipo de dor:
| Mecanismo | Use quando |
|---|---|
./CLAUDE.md |
convenção curta e permanente que todo mundo que clonar o repo precisa enxergar |
~/.claude/CLAUDE.md |
preferência sua, que vale em qualquer projeto |
.claude/rules/ com paths |
regra pesada de UI que só vale na pasta de componentes |
Skill em .claude/skills/ |
fluxo repetido, com passo a passo, versionado com o time |
Subagente em .claude/agents/ |
revisão de UI feita em contexto separado |
Hook PostToolUse |
checagem automática depois de Edit e Write |
| Modo plano | tarefa grande, com risco alto de nascer componente novo |
E agora a ressalva honesta, porque muita gente me pergunta isso
Existe o plugin frontend-design, instalado com /plugin install frontend-design@claude-plugins-official, do marketplace claude-plugins-official que é registrado automaticamente na primeira vez que você abre o Claude Code em modo interativo
O repositório oficial é o anthropics/claude-plugins-official
Só que a proposta declarada dele é gerar interfaces de frontend distintas e de nível de produção, pensando em tipografia, paleta e animação
Ou seja: ele é ótimo pra criar UI autoral, não pra impor o design system que JÁ existe no seu repositório
São problemas diferentes, e misturar os dois é receita de frustração
Conclusão
Aderência a design system no Claude Code é configuração, não sorte
O modelo não precisa de prompt mágico (dessas coisas toscas), ele precisa saber onde estão seus tokens, quais componentes existem e o que é proibido criar sem perguntar
Se você for fazer só uma coisa hoje, faça a menor delas:
- rode
/initno repositório - escreva cinco linhas de regra de design no
./CLAUDE.md - confira com
/memoryse elas entraram mesmo na sessão
Só depois disso evolua pras regras por paths, pra skill e pro hook
Começar pelo hook sem ter a convenção escrita é montar o alarme antes de ter a porta 😀
Faça o teste no seu projeto e compare a primeira tela que sair, a diferença aparece logo de cara
até o próximo post!
Perguntas frequentes
Como fazer o Claude Code parar de criar componentes duplicados no projeto?
O caminho é escrever no CLAUDE.md do projeto o endereço da pasta de componentes existentes e a proibição explícita de criar peça nova sem perguntar antes. Esse arquivo é lido no início de toda sessão como instrução persistente, então a regra vale desde a primeira mensagem da conversa.
O CLAUDE.md do design system precisa ficar na raiz do repositório?
Não precisa ficar exatamente na raiz, mas precisa estar num ponto que o Claude Code alcance. Ele procura os arquivos de memória subindo a árvore de diretórios a partir do diretório de trabalho atual, checando CLAUDE.md e CLAUDE.local.md em cada nível, então uma regra fora desse caminho simplesmente não entra na sessão.
Dá para usar um hook para checar se o Claude Code respeitou os tokens de design?
Dá, configurando o evento PostToolUse com o matcher Edit|Write no .claude/settings.json, que roda depois de qualquer edição ou criação de arquivo. Ele não desfaz a ação, já que a ferramenta já rodou, mas a saída do linter volta como texto que o Claude lê e pode usar para corrigir o próprio código.
Qual a diferença entre colocar a regra de UI no CLAUDE.md e numa regra em .claude/rules/?
O CLAUDE.md carrega inteiro no início de toda sessão, não importa o tamanho. Já uma regra em .claude/rules/ com o campo paths no frontmatter só carrega quando o Claude lê um arquivo que casa com aquele glob, o que economiza contexto em convenções específicas de uma pasta de componentes.
Quando vale a pena virar skill em vez de deixar a regra no CLAUDE.md?
Vale quando a tarefa é um fluxo repetido com passo a passo, como "criar tela nova", e não apenas uma convenção curta. Skills de projeto ficam em .claude/skills/<nome>/SKILL.md e são versionadas com o time, e o frontmatter YAML precisa de um description claro dizendo quando usar aquilo, porque é ele que faz a skill entrar na hora certa.
Como ver antes se o Claude Code vai criar um componente novo?
Use o modo plano, acionado com Shift+Tab (que cicla entre default, acceptEdits e plan) ou prefixando um único prompt com /plan. Nele o Claude lê arquivos, explora e escreve um plano sem editar o código-fonte, então a intenção de criar uma peça nova aparece escrita enquanto ainda dá tempo de vetar.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
