figcraft-implement-design — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited figcraft-implement-design (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
This skill provides a structured workflow for translating Figma designs into production-ready code with pixel-perfect accuracy. Default tool: figcraft's `get_design_context` — figcraft's self-built design-to-code context extraction runs against the Figma Plugin API and returns in-session metadata that the component's author (figcraft itself) produced.
CLAUDE.md/AGENTS.md), switch to figcraft-create-design-system-rules.Default — use figcraft for all design-to-code work:
get_design_context(nodeId, framework?) — structured node tree + resolved variables/styles/componentsexport_image(nodeId) — visual reference (returns base64)get_node_info(nodeId, detail) — full node properties when you need a single deep diveget_current_page(maxDepth) — page-level overviewWhy figcraft is the default (honest differentiation):
get_design_context returns the new shape immediately. figma-desktop MCP / Figma Remote MCP would have to re-fetch via REST.#id suffixes, INSTANCE_SWAP preferredValues, role plugin data. These are figcraft's own authoring artifacts; the official MCPs reverse-engineer them from the REST representation.Where figcraft is NOT magic (honest limits):
https://...figma.com/mcp, OAuth-based) is the right tool.Fall back to the official Figma MCPs when:
get_code_connect_suggestions / send_code_connect_mappings) — Figma Desktop MCP onlyping or get_mode to verify). If ping fails → STOP. Do not fall back to other MCP servers. Tell user: open Figma → Plugins → FigCraft → wait for connection, then retry.get_selection, or from get_current_pageFollow these steps in order. Do not skip steps.
#### Option A: Parse from Figma URL
When the user provides a Figma URL, extract the node ID. figcraft connects to the currently open Figma file through its plugin, so a fileKey is not needed for figcraft tool calls — only the nodeId.
URL format: https://figma.com/design/:fileKey/:fileName?node-id=42-15
Extract:
node-id query parameter (e.g. 42-15, normalized to 42:15 internally)If the URL points to a different file than the one open in Figma, ask the user to switch the Figma file first — figcraft does not perform cross-file reads.
#### Option B: Use Current Selection
When the user has selected a node in Figma, call get_selection to retrieve its id.
get_selection() → returns { count, nodes: [{ id, name, type, ... }] }#### Option C: Browse the Page
When the user describes the target without an id, call get_current_page(maxDepth: 1) for a fast overview, then drill into specific frames with get_node_info(nodeId, detail: "standard").
Run get_design_context with the nodeId. Optionally pass framework to get a tailored hint string.
get_design_context(nodeId: "42:15", framework: "react")This returns:
boundVariables and styleId references preserved{ id, name, type, collection } (e.g. color/bg/primary → COLOR in collection Color){ id, name, type }{ name, key, isSet, remote, propertyDefinitions }framework values: react | vue | swiftui | compose | tailwind | unspecified (default).
If the response is too large:
get_current_page(maxDepth: 2) for a high-level node mapget_design_context(nodeId: "<childId>") for each child individuallyRun export_image for a visual reference.
export_image(nodeId: "42:15", format: "PNG", scale: 2)This returns base64-encoded image data. Keep it accessible throughout implementation as the source of truth for visual validation.
The tree from Step 2 contains image fill references. For each IMAGE paint:
imageHash identifies the image inside the Figma fileexport_image on the specific node containing the image fill to get its rasterized versionFor SVG/icon nodes (vector nodes with no children):
export_image(nodeId, format: "SVG") to get clean SVG markupTranslate the Figma context into the target framework, styles, and conventions.
Use the resolved arrays from Step 2 directly:
variables[].name → map slash-separated names to your CSS variables / theme tokens (e.g. color/bg/primary → var(--color-bg-primary) for web, Color.bgPrimary for SwiftUI)styles[].name → map to text style classes / typography utilitiescomponents[] → if remote: true, the component lives in a published library; if key is set, it's importable. Match by name to existing project components first.Framework-specific mappings (driven by `frameworkHint`):
| Figma | React/Tailwind | SwiftUI | Compose |
|---|---|---|---|
layoutMode: HORIZONTAL | flex flex-row | HStack { ... } | Row { ... } |
layoutMode: VERTICAL | flex flex-col | VStack { ... } | Column { ... } |
itemSpacing: 16 | gap-4 | spacing: 16 | Arrangement.spacedBy(16.dp) |
padding: 24 | p-6 | .padding(24) | Modifier.padding(24.dp) |
| Variable bound fill | bg-[var(--color-bg-primary)] or matched token | Color.bgPrimary | MaterialTheme.colors.primary |
Reuse over recreation: Always check for existing components before creating new ones. Use search_design_system(query: "<component name>") if the project also has a Figma library, to confirm the design system component is published.
Strive for pixel-perfect visual parity with the Figma design.
Guidelines:
variables/styles arrays from Step 2 to drive every color, spacing, radius, and fontBefore marking complete, validate the final UI against the Step 3 screenshot.
Validation checklist:
For an automated structural check on the result you implemented in Figma, call audit_node(nodeId) or verify_design(nodeId).
get_design_context.variables) to project design tokens by name match, not by raw valueUser says: "Implement this Figma button component: https://figma.com/design/kL9xQn2VwM8pYrTb4ZcHjF/DesignSystem?node-id=42-15"
Actions:
nodeId = "42:15". Confirm the file is currently open in Figma (figcraft only reads the live file).get_design_context(nodeId: "42:15", framework: "react") — returns the button tree, the color/text/inverse variable, the Button/Primary component metadata, and the React framework hint.export_image(nodeId: "42:15", format: "PNG", scale: 2) for the screenshot.components array: the button is a remote library component with property definitions { Label: TEXT, Icon: INSTANCE_SWAP, State: VARIANT }.color/bg/primary → var(--color-bg-primary).Result: Button component matching Figma design, integrated with project design system.
User says: "Build this dashboard: https://figma.com/design/pR8mNv5KqXzGwY2JtCfL4D/Dashboard?node-id=10-5"
Actions:
nodeId = "10:5". Confirm the dashboard file is open in Figma.get_current_page(maxDepth: 2) to understand the page structure (header, sidebar, content area, cards).get_design_context(nodeId: "10:5", framework: "react") for the full dashboard. If the response is too large, switch to per-section calls using the child nodeIds from Step 2.export_image(nodeId: "10:5", format: "PNG", scale: 2) for a full-page reference.export_image(nodeId: "<assetId>", format: "SVG") per asset.tree.layoutMode and tree.itemSpacing values from Step 3.components[].Result: Complete dashboard matching Figma design with responsive layout.
Never implement based on assumptions. Always run get_design_context and export_image first.
Validate frequently during implementation, not just at the end. This catches issues early.
If you must deviate from the Figma design (e.g., for accessibility or technical constraints), document why in code comments.
Always check for existing components before creating new ones. Consistency across the codebase is more important than exact Figma replication.
When in doubt, prefer the project's design system patterns over literal Figma translation.
Every color, spacing, radius, and font in the generated code should map to a name from get_design_context.variables or get_design_context.styles. If you find yourself writing a raw hex or px value, stop and check if a token exists.
Cause: The target node has too many descendants to return in a single call. Solution: Call get_current_page(maxDepth: 2) to find logical sub-frames, then get_design_context on each child individually.
Cause: Visual discrepancies between the implemented code and the original Figma design. Solution: Compare side-by-side with the screenshot from Step 3. Cross-check color/spacing values against the variables array — if a value didn't come from a token, that's the likely source of drift.
Cause: The Figma library uses different naming conventions than the project's CSS / theme tokens. Solution: Maintain a one-time naming map in the project (e.g. color/bg/primary → --color-bg-primary). If a Figma variable has no project equivalent, propose adding it to the project's design system rather than hardcoding.
remote: true not found in codeCause: The Figma instance points to a published library component that doesn't have a matching code component yet. Solution: Confirm with the user whether to create the missing component or detach the instance and inline the design.
The Figma implementation workflow establishes a reliable process for translating designs to code:
For designers: Confidence that implementations will match their designs with pixel-perfect accuracy. For developers: A structured approach that eliminates guesswork and reduces back-and-forth revisions. For teams: Consistent, high-quality implementations that maintain design system integrity.
By following this workflow, you ensure that every Figma design is implemented with the same level of care and attention to detail.
list_toolsets and get_creation_guide(topic: "tool-behavior")~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.