LogoSkills

marionette:verify-component

Verify one CoUI component's interactive behaviour in isolation.

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/marionette:verify-component
Categorycocode-flutter
Complexitysimple
MCP Serversmarionette

/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 ํ˜•์‹)

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

  1. ์ ๊ฒ€ํ•  ๋ถ€ํ’ˆ(๋˜๋Š” ์ง€์ •ํ•œ ํ˜•ํƒœ) ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ˆ„๋ฅด๊ธฐ ์ „ ํ™”๋ฉด์„ ์‚ฌ์ง„์œผ๋กœ ์ฐ์Šต๋‹ˆ๋‹ค (before.png).
  3. ๊ทธ ํ™”๋ฉด์—์„œ ์‹ค์ œ๋กœ ๋ˆ„๋ฅผ ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  4. ๊ทธ ์š”์†Œ๋ฅผ ๋ˆŒ๋Ÿฌ ๋ด…๋‹ˆ๋‹ค.
  5. ๋ˆ„๋ฅธ ํ›„ ํ™”๋ฉด์„ ๋‹ค์‹œ ์‚ฌ์ง„์œผ๋กœ ์ฐ์Šต๋‹ˆ๋‹ค (after.png).
  6. ์ž…๋ ฅ์ฐฝ ๋ถ€ํ’ˆ์ด๋ผ๋ฉด, ์ž…๋ ฅํ•œ ๊ธ€์ž๊ฐ€ ์ œ๋Œ€๋กœ ๋ฐ˜์˜๋๋Š”์ง€ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

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

Parameters#

ParameterRequiredDescription
--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#

  1. Navigate Widgetbook to <type> (or the named UseCase).
  2. take_screenshots โ†’ before.png.
  3. Identify the primary interactive element (filtered by isInteractiveWidget).
  4. Run its smoke action.
  5. take_screenshots โ†’ after.png.
  6. 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.md

Output#

.claude/docs/marionette/verify- < type > - < usecase > - < ts > /
โ”œโ”€โ”€ before.png
โ”œโ”€โ”€ after.png
โ”œโ”€โ”€ element.json     # what get_interactive_elements returned
โ””โ”€โ”€ summary.md