LogoSkills

marionette:smoke

Smoke test a list of routes: navigate, screenshot, list interactive elements, surface errors.

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

/marionette smoke โ€” ํ™”๋ฉด๋“ค์ด ์ผ๋‹จ ์ž˜ ๋œจ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ์ ๊ฒ€#

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

์•ฑ์˜ ์ฃผ์š” ํ™”๋ฉด๋“ค์„ ํ•˜๋‚˜์”ฉ ์ž๋™์œผ๋กœ ์—ด์–ด๋ณด๊ณ  "์ •์ƒ์ ์œผ๋กœ ๋–ด๋Š”์ง€, ์—๋Ÿฌ๋Š” ์—†๋Š”์ง€"๋งŒ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๋Š” ์ ๊ฒ€์ž…๋‹ˆ๋‹ค. ๊ฑด๋ฌผ์„ ๋„˜๊ธฐ๊ธฐ ์ „์— ๊ฐ ๋ฐฉ์˜ ๋ถˆ์ด ์ผœ์ง€๋Š”์ง€ ์Šค์œ„์น˜๋งŒ ๋ˆŒ๋Ÿฌ๋ณด๊ณ  ๋„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๊ฐ€๊ตฌ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋งŒ์ ธ๋ณด๋Š” ์ •๋ฐ€ ์ ๊ฒ€์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

  • ์ฝ”๋“œ๋ฅผ ํ•ฉ์น˜๊ธฐ(merge) ์ง์ „์—, ์ฃผ์š” ํ™”๋ฉด๋“ค์ด ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ๊ฐ€๋ณ๊ฒŒ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž
  • "๋ฐฉ๊ธˆ ๋ฐ”๊พผ ๊ฒŒ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š์•˜๋‚˜"๋ฅผ ๋น ๋ฅด๊ฒŒ ํ›‘๊ณ  ์‹ถ์„ ๋•Œ
  • CI(์ž๋™ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ)์— ๋„ฃ์–ด ํ™”๋ฉด์ด ๋œจ๋Š”์ง€ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

ํ™”๋ฉด๋ณ„๋กœ ๋ฒ„ํŠผยท์ž…๋ ฅ์นธ ํ•˜๋‚˜ํ•˜๋‚˜๊นŒ์ง€ ์ง์ ‘ ๋ˆŒ๋Ÿฌ๋ณด๋ฉฐ ๊นŠ๊ฒŒ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ์ด ๋ช…๋ น ๋Œ€์‹  sweep์„ ์“ฐ์„ธ์š”.

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

์ง€์ •ํ•œ ํ™”๋ฉด๋“ค์„ ์ฐจ๋ก€๋กœ ์—ด์–ด๋ณด๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ•œ ํด๋”์— ์ •๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.

  • screens/<route>.png โ€” ๊ฐ ํ™”๋ฉด์˜ ์Šคํฌ๋ฆฐ์ƒท
  • interactive_summary.json โ€” ํ™”๋ฉด์— ์žˆ๋Š” ๋ฒ„ํŠผยท์ž…๋ ฅ์นธ ๋“ฑ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜์™€ ์ข…๋ฅ˜
  • errors.txt โ€” ํ™”๋ฉด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ๊ธฐ๋ก
  • summary.md โ€” ์ „์ฒด ํ†ต๊ณผ/์‹คํŒจ ์š”์•ฝ (CI์—์„œ ์„ฑ๊ณตยท์‹คํŒจ ํŒ์ • ์šฉ๋„๋กœ ์‚ฌ์šฉ)

ํŒ์ • ๊ธฐ์ค€์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ™”๋ฉด์ด ์ •์ƒ์ ์œผ๋กœ ๋œจ๊ณ  ์—๋Ÿฌ๊ฐ€ ์—†์œผ๋ฉด ํ†ต๊ณผ, ์–ด๋–ค ํ™”๋ฉด์ด ์—๋Ÿฌ๋ฅผ ๋‚ด๊ฑฐ๋‚˜ ์•„๋ฌด ์š”์†Œ๋„ ์—†๋Š” ๋นˆ ํ™”๋ฉด(ํฐ ํ™”๋ฉด)์ด๋ฉด ์‹คํŒจ์ž…๋‹ˆ๋‹ค.

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

/marionette smoke --routes=/home,/posts/123,/settings
  • --routes (ํ•„์ˆ˜) โ€” ์ ๊ฒ€ํ•  ํ™”๋ฉด ๊ฒฝ๋กœ๋“ค์„ ์‰ผํ‘œ๋กœ ์ด์–ด์„œ ์ ์Šต๋‹ˆ๋‹ค. ์˜ˆ: /home,/posts,/settings
  • --output (์„ ํƒ) โ€” ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ํด๋”. ์•ˆ ์ ์œผ๋ฉด .claude/docs/marionette/smoke-<์‹œ๊ฐ>/์— ์ž๋™ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

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

์ง€์ •ํ•œ ๊ฐ ํ™”๋ฉด๋งˆ๋‹ค ๋‹ค์Œ์„ ์ˆœ์„œ๋Œ€๋กœ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ•ด๋‹น ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. (ํ™”๋ฉด์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ์•ฑ์ด ์ง€์›ํ•˜๋ฉด ๊ฒฝ๋กœ๋กœ ๋ฐ”๋กœ ์ด๋™)
  2. ํ™”๋ฉด ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Šต๋‹ˆ๋‹ค.
  3. ํ™”๋ฉด ์•ˆ์˜ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ์š”์†Œ(๋ฒ„ํŠผยท์ž…๋ ฅ์นธ ๋“ฑ)์˜ ๊ฐœ์ˆ˜์™€ ์ข…๋ฅ˜๋ฅผ ์„ธ์–ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  4. ์—๋Ÿฌ ์ˆ˜์ค€ ์ด์ƒ์˜ ๋กœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ์–ด์™€ ์š”์•ฝ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ™”๋ฉด์„ ๋‹ค ๋Œ๋ฉด summary.md์— ์ „์ฒด ํ†ต๊ณผ/์‹คํŒจ ๊ฒฐ๊ณผ๊ฐ€ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.


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

Parameters#

ParameterRequiredDescription
--routesโœ…Comma-separated route paths, e.g. /home,/posts,/settings
--outputโŒOutput dir (default .claude/docs/marionette/smoke-<ts>/)

Behaviour#

For each route:

  1. Navigate via Marionette tap on existing navigation elements OR โ€” if the app exposes a goNamed-style dynamic tool via cc-flutter-mcp-toolkit โ€” call that instead.
  2. take_screenshots.
  3. get_interactive_elements (count + types only โ€” saved to JSON).
  4. get_logs โ€” pull anything at Level.error or higher; surface in summary.md.

Pass / Fail#

  • โœ… Pass: every route renders and produces no error log.
  • โŒ Fail: route threw, or get_interactive_elements returns empty (likely white screen).

Output#

.claude/docs/marionette/smoke- < ts > /
โ”œโ”€โ”€ screens/ < route > .png
โ”œโ”€โ”€ interactive_summary.json
โ”œโ”€โ”€ errors.txt
โ””โ”€โ”€ summary.md

Example#

/marionette smoke --routes=/home,/posts/123,/settings

Use in CI by piping the agent prompt through a non-interactive runner; the command returns exit-code-style status in summary.md.