| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /marionette:verify-component |
| Category | cocode-flutter |
| Complexity | simple |
| MCP Servers | marionette |
/marionette verify-component โ ๋ถํ ํ๋๋ง ์ฝ ์ง์ด ๋์ ์ ๊ฒ#
ํ๋ง๋๋ก#
๋ฒํผยท์ ๋ ฅ์ฐฝ ๊ฐ์ UI ๋ถํ ํ๋๋ฅผ ๋ฐ๊ฟจ์ ๋, ๊ทธ๊ฒ ์ฌ์ ํ ์ ๋๋ก ๋์ํ๋์ง ํ์ธํด ์ฃผ๋ ๋ช ๋ น์ ๋๋ค. ์๋ก ๋ง๋ ์๋์ฐจ ๋ฌธ ์์ก์ด ํ๋๋ง ๋ผ์ด๋ด "์ ์ด๋ฆฌ๊ณ ๋ซํ๋" ์ง์ ๋๋ฌ๋ณด๋ ์ ๊ฒ๊ณผ ๊ฐ์์.
๋๊ฐยท์ธ์ ์ฐ๋์#
- CoUI ๋์์ธ ์์คํ ์ ๋ถํ(์ปดํฌ๋ํธ) ํ๋๋ฅผ ์์ ํ ๊ฐ๋ฐ์
- ๊ทธ ๋ณ๊ฒฝ ํ "์ด ๋ถํ์ด ์ฌ๋ฌ ํํ(variant)์์ ์ฌ์ ํ ์ ๋์ํ๋์ง" ๋น ๋ฅด๊ฒ ํ์ธํ๊ณ ์ถ์ ๋
๋ฌด์์ ํด์ฃผ๋์#
์ง์ ํ ๋ถํ์ ํ๋ฉด์์ ์ง์ ๋๋ฌ๋ณด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ฒ ๋ณด๊ณ ์ ํด๋๋ก ๋จ๊ฒจ ์ค๋๋ค. ํด๋ ์์๋:
before.pngโ ๋๋ฅด๊ธฐ ์ ํ๋ฉด ์ฌ์งafter.pngโ ๋๋ฅธ ํ ํ๋ฉด ์ฌ์ง (๋ณํ๊ฐ ์์๋์ง ๋น๊ต์ฉ)element.jsonโ ์ ๊ฒ ๋์ ๋ถํ ์ ๋ณดsummary.mdโ ์ ๊ฒ ๊ฒฐ๊ณผ ์์ฝ
์
๋ ฅ์ฐฝ(InputยทTextarea) ๋ถํ์ด๋ผ๋ฉด ๊ธ์๋ฅผ ์
๋ ฅํ ๋ค "์ค์ ๋ก ๊ทธ ๊ธ์๊ฐ ์ ๋ค์ด๊ฐ๋์ง"๊น์ง ํ์ธํฉ๋๋ค.
์ด๋ป๊ฒ ์ฐ๋์#
/marionette verify-component --type=PrimaryButton --usecase=destructive
--type(ํ์) โ ์ ๊ฒํ CoUI ๋ถํ ์ด๋ฆ. ์:PrimaryButton--usecase(์ ํ) โ ๊ทธ ๋ถํ์ ํน์ ํํ๋ง ๊ณจ๋ผ ์ ๊ฒ. ์๋ตํ๋ฉด ๋ชจ๋ ํํ๋ฅผ ์ ๊ฒํฉ๋๋ค.--prop-overrides(์ ํ) โ ๋ถํ ์ค์ ๊ฐ์ ๊ทธ ์๋ฆฌ์์ ๋ฐ๊ฟ ์ ๊ฒ (YAML ํ์)
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
- ์ ๊ฒํ ๋ถํ(๋๋ ์ง์ ํ ํํ) ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋๋ฅด๊ธฐ ์ ํ๋ฉด์ ์ฌ์ง์ผ๋ก ์ฐ์ต๋๋ค (
before.png). - ๊ทธ ํ๋ฉด์์ ์ค์ ๋ก ๋๋ฅผ ์ ์๋ ํต์ฌ ์์๋ฅผ ์ฐพ์ต๋๋ค.
- ๊ทธ ์์๋ฅผ ๋๋ฌ ๋ด ๋๋ค.
- ๋๋ฅธ ํ ํ๋ฉด์ ๋ค์ ์ฌ์ง์ผ๋ก ์ฐ์ต๋๋ค (
after.png). - ์ ๋ ฅ์ฐฝ ๋ถํ์ด๋ผ๋ฉด, ์ ๋ ฅํ ๊ธ์๊ฐ ์ ๋๋ก ๋ฐ์๋๋์ง ํ ๋ฒ ๋ ํ์ธํฉ๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Parameters#
| Parameter | Required | Description |
|---|---|---|
--type | โ | CoUI primitive name, e.g. PrimaryButton |
--usecase | โ | Specific Widgetbook UseCase (default: all UseCases for that type) |
--prop-overrides | โ | YAML inline overrides for Widgetbook knobs |
Behaviour#
- Navigate Widgetbook to
<type>(or the named UseCase). take_screenshotsโbefore.png.- Identify the primary interactive element (filtered by
isInteractiveWidget). - Run its smoke action.
take_screenshotsโafter.png.- For
Input/Textarea, also re-fetch the element and assert the controller value matches the entered text.
Example#
/marionette verify-component --type=PrimaryButton --usecase=destructive[โ] navigated to PrimaryButton::destructive
[โ] tap target found: text= " Delete account "
[โ] tap executed
[โ] post-tap screenshot differs (ฮ > 0)
[โ] no errors in logs
Result: .claude/docs/marionette/verify-PrimaryButton-destructive- < ts > /summary.mdOutput#
.claude/docs/marionette/verify- < type > - < usecase > - < ts > /
โโโ before.png
โโโ after.png
โโโ element.json # what get_interactive_elements returned
โโโ summary.md