| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| Invoke | /jaspr-web:audit |
| Category | cocode-web |
| Complexity | moderate |
| MCP Servers | playwright |
/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 ํ์ด์ง๋ ๊ฑด๋๋ฐ๋ฉฐ ์ ๊ฒํฉ๋๋ค.
์์์ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๋์#
๋ฐ๊ฒฌํ ๋ชจ๋ ํ์ด์ง๋ง๋ค ์๋ ๊ณผ์ ์ ์ฐจ๋ก๋ก ๋ฐ๋ณตํฉ๋๋ค.
- ํ์ด์ง๋ก ์ด๋ํด ํ๋ฉด์ด ์์ ํ ๋ฉ์ถ(๋ก๋ฉ์ด ๋๋ ) ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
- ํ๋ฉด ๊ตฌ์กฐ๋ฅผ ํต์งธ๋ก ๋ ์, ๊ธฐ์ค ๋ชฉ๋ก์ ๋ฐ๋ผ ๋ฒํผยท์ ๋ ฅ์ฐฝยท๋ํ์ฐฝ ๋ฑ ๋ถํ์ ์ข ๋ฅ๋ณ๋ก ์ ๋๋ค.
- ํ์ด์ง ์ ์ฒด๋ฅผ ์ด๋ฏธ์ง๋ก ์บก์ฒํฉ๋๋ค.
- ํ๋ฉด ๋ค์์ ๋ ์ค๋ฅยท๋คํธ์ํฌ ์คํจ๋ฅผ ๋ชจ์ ๋ด์ต๋๋ค.
- ํ๋ฆฐ ๊ธ์จยท๋์ฒด ํ ์คํธ ๋๋ฝ ๊ฐ์ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ์ ๊ฒํฉ๋๋ค.
- ํ์ด์ง๋ณ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ผ๋ก ์ ์ฅํ๊ณ , ๋ง์ง๋ง์ ์ ์ฒด ์์ฝ ๋ณด๊ณ ์๋ฅผ ๋ง๋ญ๋๋ค.
โ๏ธ ์์ธ ์ต์ ยท์คํ ๋ช ์ธ (๊ฐ๋ฐ์ / AI ์์ด์ ํธ์ฉ)
Parameters#
| Parameter | Required | Description | Default |
|---|---|---|---|
--url | โ | Root URL to crawl (e.g. https://coui.cocode.im) | โ |
--depth | โ | Crawl depth from root | 1 |
--include | โ | Glob list of paths to include | all |
--exclude | โ | Glob list of paths to skip | none |
--selector-catalogue | โ | Path to YAML overriding default CoUI selectors | bundled defaults |
--mcp | โ | playwright (default) or chrome-devtools | playwright |
--output | โ | Output dir | .claude/docs/jaspr-web/audit-<ts>/ |
Loop#
For every page discovered:
- Navigate (
browser_navigate). - Wait for
networkidle. - Snapshot the DOM + ARIA tree (
browser_snapshot+aria-snapshot). - Apply the selector catalogue โ counts per primitive.
- Capture full-page screenshot.
- Drain console messages, network errors (4xx/5xx), and uncaught exceptions.
- Run accessibility heuristics (axe-style: missing alt, low-contrast text, role mismatches).
- Write per-route artifacts.
Selector Catalogue (defaults)#
| Primitive | Selector |
|---|---|
| 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"] |
| FlutterCanvas | flt-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,/changelogOutput (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 matchor/jaspr-web widgetbook-webfor that. - It does not assert pixel parity. Use
/jaspr-web regressionfor 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