Skip to main content

insane-design

Extracts a deterministic design system from any URL by fetching real CSS, parsing custom properties, and generating a 19-section design.md plus an interactive HTML report. v0.2 writes frontmatter schema_version 3.1 with medium detection (web / slide / design-system / card-news / motion / print). Pairs with insane-apply and insane-build via the ยง18 DON'T hex-grep contract. Korean triggers: "๋””์ž์ธ ๋ถ„์„ํ•ด์ค˜", "์ด ์‚ฌ์ดํŠธ ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ฝ‘์•„์ค˜", "CSS ๋œฏ์–ด๋ด", "design.md ๋งŒ๋“ค์–ด์ค˜", "๋ ˆํผ๋Ÿฐ์Šค ๋ฆฌํฌํŠธ ๋งŒ๋“ค์–ด์ค˜", "์‚ฌ์ดํŠธ ๋ถ„์„", "๋””์ž์ธ ํ† ํฐ ์ถ”์ถœ". English triggers: "analyze design", "extract design tokens", "rip the design system", "what CSS does this site use".

Source facts

Repository
fivetaku/insane-design
Last source activity
July 23, 2026 at 09:13
Detected SKILL.md language
Mixed languages
Stars
133
Forks
18

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
100 files

Showing SKILL.md

SKILL.md
Source instructions ยท Read-only preview
name
insane-design
description
Extracts a deterministic design system from any URL by fetching real CSS, parsing custom properties, and generating a 19-section design.md plus an interactive HTML report. v0.2 writes frontmatter schema_version 3.1 with medium detection (web / slide / design-system / card-news / motion / print). Pairs with insane-apply and insane-build via the ยง18 DON'T hex-grep contract. Korean triggers: "๋””์ž์ธ ๋ถ„์„ํ•ด์ค˜", "์ด ์‚ฌ์ดํŠธ ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ฝ‘์•„์ค˜", "CSS ๋œฏ์–ด๋ด", "design.md ๋งŒ๋“ค์–ด์ค˜", "๋ ˆํผ๋Ÿฐ์Šค ๋ฆฌํฌํŠธ ๋งŒ๋“ค์–ด์ค˜", "์‚ฌ์ดํŠธ ๋ถ„์„", "๋””์ž์ธ ํ† ํฐ ์ถ”์ถœ". English triggers: "analyze design", "extract design tokens", "rip the design system", "what CSS does this site use".
<!-- first-run setup: idempotent, non-blocking, self-skips after first run --> **Step 0 โ€” run once, silently, before anything else:** `bash "${CLAUDE_PLUGIN_ROOT}/setup/setup.sh" >/dev/null 2>&1 || true` โ€” do not narrate or comment on it, then continue. # Insane Design > URL ํ•˜๋‚˜ โ†’ ์‹ค์ œ CSS ๊ธฐ๋ฐ˜ design.md + ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ HTML ๋ฆฌํฌํŠธ --- ## WHEN TRIGGERED - EXECUTE IMMEDIATELY ์ด ๋ฌธ์„œ๋Š” ์ฐธ๊ณ  ๋ฌธ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ **์‹คํ–‰ ์ง€์‹œ์„œ**๋‹ค. URL์ด ์ œ๊ณต๋˜๋ฉด ์ฆ‰์‹œ Step 1๋ถ€ํ„ฐ ์‹คํ–‰ํ•œ๋‹ค. --- ## ์‚ฌ์ „ ์ค€๋น„ ์Šคํ‚ฌ ์‹คํ–‰ ์ „ ๋‹ค์Œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ•„์š”ํ•œ Step์—์„œ ์ฝ๋Š”๋‹ค: - ๐Ÿ†• **`${CLAUDE_PLUGIN_ROOT}/skills/insane-design/references/schema.v3.2.md`** โ€” frontmatter + ์„น์…˜ ๊ตฌ์กฐ์˜ **๋‹จ์ผ ์ง„์‹ค ์›์ฒœ** (Step 0 โ€” ๊ฐ€์žฅ ๋จผ์ € Read ํ•„์ˆ˜). ์ด ํŒŒ์ผ์„ ์ฝ์ง€ ์•Š์œผ๋ฉด frontmatter ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Œ. - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/references/template.md` โ€” design.md 19์„น์…˜ v3.2 ํ…œํ”Œ๋ฆฟ (ยง00~ยง19) (Step 5์—์„œ Read) - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/references/report-prompt.md` โ€” HTML ๋ฆฌํฌํŠธ ์ƒ์„ฑ ๊ทœ์น™ v2.1 (Step 6์—์„œ Read) - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/references/report.css` โ€” canonical CSS (Step 6์—์„œ Read, ์žˆ์œผ๋ฉด ์‚ฌ์šฉ) - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/references/pitfalls.md` โ€” 14๊ฐ€์ง€ ํ•จ์ • (Step 4์—์„œ Read) - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/examples/stripe/design.md` โ€” ๊ณจ๋“œ ์Šคํƒ ๋‹ค๋“œ ์˜ˆ์‹œ (Step 5์—์„œ ์ฐธ์กฐ) - `${CLAUDE_PLUGIN_ROOT}/skills/insane-design/examples/stripe/report.ko.html` โ€” ๋ฆฌํฌํŠธ ๊ณจ๋“œ ์Šคํƒ ๋‹ค๋“œ (Step 6์—์„œ ์ฐธ์กฐ) --- ## ์›Œํฌํ”Œ๋กœ์šฐ โ€” 7 Steps > **๊ฒฝ๋กœ ๊ทœ์น™**: ๋ชจ๋“  Bash ๋ช…๋ น์€ ๋ฐ˜๋“œ์‹œ **ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ** ์‹คํ–‰ํ•œ๋‹ค. > Step ์‹คํ–‰ ์ „ `WORK_DIR`์„ ํ™•์ •ํ•˜๊ณ , ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๋˜๋Š” `$WORK_DIR` ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. > ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฌผ์€ `insane-design/{slug}/` ํ•˜์œ„์— ํ†ตํ•ฉ ์ €์žฅํ•œ๋‹ค. ```bash # Step 0: ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํ™•์ • (๋ชจ๋“  Step์—์„œ ๊ณต์œ ) WORK_DIR="$(pwd)" # ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋กœ ์‚ฌ์šฉ ``` ### Step 1: INIT **Type**: script URL์„ ํŒŒ์‹ฑํ•˜๊ณ  ์ž‘์—… ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•œ๋‹ค. 1. URL์—์„œ slug ์ถ”์ถœ (๋„๋ฉ”์ธ โ†’ kebab-case: `stripe.com` โ†’ `stripe`, `linear.app` โ†’ `linear`) 2. URL ๊ฒ€์ฆ (**๋ณด์•ˆ ํ•„์ˆ˜**): - `http://` ๋˜๋Š” `https://` ํ”„๋กœํ† ์ฝœ ํ™•์ธ - `localhost`, `127.0.0.1`, `file://` ์ฐจ๋‹จ - ๋„๋ฉ”์ธ ํ˜•์‹ ์œ ํšจ์„ฑ ํ™•์ธ - **์…ธ ํŠน์ˆ˜๋ฌธ์ž ๊ฒ€์ฆ**: URL์— `` ` ``, `$`, `(`, `)`, `;`, `|`, `&`, `>`, `<` ๋“ฑ ์…ธ ๋ฉ”ํƒ€๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜๋ฉด ๊ฑฐ๋ถ€ - ์ดํ›„ ๋ชจ๋“  Bash ๋ช…๋ น์—์„œ URL์€ ๋ฐ˜๋“œ์‹œ **ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์„œ** ์‚ฌ์šฉ: `"$URL"` 3. **๋งค์ฒด(medium) ๊ฐ์ง€** (v3.1 frontmatter ํ•„๋“œ์šฉ): | ์ž…๋ ฅ ํŒจํ„ด | medium | medium_confidence | |----------|--------|-------------------| | URL์ด `.pptx`/`.ppt`๋กœ ๋๋‚จ | `slide` | `high` | | URL์ด `docs.google.com/presentation/*` | `slide` | `high` | | URL์ด `*.pdf`๋กœ ๋๋‚จ | `print` | `high` (์Šคํ…๋งŒ, ํ˜„ ์„ธ์…˜ ๋ฏธ๊ตฌํ˜„) | | URL์ด `*.figma.com/file/*` (๋””์ž์ธ ์‹œ์Šคํ…œ ํƒ์ง€ ์‹œ) | `design-system` | `medium` | | ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์ž…๋ ฅ + ์ •์‚ฌ๊ฐ ๋น„์œจ | `card-news` | `medium` | | ๊ทธ ์™ธ ์ผ๋ฐ˜ URL | `web` | `high` (๊ธฐ๋ณธ๊ฐ’) | ๊ฐ์ง€ ๊ฒฐ๊ณผ๋Š” Step 5 WRITE-MD์—์„œ frontmatter `medium`, `medium_confidence` ํ•„๋“œ์— ๊ทธ๋Œ€๋กœ ๊ธฐ๋กํ•œ๋‹ค. 4. ๐Ÿ†• **Archetype ๊ฐ์ง€** (v3.2 frontmatter ํ•„๋“œ์šฉ โ€” ํŒ์ • #21): ์‚ฌ์ดํŠธ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ 11 enum + freeform์œผ๋กœ ๋ถ„๋ฅ˜. Step 4 INTERPRET์ด archetype์„ ์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ยง00 Narrative ์–ดํœ˜์™€ ยง13 ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ•์กฐ์ ์„ ๊ฒฐ์ •. **1์ฐจ ๋‹จ์„œ** (๋„๋ฉ”์ธ + meta tag ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฐ์ง€): - ๋„๋ฉ”์ธ ๋ (`.shop`, `.store`, `.app`, `.dev`, `.docs.*` ๋“ฑ) - meta tag (`og:type`, `twitter:card`, `application-name`) - hero ๊ตฌ์กฐ ์ฒซ ์ธ์ƒ (์Šคํฌ๋ฆฐ์ƒท) **11 enum**: | archetype | ๋‹จ์„œ | ์˜ˆ์‹œ | |-----------|------|------| | `commerce-marketplace` | listing card ์œ„์ฃผ, search-bar ํผ | Airbnb, Coupang, Etsy | | `editorial-product` | ํ’€-๋ธ”๋ฆฌ๋“œ ์ œํ’ˆ photography | Apple, Tesla, Nike | | `editorial-magazine` | article-first, headline ๊ฐ•์กฐ | Verge, Wired, Medium | | `app-dashboard` | sidebar nav, dense data | Linear, Notion, Figma | | `saas-marketing` | hero CTA + feature grid | Stripe, Vercel, Supabase | | `landing-utility` | single-page, ๊ฐ€์ž… ์œ ๋„ | Resend, Posthog landing | | `documentation-site` | sidebar TOC + code blocks | Tailwind docs, MDN | | `portfolio-personal` | ํ”„๋กœ์ ํŠธ grid + ์ž์œ  ๋ ˆ์ด์•„์›ƒ | ๊ฐœ์ธ ํฌํŠธํด๋ฆฌ์˜ค | | `automotive` | ์ฐจ๋Ÿ‰ photography + spec | BMW, Ferrari, Tesla | | `luxury-brand` | ๋ฏธ๋‹ˆ๋ฉ€ + ๊ณ ๊ธ‰ photography | Chanel, Dior, Gucci | | `other` | ์œ„ ์•ˆ ๋งž์Œ | (๋ณด์กฐ freeform ํ•„๋“œ ์‚ฌ์šฉ) | **`archetype_confidence`**: high (๋ช…ํ™•) / medium (ํ˜ผํ•ฉ) / low (์ถ”์ •) ๊ฐ์ง€ ๊ฒฐ๊ณผ๋Š” Step 5 WRITE-MD์—์„œ frontmatter `archetype`, `archetype_confidence`์— ๊ธฐ๋ก. 4. ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ (**์ ˆ๋Œ€ ๊ฒฝ๋กœ ์‚ฌ์šฉ**): ```bash mkdir -p "$WORK_DIR/insane-design/{slug}/{screenshots,css,phase1}" ``` 5. ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹œ์ž‘ ์•Œ๋ฆผ: ``` ๐ŸŽจ {slug} ๋””์ž์ธ ๋ถ„์„์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. URL: {url} ์˜ˆ์ƒ ์†Œ์š”: 3-5๋ถ„ ``` --- ### Step 2: FETCH **Type**: script HTML/CSS์™€ ์Šคํฌ๋ฆฐ์ƒท์„ **๋ณ‘๋ ฌ**๋กœ ์ˆ˜์ง‘ํ•œ๋‹ค. > **์ ‘๊ทผ ์ „๋žต**: insane-search Phase 0โ†’1โ†’2โ†’3 ์—์Šค์ปฌ๋ ˆ์ด์…˜ ์ฒด์ธ์„ ์ ์šฉ. > ์–ด๋–ค ๋ฐฉ๋ฒ•๋„ ๋ฏธ๋ฆฌ ์ œ์™ธํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋˜๋Š”์ง€๋Š” ์‹œ๋„ํ•ด๋ด์•ผ ์•ˆ๋‹ค. #### ์„ฑ๊ณต ํŒ์ • ํ•จ์ˆ˜ ๋ชจ๋“  tier์—์„œ ์ˆ˜์ง‘ํ•œ HTML์— ๋ฐ˜๋“œ์‹œ ์ ์šฉ: ```bash html_ok() { local f="$1" [ -s "$f" ] || return 1 [ "$(wc -c < "$f")" -ge 5000 ] || return 1 grep -q "<html" "$f" || return 1 # Cloudflare/WAF ์ฑŒ๋ฆฐ์ง€ ๊ฐ์ง€ grep -qiE "challenge-error-text|cf_chl_opt|__cf_chl_jschl|verify you are human|checking your browser" "$f" && return 1 return 0 } css_ok() { local f="$1" [ -s "$f" ] || return 1 [ "$(wc -c < "$f")" -ge 200 ] || return 1 # 403/error HTML์ด CSS๋กœ ์ €์žฅ๋œ ๊ฒฝ์šฐ ๊ฐ์ง€ grep -qiE "DOCTYPE HTML|403 ERROR|Access Denied|Request could not be satisfied|challenge-error-text" "$f" && return 1 return 0 } ``` #### 2A. HTML + CSS ์ˆ˜์ง‘ **6-tier ์—์Šค์ปฌ๋ ˆ์ด์…˜ ์ฒด์ธ**์œผ๋กœ HTML์„ ์ˆ˜์ง‘ํ•œ๋‹ค: ```bash URL="{url}" # Step 1์—์„œ ๊ฒ€์ฆ๋œ URL OUT="$WORK_DIR/insane-design/{slug}/index.html" # Tier 1: curl Chrome Desktop UA curl -sL \ -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \ -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \ -H "Accept-Language: en-US,en;q=0.9" \ --compressed --max-time 30 -o "$OUT" "$URL" # Tier 2: curl Mobile UA if ! html_ok "$OUT"; then curl -sL \ -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1" \ -H "Accept-Language: en-US,en;q=0.9" \ --compressed --max-time 30 -o "$OUT" "$URL" fi # Tier 3: Jina Reader HTML ๋ชจ๋“œ (Cloudflare/WAF ์šฐํšŒ โ€” ์‹ค์ฆ๋œ ๋ฐฉ๋ฒ•) # โš ๏ธ ๋Œ€์ƒ URL์ด r.jina.ai๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ๋‚ด๋ถ€ URL ์‚ฌ์šฉ ๊ธˆ์ง€. if ! html_ok "$OUT"; then curl -sL --max-time 45 \ -H "X-Return-Format: html" \ "https://r.jina.ai/$URL" -o "$OUT" fi # Tier 4: curl_cffi TLS ์ž„ํผ์†Œ๋„ค์ด์…˜ (Phase 2 ์—์Šค์ปฌ๋ ˆ์ด์…˜) if ! html_ok "$OUT"; then python3 -c "import curl_cffi" 2>/dev/null || pip install curl_cffi -q python3 - "$OUT" <<'PYEOF' from curl_cffi import requests as cffi_req import sys url = "{url}" out = sys.argv[1] for target in ["safari", "chrome", "firefox"]: try: r = cffi_req.get(url, impersonate=target, timeout=20, headers={"Accept-Language": "en-US,en;q=0.9", "Referer": "https://www.google.com/"}) if r.status_code == 200 and len(r.text) > 5000: open(out, "w").write(r.text) break except: continue PYEOF fi # Tier 5: Wayback Machine ์บ์‹œ (์‚ฌ์ด๋“œ์นด โ€” ์›๋ณธ ์ „๋ถ€ ์‹คํŒจ ์‹œ) if ! html_ok "$OUT"; then WB=$(curl -sL --max-time 15 "http://archive.org/wayback/available?url=$URL" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('archived_snapshots',{}).get('closest',{}).get('url',''))" 2>/dev/null) [ -n "$WB" ] && curl -sL --max-time 30 "$WB" -o "$OUT" fi # Tier 6: Playwright MCP (์ตœํ›„ ์ˆ˜๋‹จ โ€” JS ์ฑŒ๋ฆฐ์ง€ ์ „์šฉ) # html_ok "$OUT" ์‹คํŒจ ์‹œ โ†’ Playwright MCP browser_navigate + browser_snapshot ํ˜ธ์ถœ ``` > **โš ๏ธ ์™ธ๋ถ€ API ๊ณ ์ง€**: Tier 3(Jina), Tier 5(Wayback Machine)์—์„œ ๋Œ€์ƒ URL์ด ์™ธ๋ถ€๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. **CSS ์ˆ˜์ง‘ โ€” 403 fallback ํฌํ•จ**: ```bash # 1. CSS ๋งํฌ ์ถ”์ถœ grep -oE 'href="[^"]+\.css[^"]*"' "$OUT" | \ sed 's/href="//;s/"$//' | sort -u > "$WORK_DIR/insane-design/{slug}/css/_urls.txt" # 2. CSS ๋‹ค์šด๋กœ๋“œ + 403 fallback BASE_URL="{url}" while IFS= read -r css_href; do case "$css_href" in http*) abs_url="$css_href" ;; //*) abs_url="https:$css_href" ;; /*) abs_url="$(echo "$BASE_URL" | grep -oE 'https?://[^/]+')$css_href" ;; *) abs_url="$BASE_URL/$css_href" ;; esac fname="$(echo "$css_href" | sed 's/[?#].*//' | xargs basename)" dest="$WORK_DIR/insane-design/{slug}/css/$fname" # ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ curl -sL --max-time 15 -o "$dest" "$abs_url" # CSS ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ โ€” 403/challenge HTML์ด๋ฉด ์ˆœ์ฐจ fallback if ! css_ok "$dest"; then # Fallback 1: curl_cffi (safari โ†’ firefox) โ€” WAF/CDN 403 ์šฐํšŒ python3 - <<PYEOF from curl_cffi import requests as cffi_req for target in ["safari", "firefox", "chrome"]: try: r = cffi_req.get("$abs_url", impersonate=target, timeout=15) if r.status_code == 200 and len(r.text) > 200 and "{" in r.text[:500]: open("$dest", "w").write(r.text) break except: continue PYEOF fi if ! css_ok "$dest"; then # Fallback 2: Wayback Machine CDX ์บ์‹œ WB_CSS=$(curl -sL --max-time 10 "http://archive.org/wayback/available?url=$abs_url" | \ python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('archived_snapshots',{}).get('closest',{}).get('url',''))" 2>/dev/null) [ -n "$WB_CSS" ] && curl -sL --max-time 15 "$WB_CSS" -o "$dest" # ์—ฌ์ „ํžˆ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ญ์ œ css_ok "$dest" || rm -f "$dest" fi done < "$WORK_DIR/insane-design/{slug}/css/_urls.txt" wait
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub