LogoSkills

jaspr-web

Jaspr Web automation: DOM audit, accessibility, visual regression, dual Webโ†”Flutter live-preview matching.

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/jaspr-web
Aliases/jaspr, /coui:web
Categorycocode-web
Complexityhigh
MCP Serversplaywright, chrome-devtools

/jaspr-web โ€” ์›น ํ™”๋ฉด ์ž๋™ ์ ๊ฒ€ยท๋น„๊ต ๋„์šฐ๋ฏธ#

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

์›น์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ๋žŒ ๋Œ€์‹  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ํ™”๋ฉด์„ ์ ๊ฒ€ํ•˜๊ณ , ์Šคํฌ๋ฆฐ์ƒท์„ ๋น„๊ตํ•˜๋Š” ์ž๋™ ๊ฒ€์‚ฌ๊ด€์ž…๋‹ˆ๋‹ค. ์‹ ์ถ• ๊ฑด๋ฌผ ์ค€๊ณต ๊ฒ€์‚ฌ์ฒ˜๋Ÿผ, ๊ฐ ๋ฐฉ(ํŽ˜์ด์ง€)์„ ํ•œ ์นธ์”ฉ ๋Œ๋ฉฐ ํ ์ง‘(์˜ค๋ฅ˜)์ด๋‚˜ ์„ค๊ณ„๋„(๊ธฐ์ค€ ํ™”๋ฉด)์™€ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ฐพ์•„ ๊ธฐ๋กํ•ด ์ค๋‹ˆ๋‹ค.

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

  • Jaspr๋กœ ๋งŒ๋“  ์›น์‚ฌ์ดํŠธ(์˜ˆ: coui.cocode.im)์˜ ํ™”๋ฉด ํ’ˆ์งˆ์„ ์ ๊ฒ€ํ•˜๊ณ  ์‹ถ์€ ๋‹ด๋‹น์ž
  • ์›น ํ™”๋ฉด๊ณผ Flutter ํ™”๋ฉด์ด ๋˜‘๊ฐ™์ด ๋ณด์ด๋Š”์ง€(ํ”ฝ์…€ ๋‹จ์œ„๋กœ) ๋งž์ถฐ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ
  • ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พผ ๋’ค, ํ™”๋ฉด์ด ์˜ˆ์ „๊ณผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์•˜๋Š”์ง€(์‹œ๊ฐ์  ๋ณ€ํ˜•) ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ์ ‘๊ทผ์„ฑ(์‹œ๊ฐ์žฅ์• ์ธ ๋“ฑ ๋ณด์กฐ ๊ธฐ์ˆ  ํ˜ธํ™˜)์ด๋‚˜ ์ฝ˜์†” ์˜ค๋ฅ˜๋ฅผ ํ•œ ๋ฒˆ์— ํ›‘์–ด๋ณด๊ณ  ์‹ถ์„ ๋•Œ

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

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ž๋™์œผ๋กœ ๋„์›Œ ๋‹ค์Œ์„ ๋Œ€์‹ ํ•ด ์ค๋‹ˆ๋‹ค.

  • ์‚ฌ์ดํŠธ๋งต์„ ๋”ฐ๋ผ ํŽ˜์ด์ง€๋ฅผ ๋Œ๋ฉฐ ํ™”๋ฉด ์š”์†Œยท์ ‘๊ทผ์„ฑยท์ฝ˜์†” ์˜ค๋ฅ˜ ๋ชฉ๋ก์„ ์ •๋ฆฌ
  • ์›น ํ™”๋ฉด โ†” Flutter ์›น ํ™”๋ฉด์„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋น„๊ตํ•ด ์ฐจ์ด ํ‘œ์‹œ
  • ๊ธฐ์ค€ ํ™”๋ฉด(baseline)๊ณผ ๋น„๊ตํ•œ ์Šคํฌ๋ฆฐ์ƒท ์ฐจ์ด(์‹œ๊ฐ ํšŒ๊ท€) ๊ฒ€์‚ฌ
  • ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋Š” .claude/docs/jaspr-web/<run_id>/ ํด๋”์— ๋ณด๊ณ ์„œ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

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

# ์ฒ˜์Œ ํ•œ ๋ฒˆ: ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋„๊ตฌ ์„ค์น˜ยท์ ๊ฒ€
/jaspr-web setup

# coui.cocode.im ํ™”๋ฉด ์ ๊ฒ€ (2๋‹จ๊ณ„ ๊นŠ์ด๊นŒ์ง€)
/jaspr-web audit --url=https://coui.cocode.im --depth=2

# ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ ํŽ˜์ด์ง€์—์„œ ์›น vs Flutter ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ
/jaspr-web match --url=https://coui.cocode.im/live-preview-poc

# ๋กœ์ปฌ ๋””๋ฒ„๊ทธ Flutter ์›น Widgetbook + ์ฃผ๋ณ€ Jaspr ํŽ˜์ด์ง€ ๊ตฌ๋™
/jaspr-web widgetbook-web --port=8080
  • URL๋งŒ ์ฃผ๊ณ  ํ•˜์œ„ ๋ช…๋ น์„ ์ƒ๋žตํ•˜๋ฉด ์ž๋™์œผ๋กœ audit(ํ™”๋ฉด ์ ๊ฒ€)์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋” ์ •๋ฐ€ํ•œ CSS ๊ฒ€์‚ฌ๋‚˜ ์„ฑ๋Šฅ ์ถ”์ ์ด ํ•„์š”ํ•˜๋ฉด --mcp=chrome-devtools ๋ฅผ ๋ถ™์—ฌ Chrome ๋„๊ตฌ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ•˜์œ„ ๋ช…๋ น์— ๋”ฐ๋ผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. setup โ€” ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋„๊ตฌ(Playwright/Chrome DevTools)๋ฅผ ์„ค์น˜ยท๋“ฑ๋กํ•˜๊ณ  ์ •์ƒ ๋™์ž‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. audit โ€” ์‚ฌ์ดํŠธ๋งต์„ ๋”ฐ๋ผ ํŽ˜์ด์ง€๋ฅผ ๋Œ๋ฉฐ ํ™”๋ฉด ์š”์†Œยท์ ‘๊ทผ์„ฑยท์ฝ˜์†” ์˜ค๋ฅ˜๋ฅผ ๋ชจ์•„ ๋ชฉ๋ก์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. match โ€” ์›น ํ™”๋ฉด๊ณผ Flutter ์›น ํ™”๋ฉด์„ ๋‚˜๋ž€ํžˆ ๋„์›Œ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  4. widgetbook-web โ€” ๋กœ์ปฌ์—์„œ ๋„์šด ๋””๋ฒ„๊ทธ Flutter ์›น Widgetbook ์„ธ์…˜์— ๋ถ™์–ด ํ™”๋ฉด์„ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค.
  5. regression โ€” ์ง€์ •ํ•œ ๊ฒฝ๋กœ๋“ค์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ๊ธฐ์ค€ ํ™”๋ฉด๊ณผ ๋น„๊ตํ•ด ๋‹ฌ๋ผ์ง„ ๋ถ€๋ถ„์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

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

Subcommands#

SubcommandPurpose
setupInstall Playwright/Chrome DevTools MCPs, register, smoke test
auditWalk a sitemap, inventory selectors + a11y + console errors (commands/jaspr-web/audit.md)
matchDual Webโ†”Flutter Web embed pixel matching (commands/jaspr-web/match.md)
widgetbook-webAttach to a local flutter run -d chrome --print-dtd Widgetbook session (commands/jaspr-web/widgetbook-web.md)
regressionScreenshot diff vs baseline for a list of routes

Default Behaviour#

If invoked without subcommand and a URL is given, defaults to audit --url=<url>.

Quick Start#

# First time
/jaspr-web setup

# Audit coui.cocode.im
/jaspr-web audit --url=https://coui.cocode.im --depth=2

# Verify Web vs Flutter parity on the live-preview page
/jaspr-web match --url=https://coui.cocode.im/live-preview-poc

# Drive a local debug Flutter Web Widgetbook + the surrounding Jaspr page
/jaspr-web widgetbook-web --port=8080

Required Inputs#

SubcommandRequiredOptional
setupโ€”โ€”
audit--url--depth, --selector-catalogue, --include, --exclude
match--url--tolerance, --variants, --output
widgetbook-web--port--routes, --marionette-uri
regression--routes--baseline-dir, --tolerance

Browser Selection#

The playwright MCP is the default for all subcommands. Force chrome-devtools instead with --mcp=chrome-devtools when you need:

  • Sharper CSS variable inspection.
  • Performance traces.
  • Native Chrome accessibility tree.

Output#

.claude/docs/jaspr-web/<run_id>/ โ€” see skills/jaspr-web/SKILL.md for the schema.

  • Skill: cc-jaspr-web:jaspr-web
  • Companion: cc-jaspr-web:live-preview-match
  • Native counterpart: cc-flutter-pixel-loop:pixel-loop
  • Debug-mode Flutter Web drive: cc-flutter-marionette:marionette