LogoSkills

marionette

Widget-tree-level Flutter automation tuned for CoUI (Marionette MCP wrapper).

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/marionette
Aliases/coui:smoke, /widgetbook:verify
Categorycocode-flutter
Complexitymoderate
MCP Serversmarionette

/marionette โ€” ์‹คํ–‰ ์ค‘์ธ ์•ฑ์„ ์†๋Œ€์ง€ ์•Š๊ณ  ์กฐ์ข…ํ•˜๋Š” "์ธํ˜•์ˆ ์‚ฌ"#

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

์‹ค์ œ๋กœ ์ผœ์ ธ ์žˆ๋Š” Flutter ์•ฑ์„ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜์ง€ ์•Š๊ณ  ๋งˆ์น˜ ์ธํ˜•์ฒ˜๋Ÿผ ์กฐ์ข…ํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ณด๊ณ , ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•ด ๋ณด๊ณ , ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜๋ฉด์„œ "์ด ํ™”๋ฉดยท์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€" ์ž๋™์œผ๋กœ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

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

  • ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์•ฑ์„ ์ง์ ‘ ํด๋ฆญยท์ž…๋ ฅํ•ด ๋ณด๋ฉฐ ๋™์ž‘์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ๋””์ž์ธ ์‹œ์Šคํ…œ(CoUI) ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ™”๋ฉด๋“ค์„ ํ•œ๊บผ๋ฒˆ์— ๋‘˜๋Ÿฌ๋ณด๋ฉฐ ํšŒ๊ท€ ์ ๊ฒ€(regression sweep) ์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ์—ฌ๋Ÿฌ ํ™”๋ฉด์„ ๋น ๋ฅด๊ฒŒ ํ›‘์–ด ๊นจ์ง„ ๊ณณ์ด ์—†๋Š”์ง€ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ํŠน์ • ๋ฒ„ํŠผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ๋™์ž‘๋งŒ ์ฝ• ์ง‘์–ด ๊ฒ€์ฆํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฏ€๋กœ, QAยท๋””์ž์ด๋„ˆยท๊ธฐํš์ž๋„ "์ง€๊ธˆ ๋งŒ๋“ค์–ด์ง„ ํ™”๋ฉด์ด ์‹ค์ œ๋กœ ์ž˜ ๋„๋Š”์ง€" ํ™•์ธํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ์‹คํ–‰ ์ค‘์ธ ์•ฑ์— ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด, ํƒญยทํ…์ŠคํŠธ ์ž…๋ ฅยทํ•ซ ๋ฆฌ๋กœ๋“œยท์Šคํฌ๋ฆฐ์ƒท์„ ๋Œ€์‹  ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ๊ฒ€ ๊ฒฐ๊ณผ(์Šคํฌ๋ฆฐ์ƒท ๋“ฑ)๋ฅผ .claude/docs/marionette/<run_id>/ ํด๋”์— ์ •๋ฆฌํ•ด ๋‚จ๊ฒจ ์ค๋‹ˆ๋‹ค.
  • ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ™”๋ฉด์„ ๋Œ์•„๋ณด๊ฑฐ๋‚˜, ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋งŒ ๊นŠ๊ฒŒ ๊ฒ€์ฆํ•˜๋Š” ๋“ฑ ์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ณจ๋ผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

# ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ โ€” ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์ค€๋น„
/marionette setup

# Widgetbook ์นดํƒˆ๋กœ๊ทธ ์ „์ฒด๋ฅผ ๋Œ๋ฉฐ ํšŒ๊ท€ ์ ๊ฒ€
/marionette sweep --catalogue=coui

# ์ฃผ์š” ํ™”๋ฉด๋“ค์„ ๋น ๋ฅด๊ฒŒ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ
/marionette smoke --routes=/home,/posts,/settings

# ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๋งŒ ์ฝ• ์ง‘์–ด ๊ฒ€์ฆ
/marionette verify-component --type=PrimaryButton --usecase=destructive
  • setup: ๋งจ ์ฒ˜์Œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ์„ค์น˜ยท๋“ฑ๋ก ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
  • sweep: --catalogue๋กœ ์ง€์ •ํ•œ ๋ชฉ๋ก(์˜ˆ: coui)์„ ์ญ‰ ํ›‘์–ด ๊ฐ ํ•ญ๋ชฉ์„ ์บก์ฒ˜ยท์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • smoke: --routes์— ์ ์€ ํ™”๋ฉด๋“ค๋งŒ ๋น ๋ฅด๊ฒŒ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค(,๋กœ ๊ตฌ๋ถ„).
  • verify-component: --type(์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜)๊ณผ --usecase(์‚ฌ์šฉ ์˜ˆ์‹œ)๋ฅผ ์ง€์ •ํ•ด ํ•˜๋‚˜๋งŒ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ฌด ํ•˜์œ„ ๋ช…๋ น ์—†์ด /marionette๋งŒ ์‹คํ–‰ํ•˜๋ฉด, ์‹คํ–‰ ์ค‘์ธ ์•ฑ์„ ์ฐพ์•„ ์ž๋™ ์—ฐ๊ฒฐํ•œ ๋’ค ํ˜„์žฌ ํ™”๋ฉด๋งŒ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

ํ•˜์œ„ ๋ช…๋ น์„ ์ ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ‘œ์ค€ ํฌํŠธ(๊ธฐ๋ณธ 8181)์—์„œ ์‹คํ–‰ ์ค‘์ธ Flutter ์•ฑ์ด ์žˆ๋Š”์ง€ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ์•ฑ์„ ์ฐพ์œผ๋ฉด ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ(connect) ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ํ˜„์žฌ ํ™”๋ฉด๋งŒ ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

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

Subcommands#

SubcommandPurpose
setupOne-time install + binding registration (see commands/marionette/setup.md)
connectConnect to a running app via its VM Service URI
sweepWalk a target catalogue (Widgetbook UseCases, route table) and screenshot/interact each item
smokeQuick smoke test on a list of routes
verify-componentVerify one CoUI component's interactive behaviour

Quick Start#

# First time only
/marionette setup

# Drive a Widgetbook regression sweep
/marionette sweep --catalogue=coui

# Smoke test top-level routes
/marionette smoke --routes=/home,/posts,/settings

# Verify a single component
/marionette verify-component --type=PrimaryButton --usecase=destructive

Required Inputs#

SubcommandRequiredOptional
setupโ€”โ€”
connect--uriโ€”
sweep--catalogue--limit, --output
smoke--routes--output
verify-component--type, --usecase--prop-overrides

Default Behaviour#

If invoked with no subcommand, the agent:

  1. Looks for a running Flutter app on the standard VM Service port (8181 fallback).
  2. If found, calls connect automatically.
  3. Runs smoke against the current route only.

Output#

.claude/docs/marionette/<run_id>/ โ€” see skill SKILL.md for full schema.

  • Skill: cc-flutter-marionette:marionette
  • Templates: cc-flutter-marionette:marionette/TEMPLATES.md
  • Pixel-perfect verification: cc-flutter-pixel-loop:pixel-loop
  • Domain-state injection: cc-flutter-mcp-toolkit:mcp-toolkit