LogoSkills

pixel-loop

Pixel-perfect Flutter UI agentic loop (Figma + Maestro + Dart).

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/pixel-loop
Aliases/pixel, /figma:loop
Categorycocode-flutter
Complexityhigh
MCP Serversfigma, maestro, dart

/pixel-loop โ€” ๋””์ž์ธ ๋˜‘๊ฐ™์ด ๋งž์ถ”๊ธฐ ์ž๋™ ๋ฃจํ”„#

ํ•œ๋งˆ๋””๋กœ#

Figma ๋””์ž์ธ ์‹œ์•ˆ๊ณผ ์‹ค์ œ ์•ฑ ํ™”๋ฉด์„ ๋‚˜๋ž€ํžˆ ๋†“๊ณ  ํ‹€๋ฆฐ ๊ณณ์„ ์ฐพ์•„ ์ž๋™์œผ๋กœ ๊ณ ์น˜๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•ด, ํ™”๋ฉด์„ ์‹œ์•ˆ๊ณผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋˜‘๊ฐ™์ด ๋งž์ถฐ ์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. "์‹œ์•ˆ ๋ณด๊ณ  โ†’ ์ฝ”๋“œ ๊ณ ์น˜๊ณ  โ†’ ์•ฑ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ  โ†’ ํ™”๋ฉด ์ฐ์–ด์„œ โ†’ ์‹œ์•ˆ๊ณผ ๋น„๊ต"๋ฅผ ์‚ฌ๋žŒ์ด ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ์•Œ์•„์„œ ๋Œ๋ ค ์ฃผ๋Š” ์ž๋™ ๊ฒ€์ˆ˜ ๋ฃจํ”„์˜ˆ์š”.

๋ˆ„๊ฐ€ยท์–ธ์ œ ์“ฐ๋‚˜์š”#

  • ์ƒˆ ํ™”๋ฉด์„ ๋””์ž์ธ ์‹œ์•ˆ ๊ทธ๋Œ€๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ ("์ด Figma ํ™”๋ฉด์„ ํ”ฝ์…€ ํผํŽ™ํŠธ๋กœ ๊ตฌํ˜„ํ•ด ์ค˜")
  • ๋งŒ๋“ค์–ด ๋‘” ํ™”๋ฉด์ด ์‹œ์•ˆ์—์„œ ์–ด๊ธ‹๋‚ฌ์„ ๋•Œ ๋‹ค์‹œ ๋งž์ถ”๊ณ  ์‹ถ์„ ๋•Œ ("์ด ํ™”๋ฉด์ด ๋””์ž์ธ์ด๋ž‘ ๋‹ฌ๋ผ์กŒ์–ด โ€” ๊ณ ์ณ ์ค˜")
  • ํŠน์ • ํ™”๋ฉด์ด ์‹œ์•ˆ๊ณผ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ์ง€ ์ ๊ฒ€(audit) ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

๋ฌด์—‡์„ ํ•ด์ฃผ๋‚˜์š”#

  • ์•ฑ ํ™”๋ฉด์„ Figma ์‹œ์•ˆ๊ณผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋น„๊ตํ•ด ์ฐจ์ด ๋‚˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ ์‹œ์•ˆ์— ๊ฐ€๊น๊ฒŒ ๋งž์ถฐ ์ค๋‹ˆ๋‹ค.
  • ๋น„๊ต์— ์“ด ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๋น„๊ต ๊ฒฐ๊ณผ ํŒŒ์ผ์ด .claude/docs/pixel-loop/<๋‚ ์งœ-์‹œ๊ฐ>/ ํด๋”์— ์ •๋ฆฌ๋˜์–ด ๋‚จ์Šต๋‹ˆ๋‹ค.
  • ์ฒ˜์Œ ์“ฐ๋Š” ๊ฒฝ์šฐ์—” ํ•„์š”ํ•œ ์—ฐ๊ฒฐ ๋„๊ตฌ(Figma / Maestro / Dart)๋ฅผ ํ•œ ๋ฒˆ์— ์„ค์น˜ยท๋“ฑ๋กํ•ด ์ค๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”#

# ์ƒˆ ํ™”๋ฉด ๊ตฌํ˜„ (Figma ์‹œ์•ˆ ์ฃผ์†Œ๋งŒ ์ฃผ๋ฉด ์‹œ์ž‘)
/pixel-loop loop https://www.figma.com/design/ < key > / < name > ?node-id= < id > 

 # /home ํ™”๋ฉด์ด ์‹œ์•ˆ์—์„œ ์–ด๊ธ‹๋‚œ ๊ฒƒ์„ ๋‹ค์‹œ ๋งž์ถ”๊ธฐ
/pixel-loop loop  < figma-url >   --mode=repair --route=/home

# ํ•œ ๋ฒˆ๋งŒ ๋น„๊ตํ•ด์„œ ์ ๊ฒ€ (๊ธฐ์กด ์Šคํฌ๋ฆฐ์ƒท vs ์‹œ์•ˆ)
/pixel-loop compare --figma= < figma-url >   --screenshot=.claude/docs/pixel-loop/home_actual.png

# ํ™”๋ฉด ์Šคํฌ๋ฆฐ์ƒท๋งŒ ํ•œ ์žฅ ์ฐ๊ธฐ
/pixel-loop capture --route=/home --label=baseline

# ์ฒ˜์Œ ์“ธ ๋•Œ ๋„๊ตฌ ์„ค์น˜ยท๋“ฑ๋ก
/pixel-loop setup
  • Figma ์‹œ์•ˆ ์ฃผ์†Œ๋งŒ ์ฃผ๋ฉด ์ž๋™์œผ๋กœ ์ƒˆ ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“œ(--mode=create)๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • --mode=repair๋Š” ์ด๋ฏธ ์žˆ๋Š” ํ™”๋ฉด์„ ๋‹ค์‹œ ๋งž์ถ”๋Š” ๋ชจ๋“œ๋กœ, ์–ด๋–ค ํ™”๋ฉด์ธ์ง€ --route(์˜ˆ: /home)๋ฅผ ๊ฐ™์ด ์•Œ๋ ค ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ๋ฐ–์— ํ—ˆ์šฉ ์˜ค์ฐจ(--tolerance), ๋ฐ˜๋ณต ํšŸ์ˆ˜ ์ œํ•œ(--iteration-cap), ๋น„๊ต์— ์“ธ ๊ธฐ๊ธฐ ์„ ํƒ(--target) ๊ฐ™์€ ์˜ต์…˜์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์ง€๋‚˜์š”#

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋Œ๊ธฐ ์ „์— ๋จผ์ € ์ค€๋น„ ์ƒํƒœ๋ถ€ํ„ฐ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์ „ ์ ๊ฒ€ โ€” Dart ์—ฐ๊ฒฐ, ํ™”๋ฉด์„ ๋„์šธ ๊ธฐ๊ธฐ(Maestro) ์—ฐ๊ฒฐ, Figma ์‹œ์•ˆ ์ ‘๊ทผ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋ผ๋„ ์•ˆ ๋˜๋ฉด ๋ฉˆ์ถ”๊ณ  /pixel-loop setup์„ ๋จผ์ € ๋Œ๋ฆฌ๋ผ๊ณ  ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ˜๋ณต ๋ฃจํ”„ โ€” ์‹œ์•ˆ์„ ์ฝ๊ณ (Read) โ†’ ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๊ณ (Write) โ†’ ์•ฑ์„ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ณ (Reload) โ†’ ํ™”๋ฉด์„ ์ฐ์–ด(Capture) โ†’ ์‹œ์•ˆ๊ณผ ๋น„๊ต(Compare)ํ•˜๋Š” ๊ณผ์ •์„, ์ฐจ์ด๊ฐ€ ํ—ˆ์šฉ ์˜ค์ฐจ ์•ˆ์— ๋“ค ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ ์ •๋ฆฌ โ€” ๋น„๊ต์— ์“ด ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๊ฒฐ๊ณผ๋ฅผ .claude/docs/pixel-loop/<๋‚ ์งœ-์‹œ๊ฐ>/ ํด๋”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

โš™๏ธ ์ƒ์„ธ ์˜ต์…˜ยท์‹คํ–‰ ๋ช…์„ธ (๊ฐœ๋ฐœ์ž / AI ์—์ด์ „ํŠธ์šฉ)

Triggers#

  • "Implement this Figma screen pixel-perfect"
  • "This screen drifted from the design โ€” fix it"
  • "Audit <screen> against <figma-url>"

Context Trigger Pattern#

/pixel-loop  < subcommand >   [args...]

Subcommands#

SubcommandPurpose
loopFull Read โ†’ Write โ†’ Reload โ†’ Capture โ†’ Compare loop (see commands/pixel-loop/loop.md)
captureMaestro screenshot of the current route with metadata (commands/pixel-loop/capture.md)
compareOne-shot visual diff between an existing screenshot and a Figma node (commands/pixel-loop/compare.md)
setupInstall + register Figma / Maestro / Dart MCPs (commands/pixel-loop/setup.md)

Default Behavior#

When invoked with a Figma URL only, defaults to:

/pixel-loop loop  < figma-url >   --mode=create --target=auto

--target=auto picks the first connected Maestro device, preferring iOS Simulator โ†’ Android Emulator โ†’ desktop.

Examples#

# New screen implementation
/pixel-loop loop https://www.figma.com/design/ < key > / < name > ?node-id= < id > 

 # Drift repair on /home
/pixel-loop loop  < figma-url >   --mode=repair --route=/home

# One-shot audit
/pixel-loop compare --figma= < figma-url >   --screenshot=.claude/docs/pixel-loop/home_actual.png

# Just grab a screenshot
/pixel-loop capture --route=/home --label=baseline

# First-time setup
/pixel-loop setup

Required Inputs#

ModeRequiredOptional
loop --mode=createfigma-url--route, --target, --tolerance, --iteration-cap
loop --mode=repairfigma-url, --route--target, --tolerance
capture--route--label, --target
compare--figma, --screenshot--tolerance
setupโ€”โ€”

Prerequisites Check#

Before any non-setup subcommand runs, the command verifies:

  1. Dart MCP is connected (DTD URI valid).
  2. Maestro MCP reports at least one connected device.
  3. Figma MCP can resolve the given file key.

If any check fails, the command pauses and instructs the user to run /pixel-loop setup.

Output#

All output goes to .claude/docs/pixel-loop/<YYYYMMDD-HHMM>/ (see skills/pixel-loop/SKILL.md for full schema).

  • Skill: cc-flutter-pixel-loop:pixel-loop
  • Companion command: cc-flutter-inspector:inspector:visual-verify
  • End-to-end feature pipeline: cc-flutter-dev:figma:analyze