| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /marionette |
| Aliases | /coui:smoke, /widgetbook:verify |
| Category | cocode-flutter |
| Complexity | moderate |
| MCP Servers | marionette |
/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๋ง ์คํํ๋ฉด, ์คํ ์ค์ธ ์ฑ์ ์ฐพ์ ์๋ ์ฐ๊ฒฐํ ๋ค ํ์ฌ ํ๋ฉด๋ง ์ค๋ชจํฌ ํ ์คํธํฉ๋๋ค.
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
ํ์ ๋ช ๋ น์ ์ ์ง ์๊ณ ๊ทธ๋ฅ ์คํํ์ ๋ ๊ธฐ๋ณธ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ค ํฌํธ(๊ธฐ๋ณธ 8181)์์ ์คํ ์ค์ธ Flutter ์ฑ์ด ์๋์ง ์ฐพ์ต๋๋ค.
- ์ฑ์ ์ฐพ์ผ๋ฉด ์๋์ผ๋ก ์ฐ๊ฒฐ(connect) ํฉ๋๋ค.
- ์ง๊ธ ๋ณด๊ณ ์๋ ํ์ฌ ํ๋ฉด๋ง ์ค๋ชจํฌ ํ ์คํธํฉ๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Subcommands#
| Subcommand | Purpose |
|---|---|
setup | One-time install + binding registration (see commands/marionette/setup.md) |
connect | Connect to a running app via its VM Service URI |
sweep | Walk a target catalogue (Widgetbook UseCases, route table) and screenshot/interact each item |
smoke | Quick smoke test on a list of routes |
verify-component | Verify 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=destructiveRequired Inputs#
| Subcommand | Required | Optional |
|---|---|---|
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:
- Looks for a running Flutter app on the standard VM Service port (8181 fallback).
- If found, calls
connectautomatically. - Runs
smokeagainst the current route only.
Output#
.claude/docs/marionette/<run_id>/ โ see skill SKILL.md for full schema.
Related#
- 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