uxskill
Star on GitHub
Blog · Português (Brasil) · 2026-05-28

Design para programação com IA · por que toda IA entrega a mesma tela.

Quem já pediu para o Claude Code, Cursor, Windsurf, GitHub Copilot, Cline ou Continue gerar uma landing reconhece o resultado de primeira: Inter esticada até virar fonte de display, gradiente do roxo para o azul, três cartões iguais lado a lado, e logo abaixo do herói a frase «Build something amazing». O problema não está na ferramenta. Está em todas elas terem aprendido com o mesmo conjunto de templates. O ux-skill barra esses defaults dentro do CI, sem LLM, com 145 regras regex determinísticas.

Os oito defeitos visuais que toda IA entrega

Catalogamos a coleção inteira na taxonomia das impressões digitais de design de IA. Estes oito aparecem em quase toda primeira dobra gerada:

  1. Inter como fonte de display, uma fonte desenhada para legibilidade em tamanhos pequenos de tela, esticada para 90 px no herói. O oposto do seu caso de uso.
  2. Gradiente roxo para azul, a família #7C3AED → #3B82F6, sempre no fundo da primeira seção.
  3. Três cartões idênticos em linha, ícone, título de uma palavra, subtítulo de uma frase, repetidos três vezes.
  4. Fade-in-up universal, aplicado em cada filho direto de cada seção, sem distinção de papel.
  5. Tudo centralizado, herói, cartões, formulários, tudo no eixo vertical central da tela.
  6. Copy genérico, «Build something amazing», «Beautiful experiences», «Revolutionizing X», sem um único substantivo do produto.
  7. URLs de imagens de banco, placeholders genéricos no lugar de screenshots reais do produto.
  8. Sombras pesadas sobre design flat, o reflexo «precisa destacar» colide com a moda do flat e nasce uma profundidade visual confusa.

Nenhum desses defeitos isolado é erro grave. O problema é o pacote: os oito juntos, na mesma página, formam a digital reconhecível. Um, você dá de ombros. Quatro deles na mesma primeira dobra e você consegue até adivinhar qual ferramenta gerou o código.

Por que prompt não basta

A primeira reação de qualquer time é incrementar o prompt: «não use o gradiente padrão», «escolha uma fonte de display de verdade», «não enfileire três cartões iguais». Funciona durante uma mensagem. Na seguinte, a orientação se dilui, a janela de contexto cresce, e a digital volta. Direção por prompt é probabilística e decai com o comprimento da conversa.

O que falta é um piso determinístico, uma checagem que roda depois do modelo escrever, sem LLM no loop. Esse é exatamente o buraco que o ux-skill preenche: o recomendador estreita as escolhas do modelo no começo, o linter empurra de volta o que escapou no final.

Não dá para combater estocástico com estocástico

A ideia de «coloca um segundo LLM avaliando a saída do primeiro» volta sempre, mas avaliação por LLM tem a mesma variância da geração por LLM: depende do prompt de nota, dos exemplos few-shot, da versão do modelo do dia. No CI o que a gente precisa é de uma camada que devolve o mesmo veredito todas as vezes. Determinismo é a única força da regex, e aqui é mais que suficiente.

145 regras regex, sem LLM, no CI

O linter varre todo arquivo em *.tsx, *.jsx, *.vue, *.svelte, *.astro, *.css, *.scss, *.html. Aplica 145 expressões regulares com as flags i e m. Devolve JSON com ID da regra, severidade, arquivo, linha, coluna, trecho e a correção sugerida.

# Lint local, gate padrão em high+critical
$ uxskill lint
[OK] Scanned 142 files in 412ms · 0 findings at threshold high

# Subpasta + JSON
$ uxskill lint apps/web/src --json | jq '.summary'
{
  "critical": 0,
  "high": 4,
  "medium": 11,
  "low": 3,
  "total": 18
}

Zero chamadas de LLM. A varredura média de um repositório Next.js de 200 arquivos é 380 ms a frio, 90 ms a quente. A documentação completa das regras está no guia do regex linter.

Antes e depois, em um herói real

A seguir, um bloco de herói simplificado tirado de um starter Next.js que cai em três regras, e a versão reescrita que sai com exit 0. Mesma intenção de conversão, digital diferente.

// Antes: 3 achados high
<section className="bg-gradient-to-br
  from-purple-500 via-violet-500
  to-blue-500 py-32">
  <h1 className="font-['Inter']
    text-7xl leading-none">
    Build something amazing.
  </h1>
  <div className="grid grid-cols-3 gap-6">
    <Card icon="Zap" title="Fast" />
    <Card icon="Shield" title="Safe" />
    <Card icon="Heart" title="Loved" />
  </div>
</section>

// Depois: 0 achados
<section className="bg-stone-50 py-28">
  <h1 className="font-['Fraunces']
    text-6xl leading-[1.04]
    tracking-tight">
    A camada de roteamento de carga
    que seu TMS nunca entregou.
  </h1>
  <div className="grid grid-cols-12 gap-6 mt-16">
    <Card className="col-span-7"
      title="Consolidação de carga" />
    <Card className="col-span-5"
      title="Ranking de transportadoras" />
  </div>
</section>

No «antes» disparam três regras: Inter em text-7xl, o gradiente canônico de IA, e o grid de três cartões iguais. No «depois» a fonte de display Fraunces se emparelha com Inter no corpo, a superfície fica plana, e o grid vira 7-e-5 assimétrico. Intenção igual, digital sumiu.

O recomendador levanta o chão. O linter põe o teto. Os dois são necessários.

Montando um sistema de design dentro do Claude Code

O Claude Code é o terreno nativo do ux-skill. A instalação a partir do marketplace cabe em duas linhas:

# Marketplace de plugins do Claude Code
$ /plugin marketplace add Laith0003/ux-skill
$ /plugin install ux@ux-skill

Depois da instalação, 22 comandos slash ficam disponíveis dentro da sessão do Claude Code. O /ux-discover coleta um brief de 10 campos via perguntas estruturadas, o /ux-recommend dispara cinco buscas paralelas (indústria, estilo, paleta, tipografia e movimento), e o /ux-persist save escreve MASTER.md, tokens.css e manifest.json na raiz do repositório. Com esses arquivos no disco, o Claude Code passa a usá-los como fonte em todas as sessões seguintes.

No Cursor o caminho é .cursorrules + servidor MCP via uxskill init --target cursor. No Windsurf, .windsurfrules + MCP via uxskill init --target windsurf. No GitHub Copilot, o ux-skill gera o .github/copilot-instructions.md e liga o linter em disco via uxskill init --target copilot.

Três caminhos de instalação, um motor

O mesmo pacote Python alcança os 17 IDEs da matriz de compatibilidade. Escolha o caminho mais próximo do seu editor:

Editor Caminho Comando
Claude CodeMarketplace/plugin install ux@ux-skill
Cursor.cursorrules + MCPuxskill init --target cursor
Windsurf.windsurfrules + MCPuxskill init --target windsurf
GitHub Copilotcopilot-instructions.mduxskill init --target copilot
Cline / ContinueServidor MCPuxskill mcp-config --target cline
JetBrains AI Assistant.junie/guidelines.mduxskill init --target jetbrains
ZedMCP stdiouxskill init --target zed
Codex CLI / AiderCLI diretopip install uxskill

Por baixo de todos: 1.182 entradas de catálogo, 145 regras, 160 especificações de marca, 22 comandos, 75 testes verdes em cada release.

Escopo honesto

As regras pegam estrutura. Não pegam gosto.

O linter nunca vai sinalizar «essa seção tem ritmo errado» ou «esse copy soa frio». Isso é trabalho humano, ou de um LLM na hora da revisão. O que a regex captura com confiança é toda digital que pode ser expressa por token literal, padrão ou forma, ou seja, a maior parte dos defaults de IA, porque o modelo volta sempre ao mesmo artefato.

De propósito não rodamos um LLM-juiz no CI. Se a sua régua é «parece feito por designer», isso é code review, não lint. O ux-skill oferece o ux critique para esse passe, mas roda sob demanda no editor, não no CI.

Para continuar lendo

Instalar

17 IDEs. Um motor. 145 regras.

Recomendador, linter, servidor MCP, 22 comandos, 160 especificações de marca e 1.182 entradas de catálogo são distribuídos juntos. O linter roda em sub-segundo; o resto, sob demanda. MIT, sem telemetria, sem conta.

$ /plugin marketplace add Laith0003/ux-skill
$ /plugin install ux@ux-skill
· ou ·
$ pip install uxskill
· ou ·
$ npx uxskill@alpha init