O Claude Code é um agente de codificação capaz. Forneça a ele uma captura de tela de uma tela do Figma e ele produzirá algo que parece vagamente correto. Forneça a ele um bundle de contexto estruturado — tokens de design tipados, um IR de layout, renders de referência e uma especificação legível por máquina — e ele produzirá código que você pode realmente colocar em produção.
O figmascope gera esse bundle do lado do cliente, inteiramente no seu navegador. Sem backend, sem upload, sem serviço intermediário com acesso aos seus arquivos do Figma. Este guia percorre o workflow completo Figma → figmascope → Claude Code com exemplos reais de CLI. Se você usa Cursor em vez de Claude Code, veja Figma para Cursor para o workflow específico do Cursor.
Pré-requisitos
- Claude Code instalado:
npm install -g @anthropic-ai/claude-code(ou o método de instalação atual conforme docs.anthropic.com/claude-code) - Um URL de arquivo do Figma
- Um Personal Access Token do Figma com escopo File content: read-only
Exporte o bundle de contexto do figmascope
Abra figmascope.dev, cole o URL do arquivo do Figma e seu token, clique em Export Context Bundle. Você receberá um zip como figmascope-ABC123.zip.
Descompacte-o em um diretório design/ no seu projeto:
unzip figmascope-ABC123.zip -d design/
A árvore resultante:
design/
├── CONTEXT.md
├── tokens.json
├── _meta.json
├── components/
│ └── inventory.json
├── screens/
│ ├── Home.json
│ ├── Home.png
│ ├── Settings.json
│ └── Settings.png
└── strings.json
Faça commit no controle de versão. O manifesto _meta.json registra o timestamp da exportação e a chave do arquivo do Figma, para que a equipe sempre saiba a qual versão do design o bundle corresponde.
Como o Claude Code lê o bundle de contexto
O CONTEXT.md é o ponto de entrada. É um documento de especificação estruturado que informa ao agente:
- Quais frames foram exportados e em que ordem
- As convenções de nomenclatura de tokens em uso
- Notas de escopo — ex.: quais telas estavam fora do escopo por serem nós não-frame, ou quais componentes foram excluídos
- Exemplos práticos mostrando como uma referência de token como
{ "$ref": "color.accent" }resolve para um valor emtokens.json - Quaisquer avisos emitidos durante a exportação (colisão em chaves de string, modo de layout inferido em containers)
O Claude Code lê arquivos antes de agir. Começar uma sessão com CONTEXT.md orienta o agente antes de ele tocar em qualquer JSON de tela.
Iniciando uma sessão do Claude Code
A abordagem mais direta — inicie o claude na raiz do seu projeto e aponte-o para o diretório de design:
claude
Em seguida, na sessão interativa:
Read design/CONTEXT.md, then implement the Home screen as a React component.
Use:
- design/tokens.json for all design token values
- design/screens/Home.json for the layout tree
- design/screens/Home.png as visual reference
- design/strings.json for all copy (use dot-notation keys as i18n identifiers)
Constraints:
- Tailwind CSS for styles, mapping token values to theme config
- TypeScript
- No hardcoded color or spacing values — all values must come from tokens
O Claude Code lerá os arquivos sequencialmente, resolverá referências de tokens da IR e gerará um componente que reflete seu sistema de design real em vez de uma aproximação genérica.
Prompts de uma só vez com --print
Para pipelines de CI ou geração de código com scripts, use o modo não-interativo --print:
claude --print "$(cat <<'EOF'
Read design/CONTEXT.md. Then implement design/screens/Home.json as
src/screens/Home.tsx (React + Tailwind + TypeScript).
- All tokens from design/tokens.json
- All strings from design/strings.json using dot-notation keys
- Visual reference: design/screens/Home.png
- Component names from design/components/inventory.json
EOF
)"
O heredoc mantém o prompt legível em scripts shell. O --print escreve a resposta do Claude para stdout, para que você possa encaminhar ou capturar conforme necessário.
O Claude Code funciona melhor quando você fornece uma tela por vez. A IR de layout de uma única tela já é densa; mantenha as sessões focadas.
Projetos com múltiplas telas — uma abordagem sensata
Para arquivos com muitos frames, trabalhe de forma incremental. Um loop sobre arquivos de tela:
for screen_json in design/screens/*.json; do
screen=$(basename "$screen_json" .json)
echo "Implementing $screen..."
claude --print "$(cat <
A instrução "não reimplemente componentes que já existem" importa quando o inventário de componentes é compartilhado. O Claude Code pode ler design/components/inventory.json para identificar quais componentes já estão implementados e importá-los em vez de regenerá-los.
Conectando os tokens de design
O tokens.json exportado pelo figmascope usa uma estrutura aninhada inspirada no W3C com campos $value e $type:
{
"color": {
"surface": { "$value": "#f6f2ea", "$type": "color" },
"ink": { "$value": "#1f1d1a", "$type": "color" },
"accent": { "$value": "#d96a3a", "$type": "color" }
},
"spacing": {
"1": { "$value": "4px", "$type": "dimension" },
"2": { "$value": "8px", "$type": "dimension" },
"4": { "$value": "16px", "$type": "dimension" },
"8": { "$value": "32px", "$type": "dimension" }
},
"typography": {
"body": {
"fontFamily": { "$value": "Inter", "$type": "fontFamily" },
"fontSize": { "$value": "14px", "$type": "dimension" },
"lineHeight": { "$value": 1.45, "$type": "number" }
}
}
}
Peça ao Claude Code para gerar um bloco de extensão de tema no tailwind.config.ts a partir desse arquivo como primeiro passo, antes de implementar qualquer tela. Assim, todas as implementações de telas subsequentes podem usar os aliases de token do Tailwind de forma consistente:
claude --print "Read design/tokens.json and generate a tailwind.config.ts
theme.extend block. Map color tokens to theme.extend.colors,
spacing tokens to theme.extend.spacing, and typography to
theme.extend.fontFamily / fontSize. Output only the config object."
Veja Design Token Export para Agentes de IA para uma análise aprofundada do formato de tokens e o fallback de inferência por frequência que o figmascope usa quando Figma Variables não estão configuradas.
Lidando com a camada de strings
Cada nó de texto no arquivo do Figma recebe uma entrada em strings.json. As chaves usam notação de ponto derivada da hierarquia de frames:
{
"home.hero.title": "Everything you need",
"home.hero.subtitle": "Ship faster with structured context",
"home.cta.primary": "Get started",
"settings.account.heading": "Account settings"
}
Instrua o Claude Code a usar essas chaves como identificadores de i18n. Em vez de codificar a string "Everything you need" diretamente no JSX, o componente gerado chama t('home.hero.title') (ou o equivalente da sua biblioteca de i18n). O arquivo de recursos já está em strings.json — você só precisa importá-lo ou conectá-lo à sua configuração de i18n.
Se o figmascope detectar uma colisão — dois nós que resultam na mesma chave — ele emite um aviso strings-collision em _meta.json e acrescenta um sufixo numérico para desambiguar. Verifique _meta.json antes de iniciar uma sessão para saber o que esperar.
Integração com CLAUDE.md
Se você usa um arquivo de contexto de projeto CLAUDE.md, adicione uma seção curta apontando o agente para o diretório de design. Isso combina bem com a abordagem descrita em AI Design Handoff e complementa por que o figmascope difere dos plugins de inspeção do Figma.
Adicione uma seção de design como esta:
## Design context
Design tokens, layout IR, reference renders, and strings live in `design/`.
Always read `design/CONTEXT.md` before implementing any screen.
Token values are in `design/tokens.json` — never hardcode color or spacing.
Component canonical names are in `design/components/inventory.json`.
Isso significa que cada sessão do Claude Code no projeto terá automaticamente o contexto de design como parte do seu conhecimento de trabalho, sem que você precise repeti-lo em cada prompt.
O que o agente realmente acerta
Com contexto estruturado, o Claude Code acerta consistentemente:
- Valores de espaçamento — porque estão em
tokens.jsoncomospacing.4 → 16px, não estimados de uma captura de tela - Cores — valores hex exatos, não "parece um laranja quente"
- Tipografia — família de fonte, tamanho, peso, altura de linha, todos tipados
- Direção de layout — nós stack têm um campo explícito de
directionegap - Nomenclatura de componentes — inventory.json é a fonte canônica, sem nomes inventados
- Textos — strings.json impede que o agente parafraseie ou invente textos de placeholder
O que ainda precisa de revisão humana: estados de interação (hover, focus, active) que não estão visíveis em frames estáticos do Figma, timing de animações e breakpoints responsivos que não foram explicitamente projetados no arquivo. A IR captura layout estático; comportamento dinâmico está fora do escopo.
Usando --dangerously-skip-permissions em ambientes controlados
Para pipelines automatizados onde você quer que o Claude Code opere sem prompts de aprovação interativos — por exemplo, em uma etapa de CI que gera stubs de componentes após uma atualização de design — você pode usar --dangerously-skip-permissions. Adequado apenas em ambientes com sandbox e sem credenciais de produção.
claude --dangerously-skip-permissions --print "$(cat <<'EOF'
Read design/CONTEXT.md. Generate component stub files for any components
in design/components/inventory.json that don't already exist in src/components/.
Use TypeScript + React functional component format. Include a TODO comment
for each component referencing the relevant screen JSON.
EOF
)"
Em workflows de desenvolvedores em produção, deixe as permissões interativas. Os prompts existem por um bom motivo — o Claude Code pode e vai escrever arquivos, e você quer saber quais antes que ele o faça.
Verificando os avisos de exportação antes de enviar o prompt
O figmascope emite avisos em _meta.json para condições que podem afetar a qualidade do output. Verifique-os antes de iniciar uma sessão do Claude Code:
python3 -c "
import json
meta = json.load(open('design/_meta.json'))
for w in meta.get('warnings', []):
print(f\"{w['code']}: {w['message']}\")
print(f\"Frames exported: {meta['frameCount']}\")
print(f\"Tokens source: {meta.get('tokensSource', 'variables')}\")
"
Dois avisos para prestar atenção:
layout-mode-none-inferred— um frame não tinha auto-layout definido. O figmascope inferiu o layout a partir das posições absolutas dos filhos, o que é menos confiável. Sinalize a tela relevante no seu prompt: "Esta tela usa posicionamento absoluto; gere de acordo."strings-collision— dois nós de texto produziram a mesma chave de recurso. O figmascope desambigua com um sufixo numérico, mas você deve verificar se as strings emstrings.jsonestão corretas antes de o agente gerar chamadas de i18n.
Workflows para Android e iOS
O Claude Code não está limitado a frameworks web. O bundle de contexto é agnóstico de framework — a IR de layout e os tokens são dados, não CSS. Para Jetpack Compose:
claude --print "$(cat <<'EOF'
Read design/CONTEXT.md and design/tokens.json.
Implement design/screens/Home.json as a Jetpack Compose screen.
- Map color tokens to a MaterialTheme ColorScheme
- Map spacing tokens to Dp values (strip 'px' suffix, use .dp)
- Map typography tokens to MaterialTheme.typography
- Use the component names from design/components/inventory.json as Composable names
- Reference design/screens/Home.png for visual accuracy
EOF
)"
Os nós stack da IR mapeiam naturalmente para Column (direction: vertical) e Row (direction: horizontal) no Compose. Nós leaf com type: "text" se tornam composables Text; type: "image" se torna Image ou um placeholder. Veja Jetpack Compose from Figma para o padrão completo.
Versionando o bundle de design
Trate o diretório design/ como qualquer outra dependência do projeto. Quando o design mudar significativamente, re-exporte do figmascope.dev, faça commit e anote a mudança no PR:
# Check when the bundle was last exported vs when Figma file was last modified
python3 -c "
import json
from datetime import datetime
meta = json.load(open('design/_meta.json'))
exported = datetime.fromisoformat(meta['exportedAt'].replace('Z', '+00:00'))
modified = datetime.fromisoformat(meta['figmaLastModified'].replace('Z', '+00:00'))
delta = modified - exported
if delta.total_seconds() > 0:
print(f'WARNING: Figma file was modified {delta} after last export')
else:
print('Bundle is current')
"
Um bundle desatualizado significa que o agente está trabalhando com um design obsoleto. A verificação de timestamp detecta isso antes de você gastar tempo em uma sessão de geração de código baseada em especificações superadas.