LogoSkills

jaspr-web:audit

Walk a Jaspr site, inventory CoUI Web selectors, capture a11y + console-error reports per route.

ํ•ญ๋ชฉ๋‚ด์šฉ
Invoke/jaspr-web:audit
Categorycocode-web
Complexitymoderate
MCP Serversplaywright

/jaspr-web audit โ€” ์›น์‚ฌ์ดํŠธ ๊ฑด๊ฐ•๊ฒ€์ง„#

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

์›น์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์ž๋™์œผ๋กœ ํ•œ ๋ฐ”ํ€ด ๋Œ๋ฉด์„œ "์–ด๋–ค ๋ถ€ํ’ˆ(๋ฒ„ํŠผยท์ž…๋ ฅ์ฐฝ ๋“ฑ)์ด ๋ช‡ ๊ฐœ๋‚˜ ์“ฐ์˜€๋Š”์ง€" ์„ธ์–ด๋ณด๊ณ , "๊ธ€์”จ๊ฐ€ ๋„ˆ๋ฌด ํ๋ ค์„œ ์•ˆ ๋ณด์ด๊ฑฐ๋‚˜, ํ™”๋ฉด ๋’ค์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ณณ์€ ์—†๋Š”์ง€" ์ ๊ฒ€ํ•ด ์ฃผ๋Š” ์›น์‚ฌ์ดํŠธ ๊ฑด๊ฐ•๊ฒ€์ง„์ž…๋‹ˆ๋‹ค. ๊ฑด๋ฌผ์„ ํ•œ ์ธต์”ฉ ๋Œ๋ฉฐ ๋ฌธยท์ฐฝ๋ฌธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ณ  ๋ˆ„์ˆ˜ยท๊ท ์—ด์„ ๊ธฐ๋กํ•˜๋Š” ์‹œ์„ค ์ ๊ฒ€๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

  • ์šฐ๋ฆฌ ์›น์‚ฌ์ดํŠธ(์˜ˆ: CoUI ์‚ฌ์ดํŠธ)๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฌ๊ณ , ์–ด๋–ค ๊ตฌ์„ฑ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์ „์ฒด ํ˜„ํ™ฉ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ(ํ๋ฆฐ ๊ธ€์”จ, ๋Œ€์ฒด ํ…์ŠคํŠธ ๋ˆ„๋ฝ ๋“ฑ)๋‚˜ ์ˆจ์€ ์˜ค๋ฅ˜๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ฐพ์•„๋‚ด๊ณ  ์‹ถ์„ ๋•Œ
  • ๋ฐฐํฌ ์ „ํ›„๋กœ ์‚ฌ์ดํŠธ ์ƒํƒœ๋ฅผ ๊ฐ๊ด€์ ์ธ ์ˆซ์ž๋กœ ๊ธฐ๋กํ•ด ๋‘๊ณ  ์‹ถ์„ ๋•Œ

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

๊ฒ€์ง„์ด ๋๋‚˜๋ฉด .claude/docs/jaspr-web/audit-<์‹œ๊ฐ>/ ํด๋” ์•„๋ž˜์— ๊ฒฐ๊ณผ๋ฌผ์ด ์ •๋ฆฌ๋˜์–ด ๋‚จ์Šต๋‹ˆ๋‹ค.

  • summary.md โ€” ์ „์ฒด ์š”์•ฝ ๋ณด๊ณ ์„œ (๋ช‡ ๊ฐœ ํŽ˜์ด์ง€๋ฅผ ๋Œ์•˜๊ณ , ๋ถ€ํ’ˆ์ด ์ด ๋ช‡ ๊ฐœ์ด๋ฉฐ, ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ๋Š” ๋ช‡ ๊ฑด์ธ์ง€)
  • inventory/ โ€” ํŽ˜์ด์ง€๋ณ„ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜ ๋ช…์„ธ (JSON)
  • screens/ โ€” ํŽ˜์ด์ง€๋ณ„ ์ „์ฒด ํ™”๋ฉด ์บก์ฒ˜ ์ด๋ฏธ์ง€ (PNG)
  • a11y/ โ€” ํŽ˜์ด์ง€๋ณ„ ์ ‘๊ทผ์„ฑ ์ ๊ฒ€ ๊ฒฐ๊ณผ (ํ…์ŠคํŠธ)
  • network/, console/ โ€” ํŽ˜์ด์ง€๋ณ„ ๋„คํŠธ์›Œํฌยท์˜ค๋ฅ˜ ๊ธฐ๋ก

์ด ๋ช…๋ น์€ ์„ธ์–ด๋ณด๊ณ  ์ ๊ฒ€๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ , ๋””์ž์ธ์ด ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋˜‘๊ฐ™์€์ง€๊นŒ์ง€๋Š” ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ทธ๊ฑด /jaspr-web match, /jaspr-web regression ๊ฐ™์€ ๋‹ค๋ฅธ ๋ช…๋ น์˜ ๋ชซ์ž…๋‹ˆ๋‹ค).

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

/jaspr-web audit \
  --url=https://coui.cocode.im \
  --depth=2 \
  --exclude=/contributing,/changelog
  • --url (ํ•„์ˆ˜): ๊ฒ€์ง„์„ ์‹œ์ž‘ํ•  ์‚ฌ์ดํŠธ ์ฃผ์†Œ
  • --depth: ์‹œ์ž‘ ํŽ˜์ด์ง€์—์„œ ๋ช‡ ๋‹จ๊ณ„๊นŒ์ง€ ๋”ฐ๋ผ ๋“ค์–ด๊ฐˆ์ง€ (๊ธฐ๋ณธ 1๋‹จ๊ณ„)
  • --include / --exclude: ์ ๊ฒ€์— ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๊ฑด๋„ˆ๋›ธ ๊ฒฝ๋กœ ์ง€์ •
  • --selector-catalogue: ๋ถ€ํ’ˆ์„ ์•Œ์•„๋ณด๋Š” ๊ธฐ์ค€ ๋ชฉ๋ก์„ ์ง์ ‘ ๋ฐ”๊ฟ” ๋ผ์šฐ๊ณ  ์‹ถ์„ ๋•Œ
  • --mcp: ์‚ฌ์šฉํ•  ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ์—”์ง„ (๊ธฐ๋ณธ playwright)
  • --output: ๊ฒฐ๊ณผ๋ฌผ์„ ์ €์žฅํ•  ํด๋”

์œ„ ์˜ˆ์‹œ๋Š” CoUI ์‚ฌ์ดํŠธ๋ฅผ 2๋‹จ๊ณ„ ๊นŠ์ด๊นŒ์ง€ ๋Œ๋˜, /contributing๊ณผ /changelog ํŽ˜์ด์ง€๋Š” ๊ฑด๋„ˆ๋›ฐ๋ฉฐ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค.

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

๋ฐœ๊ฒฌํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€๋งˆ๋‹ค ์•„๋ž˜ ๊ณผ์ •์„ ์ฐจ๋ก€๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

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

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

Parameters#

ParameterRequiredDescriptionDefault
--urlโœ…Root URL to crawl (e.g. https://coui.cocode.im)โ€”
--depthโŒCrawl depth from root1
--includeโŒGlob list of paths to includeall
--excludeโŒGlob list of paths to skipnone
--selector-catalogueโŒPath to YAML overriding default CoUI selectorsbundled defaults
--mcpโŒplaywright (default) or chrome-devtoolsplaywright
--outputโŒOutput dir.claude/docs/jaspr-web/audit-<ts>/

Loop#

For every page discovered:

  1. Navigate (browser_navigate).
  2. Wait for networkidle.
  3. Snapshot the DOM + ARIA tree (browser_snapshot + aria-snapshot).
  4. Apply the selector catalogue โ†’ counts per primitive.
  5. Capture full-page screenshot.
  6. Drain console messages, network errors (4xx/5xx), and uncaught exceptions.
  7. Run accessibility heuristics (axe-style: missing alt, low-contrast text, role mismatches).
  8. Write per-route artifacts.

Selector Catalogue (defaults)#

PrimitiveSelector
Button[data-co="button"]
Button.primary[data-co="button"][data-variant="primary"]
Input[data-co="input"]
Dialog[data-co="dialog"]
NavigationBar[data-co="navigation-bar"]
FlutterCanvasflt-glass-pane, flutter-view

Override with --selector-catalogue=.claude/docs/jaspr-web/selectors.yaml if CoUI Web ships different attribute names.

Example#

/jaspr-web audit \
  --url=https://coui.cocode.im \
  --depth=2 \
  --exclude=/contributing,/changelog

Output (excerpt of summary.md):

Crawled: 142 routes
Components inventoried: 7,318 instances
Buttons:        2,104  (primary 612, secondary 488, outline 320, ghost 244, link 256, destructive 184)
Inputs:           512
Dialogs:           37
Flutter embeds:   142  (one per live-preview card)
A11y findings:     12  (1 missing alt, 11 low-contrast text)
Console errors:     0
Network 4xx:        3  (favicon-related, ignorable)

What this command does not do#

  • It does not interact with Flutter Web embeds (just counts the canvas containers). Use /jaspr-web match or /jaspr-web widgetbook-web for that.
  • It does not assert pixel parity. Use /jaspr-web regression for that.

Artifacts#

.claude/docs/jaspr-web/audit- < ts > /
โ”œโ”€โ”€ inventory/
โ”‚   โ””โ”€โ”€  < route-slug > .json
โ”œโ”€โ”€ screens/ < route-slug > .png
โ”œโ”€โ”€ a11y/ < route-slug > .txt
โ”œโ”€โ”€ network/ < route-slug > .har
โ”œโ”€โ”€ console/ < route-slug > .log
โ””โ”€โ”€ summary.md