Claude Code è un agente di codifica capace. Dagli uno screenshot di una schermata Figma e produrrà qualcosa che sembra vagamente corretto. Dagli un bundle di contesto strutturato — design token tipizzati, un IR del layout, render di riferimento e una specifica leggibile dalla macchina — e produce codice che puoi effettivamente spedire.
figmascope genera quel bundle lato client, interamente nel tuo browser. Nessun backend, nessun upload, nessun servizio intermediario con accesso ai tuoi file Figma. Questa guida illustra l'intero flusso di lavoro Figma → figmascope → Claude Code con esempi CLI reali. Se usi Cursor invece di Claude Code, vedi Figma to Cursor per il flusso di lavoro specifico per Cursor.
Prerequisiti
- Claude Code installato:
npm install -g @anthropic-ai/claude-code(o il metodo di installazione attuale per docs.anthropic.com/claude-code) - Un URL di file Figma
- Un Personal Access Token di Figma con ambito File content: read-only
Esporta il bundle di contesto da figmascope
Apri figmascope.dev, incolla l'URL del file Figma e il tuo token, clicca Esporta Bundle di Contesto. Otterrai uno zip come figmascope-ABC123.zip.
Decomprimi in una directory design/ nel tuo progetto:
unzip figmascope-ABC123.zip -d design/
L'albero risultante:
design/
├── CONTEXT.md
├── tokens.json
├── _meta.json
├── components/
│ └── inventory.json
├── screens/
│ ├── Home.json
│ ├── Home.png
│ ├── Settings.json
│ └── Settings.png
└── strings.json
Committalo nel controllo di versione. Il manifesto _meta.json registra il timestamp di export e la chiave del file Figma, così il team sa sempre a quale versione del design corrisponde il bundle.
Come Claude Code legge il bundle di contesto
CONTEXT.md è il punto di ingresso. È un documento di specifica strutturato che dice all'agente:
- Quali frame sono stati esportati e in quale ordine
- Le convenzioni di denominazione dei token in uso
- Note sull'ambito — es. quali schermate erano fuori ambito perché erano nodi non-frame, o quali componenti erano esclusi
- Esempi pratici che mostrano come un riferimento a un token come
{ "$ref": "color.accent" }si risolve in un valore intokens.json - Eventuali avvisi emessi durante l'export (collisione nelle chiavi di stringhe, modalità layout dedotta nei contenitori)
Claude Code legge i file prima di agire. Avviare una sessione con CONTEXT.md orienta l'agente prima che tocchi qualsiasi schermata JSON.
Avviare una sessione Claude Code
L'approccio più diretto — avvia claude nella radice del tuo progetto e puntalo alla directory design:
claude
Poi nella sessione interattiva:
Leggi design/CONTEXT.md, poi implementa la schermata Home come componente React.
Usa:
- design/tokens.json per tutti i valori dei design token
- design/screens/Home.json per l'albero del layout
- design/screens/Home.png come riferimento visivo
- design/strings.json per tutto il testo (usa le chiavi con notazione a punto come identificatori i18n)
Vincoli:
- Tailwind CSS per gli stili, mappando i valori dei token alla configurazione del tema
- TypeScript
- Nessun valore di colore o spaziatura codificato — tutti i valori devono provenire dai token
Claude Code leggerà i file sequenzialmente, risolverà i riferimenti ai token dall'IR, e genererà un componente che riflette il tuo design system effettivo piuttosto che un'approssimazione generica.
Prompt one-shot con --print
Per pipeline CI o generazione di codice con script, usa la modalità non interattiva --print:
claude --print "$(cat <<'EOF'
Leggi design/CONTEXT.md. Poi implementa design/screens/Home.json come
src/screens/Home.tsx (React + Tailwind + TypeScript).
- Tutti i token da design/tokens.json
- Tutte le stringhe da design/strings.json usando le chiavi con notazione a punto
- Riferimento visivo: design/screens/Home.png
- Nomi dei componenti da design/components/inventory.json
EOF
)"
Il heredoc mantiene il prompt leggibile negli script shell. --print scrive la risposta di Claude su stdout, così puoi instradarlo o catturarlo secondo necessità.
Claude Code funziona meglio quando gli dai una schermata alla volta. L'IR del layout per una singola schermata è già denso; mantieni le sessioni focalizzate.
Progetti multi-schermata — un approccio sensato
Per file con molti frame, lavora in modo incrementale. Un ciclo sui file delle schermate:
for screen_json in design/screens/*.json; do
screen=$(basename "$screen_json" .json)
echo "Implementando $screen..."
claude --print "$(cat <
L'istruzione "non re-implementare componenti che esistono già" è importante quando l'inventario dei componenti è condiviso. Claude Code può leggere design/components/inventory.json per identificare quali componenti sono già implementati e importarli piuttosto che rigenerarli.
Collegamento dei design token
Il tokens.json esportato da figmascope usa una struttura annidata W3C-ish con campi $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" }
}
}
}
Chiedi a Claude Code di generare un blocco di estensione del tema tailwind.config.ts da questo file come primo passo, prima di implementare qualsiasi schermata. In questo modo tutte le implementazioni successive delle schermate possono usare gli alias dei token Tailwind in modo coerente:
claude --print "Leggi design/tokens.json e genera un blocco theme.extend per tailwind.config.ts.
Mappa i token colore su theme.extend.colors,
i token spaziatura su theme.extend.spacing, e la tipografia su
theme.extend.fontFamily / fontSize. Emetti solo l'oggetto di configurazione."
Vedi Esportazione Token Design per Agenti AI per un approfondimento sul formato dei token e il fallback per inferenza di frequenza che figmascope usa quando le Variabili Figma non sono configurate.
Gestione del livello delle stringhe
Ogni nodo di testo nel file Figma ottiene uno slot in strings.json. Le chiavi usano notazione a punto derivata dalla gerarchia dei frame:
{
"home.hero.title": "Everything you need",
"home.hero.subtitle": "Ship faster with structured context",
"home.cta.primary": "Get started",
"settings.account.heading": "Account settings"
}
Istruisci Claude Code a usare queste chiavi come identificatori i18n. Invece di codificare la stringa "Everything you need" in JSX, il componente generato chiama t('home.hero.title') (o l'equivalente della tua libreria i18n). Il file di risorse è già in strings.json — devi solo importarlo o collegarlo alla tua configurazione i18n.
Se figmascope rileva una collisione — due nodi che generano la stessa chiave — emette un avviso strings-collision in _meta.json e aggiunge un suffisso numerico per disambiguare. Controlla _meta.json prima di avviare una sessione così sai cosa aspettarti.
Integrazione con CLAUDE.md
Se usi un file di contesto progetto CLAUDE.md, aggiungi una breve sezione che punta l'agente alla directory design. Questo si abbina bene all'approccio descritto in Consegna Design AI e complementa perché figmascope differisce dai plugin Figma inspector.
Aggiungi una sezione design come questa:
## Contesto design
Design token, IR del layout, render di riferimento e stringhe sono in `design/`.
Leggi sempre `design/CONTEXT.md` prima di implementare qualsiasi schermata.
I valori dei token sono in `design/tokens.json` — non codificare mai colori o spaziature.
I nomi canonici dei componenti sono in `design/components/inventory.json`.
Questo significa che ogni sessione di Claude Code nel progetto avrà automaticamente il contesto del design come parte della sua conoscenza operativa, senza che tu debba ripeterlo in ogni prompt.
Cosa l'agente ottiene davvero correttamente
Con il contesto strutturato, Claude Code ottiene in modo affidabile:
- Valori di spaziatura — perché sono in
tokens.jsoncomespacing.4 → 16px, non indovinati da uno screenshot - Colori — valori hex esatti, non "sembra un arancione caldo"
- Tipografia — famiglia di font, dimensione, peso, altezza di riga, tutto tipizzato
- Direzione del layout — i nodi stack hanno un campo esplicito
directionegap - Denominazione dei componenti — inventory.json è la fonte canonica, quindi nessun nome inventato
- Testo — strings.json impedisce all'agente di parafrasare o inventare testo segnaposto
Cosa richiede ancora la revisione umana: stati di interazione (hover, focus, active) non visibili nei frame Figma statici, timing delle animazioni, e breakpoint responsive che non erano esplicitamente progettati nel file. L'IR cattura il layout statico; il comportamento dinamico è fuori ambito.
Usare --dangerously-skip-permissions in ambienti controllati
Per pipeline automatizzate dove vuoi che Claude Code operi senza prompt di approvazione interattivi — per esempio in un passo CI che genera stub di componenti dopo un aggiornamento del design — puoi usare --dangerously-skip-permissions. Appropriato solo in ambienti sandboxed senza credenziali di produzione.
claude --dangerously-skip-permissions --print "$(cat <<'EOF'
Leggi design/CONTEXT.md. Genera file stub di componenti per tutti i componenti
in design/components/inventory.json che non esistono già in src/components/.
Usa il formato TypeScript + React functional component. Includi un commento TODO
per ogni componente che fa riferimento al JSON della schermata rilevante.
EOF
)"
Nei flussi di lavoro degli sviluppatori di produzione, lascia i permessi interattivi. I prompt esistono per una buona ragione — Claude Code può e scriverà file, e vuoi sapere quali prima che lo faccia.
Controlla gli avvisi dell'export prima di inviare il prompt
figmascope emette avvisi in _meta.json per condizioni che potrebbero influenzare la qualità dell'output. Controllali prima di avviare una sessione 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')}\")
"
Due avvisi a cui prestare attenzione:
layout-mode-none-inferred— un frame non aveva auto-layout impostato. figmascope ha dedotto il layout dalle posizioni assolute dei figli, che è meno affidabile. Segnala la schermata rilevante nel tuo prompt: "Questa schermata usa posizionamento assoluto; genera di conseguenza."strings-collision— due nodi di testo hanno prodotto la stessa chiave di risorsa. figmascope disambigua con un suffisso numerico, ma dovresti verificare che le stringhe instrings.jsonsiano corrette prima che l'agente generi chiamate i18n.
Flussi di lavoro Android e iOS
Claude Code non è limitato ai framework web. Il bundle di contesto è agnostico rispetto al framework — l'IR del layout e i token sono dati, non CSS. Per Jetpack Compose:
claude --print "$(cat <<'EOF'
Leggi design/CONTEXT.md e design/tokens.json.
Implementa design/screens/Home.json come schermata Jetpack Compose.
- Mappa i token colore su un MaterialTheme ColorScheme
- Mappa i token spaziatura su valori Dp (rimuovi il suffisso 'px', usa .dp)
- Mappa i token tipografia su MaterialTheme.typography
- Usa i nomi dei componenti da design/components/inventory.json come nomi Composable
- Fai riferimento a design/screens/Home.png per l'accuratezza visiva
EOF
)"
I nodi stack dell'IR si mappano naturalmente a Column (direzione: vertical) e Row (direzione: horizontal) in Compose. I nodi leaf con type: "text" diventano composable Text; type: "image" diventa Image o un segnaposto. Vedi Jetpack Compose da Figma per il pattern completo.
Versionamento del bundle di design
Tratta la directory design/ come qualsiasi altra dipendenza del progetto. Quando il design cambia significativamente, riesporta da figmascope.dev, committa, e nota il cambiamento nella PR:
# Controlla quando il bundle è stato esportato l'ultima volta vs quando il file Figma è stato modificato
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'AVVISO: Il file Figma è stato modificato {delta} dopo l\'ultimo export')
else:
print('Il bundle è aggiornato')
"
Un bundle obsoleto significa che l'agente sta lavorando da un design superato. Il controllo del timestamp rileva questo prima che tu spenda tempo su una sessione di generazione di codice basata su specifiche superate.