| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /inspector:visual-verify |
| Category | cocode-flutter |
| Complexity | moderate |
| MCP Servers | flutter-inspector, maestro, figma, dart |
/inspector/visual-verify โ ํ๋ฉด์ด ๋์์ธ๋๋ก ๋์๋์ง "์ฌ์ง ์ฐ์ด ๋์กฐ"#
ํ๋ง๋๋ก#
์ค์ ๋ก ๋์๊ฐ๋ ์ฑ ํ๋ฉด์ ์ฌ์ง์ผ๋ก ์ฐ์ด, Figma ๋์์ธ ์๋ณธ๊ณผ ๋๋ํ ๋๊ณ "๋ค๋ฅธ ์ "์ ์ฐพ์์ฃผ๋ ๊ฒ์ฌ๊ธฐ์ ๋๋ค. ์ฝ๋๋ฅผ ๊ณ ์น์ง๋ ์๊ณ , ์ด๋๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋ฆฌํฌํธ๋ง ๋ง๋ค์ด ์ค๋๋ค.
๋๊ฐยท์ธ์ ์ฐ๋์#
- ๋์์ด๋ยท๊ธฐํ์: "์ง๊ธ ์ฑ ํ๋ฉด์ด ์ฐ๋ฆฌ Figma ์์๊ณผ ์ ๋ง ๋๊ฐ์ด ๋์๋?"๋ฅผ ํ์ธํ๊ณ ์ถ์ ๋
- ๊ฐ๋ฐ์: ์ฝ๋๋ฅผ ์ง์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ํ๋ฉด๊ณผ ๋์์ธ์ ์ฐจ์ด๋ง ๋น ๋ฅด๊ฒ ์ ๊ฒํ๊ณ ์ถ์ ๋
-
ํ๋ฉด ํ ๊ฐ๋ฟ ์๋๋ผ ์ฌ๋ฌ ํ๋ฉด(
/home,/settings,/profile๋ฑ)์ ํ ๋ฒ์ ์ ๊ฒํ๋ "ํ๊ท ๊ฒ์ฌ"๊ฐ ํ์ํ ๋
๋ฌด์์ ํด์ฃผ๋์#
์ง์ ํ ํ๋ฉด์ ์ค์ ๋ก ๋์ ์ฌ์ง์ ์ฐ๊ณ , Figma ์์๊ณผ ๋น๊ตํด ๋ค๋ฅธ ์ ์ ์ ๋ฆฌํ ๋ฆฌํฌํธ ํ์ผ์ ๋ง๋ค์ด ์ค๋๋ค.
- ์ฐ์ ํ๋ฉด ์ฌ์ง (์:
screens/after.png) -
์ฐจ์ด ๋ฆฌํฌํธ ํ์ผ:
.claude/docs/inspector/visual-verify/<์คํID>/diff.yaml- ์: ๊ธ์ ๊ตต๊ธฐ 500 โ 600, ๋ฐฐ๊ฒฝ์ #F9FAFB โ #FFFFFF ์ฒ๋ผ "๋ฌด์์ด ์ด๋ป๊ฒ ๋ฌ๋ผ์ก๋์ง" ๋ชฉ๋ก
- ์ฌ๋ฌ ํ๋ฉด์ ๊ฒ์ฌํ๋ฉด ํ๋ฉด๋ณ ๋ฆฌํฌํธ์ ์ ์ฒด ์์ฝ๊น์ง ํจ๊ป ๋ง๋ค์ด ์ค๋๋ค
์ฐจ์ด๋ฅผ ์๋์ผ๋ก "๊ณ ์ณ์ฃผ์ง๋ ์๋๋ค"๋ ์ ์ด ํต์ฌ์
๋๋ค. ๊ณ ์น๋ ์์
์ ๋ณ๋ ๋ช
๋ น(/pixel-loop)์ ๋๊น๋๋ค.
์ด๋ป๊ฒ ์ฐ๋์#
# ๊ธฐ๋ณธ: ํ๋ฉด ํ๋๋ฅผ Figma ์์๊ณผ ๋น๊ต
/inspector/visual-verify \
--figma=https://www.figma.com/design/AbCd/Home?node-id=12-345 \
--route=/home
# ์ฌ๋ฌ ํ๋ฉด์ ํ ๋ฒ์ ์ ๊ฒ (ํ๊ท ๊ฒ์ฌ)
/inspector/visual-verify --figma= < file-url > \
--routes=/home,/settings,/profile \
--mode=regression
--figma(ํ์): ๋น๊ต ๊ธฐ์ค์ด ๋๋ Figma ์์ ์ฃผ์ (node-idํฌํจ)--route(ํ์): ๊ฒ์ฌํ ์ฑ ํ๋ฉด ๊ฒฝ๋ก (/home,/posts/123๋ฑ)-
--mode:verify(๊ธฐ๋ณธ) /verify-after-reload(๋ฐฉ๊ธ ๊ณ ์น ํ๋ฉด์ ๋ค์ ๋ถ๋ฌ์ ์ฐ๊ธฐ) /regression(์ฌ๋ฌ ํ๋ฉด ํ ๋ฒ์) --routes:--mode=regression์ผ ๋ ๊ฒ์ฌํ ํ๋ฉด ๋ชฉ๋ก์ ์ผํ๋ก ๋์ด-
--target: ์ด๋ ๊ธฐ๊ธฐ์์ ์ฐ์์ง (ios/android/macos/linux/windows/auto) --tolerance: ์ด๋ ์ ๋๊น์ง "๊ฐ๋ค"๊ณ ๋ด์ค์ง ํ์ฉ ์ค์ฐจ (๊ธฐ๋ณธpixel=1,color_delta_e=2)
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
- Figma ์์์ ๋ถ๋ฌ์ "์ด๋ ๊ฒ ๋์์ผ ํ๋ค"๋ ๊ธฐ์ค์ ์ ํฉ๋๋ค.
- ์ฑ์ ์คํํด ์ง์ ํ ํ๋ฉด์ผ๋ก ์ด๋ํ ๋ค, ๊ทธ ํ๋ฉด์ ์ฌ์ง์ ์ฐ์ต๋๋ค.
- ํ๋ฉด์ ๊ตฌ์ฑ ์์(์์ ฏ ๊ตฌ์กฐ)๋ ํจ๊ป ์ดํด ๋น๊ต ์ ํ๋๋ฅผ ๋์ ๋๋ค.
- ์์๊ณผ ์ฌ์ง์ ๋์กฐํด ๋ค๋ฅธ ์ ์ ๊ณจ๋ผ๋ด๊ณ , ์ฐจ์ด ๋ฆฌํฌํธ ํ์ผ(
diff.yaml)๋ก ์ ์ฅํฉ๋๋ค. verify-after-reload๋ชจ๋๋ฉด ์ฌ์ง ์ฐ๊ธฐ ์ ์ ๋ฐฉ๊ธ ๊ณ ์น ๋ด์ฉ์ ๋ค์ ๋ถ๋ฌ์(ํซ ๋ฆฌ๋ก๋) ์ต์ ํ๋ฉด์ ์ฐ์ต๋๋ค.regression๋ชจ๋๋ฉด ํ๋ฉด ๋ชฉ๋ก์ ํ๋์ฉ ๋๋ฉฐ ๋ชจ๋ ์ฐ๊ณ , ํ๋ฉด๋ณ ๋ฆฌํฌํธ + ์ ์ฒด ์์ฝ์ ๋ง๋ญ๋๋ค.
์ด ๋ช
๋ น์ ํ ๋ฒ ๊ฒ์ฌํด ๋ฆฌํฌํธ๋ง ๋จ๊ธฐ๊ณ ๋๋ฉ๋๋ค. ์ฐจ์ด๋ฅผ ์ค์ ๋ก ๋ง์ถฐ ๊ณ ์น๊ณ ์ถ๋ค๋ฉด /pixel-loop๋ก ๋๊ฒจ์ฃผ์ธ์.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Parameters#
| Parameter | Required | Description |
|---|---|---|
--figma | โ | Figma frame URL (with node-id) |
--route | โ | In-app route to verify (/home, /posts/123, โฆ) |
--mode | โ | verify (default), verify-after-reload, or regression |
--routes | conditional | Comma-separated list for --mode=regression |
--target | โ | ios/android/macos/linux/windows/auto |
--tolerance | โ | pixel=N,color_delta_e=N (default pixel=1,color_delta_e=2) |
Phase Flow#
verify (default)#
figma.getNode(nodeId)โ expected spec.- Maestro: launch (no clearState) โ navigate โ screenshot.
flutter-inspector.ui_get_widget_treefor structural context.- Agent diffs and writes
.claude/docs/inspector/visual-verify/<run_id>/diff.yaml.
verify-after-reload#
Adds a dart.hotReload() step before Maestro launches, so the freshly edited UI is captured. Use after a single-line tweak when you don't want to relaunch the app.
regression#
/inspector/visual-verify --figma= < file-url > \
--routes=/home,/settings,/profile \
--mode=regressionIterates each route, captures each screenshot, and writes a per-route diff plus an aggregate summary.
Example#
/inspector/visual-verify \
--figma=https://www.figma.com/design/AbCd/Home?node-id=12-345 \
--route=/homeOutput:
[1/1] Capture โ screens/after.png (iOS Simulator)
[1/1] Diff 2 deltas (TitleText weight 500โ600, BG #F9FAFBโ#FFFFFF)
Report: .claude/docs/inspector/visual-verify/20260511-1132/diff.yamlConvergence#
This command does not loop or edit. It produces a single report. If you want the agent to converge the deltas, hand off to /pixel-loop loop <figma-url> --mode=repair --route=<route>.
Related#
- Skill:
cc-flutter-inspector:visual-verify - Edit loop:
cc-flutter-pixel-loop:pixel-loop - Generic UI introspection:
cc-flutter-inspector:inspector/ui