Documentation Index
Fetch the complete documentation index at: https://docs.uspec.design/llms.txt
Use this file to discover all available pages before exploring further.
uSpec V2.1.1
Transient interactive state names now use the past-participle form (hovered, pressed, focused) so they read in parallel with persistent ones (enabled, disabled). Previously the recommendation mixed hover with the participle forms, which read inconsistently in property tables, color spec column headers, and prompt examples. This is a non-breaking change: existing Figma libraries that name their state-axis options hover continue to be recognized.Recommendation update
references/api/api-library.mdnow recommendshoveredalongsidepressedandfocused. The recommendation table also explicitly documents that earlier docs and many existing Figma libraries usehover, and that both forms are recognized by the extractor.- All instruction files (
agent-api,agent-color,agent-structure,agent-anatomy) and skill prose updated to useHovered/hoveredin state listings, JSON examples, and worked examples. - Mintlify spec pages, Getting started examples, and Troubleshooting prompt suggestions updated to match.
Backwards compatibility (figma-plugin 2.1.1)
- The
stateKeywordsmatcher infigma-plugin/src/phaseF.tsandskills/create-color/SKILL.mdaccepts bothhoverandhoveredas state-axis option names, so designers who keep the legacy name continue to get correct axis classification. - Real design-token identifiers (
hoverOverlayAlpha,interactivePrimaryHover, etc.) are unchanged — these are platform variable names, not state labels. - Generated specs continue to render whichever form the source Figma file uses; output is truthful pass-through, not a silent rewrite.
npx uspec-skills update to pick up the recommendation. No action needed on Figma libraries unless you want to rename your state-axis options to match.uSpec V2.1
The uSpec Extract Figma plugin now handles layout-wrapper FRAMEs and repeated sub-component placements correctly, so the classification checklist surfaces the real sub-components and arrays of identical instances are documented as one entry with a count instead of N duplicates. A coordinateduspec-skills patch keeps create-component-md from misreading the new entry shapes.Layout-wrapper descent (Figma plugin 2.1.0)
- Designers commonly wrap a component’s real sub-components in a single auto-layout FRAME for clipping, scroll, padding, or grouping (for example, a Button group’s
groupwrapper for theoverflow=scrollvariant). The plugin now descends through these wrappers so the classification UI surfaces the actual sub-components instead of the wrapper - Each wrapper is recorded as an explicit decorative entry in
_childComposition.children[]withtopLevelInstanceId: "wrapper:<depth>"andclassificationEvidence: ["layout-wrapper"], so layout chrome remains visible to downstream consumers idx:NintopLevelInstanceIdnow indexes into the effective container (post wrapper descent), not the variant root. Phase I andtreeHierarchicalare unaffected
Sub-component placement dedup (Figma plugin 2.1.0)
- Repeated placements of the same sub-component (for example, six Selection Button instances inside a Button group) now collapse to one
_childCompositionentry instead of N. The designer classifies once; multiplicity is recorded in three new fields:placementCount— number of sibling placements that share the entry’s identityplacementIndices— original positions in the effective container’s childrenplacementsVary—truewhen at least two placements differ in main component or boolean overrides, signalling a heterogeneous array
- The plugin UI surfaces a
× Nbadge on grouped rows and avaries in statetag whenplacementsVaryis true, so the designer can spot heterogeneous arrays at a glance - Equivalence fingerprint covers
mainComponentName(which encodes variant choice for component-set members) andbooleanOverrides— instance-swap and text-override differences are intentionally not in the fingerprint and remain visible intreeHierarchical
create-component-md Step 4.5 fix (uspec-skills 0.2.3)
- The post-extract review previously flagged any
_childCompositionentry withoutuser-selectedevidence as malformed. The new wrapper FRAME entries legitimately carry["layout-wrapper"]evidence, so the check is now scoped tonodeType === "INSTANCE"— the only entries the plugin UI asks the designer to confirm - Prevents a spurious “the plugin UI did not reach the designer’s confirmation step” warning and a redundant override pass on every plugin run that contains a layout wrapper
- Run
npx uspec-skills updateto pick up the fix
uspec-skills 0.2.2
Fixed the first run experience so the skip option works as intended. Runnpx uspec-skills update to pick up the fix.V2.0 — April 2026
New create-component-md skill, uSpec Extract Figma plugin, and uspec-skills install CLI
uSpec V2.0
A major milestone release. uSpec now supports two rendering paths: the original Figma-native annotations, and a new Component Markdown path that produces a single self-contained.md specification you can hand to any LLM. The release ships with a new Figma plugin that captures every variant, token binding, and sub-component deterministically inside Figma’s sandbox, and a new uspec-skills CLI that replaces the clone-and-copy install flow.New: uspec-skills install CLI (0.2.0)
- Run
npx uspec-skills initfrom any project root. The CLI prompts for your agent host (Cursor, Claude Code, or Codex) and your Figma MCP provider, installs every skill into the matching platform directory (.cursor/skills/,.claude/skills/, or.agents/skills/), copies references into./references/, and writesuspecs.config.json npx uspec-skills install --platform <cursor|claude-code|codex>reinstalls or repairs skills non-interactivelynpx uspec-skills updatere-renders skills against the current package versionnpx uspec-skills doctorvalidates your install and reports missing skills, missing references, or broken cross-referencesinitbootstraps a fresh uSpec project into the current directory when no project root marker (.git/,package.json, oruspecs.config.json) is found above it, so the documented “create a new folder, then run init” walkthrough works from an empty directory. A one-line note (bootstrapping a new uSpec project here.) is printed when this happensuspec-skills installpoints you atnpx uspec-skills initwhen run from a directory with no project root, instead of failing with a generic message- All CLI error and log prefixes consistently say
uspec-skills(the legacyuspecshorthand has been removed) - The previous flow (cloning the repo and running
utils/sync-skills.sh) is no longer required. Existing users can keep their clone, but new setups should usenpx uspec-skills initfrom their own project root uspecs.config.jsonnow records the chosen platform and MCP provider sofirstrunreads them from disk instead of asking again
New skill: create-component-md
- Orchestrator skill that turns a plugin-produced
_base.jsoninto a singlecomponents/{componentSlug}.mdfile - Runs four interpretation specialists:
extract-api(serial, produces the shared property dictionary), thenextract-structure,extract-color, andextract-voicein a parallel batch - Deterministic reconciliation gate catches typed disagreements between specialists (conflicting child classifications, mismatched axes, missing states) and serially re-dispatches only the specialist that owns the mismatch
- Integrity gate validates cache-file shapes, axis consistency, and structure coverage matrix before rendering the Markdown
- Output sections: Overview, API, Structure, Color, Voice / Screen reader, Provenance. Everything needed to implement the component from scratch without opening Figma
- Cost envelope: 50k–200k tokens per run. Recommended model: Opus 4.7 High or above
- Full guide →
uSpec Extract Figma plugin
- New Figma plugin that captures a component’s complete extractable state in one pass
- Walks every variant (no default-variant sampling), resolves library-linked variables with name,
codeSyntax, alias chains, and remote collection metadata, and captures inline font properties alongside text style IDs - Phase I: sub-component variant walks. Constitutive sub-components are measured across their own variant axes, not only the configuration the parent embeds, so a Button inside a Text Field is specified at every size and density
- Designer-in-the-loop classification checklist: confirm or flip whether each top-level child is constitutive, referenced, or decorative before extraction
- Runs entirely inside the Figma plugin sandbox with no network access. Nothing is stored, nothing leaves your machine. To build locally, clone the uSpec repo, run
npm install && npm run buildinsidefigma-plugin/, then import the manifest in Figma Desktop. See the install walkthrough - Output is a validated
_base.json(Ajv schema atfigma-plugin/docs/base-json-schema.md) that becomes the sole input forcreate-component-md
Documentation
- New Component Markdown spec page covering install, usage, the four-specialist pipeline, and skill-side troubleshooting
- New Figma Extract plugin tab on the Troubleshooting page covering build steps, Node version requirements, the watch-mode dev loop, and common install failure modes
- Getting Started rewritten around the CLI flow with platform-specific tabs
- Troubleshooting updated with
npx uspec-skills doctorand per-platform repair commands
Structure skill: coverage matrix artifact
extract-structurenow emits a_extractionArtifacts.coverageMatrixartifact listing every auto-layout frame walked, the non-zero layout properties found on it, and whether a corresponding row was emitted in the final spec- The orchestrator’s integrity step asserts
coverageMatrix.complete === trueand independently recounts frames walked, so silently dropped padding or spacing is caught before rendering - Fixes a class of bugs where inner wrapper frames with non-zero
horizontalPaddingoritemSpacingcould be measured but not emitted
Dual-path architecture
implementation.mdfully rewritten to describe both rendering paths, the plugin phases (A–I), the orchestrator workflow, the.uspec-cache/layout, and theextract-*interpretation skillsuspecs.config.jsongainsextractionSource: "plugin"andreconciliation: { autoRetry: true }to control the new path.uspec-cache/{componentSlug}/directory stages the plugin payload and caches each specialist’s JSON output. Useful for debugging and for re-running only part of the pipeline
V1.8.1 — April 2026
Recursive nested container measurement and wrapper frame padding coverage in structure specs
uSpec V1.8.1
The structure skill now recursively measures nested auto-layout containers and enforces per-wrapper padding documentation — no more collapsed padding notes on parent groups.Recursive nested container measurement (Structure)
measureChildrennow calls itself recursively instead of using a flat loop for grandchildren — deeply nested wrapper frames (e.g., icon containers insidetrailingContent) are fully measured and surfaced as__childrenentries in the cross-variant data- Fixes cases where intermediate auto-layout frames with their own padding were invisible to the completeness check
Wrapper frame padding coverage (Structure)
- New verification procedure in the completeness judgment: for each sub-component section, walk
__childrenentries recursively — every entry with non-zero padding is an auto-layout container that needs its own group with dedicated rows - Catches content areas (e.g.,
leadingContent,trailingContent) whose children each have individual padding that was previously collapsed into a single note on the parent - Cross-checks against
enrichedTreewhen available for redundant validation
Common mistake guidance (Structure)
- New “Collapsing wrapper frame padding into notes” entry in the instruction file — documents the anti-pattern of merging per-child padding into a parent group header note instead of giving each wrapper its own group
V1.8.0 — April 2026
Composite color specs, context-aware property exhibits, non-dimensional axis coverage, and sub-pixel precision
uSpec V1.8.0
The color skill now specs composite paint styles — gradients, multi-layer fills, and blended overlays — with nested hierarchy rows breaking down each layer. The property skill gains a new exhibit planning system with context axis rendering, sparse matrix chapters, and a dedicated instruction file. Structure now diffs every variant axis for structural or property-level changes, and measurements preserve sub-pixel precision.Composite style support (Color)
- New
buildCompositeDetailfunction in the extraction script detects paint styles with 2+ visible fill layers and emits acompositeDetailobject with layer stacking order, blend modes, opacities, and gradient stops - Token resolution priority updated: paint/stroke style names (
fillStyleId,strokeStyleId) now take precedence over variable bindings (boundVariables.color), matching how effect styles are already handled - AI interpretation builds
compositeChildrenarrays on elements — solid layers, gradient layers with per-stop detail, and image layers — rendered as nested rows with hierarchy indicators (#hierarchy-indicatorframe toggled per child row) - Both Strategy A (simple) and Strategy B (state-consolidated) rendering scripts support composite child rows with
showIndicatorfor middle/last-child visual connectors - Instruction file adds composite breakdown guidance, worked examples, rendering rules, and validation checklist items
Exhibit planning and context axis rendering (Property)
- New Step 1 reads a dedicated instruction file (
agent-property-instruction.md) containing data validation, exhibit planning, pre-render checklist, common mistakes, and do-not rules — previously inline in SKILL.md - Step 4e now includes exhibit planning (Phase B) that produces an
exhibitPlanarray routing each property to the correct rendering template - New context axis system: when a variant axis qualifies as a visual context (e.g.,
variant: primary/subtle), all other illustrated chapters render grouped rows per context value using new6a-ctxand6b-ctxtemplates - New 6a-matrix template for sparse variant matrices — absolute-positioned grid with N/A placeholders for missing combinations, plus standalone chapters for both axes
- Step renumbering (1–11) with a new Step 5 audit pass that re-reads the instruction file’s pre-render checklist before rendering
- All implementation notes moved from the SKILL.md Notes section to the instruction file, reducing SKILL.md scope to pure orchestration
Non-dimensional axis coverage (Structure)
- New Step 4e runs a diff script measuring root and direct children across every variant axis not already covered by size/density/shape extraction
- Step 6 classifies each axis as structural (children differ → separate sections per configuration), property-variant (dimensional properties differ → state-conditional section), or visual-only (skip)
- New Step 6b runs targeted follow-up extractions for structural axes, giving each configuration complete dimensional data across all sizes
- Instruction file adds non-dimensional variant axis guidance, decision table entries, and common mistake warnings for skipped diffs and missing property-variant sections
- User-provided value adjustments now replace extracted values in existing rows with explanatory notes instead of creating duplicate rows
Sub-pixel precision (Structure)
- All rounding functions updated from
Math.round()to arv()helper that preserves one decimal place (Math.round(v * 10) / 10) — values like 1.5px stay 1.5 instead of rounding to 2 - Applied across both Step 4b enhanced extraction and Step 4d cross-variant comparison scripts
- Instruction file updated: “Preserve one decimal place; whole numbers stay whole”
Anatomy refinements
- Root variant fills/effects now fold into the container note when a container synthetic already exists, instead of always creating a separate statelayer/backplate element
- Ghost overlays for failed slot insertions deferred to after auto-layout reflow so they use final positioning
instAbsX/instAbsYrecomputed after centering to fix absolute transform drift
Element naming (Color)
- Fill-bearing elements now consistently use a property qualifier: “Container fill” instead of “Container”, “Background fill” instead of “Background” — removes ambiguity when the same element also has a stroke
V1.7.4 — April 2026
Evidence-based API reasoning with ownership hints, override promotion, and compound component guidance
uSpec V1.7.4
The API skill now separates deterministic evidence from AI reasoning with a structured evidence model, ownership hints, and an explicit override promotion pass. The instruction file adds compound component ownership rules, nested property grouping heuristics, and a worked Text Field example demonstrating state decomposition and child override promotion.Evidence-based API reasoning
- New
ownershipHintsarray in the extraction script collects deterministic ownership cues from root properties, child overrides, text nodes, and variable collections — each hint includesevidenceType,suggestedExposure, and arationale - New Step 4c requires assembling a structured
ComponentEvidenceobject before reasoning about the API — keeping raw facts separate from semantic interpretation relevantVariableCollectionsare now extracted inline during property extraction, with component-name and generic-property matching to discover mode-controlled capabilities like density and shape- The instruction file introduces a
ComponentEvidenceTypeScript interface as the required intermediate model between extraction and API generation
Override promotion pass
- Step 5 now includes a mandatory override promotion pass: every
composableChildrenoverride key is classified as parent-owned, child-only, or shared - Master boolean + sub-boolean combinations are merged into single enums (e.g.,
leadingContent: none, icon, text, iconAndText) instead of being exposed as separate boolean properties - New validation checklist items verify that parent-owned properties are not buried in sub-component tables and that broad state axes are decomposed
Compound component guidance
- New “Critical Rules” quick-reference section at the top of the instruction file highlights the five most commonly violated rules
- New ownership rules table for compound components with tie-breaker heuristics (parent vs child vs both)
- New “Choosing Top-Level vs Nested Rows” section with heuristics for
isSubPropertyusage - New “Do NOT” section replaces the former “Common Property Categories” with explicit anti-patterns
- New worked example: Text Field with state axis decomposition, promoted child overrides, and sub-component tables
API library updates
- Added compound component ownership guidance with decision table and examples
- Added nested property grouping patterns (
trailingContentType→ nestedlabel,variant) - Added
showCharacterCountto the Text field canonical API - Added
validationStateenum guidance for components with multiple validation-like states
V1.7.3 — April 2026
Screen reader specs now handle preferred slot fills in focus-order planning and artwork previews
uSpec V1.7.3
This update extends the voice and screen reader workflow so slot-hosted controls can be documented from the right scenario. The skill now distinguishes default slot children from preferred interactive fills, carries that decision into preview rendering, and validates that the rendered artwork matches the documented focus order.Preferred slot fills for screen reader specs
create-voicenow resolves SLOTpreferredValuesto local components during extraction and records both preferred instances and default slot children- Focus-order planning can choose between the default slot content and a representative preferred interactive fill when a slot-hosted control changes the traversal order
- Slot metadata now includes visibility bindings, descriptions, raw keys, and contextual child overrides so the agent can reason about conditional focus stops more accurately
Slot-aware artwork rendering
- Screen reader previews now support
slotInsertions, allowing the render step to populate slot content before marker resolution and bbox capture - The focus-order fallback logic reapplies slot insertions while searching for the richest preview state, improving marker placement for slot-hosted actions
- States with zero focus stops still render the component preview, while slot-populated states can now show the correct interactive control instead of a default placeholder scenario
Clearer guidance and validation
- The screen reader instruction file now frames focus order as a single top-level section and removes anatomy-specific language from the task definition
- Validation guidance is split into pre-render and post-render checks, including explicit checks for slot-hosted focus stops and slot-populated previews
implementation.mdnow documents the voice skill’s preferred-slot extraction and insertion flow alongside the existing SLOT support across other skills
V1.7.2 — April 2026
Figma slot support refined with ownership-aware structure planning and hosting-context slot sections
uSpec V1.7.2
This update sharpens the structure skill’s Figma slot support. Section planning now resolves ownership before rendering, so parent-owned roles stay on the sub-component path while true preferred slot content gets slot-specific documentation. Slot content sections also stay focused on hosting context and placement-specific deltas instead of duplicating another component’s full structure spec.Ownership-aware structure planning
- Section planning now treats
subComponents,slotContents,enrichedTree, andlayoutTreeas discovery inputs instead of final section types - New ownership resolution classifies each candidate onto exactly one path:
subComponent,slotContent, or composition/root-only - Parent-owned structural roles remain sub-components even when they are placed through a slot or slot-like composition
- Generic library-owned preferred content stays on the
slotContentpath, and overlapping candidates are deduplicated before any sections are emitted
Clearer slot content boundaries
- Slot content sections now render only for preferred instances that still classify as
slotContentafter ownership resolution slotContextis the primary source for hosting-container properties such as sizing mode, padding, and alignment- The preferred component’s measured
selfvalues are used only for placement-specific deltas caused by slot context, not as a second full structure spec - Section descriptions now explicitly defer component internals to the referenced component spec
Stronger validation and authoring guidance
- Validation checks now confirm that every instance still classified as a sub-component is covered after ownership resolution
- Slot-related validation also checks that each surfaced instance is documented on exactly one section path
- Structure guidance adds clearer examples for container-only rows in slot sections and for single-path ownership decisions
V1.7.1 — April 2026
Slot-aware previews, sub-component token ownership, composition Pattern B, and slot mutation safety
uSpec V1.7.1
API configuration examples now render live slot content and text overrides in previews. Color applies a token ownership framework to sub-component entries. Structure gains Pattern B composition sections for standalone components, boolean-toggled previews, and section ID-based rendering. All slot-traversing scripts use a crash-safe recursive collector.Slot-aware API configuration previews
- Configuration examples now support
textOverrides— a map of Figma TEXT node layer names to replacement text, applied to the main instance so previews show the example’s actual text instead of default placeholders - New
slotInsertionsparameter populates named SLOT nodes with fresh component instances: specify the slot name, a component node ID, and optionalnestedOverrides/textOverrideson the inserted child - All overrides are applied before
appendChildinto the slot — after adoption, child nodes get compound IDs and become inaccessible (see slot mutation ordering constraint below) - Extraction returns
textNodeMap— an array of{ name, characters, parentName }for every TEXT node in the default variant — eliminating guesswork fortextOverrideskeys
Sub-component token ownership (Color)
- New token ownership decision framework in the color instruction file — evaluate each
subComponentNameentry against four signals (full component vs leaf instance, slot-hosted, parent override) before including or excluding - Leaf instances (icon fills, divider strokes) stay in the parent spec; full sub-components (buttons, badges, checkboxes) are excluded and noted in
generalNotes - Worked examples table covers common cases (MicroButton → exclude, Chevron icon → include, Divider → include, IconButton → exclude)
- Slot-based component guidance: document default slot content tokens, note slot architecture and preferred instances in
generalNotes, explain extraction behavior with nested booleans
Composition Pattern B (Structure)
- New Pattern B — Structural map for standalone components or components without a size axis (e.g., Section Heading with leading slot + heading area + trailing slot)
- Uses
Spec | Default | Notescolumns with group rows for the host container and each structural zone — replaces the need for a separate “container” section - Boundary rule: when any section says “See X spec”, only document the hosting container (sizing mode, padding, spacing, alignment) — never re-document the component’s own internals
- Slot container properties (sizing mode, alignment, clipsContent) belong as group rows in the composition section, not repeated in each slotContent section
- HUG-sized container guidance: document
widthMode: huginstead of reporting measured pixel dimensions, which are artifacts of current content
Boolean-toggled previews (Structure)
- New preview type for standalone components with booleans controlling structural elements (slots, accessories, subtext)
- Shows meaningful boolean combinations as labeled instances (e.g., Default, With subtext, Full)
PROPERTY_OVERRIDESarray drives per-column boolean configurations in the preview script
Section ID-based rendering (Structure)
- Step 11b now returns the rendered section’s node ID (
sectionId) - Step 11c preview script locates the section by ID instead of by name — eliminates name-collision issues when multiple sections share similar names
- Page context is loaded explicitly via
figma.setCurrentPageAsyncfor stable child traversal
Slot-safe tree traversal
loadAllFontsacross API, color, and structure skills now uses a manual recursive collector with per-node try-catch instead offindAll— prevents crashes on SLOT nodes with compound IDs- Color extraction adds
figma.setCurrentPageAsyncbefore traversal for stable child resolution enableNestedBooleansanddirectUnhidein the color skill wrapped with try-catch guards for slot-hosted instancesimplementation.mddocuments the slot mutation ordering constraint: all mutations on a child instance must happen beforeappendChildinto a SLOT, with code examples for both correct and incorrect patterns, plus the default-slot-child replacement workaround
Response truncation guidance (Structure)
- Added guidance for handling MCP response truncation (>~20KB): run targeted follow-up extraction for missing fields instead of re-running the full script
V1.7.0 — April 2026
Figma slot detection, nearest-edge marker placement, component-relative spec placement, and improved rendering
uSpec V1.7.0
All seven skills now detect and handle native Figma SLOT nodes — preferred instances, boolean visibility bindings, and slot content population. Marker placement uses a new nearest-edge algorithm with collision avoidance, specs are placed next to the source component, and rendering is more resilient with dynamic font loading and font-family fallbacks.Figma SLOT node support
- Anatomy extraction detects SLOT-type properties, resolves
preferredValuesto local component nodes, readscomponentPropertyReferences.visiblefor boolean bindings, and surfacesslotDefaultChildrenfor default content. Step 4 enriches slot notes with preferred component names, marks hidden/empty slots for artwork population, and sets section eligibility for sub-component anatomy sections. - API extraction collects
slotPropswith preferred instances anddefaultChildrenincluding contextual overrides. Sub-component table defaults now reflect values the designer set in the slot context, not the standalone component’s global defaults. Descriptions reference the source component. - Property extraction detects boolean-to-slot linkage — when a boolean controls a SLOT’s visibility, the description reads “Controls slot: (accepts: )” instead of the generic “Controls layer”.
- Structure resolves SLOT properties with
preferredValuesand generates dedicatedslotContentsections per preferred component, measuring contextual dimensions when each preferred component is placed inside the slot across all parent sizes. - Voice deep-recurses into SLOT nodes during extraction so interactive elements inside slots appear as separate focus stop entries for merge analysis. Reads
slotVisibilityfor conditional focus stop detection across states.
Nearest-edge marker placement with collision avoidance
- Replaces the previous clockwise / left-stagger / alternating strategy system with a unified nearest-edge algorithm across anatomy, per-child, and voice skills
- For each element, all four sides are scored by distance to the component boundary — the marker is placed on the shortest side
- Before placing, overlap with already-placed markers is checked (8 px minimum gap); on collision, perpendicular offsets are applied, falling back to the next-best side if bounds are exceeded
- Inline markers for nested elements — elements visually contained inside another annotated element get a short stub line (16 px) on their nearest edge instead of a perimeter marker
Component-relative spec placement
- Specs are now placed on the same page as the source component, positioned to its right with a 200 px gap — no more viewport-center placement
- The script resolves the component node, walks up to its PAGE ancestor, activates the page, and positions the frame at
compNode.x + compNode.width + 200 - Cross-file destination URLs retain the existing viewport-center behavior
Completion link
- Every skill now prints a clickable Figma deep-link URL to the rendered spec frame at the end of the run
- URL format:
https://www.figma.com/design/{fileKey}/?node-id={frameId}
Improved example rendering
- Dynamic font loading (
loadAllFonts) runs after every mutation that may reveal new text nodes —createInstance,setProperties,appendChildinto slots, anddirectUnhide— preventing “unloaded font” errors on components using non-template fonts - Font-family fallback (
loadFontWithFallback) discovers exact font style strings vialistAvailableFontsAsyncinstead of hardcoding style names, with graceful fallback through preferred → fallback → first-available → Inter - Template font loading moved from hardcoded family to discovery from existing marker and section text nodes
- API configuration example preview now finds SLOT nodes via
findOne(n => n.type === 'SLOT')instead of assumingchildren[0]
Variant selection evaluation (Anatomy)
- New Step 4 sub-step 0 evaluates whether the default variant is the best representative — when it yields only 1–2 elements and variant axis option names suggest a structurally richer alternative, the extraction re-runs with
PREFERRED_VARIANT_PROPS - Does not re-extract for purely stylistic differences (color, size, theme)
Brief description header
- Anatomy and property specs now compose a 1-sentence
briefDescription(max ~15 words) describing what the component IS and does, placed in the#brief-component-descriptionheader field - Replaces the previous generic “Anatomy breakdown of…” and “Configurable properties of…” text
Root container detection (Anatomy)
- New
childContainerIsVariantflag indicates when the extraction traversed past the root container — a synthetic container element is always inserted when traversal occurred - When the root container was not traversed, the agent evaluates architectural significance (composable slots, conditional visibility, mixed layout) to decide whether annotation is warranted
hasStrokeson the root variant no longer triggers a separate synthetic element — strokes are described in the container note instead
Voice rendering improvements
- Removed
artworkLabelsand the detach-and-replace-text workflow — artwork instances stay live throughout rendering findStopNodenow uses ancestor-aware visibility matching (isEffectivelyVisible) for the Focus Order entry, correctly triggering the richest-variant fallback when boolean-enable alone cannot surface all focus stops- Preview wrapper width reads from
previewPlaceholder.widthto match the template layout instead of computing independently - Conditional focus stops and disabled/non-focusable states documented in merge analysis guidance
V1.6.2 — April 2026
FRAME-wrapped text detection, frame icon indicators, and effect style consolidation
uSpec V1.6.2
Anatomy now detects FRAME-wrapped TEXT nodes and displays a dedicated frame icon indicator, while color consolidates effect style entries into a single token reference.FRAME-wrapped TEXT detection (Anatomy)
- Frames containing a single TEXT child are now classified as
textinstead ofcontainer— the frame name is preserved inoriginalNameand the element carriesnodeType: 'TEXT' - Short text content (up to 30 characters) is included in the element notes for richer context in the attribute table
- Applies to both extraction and the
name/originalNamedocumentation in the instruction file
Frame icon indicator (Anatomy)
- New
#frameindicator icon for FRAME and GROUP node types, added alongside the existing#instance,#text, and#sloticons - Applied to both composition-level and per-child artwork rendering scripts — FRAME/GROUP elements now display their own icon instead of falling through to the default (no icon) case
Name field semantics (Anatomy)
namenow consistently returns the designer-facing layer name across all classifications- For
instance-unwrappedelements,nameis the wrapper frame’s name (e.g., “Thumb”) — the inner component name is available viawrappedInstance.componentSetName - Previously, unwrapped instances overwrote
namewith the inner component’scomponentSetName, losing the original frame label
Effect style consolidation (Color)
- When a node has an
effectStyleId, extraction now emits a single"effect style"entry with the style name as the token, instead of iterating individual shadow layers - Individual
drop shadow/inner shadowentries are still emitted when no effect style is applied - The
variantColorDatacontract documents the new"effect style"property value and its semantics
Effect and elevation token category (Color)
- Added
Effect/Elevationrow to the token-naming reference table with common style names (low,medium,high) - Added
Effectsrow to the element-naming reference table with common layer names (Shadow,Elevation,Drop shadow)
uSpec V1.6.1
Anatomy and voice reader artwork rendering are now more robust — both skills use a dedicated wrapper frame for absolute positioning and voice gains dynamic preview sizing with smarter marker placement.Wrapper frame for artwork (Anatomy)
- Artwork elements (component instance, outlines, markers, lines) are now placed inside a dedicated inner wrapper frame instead of directly on the preview placeholder
- The wrapper uses
layoutMode = 'NONE'with transparent fills andclipsContent = true, keeping absolute positioning isolated from the template’s auto-layout - Applied to both composition-level and per-child artwork scripts
Dynamic preview sizing (Voice)
- Preview dimensions are now calculated from the live instance’s
width/heightplus marker margins, replacing the staleROOT_SIZEparameter - Eliminates centering drift when variant switching changes the component’s rendered size
- Sizing formula accounts for the number of focus stops so left-stagger markers never run out of room
- Removed the
ROOT_SIZEplaceholder from the rendering template and instruction file
Marker positioning strategies (Voice)
- Voice artwork now uses the same three-strategy marker placement as anatomy: clockwise, left stagger, and alternating
- Strategy is auto-detected by clustering focus stop centers — consistent with anatomy’s approach
- Replaces the previous simple alternating-only placement, producing cleaner annotations for concentric and vertically stacked components
Pre-detach bounding box capture (Voice)
- Bounding boxes for focus stops are now captured from the live instance before any
detachInstance()call - Avoids fragility of post-detach name matching where SLOT nodes reorganize and
findStopNodemay fail
V1.6.0 — April 2026
Synthetic layer detection, clockwise markers, measurement annotation pause, and two-layer architecture
uSpec V1.6.0
Anatomy now handles concentric components (checkbox, radio, toggle) with synthetic element detection and clockwise marker placement. Structure gains icon/component reference rows and temporarily removes measurement annotations until Figma MCP supports them natively. All seven skills follow a two-layer architecture separating orchestration from domain knowledge.Measurement annotation paused (Structure)
- Temporarily removed measurement annotations (
TOKEN_MAPS,annotateNode, and all native FigmaaddMeasurementcalls) from the structure skill - The
addMeasurementAPI is not yet exposed through Figma MCP — annotations will return once native support is available - Table-driven spec rows and token references are unaffected; only the visual measurement lines on preview instances are paused
Synthetic element detection (Anatomy)
- New
hasVisuals()utility detects fills, strokes, and effects on any node — used to identify visually meaningful frames that wrapper traversal would otherwise skip rootVariantVisualsandtraversedFramesare now returned by the extraction script, surfacing visual layers (statelayers, backplates, shape containers) that exist on the root variant or intermediate wrapper frames- Step 4 inserts synthetic elements (
isSynthetic: true) for skipped visual layers, with re-indexing — concentric components like checkbox now show all structural layers in the anatomy table - Instruction file adds note-writing guidelines, worked examples, and validation checklist items for synthetic elements
Clockwise marker placement (Anatomy)
- Three marker placement strategies based on element center clustering: clockwise (concentric/overlapping), left stagger (vertical stack), and alternating (mixed layouts)
- Clockwise strategy rotates markers around the component (left → top → right → bottom) — ideal for concentric components where all elements share the same center
- Both composition and per-child artwork scripts use the same
isClustereddetection and strategy selection
Richest variant fallback (Anatomy)
- When the default variant produces 0 elements after wrapper traversal (e.g., an unchecked checkbox with an empty structure frame), extraction falls back to the variant with the most descendant children
selectedVariantIdis returned by extraction and reused by the rendering step, ensuring artwork matches the extraction dataresolveChildContainerrefactored into a reusable function shared by the fallback logic
Icon and component references (Structure)
- INSTANCE children now carry
parentSetName— the component set name (e.g.,"checkmark","chevron-down") — at all tree depths, not just depth 0 - New
iconName/leadingIcon/trailingIconspec rows document which component is used, placed before the corresponding size row - Instruction file adds a Component References section, decision-table entry, common-mistake warning, and validation checklist item
Two-layer skill architecture
- SKILL.md is now strictly the orchestration layer — step-by-step workflow, MCP adapter mapping, Plugin API scripts, script output contracts, intermediate data structures, and template mechanics
- Instruction files are now strictly the domain knowledge layer — interpretation guidance, decision frameworks, naming conventions, value formatting rules, worked examples, edge cases, and validation checklists
- Every skill retains its two-tier extraction model: deterministic scripts for data gathering, AI reasoning for interpretation and enrichment
Housekeeping
- Deleted
data-example.json— no longer referenced by any skill - Updated
api/api-library.mdwith improved reference patterns - Updated
implementation.mdwith variant selection and marker positioning docs
uSpec V1.5.0
All seven skills now handle composable slot components (button groups, tab bars, chip groups) — with new SLOT node traversal, composition-level deduplication, blown-out child rendering, and realistic artwork labels.Composable slot support across skills
- New
slotclassification type in the anatomy extraction script — SLOT nodes are detected, traversed, and annotated with a dedicated#slotindicator in the table - Slot traversal added to all three wrapper-walking paths (extraction, composition artwork, per-child artwork) so components using Figma’s composable slot pattern are handled consistently
- Voice/screen reader extraction recurses into slot containers with identically-named children, assigning
slotIndexfor index-based matching across focus stop resolution
Composition-level deduplication
- Multiple instances of the same sub-component (e.g., 4 buttons in a button group) are collapsed into a single representative element with an
(xN)suffix at the composition level - Prevents redundant markers, outlines, and table rows — one entry per unique sub-component, with a note explaining the repeated pattern
- Per-child sections are also deduplicated by
mainComponentSetIdso only one anatomy section is created per unique sub-component
Blown-out child rendering (property skill)
- New rendering mode creates instances directly from a child’s component set instead of modifying nested instances in a parent — immune to sparse variant matrices and nested-instance property access issues
- Automatic fallback: when
setProperties()fails on a nested instance, the chapter is re-rendered in blown-out mode - Sparse variant matrix detection added to AI validation — identifies missing axis combinations and adds
constrainedBymetadata for correct base variant selection - Coupled axis detection improved with heuristics for semantically coupled axes where option names differ
Artwork label replacement (voice skill)
- Artwork previews now replace generic “Label” placeholder text with realistic, state-specific labels (e.g., “Day”, “Week”, “Month”, “Year”)
- Labels are passed per-state via
artworkLabelsand applied by detaching the instance and its nested sub-instances before modifying text nodes - Focus stop outlines (pink dashed rectangles) added to voice artwork for visual consistency with the anatomy skill
Color token resolution improvements
- Token resolution now prefers
codeSyntax.WEBover raw variable names, producing cleaner developer-ready token references - Paint style fallback added for fills, strokes, and effects — when no variable binding exists but a Figma paint style is applied, the style name is used as the token
- Container/slot component detection: when the parent has no direct color entries, extraction re-targets to the sub-component automatically
- Mode token maps updated to use web code syntax
API child overrides for slot components
- Configuration examples now support
childOverrides— per-child property overrides applied to composable slot children by index - Item-level properties (e.g.,
item 1 isSelected) can be documented in example tables to reflect the preview state
Figma MCP compatibility (property skill)
- Added method restriction table and replacement helpers (
findByName,findAllText, font-loading viatn.fontName) forfigma-mcpwherefindAll,findOne, andgetRangeAllFontNamesthrowTypeError - Page-loading block updated to use explicit page name lookup instead of parent traversal
User-provided design context
- Anatomy and property skills now integrate user-provided notes (behavioral descriptions, usage constraints, coupling hints) into semantic notes and validation logic
- Voice skill documents behavioral states from user context (e.g., single-select vs. multi-select) as separate entries when they produce different semantic properties
Robustness
- Font loading wrapped in try/catch across all rendering scripts to prevent crashes on mixed-font or empty text nodes
- Instance-wrapper terminology standardized from “slot-wrapper” to “instance-wrapper” across all skills and instruction files
uSpec V1.4.1
Documentation now covers both Figma MCP providers — Figma Console MCP (Southleft) and native Figma MCP (Figma) — across the entire docs site.Dual MCP documentation
- All references to “Figma Console MCP” replaced with MCP-agnostic phrasing throughout spec pages, diagrams, and prerequisites
- Architecture overview in How It Works rewritten to show both MCP paths in a single diagram
- Mermaid diagrams across all 7 spec pages and the How It Works page updated to use generic “Figma MCP” nodes
- Removed tool-specific labels (
figma_execute) from diagram nodes — tool names are implementation details
Expanded troubleshooting
- Figma connection troubleshooting restructured into Console MCP and Native Figma MCP tabs
- Added native MCP troubleshooting for connection issues, token validation errors, and file/node resolution
- Updated multiple-agent guidance to cover both MCP models
Pre-verification callout
- Added a prominent warning between MCP setup and firstrun in Getting Started — test your MCP connection before running firstrun
- MCP-specific verification instructions with links to each provider’s documentation
MCP documentation freshness notices
- Added notes throughout setup and troubleshooting pages reminding readers that MCP providers update their instructions frequently
- Direct links to Figma Console MCP docs and native Figma MCP docs wherever configuration is discussed
Global navigation
- Removed the Figma Console MCP anchor from the global nav — with dual MCP support, a single provider link is misleading
uSpec V1.4
Thecreate-color skill now uses a single consolidated extraction script and a clearer AI interpretation layer — replacing the previous multi-step flow with a faster, more accurate pipeline.Consolidated extraction script
- A single
figma_executecall (Step 4b) replaces the previous multi-step flow (token extraction + separate boolean enrichment + separate axis classification), handling everything in one pass - The script walks the component tree, resolves color variable bindings, classifies variant axes by token fingerprint, detects boolean-gated elements, and discovers mode-controlled collections
Sub-component tagging
- Nested instances are now tagged with their parent component set name, producing richer and more descriptive element labels in the output tables
Nested boolean enablement
- Live preview instances now show all optional elements (icons, prefix/suffix, clear button, hints) by recursively enabling boolean properties on nested instances, so the artwork matches the documented tokens
Updated AI interpretation layer
- Step 4c strategy selection logic is clearer — the two-gate model (variant count and token similarity) now has explicit thresholds and reasoning guidance for choosing Strategy A vs Strategy B
uSpec V1.3
Thecreate-voice screen reader skill now produces more detailed, more accurate specs while using fewer tokens — smarter extraction, better artwork fidelity, and automatic state deduplication.More detailed screen reader output
- Focus stop discovery uses deep traversal (
findOne) instead of shallow children lookup — correctly resolves nested elements like a clear button inside an Input child instance - Focus Order artwork now maximizes element visibility: boolean properties are force-enabled and the richest state variant is selected automatically, so all documented focus stops appear in the preview even when the default variant hides some of them
booleanDefsextracted alongsidevariantAxesin the component scan, giving the rendering step full knowledge of toggleable sub-elements
Fewer tokens via state grouping
- States with identical accessibility semantics (same focus stops, roles, labels, and announcements) are collapsed into a single entry with a combined title — e.g., “Text field Enabled / Pressed / Active” instead of three separate sections
- Cuts redundant output for components like Text field that have many visual-only state differences but identical screen reader behavior
- Guidance added to both the skill workflow and the agent instruction file, with a new validation checklist row and common-mistake entry
Housekeeping
- Added
FONT_FAMILYplaceholder to the rendering template for consistent font resolution across specs
uSpec V1.2
Major overhaul of thecreate-structure skill with smarter measurements, template-driven layout, and a clear deterministic/AI split.Smarter measurement annotations
- Padding and spacing now use Figma’s native measurement display instead of custom text labels — cleaner output with no mislabeled annotations
- Min/max constraints show actual node values (e.g.,
min 32,max 200)
Template-driven previews
- Preview layout is defined by the template; the script no longer overrides direction or spacing
- Section template hidden by default, eliminating an extra manual step
Clearer agent instructions
- Removed ambiguous language that caused layout direction changes
- Updated validation rules for new measurement behavior
Deterministic vs AI split (~60/40)
- ~60% deterministic scripts handle extraction, cross-variant comparison, and rendering
- ~40% AI reasoning handles section planning, design-intent notes, and anomaly detection
- Output is highly consistent across runs
uSpec V1.1.0
Added support for Claude Code CLI and Codex CLI alongside Cursor, and improved anatomy and property skills for complex components.Multi-platform support
- Claude Code CLI and Codex CLI are now supported as agent hosts alongside Cursor
- New
firstrunskill handles environment setup — run/firstrunin Claude Code or$firstrunin Codex to get started - Skills are deployed to the chosen platform on demand, keeping each environment clean
CLAUDE.mdandAGENTS.mdprovide platform-specific project instructions
Improved layer detection
- Anatomy and Property skills now handle complex component structures with better layer detection and classification
- More accurate marker placement for deeply nested or auto-layout-heavy components
Infrastructure
sync-skills.shsupports--targetflag for platform-specific skill deploymentuspecs.config.jsonnow stores the active environment alongside template keys.gitignoreupdated to keep generated skill copies out of version control
uSpec V1
First public release of uSpec — an agentic system that generates design system documentation directly in Figma, powered by AI agent skills in Cursor.Spec types
- Anatomy: numbered markers and attribute tables for component structure, with AI-driven element classification, per-child sections, and property-aware unhide
- Properties: variant axes, boolean toggles, variable mode exhibits, and child component chapters with live instance previews
- API: property tables with values, defaults, required status, sub-component tables, and configuration examples
- Color Annotation: design token mapping for fills, strokes, and shadows across states and variants, with automatic strategy selection
- Structure: dimensions, spacing, and padding across density, size, and shape variants with token references
- Screen Reader: VoiceOver (iOS), TalkBack (Android), and ARIA (Web) accessibility specs with focus order and merge analysis
- Motion: animation timeline bars and easing detail tables from After Effects keyframe data, with pre-computed segments and color-coded easing visualization
Infrastructure
- Agent skills architecture running in Cursor via
.cursor/skills/ - Figma Console MCP integration for real-time component data extraction
- Template library system with one-time
@firstrunconfiguration - Documentation site at docs.uspec.design