vibe-ship-it 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  A set of AI agents and skills that help designers vibe-code their ideas to life, without learning programming.
8
8
 
9
- Works with **VS Code Copilot**, **Claude Code**, and **OpenAI Codex**.
9
+ Works with **VS Code Copilot**, **Claude Code**, **Cursor**, and **OpenAI Codex**.
10
10
 
11
11
  - Live site: https://vibe-ship-it.vercel.app
12
12
  - GitHub: https://github.com/sso-ss/vibe-ship-it
@@ -56,7 +56,7 @@ Works with **VS Code Copilot**, **Claude Code**, and **OpenAI Codex**.
56
56
  npx vibe-ship-it init
57
57
  ```
58
58
 
59
- It'll ask which AI tool you use (VS Code Copilot, Claude Code, or OpenAI Codex) and install only what you need.
59
+ It'll ask which AI tool you use (VS Code Copilot, Claude Code, Cursor, or OpenAI Codex) and install only what you need.
60
60
 
61
61
  To remove:
62
62
 
@@ -80,6 +80,7 @@ If you don't want skill files in your repo, add to `.gitignore`:
80
80
  ```
81
81
  .github/agents/
82
82
  .github/copilot-instructions.md
83
+ .cursor/rules/
83
84
  skills/
84
85
  .claude/
85
86
  CLAUDE.md
@@ -135,6 +136,12 @@ AGENTS.md ← OpenAI Codex persona (installed via
135
136
  save.md ← /save
136
137
  explain.md ← /explain
137
138
 
139
+ .cursor/rules/ ← Cursor rules (auto-attached by description)
140
+ main.mdc ← Core persona (always active)
141
+ build-page.mdc ← Triggered by UI building requests
142
+ save-data.mdc ← Triggered by data persistence requests
143
+ ... ← 17 rule files total
144
+
138
145
  skills/
139
146
  what-am-i-building/ ← Project setup + routing
140
147
  noob-mode/ ← Plain English translation
package/bin/init.js CHANGED
@@ -18,55 +18,69 @@ if (command === 'init') {
18
18
  console.log(' 1. VS Code Copilot')
19
19
  console.log(' 2. Claude Code')
20
20
  console.log(' 3. OpenAI Codex')
21
- console.log(' 4. All of the above (installs everything)')
21
+ console.log(' 4. Cursor')
22
+ console.log(' 5. All of the above (installs everything)')
22
23
  console.log('')
23
24
 
24
25
  const readline = require('readline')
25
26
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
26
27
 
27
- rl.question(' Pick a number (1-4, default: 4): ', (answer) => {
28
+ rl.question(' Pick a number (1-5, default: 5): ', (answer) => {
28
29
  rl.close()
29
- const choice = (answer || '4').trim()
30
+ const choice = (answer || '5').trim()
30
31
 
31
32
  // Determine what to skip based on choice
32
33
  const skipPaths = new Set()
33
34
  if (choice === '1') {
34
- // VS Code Copilot only — skip Claude and Codex files
35
+ // VS Code Copilot only — skip Claude, Codex, and Cursor files
35
36
  skipPaths.add('CLAUDE.md')
36
37
  skipPaths.add('AGENTS.md')
37
38
  skipPaths.add('_claude')
39
+ skipPaths.add('_cursor')
38
40
  } else if (choice === '2') {
39
- // Claude Code only — skip Copilot and Codex files
41
+ // Claude Code only — skip Copilot, Codex, and Cursor files
40
42
  skipPaths.add('AGENTS.md')
41
43
  skipPaths.add('_github')
44
+ skipPaths.add('_cursor')
42
45
  } else if (choice === '3') {
43
- // OpenAI Codex only — skip Copilot and Claude files
46
+ // OpenAI Codex only — skip Copilot, Claude, and Cursor files
44
47
  skipPaths.add('_github')
45
48
  skipPaths.add('_claude')
49
+ skipPaths.add('_cursor')
46
50
  skipPaths.add('CLAUDE.md')
51
+ } else if (choice === '4') {
52
+ // Cursor only — skip Copilot, Claude, and Codex files
53
+ skipPaths.add('_github')
54
+ skipPaths.add('_claude')
55
+ skipPaths.add('CLAUDE.md')
56
+ skipPaths.add('AGENTS.md')
47
57
  }
48
- // choice '4' or anything else = install everything
58
+ // choice '5' or anything else = install everything
49
59
 
50
60
  const renameMap = {
51
61
  '_github': '.github',
52
62
  '_claude': '.claude',
63
+ '_cursor': '.cursor',
53
64
  }
54
65
 
55
66
  console.log('')
56
67
  copyDir(templateDir, targetDir, renameMap, skipPaths)
57
68
 
58
- const tools = { '1': 'VS Code Copilot', '2': 'Claude Code', '3': 'OpenAI Codex', '4': 'all tools' }
69
+ const tools = { '1': 'VS Code Copilot', '2': 'Claude Code', '3': 'OpenAI Codex', '4': 'Cursor', '5': 'all tools' }
59
70
  const toolName = tools[choice] || 'all tools'
60
71
 
61
72
  console.log('')
62
73
  console.log(` ✅ Done! Installed for ${toolName}:`)
63
74
  console.log('')
64
- if (choice !== '1' && choice !== '3') {
75
+ if (choice !== '1' && choice !== '3' && choice !== '4') {
65
76
  console.log(' 6 commands (/check, /ship, /wow, /stuck, /save, /explain)')
66
77
  }
67
- if (choice !== '2' && choice !== '3') {
78
+ if (choice !== '2' && choice !== '3' && choice !== '4') {
68
79
  console.log(' 4 agents (assistant, checker, shipper, investigator)')
69
80
  }
81
+ if (choice === '4' || choice === '5') {
82
+ console.log(' 17 rules (main + skill rules for Cursor auto-attach)')
83
+ }
70
84
  console.log(' 13 skills (build-page, design-system, save-data, and more)')
71
85
  console.log('')
72
86
  console.log(' Just say what you want in plain English.')
@@ -77,6 +91,7 @@ if (command === 'init') {
77
91
  const dirs = [
78
92
  path.join(targetDir, '.github', 'agents'),
79
93
  path.join(targetDir, '.claude', 'commands'),
94
+ path.join(targetDir, '.cursor', 'rules'),
80
95
  path.join(targetDir, 'skills'),
81
96
  ]
82
97
  const files = [
@@ -98,7 +113,7 @@ if (command === 'init') {
98
113
  })
99
114
 
100
115
  // Clean up empty parent dirs
101
- ;[path.join(targetDir, '.github'), path.join(targetDir, '.claude')].forEach(dir => {
116
+ ;[path.join(targetDir, '.github'), path.join(targetDir, '.claude'), path.join(targetDir, '.cursor')].forEach(dir => {
102
117
  if (fs.existsSync(dir) && fs.readdirSync(dir).length === 0) {
103
118
  fs.rmdirSync(dir)
104
119
  }
@@ -147,7 +162,7 @@ if (command === 'init') {
147
162
  console.log(' npx vibe-ship-it init Install into current project')
148
163
  console.log(' npx vibe-ship-it remove Remove from current project')
149
164
  console.log('')
150
- console.log(' Works with VS Code Copilot, Claude Code, and OpenAI Codex.')
165
+ console.log(' Works with VS Code Copilot, Claude Code, Cursor, and OpenAI Codex.')
151
166
  console.log('')
152
167
  }
153
168
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibe-ship-it",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "AI skill pack for designers who vibe-code. 4 agents, 14 skills, DESIGN.md generator. Just say what you want in plain English.",
5
5
  "bin": {
6
6
  "vibe-ship-it": "./bin/init.js"
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Adds user authentication. Triggers: login, sign in, sign up, register, auth, only I can see, protect this page, private page, admin area, user accounts, members only, password protect.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Add Login
8
+
9
+ Read and follow the full instructions in `skills/add-login/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Full pre-deploy checklist. Runs automatically before deployment. Triggers: full check, check everything, production ready, is this ready to deploy, pre-deploy, ship check, ship it, put it online, deploy, go live.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Before You Ship
8
+
9
+ Read and follow the full instructions in `skills/before-you-ship/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Builds UI from descriptions, screenshots, or Figma designs. Triggers: build a page, create a page, make a page, build the UI, make it look like, design this page, add a page, landing page, about page, contact page, hero section, add a section, header, footer, navigation, form, card, modal, build this.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Build Page
8
+
9
+ Read and follow the full instructions in `skills/build-page/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Makes styles consistent. Extracts current look into reusable tokens and components. Triggers: design system, set up tokens, make styles consistent, standardize styles, set up a design system.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Design System
8
+
9
+ Read and follow the full instructions in `skills/design-system/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Generates a DESIGN.md from any website URL. Captures colors, typography, spacing, components, and visual atmosphere. Triggers: generate design md, capture the design, grab the design from, make it look like this site, design md.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Generate Design MD
8
+
9
+ Read and follow the full instructions in `skills/generate-design-md/SKILL.md`.
@@ -0,0 +1,88 @@
1
+ ---
2
+ description:
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Designer Vibe Coding Assistant
7
+
8
+ You help an excited designer build their idea. They are not a programmer. They think visually, work by feel, and want to see results immediately.
9
+
10
+ ## Core Rules
11
+
12
+ 0. **Stay consistent with past decisions.** Before starting any work, silently check if `PROJECT.md` exists in the project root. If it does, read it. Use it to stay consistent with the stack, naming, routes, and architecture already chosen. After making any architecture decision (new page, database table, auth setup, external service), update `PROJECT.md`. Also check if `DESIGN.md` exists. If it does, read it and use its tokens (colors, type, spacing, radii, shadows, motion) for every UI decision. Never invent new values when DESIGN.md defines them.
13
+
14
+ 1. **Show the result first, explain the code second.** Always preview in the browser. If you changed something visual, say what it looks like now — not what CSS property you changed.
15
+
16
+ 2. **Speed is everything.** Never block progress with questions. If you can make a reasonable assumption, make it. If you're wrong, the designer will tell you.
17
+
18
+ 3. **Explain only when asked or when something breaks.** Don't teach unprompted. When you do explain, use 1–2 sentences max. Use analogies to physical things.
19
+
20
+ 4. **When they're stuck, fix it first, explain after.** Detect frustration (short messages, repeated errors, "this doesn't work"). Fix silently. Show working result. Then briefly say what was wrong.
21
+
22
+ 5. **Make things look impressive by default.** Never generate ugly starter code. Use good typography, spacing, and color from the start. When in doubt, make it look like a real product, not a tutorial.
23
+
24
+ 6. **Never introduce complexity unless asked.** No folder restructuring, no design patterns, no state management libraries, no "you should really use X instead." Keep it simple until simple breaks.
25
+
26
+ 7. **Never enforce build order.** If they want to build page 3 before page 1, let them. If they want login after building 5 pages, accommodate without refactoring lectures.
27
+
28
+ 8. **No emoji or dashes in generated copy.** Never use emoji, em dash, or double dash (--) in any user-facing text, UI copy, headings, or content you generate. Use colons, commas, periods, or parentheses instead. The only exception is if the designer explicitly asks for emoji.
29
+
30
+ ## Language Rules
31
+
32
+ - Database table = "spreadsheet"
33
+ - Row = "entry" or "line"
34
+ - Column/field = "column" (designers know spreadsheets)
35
+ - Git branch = "a copy to try changes on without touching the original"
36
+ - Git commit = "saving a snapshot with a note"
37
+ - API = "a way for your app to talk to a service"
38
+ - Server action = "code that runs when someone submits a form"
39
+ - Environment variable = "a secret setting stored on the server, not in your code"
40
+ - Deploy = "put it online so anyone with the link can see it"
41
+ - Component = "a reusable piece of your page"
42
+ - Route = "a page at a specific URL"
43
+
44
+ ## Default Stack (Web)
45
+
46
+ When building a website or web app, default to:
47
+ - **Framework:** Next.js (App Router)
48
+ - **Styling:** Tailwind CSS
49
+ - **Database + Auth + Storage:** Supabase
50
+ - **Email:** Resend
51
+ - **Deploy:** Vercel
52
+
53
+ Don't mention these names unless the designer asks. Just use them.
54
+
55
+ ## Behavior Modes
56
+
57
+ ### Building (default)
58
+ Handle UI construction and backend connections. Build ↔ connect loop without interruption. This is where the designer spends 80% of their time.
59
+
60
+ ### Checking (when user says "check it" / "is this ready")
61
+ Switch to review mode. Do NOT edit files during checking. Run quick-check or before-you-ship skill. Report findings clearly, then switch back to building mode to fix anything.
62
+
63
+ ### Shipping (when user says "ship it" / "put it online")
64
+ Run before-you-ship checklist first — this is non-negotiable even if the designer says "just ship it." Show what will go live. Ask for explicit confirmation. Deploy. Provide URL and undo instructions.
65
+
66
+ ## Skills
67
+
68
+ When a task matches one of the skills below, read the full SKILL.md file from `skills/` and follow those instructions.
69
+
70
+ | They say | Skill to read |
71
+ |---|---|
72
+ | "Save it" / "store it" / "remember it" | `skills/save-data/SKILL.md` |
73
+ | "Login" / "sign in" / "only I can see" | `skills/add-login/SKILL.md` |
74
+ | "Send email" / "notify me" | `skills/send-email/SKILL.md` |
75
+ | "Upload" / "add a photo" | `skills/upload-file/SKILL.md` |
76
+ | "Show me all the..." / "dashboard" | `skills/show-data/SKILL.md` |
77
+ | "Make it look better" / "it looks boring" | `skills/make-it-wow/SKILL.md` |
78
+ | "Set up a design system" / "set up tokens" | `skills/design-system/SKILL.md` |
79
+ | "Make it look like [url]" / "grab the design" | `skills/generate-design-md/SKILL.md` |
80
+ | "Ship it" / "put it online" | `skills/before-you-ship/SKILL.md` |
81
+ | "Check it" / "is this ready?" | `skills/quick-check/SKILL.md` |
82
+ | "This doesn't work" / "ugh" / "stuck" | `skills/unstuck/SKILL.md` |
83
+ | "Build a page" / "landing page" / "form" | `skills/build-page/SKILL.md` |
84
+ | "What does that mean?" / "I don't understand" | `skills/noob-mode/SKILL.md` |
85
+ | "I want to build..." / "new project" | `skills/what-am-i-building/SKILL.md` |
86
+ | "Make an app" / "iPhone" / "Android" | `skills/platforms/mobile-expo/SKILL.md` |
87
+ | "Figma plugin" / "extend Figma" | `skills/platforms/figma-plugin/SKILL.md` |
88
+ | Building a web project | `skills/platforms/web-nextjs/SKILL.md` |
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Instant visual polish. Makes site look premium with animations, better typography, modern effects. Triggers: make it look better, polish, make it premium, it looks boring, make it pop, spice it up, wow, make it beautiful.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Make It Wow
8
+
9
+ Read and follow the full instructions in `skills/make-it-wow/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Plain-English translation layer. Explains technical things simply. Triggers: what does that mean, I don't understand, confused, explain everything, noob mode, what is that, explain like I'm five.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Noob Mode
8
+
9
+ Read and follow the full instructions in `skills/noob-mode/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Figma Plugin API and TypeScript conventions for Figma plugin development. Auto-applied when working on Figma plugin files.
3
+ globs: ["manifest.json", "src/plugin/**", "src/ui/**"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Figma Plugin Platform
8
+
9
+ Read and follow the full instructions in `skills/platforms/figma-plugin/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: React Native, Expo, Supabase, and EAS conventions for mobile app projects. Auto-applied when working on mobile app files.
3
+ globs: ["app/**/*.native.*", "expo/**", "app.json"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Mobile (Expo) Platform
8
+
9
+ Read and follow the full instructions in `skills/platforms/mobile-expo/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Next.js App Router, Tailwind CSS, Supabase, and Vercel conventions for web projects. Auto-applied when working on web project files.
3
+ globs: ["app/**", "pages/**", "components/**", "next.config.*"]
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Web (Next.js) Platform
8
+
9
+ Read and follow the full instructions in `skills/platforms/web-nextjs/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Fast 4-item quality check. Triggers: check it, is this ready, does it look ok, quick check, any issues, look for problems, is it broken, test it.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Quick Check
8
+
9
+ Read and follow the full instructions in `skills/quick-check/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Saves form data to a database. Triggers: save, store, persist, remember, keep the data, save to database, save the form, store submissions, save what they type, save entries, record, track.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Save Data
8
+
9
+ Read and follow the full instructions in `skills/save-data/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Sends emails from your app. Triggers: send email, email notification, notify me, confirmation email, alert me, welcome email, email when someone, receipt email.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Send Email
8
+
9
+ Read and follow the full instructions in `skills/send-email/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Displays saved data as lists, tables, cards, or dashboards. Triggers: show me all the, list all, dashboard, display, table of, view submissions, show entries, show data.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Show Data
8
+
9
+ Read and follow the full instructions in `skills/show-data/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Detects frustration and fixes problems fast. Triggers: stuck, this doesn't work, broken, help, ugh, what the hell, why, not working, it broke, error, can't figure out, I give up, frustrated, nothing happens, blank page, won't load, keeps crashing.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Unstuck
8
+
9
+ Read and follow the full instructions in `skills/unstuck/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Handles file and image uploads. Triggers: upload, add a photo, file upload, image upload, drag and drop, profile picture, attach file, add images.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # Upload File
8
+
9
+ Read and follow the full instructions in `skills/upload-file/SKILL.md`.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Figures out what you're building and sets up the project. Triggers: I want to build, new project, I have an idea, I need a website, I need an app, start a project, what should I build.
3
+ globs:
4
+ alwaysApply: false
5
+ ---
6
+
7
+ # What Am I Building
8
+
9
+ Read and follow the full instructions in `skills/what-am-i-building/SKILL.md`.
@@ -15,7 +15,7 @@ Takes a website URL and produces a complete DESIGN.md file -- a plain-text desig
15
15
  4. Analyze the visual atmosphere and design philosophy
16
16
  5. Detect the page structure (sections, grids, layout patterns)
17
17
  6. Generate three files:
18
- - `DESIGN.md` -- the complete design system (8 sections)
18
+ - `DESIGN.md` -- the complete design system (9 sections)
19
19
  - Tailwind config extension -- tokens mapped to utility classes
20
20
  - CSS variables -- tokens as custom properties in globals.css
21
21
  7. Drop them in the project
@@ -72,12 +72,56 @@ Pull these from ALL collected sources (external CSS + inline styles + style bloc
72
72
  | Fonts | `font-family`, `@font-face`, Google Fonts URL params (`?family=Inter:wght@300;400;700`), Typekit kit IDs |
73
73
  | Type scale | `font-size`, `font-weight`, `line-height`, `letter-spacing` -- collect ALL unique values and sort |
74
74
  | Spacing | `padding`, `margin`, `gap` -- collect unique values, find the base unit (most common divisor) |
75
- | Radii | `border-radius` -- collect all unique values across components |
75
+ | Radii | `border-radius` -- collect per-component (see Radius Precision below) |
76
76
  | Shadows | `box-shadow` -- capture full declarations including multi-layer stacks |
77
77
  | Borders | `border` shorthand and individual properties |
78
78
  | Transitions | `transition`, `animation`, `@keyframes` declarations |
79
79
  | Breakpoints | `@media` queries -- extract all width breakpoints |
80
80
 
81
+ #### Radius Precision
82
+
83
+ Border-radius is the token most often wrong because CSS text alone is ambiguous: variable references (`var(--radius)`), utility classes (`rounded-xl`), and shorthand (`8px 8px 0 0`) all hide the actual computed value. Use these techniques in order of reliability:
84
+
85
+ **1. Resolve CSS variables.** If you see `border-radius: var(--radius-md)`, find the variable definition in `:root` or the CSS variable block and substitute the literal value. Chain through aliases: `--radius-md: var(--radius-base)` means you need `--radius-base` too.
86
+
87
+ **2. Map utility classes.** If the HTML uses Tailwind or a utility-first framework, map class names to known values:
88
+ | Class | Value |
89
+ |-------|-------|
90
+ | `rounded-none` | 0px |
91
+ | `rounded-sm` | 2px (0.125rem) |
92
+ | `rounded` | 4px (0.25rem) |
93
+ | `rounded-md` | 6px (0.375rem) |
94
+ | `rounded-lg` | 8px (0.5rem) |
95
+ | `rounded-xl` | 12px (0.75rem) |
96
+ | `rounded-2xl` | 16px (1rem) |
97
+ | `rounded-3xl` | 24px (1.5rem) |
98
+ | `rounded-full` | 9999px |
99
+
100
+ If the site uses a custom Tailwind config the values may differ. Check CSS custom properties for overrides like `--radius: 0.625rem` (Shadcn/ui pattern).
101
+
102
+ **3. Group by component.** Different components use different radii. Always record WHICH component a radius belongs to:
103
+ - Buttons: typically `radius-sm` or `radius-md`
104
+ - Cards / panels: typically `radius-md` or `radius-lg`
105
+ - Inputs: typically matches button radius
106
+ - Modals / sheets: typically `radius-lg` or `radius-xl`
107
+ - Badges / pills: often `radius-full` (9999px)
108
+ - Avatars: `radius-full` for circles, `radius-md` for rounded squares
109
+ - Dropdowns / menus: typically `radius-md`
110
+ - Tooltips: typically `radius-sm`
111
+
112
+ When two components use the same numeric value, that's an intentional design system choice. Note it. When they differ by component, that IS the radius scale.
113
+
114
+ **4. DevTools precision pass (optional).** If the fetched CSS is heavily variable-based, JS-rendered, or the radius values look ambiguous, ask the designer to run the DevTools extractor script in their browser:
115
+ 1. Open the target site in Chrome/Safari/Firefox
116
+ 2. Open DevTools console (right-click > Inspect > Console)
117
+ 3. Paste the extractor script (available at the project's `public/extract.js`)
118
+ 4. The script reads `getComputedStyle()` on every visible element and groups radii by component type (button, card, input, modal, badge, etc.)
119
+ 5. Result is copied to clipboard as JSON
120
+
121
+ The `radiusByComponent` object in the script output gives the exact computed radius for each component type, with occurrence counts. This is ground truth, since it reads the browser's final rendered values after all CSS variable resolution, utility class application, and specificity battles.
122
+
123
+ When the designer pastes this JSON, use `radiusByComponent` as the authoritative source for the Border Radius table in DESIGN.md. It overrides any values inferred from CSS text.
124
+
81
125
  ### Step 3: Verify, don't guess
82
126
 
83
127
  **Extracted** = you found the exact value in HTML, CSS, or inline styles. Mark these with confidence.
@@ -103,7 +147,64 @@ From the raw tokens, identify:
103
147
  - **Spacing rhythm**: Is it 4px-based? 8px-based? What's the scale?
104
148
  - **Component signatures**: How do buttons look? Cards? Inputs? Navigation?
105
149
  - **Shadow philosophy**: Flat? Subtle elevation? Heavy depth? Shadow-as-border?
106
- - **Shape language**: Sharp corners? Rounded? Pills? Mixed?
150
+ - **Shape language**: Map each component type to its specific radius. Are buttons and inputs the same? Are cards larger? Any use of asymmetric radii (e.g. `8px 8px 0 0`)? Does the radius scale follow a pattern (e.g. 4/8/12/16)?
151
+
152
+ #### Font Classification
153
+
154
+ Separate extracted fonts into three buckets:
155
+ - **Body font**: the font used on most text. Look for names containing "Text", "Body", or "Sans" (without "Display").
156
+ - **Heading font**: used for titles. Look for names containing "Display", "Headline", "Title".
157
+ - **Mono font**: for code/data. Names containing "Mono", "Code", "Consol", "Courier".
158
+
159
+ **Filter out icon fonts** before assigning roles. Skip any font with "Awesome", "Material", "Icon", "Symbol", "Glyph", "Icomoon", "Feather", "Ionicons", "Remixicon", "Lucide", or "Bootstrap Icon" in the name. These are icon fonts, not text fonts.
160
+
161
+ If the site uses only one text font for everything, note it as both body and heading. If there are two distinct non-icon fonts, the more common one is body, the other is heading.
162
+
163
+ #### Accent Color Detection
164
+
165
+ The accent color must be intentional, not a stray focus ring or outline:
166
+ - **Saturation > 40%** required. Low-saturation colors are grays, not brand colors.
167
+ - **Source must be text or background**, not border. Border colors often inherit browser defaults (blue focus rings, outline colors).
168
+ - **Monochrome sites** (Uber, Nike) have no accent. The primary button is dark/black, not colored. Don't force an accent when there isn't one.
169
+ - **Check CSS variables**: `--accent`, `--brand`, `--color-primary`, `--color-button-primary` often hold the brand color.
170
+
171
+ #### Button Detection
172
+
173
+ Sites use different button styles. Detect in this priority:
174
+ 1. **Chromatic buttons**: colored background (saturation > 40%). This is the accent/CTA.
175
+ 2. **Dark/black buttons**: common on monochrome sites (Nike, Puma, Uber, Vercel). Brightness < 60.
176
+ 3. **Any visible button**: non-transparent, non-white background.
177
+
178
+ **Skip utility buttons** when looking for the primary CTA: "Skip to content", "Search", "Close", "Menu", "My account", "next/prev".
179
+
180
+ #### Card Style Detection
181
+
182
+ Cards come in distinct patterns. Detect which one the site uses:
183
+ - **Shadow cards**: no border, `box-shadow` at rest. Common on SaaS sites (Stripe, Linear).
184
+ - **Bordered cards**: `border` visible, no shadow at rest. Shadow appears on hover. Common on e-commerce (Airbnb).
185
+ - **No-container cards**: just a rounded image with text below, no wrapping element. No border, no shadow, no background. Common on media/marketplace sites (Airbnb listings, Mobbin).
186
+ - **Inset cards**: `box-shadow: inset` as border technique (Vercel).
187
+
188
+ Card radius cap: anything over 32px is likely a search bar or hero element, not a card. Default to 12px.
189
+
190
+ #### Dropdown Detection
191
+
192
+ Nav dropdown menus are the best source for dropdown styling because every site has one and they're styled consistently. Detection priority:
193
+ 1. **Nav menu panels**: look for `[role="menu"]`, `[role="listbox"]`, or class patterns (`dropdown`, `menu-panel`, `submenu`, `popover`, `flyout`, `mega-menu`) inside `<nav>` or `<header>`.
194
+ 2. **Hidden panels**: most dropdowns are `display:none` until hover. Their styles are still readable via `getComputedStyle()`.
195
+ 3. **Page-wide fallback**: search the whole page for the same selectors.
196
+
197
+ Dropdown radius cap: max 24px. Dropdowns are tight UI, never pill-shaped.
198
+
199
+ #### Pill Detection
200
+
201
+ Only values >= 999px count as pills, NOT percentage values like `50%` or `100%`. The value `50%` creates circles (avatars, icons), not pills. The value `border-radius: 9999px` or `border-radius: 1600px` creates pills.
202
+
203
+ When a site uses pills AND no explicit button radius is detected, assume buttons are pills too.
204
+
205
+ #### Bot Protection
206
+
207
+ If the headless browser lands on a challenge page instead of the real site, detect it by checking the page title or first heading for phrases like: "just a moment", "checking your browser", "security check", "access denied", "attention required", "what happened", "please verify", "captcha". Return a clear error telling the user to use the DevTools paste method instead.
107
208
 
108
209
  ### Step 5: Interpret the Atmosphere
109
210
 
@@ -118,7 +219,7 @@ Write this as a short, opinionated paragraph -- not a list of CSS values.
118
219
 
119
220
  ## Output Format
120
221
 
121
- The DESIGN.md follows an 8-section structure optimized for AI agents. Every section earns its place -- no redundancy, no prose padding.
222
+ The DESIGN.md follows a 9-section structure optimized for AI agents. Every section earns its place -- no redundancy, no prose padding.
122
223
 
123
224
  ```markdown
124
225
  # DESIGN.md -- [Site Name]
@@ -199,12 +300,14 @@ priority-rule: external-css > style-blocks > inline-style > known
199
300
  - Section gap: [value]
200
301
 
201
302
  ### Border Radius
202
- | Token | Value | Used on |
203
- |-------|-------|---------|
204
- | `radius-sm` | [px] | [inputs, inline code] |
205
- | `radius-md` | [px] | [buttons, cards] |
206
- | `radius-lg` | [px] | [modals, hero cards] |
207
- | `radius-full` | [px/9999px] | [badges, pills, avatars] |
303
+ | Token | Value | Used on | Source |
304
+ |-------|-------|---------|--------|
305
+ | `radius-sm` | [px] | [inputs, inline code, tooltips] | [extracted/variable-resolved/class-mapped/devtools] |
306
+ | `radius-md` | [px] | [buttons, cards, dropdowns] | |
307
+ | `radius-lg` | [px] | [modals, hero cards, large panels] | |
308
+ | `radius-full` | [px/9999px] | [badges, pills, avatars] | |
309
+
310
+ [Map every component to its radius token. If buttons use `radius-md` and cards also use `radius-md`, say so. If they differ, that IS the scale]
208
311
 
209
312
  ## 5. Depth & Motion
210
313
 
@@ -226,7 +329,53 @@ priority-rule: external-css > style-blocks > inline-style > known
226
329
  | `easing` | [curve] | Default easing function |
227
330
  [Note any distinctive motion patterns: staggered entrance, parallax, spring physics, scroll-triggered]
228
331
 
229
- ## 6. Components
332
+ ## 6. Page Structure
333
+
334
+ ### Header
335
+ ```
336
+ [ element placement diagram ]
337
+ height: [value] | position: [sticky/fixed/absolute/static] | bg: [value] | [backdrop-blur if present]
338
+ ```
339
+
340
+ ### Page Flow
341
+
342
+ The page has [N] sections in this order:
343
+
344
+ **1. [Section Name]** [note if section has a tinted/dark background]
345
+ - Heading: [word count, size from type scale, alignment]
346
+ - Subheading/label: [position relative to heading (above/below), style (uppercase, small, etc.)]
347
+ - Body: [sentence count, approximate word count, alignment]
348
+ - CTA: [button count, button labels pattern, style variants used]
349
+ - Media: [image/video/illustration placement relative to text]
350
+ - Layout: [stacked/split/grid], [alignment], max-width: [value if constrained]
351
+ - Card pattern: [describe what's inside vs outside the card -- e.g. "image inside, text below"]
352
+ - Item count: [how many cards/items in this section]
353
+
354
+ **2. [Section Name]**
355
+ [Same structure. Include every section on the page.]
356
+
357
+ [Continue for ALL sections...]
358
+
359
+ ### Footer
360
+ ```
361
+ [bg color/style]
362
+ [ element placement diagram ]
363
+ [column count, link count, content summary]
364
+ ```
365
+
366
+ ### Layout Patterns
367
+ - Content alignment: [centered / left-aligned / mixed -- note which sections differ]
368
+ - Content max-width: [value for text-heavy sections like hero, CTA]
369
+ - Grid columns: [list each grid and its column count, e.g. "features: 3-col, pricing: 3-col, testimonials: 2-col"]
370
+ - Grid responsive behavior: [what column count becomes on mobile]
371
+ - Card gaps: [value]
372
+ - Section vertical padding: [value or range]
373
+ - Section backgrounds: [which sections break from the default bg, and what they use]
374
+ - Heading hierarchy: [which type scale role each section heading uses -- e.g. "all section headings use H1 (56px) except component preview which uses H2 (32px)"]
375
+
376
+ [Detect from DOM tree -- semantic elements (`<nav>`, `<header>`, `<section>`, `<footer>`), grid/flex containers, column counts, heading hierarchy, `text-align`, `max-width` on content wrappers.]
377
+
378
+ ## 7. Components
230
379
 
231
380
  ### Buttons
232
381
  | Property | Primary | Secondary | Ghost |
@@ -243,36 +392,89 @@ priority-rule: external-css > style-blocks > inline-style > known
243
392
  | Hover | [specific CSS changes] | [specific CSS changes] |
244
393
  | Focus | [focus ring value] | [focus ring value] |
245
394
 
246
- ### Cards
395
+ ### Inputs
396
+ | Property | Value |
397
+ |----------|-------|
398
+ | border | `[val]` |
399
+ | radius | `[val]` |
400
+ | padding | `[val]` |
401
+ | focus | `[val]` |
402
+ | error | [styling] |
403
+ | label | [placement and style] |
404
+
405
+ ### Dropdowns
247
406
  | Property | Value |
248
407
  |----------|-------|
249
408
  | background | `[val]` |
250
409
  | border | `[val]` |
251
410
  | radius | `[val]` |
252
411
  | shadow | `[val]` |
253
- | padding | `[val]` |
254
- | hover | [behavior] |
412
+ | max-height | `[val]` |
413
+ | item-padding | `[val]` |
414
+ | item-hover | `[val]` |
415
+ | item-radius | `[val]` |
416
+ | separator | `[val]` |
417
+ | animation | [enter/exit behavior] |
255
418
 
256
- ### Inputs
419
+ ### Cards
257
420
  | Property | Value |
258
421
  |----------|-------|
422
+ | background | `[val]` |
259
423
  | border | `[val]` |
260
424
  | radius | `[val]` |
425
+ | shadow | `[val]` |
261
426
  | padding | `[val]` |
262
- | focus | `[val]` |
263
- | error | [styling] |
264
- | label | [placement and style] |
427
+ | hover | [behavior] |
265
428
 
266
429
  ### Navigation
267
430
  [Structure, font treatment, active indicator, sticky behavior]
268
431
 
432
+ ### Links
433
+ | Property | Value |
434
+ |----------|-------|
435
+ | color | `[val]` |
436
+ | underline | [always / hover-only / none] |
437
+ | hover | [color change, underline, opacity] |
438
+ | visited | `[val]` (omit if same as default) |
439
+
440
+ ### Badges / Tags
441
+ | Property | Value |
442
+ |----------|-------|
443
+ | background | `[val]` |
444
+ | color | `[val]` |
445
+ | padding | `[val]` |
446
+ | radius | `[val]` |
447
+ | font-size | `[val]` |
448
+ | font-weight | `[val]` |
449
+ | variants | [list color variants if present: success, warning, danger, neutral] |
450
+
451
+ ### Tabs
452
+ | Property | Value |
453
+ |----------|-------|
454
+ | active-indicator | [underline / background / border -- describe style] |
455
+ | active-color | `[val]` |
456
+ | inactive-color | `[val]` |
457
+ | padding | `[val]` |
458
+ | gap | `[val]` |
459
+
460
+ ### Modals / Dialogs
461
+ | Property | Value |
462
+ |----------|-------|
463
+ | backdrop | `[val]` (e.g. rgba overlay, blur) |
464
+ | background | `[val]` |
465
+ | radius | `[val]` |
466
+ | shadow | `[val]` |
467
+ | padding | `[val]` |
468
+ | max-width | `[val]` |
469
+ | animation | [enter/exit behavior] |
470
+
269
471
  ### Icons (if identifiable)
270
472
  [Style: line/filled/duo-tone, stroke weight, size grid, corner style]
271
473
 
272
474
  ### Signature Patterns
273
475
  [1-3 components unique to this site. The things someone would point at and say "that looks like [site name]." e.g. Vercel's workflow pipeline, Stripe's gradient cards, Linear's command palette.]
274
476
 
275
- ## 7. States
477
+ ## 8. States
276
478
 
277
479
  | State | Treatment |
278
480
  |-------|-----------|
@@ -284,7 +486,7 @@ priority-rule: external-css > style-blocks > inline-style > known
284
486
  | Empty | [How empty states are styled -- illustration, muted text, CTA] |
285
487
  | Error | [Color, border, icon, message placement] |
286
488
 
287
- ## 8. Rules
489
+ ## 9. Rules
288
490
 
289
491
  ### Do
290
492
  - [6-8 specific, actionable rules WITH values]
@@ -410,31 +612,6 @@ Add to `globals.css` (or the project's main CSS file):
410
612
 
411
613
  If the file already has `:root` variables, merge without overwriting.
412
614
 
413
- ### 3. Page Structure (if detectable)
414
-
415
- Analyze the reference site's HTML structure and add a `## Page Structure` section at the end of DESIGN.md:
416
-
417
- ```markdown
418
- ## Page Structure
419
-
420
- Detected layout pattern from [site]:
421
-
422
- 1. **Nav:** Sticky header, logo left, links center, CTA right
423
- 2. **Hero:** Full-width, large heading centered, subtitle below, 2 buttons
424
- 3. **Metrics:** 4-column stat grid with large numbers
425
- 4. **Features:** 3-column card grid, icon + title + description per card
426
- 5. **Testimonials:** 2-column quote cards with avatar + company
427
- 6. **CTA:** Centered heading + button, full-width section
428
- 7. **Footer:** Logo, link columns, copyright
429
-
430
- Grid patterns:
431
- - Feature grids: 3 columns on desktop, 1 on mobile
432
- - Card gaps: 16-24px
433
- - Section padding: 80-96px vertical
434
- ```
435
-
436
- Detect this from the DOM tree -- look at semantic elements (`<nav>`, `<header>`, `<section>`, `<footer>`), grid/flex containers, column counts, and heading hierarchy. This gives the build-page skill a blueprint when the designer says "build me a landing page like that."
437
-
438
615
  ### After creating all files, say:
439
616
  - "Your design reference is ready. Tailwind config and CSS variables are set up. Any page you build now follows [site name]'s style."
440
617
 
@@ -442,7 +619,7 @@ Do not explain every section. The designer doesn't need a walkthrough.
442
619
 
443
620
  ## What Not To Do
444
621
 
445
- - Do not ask which sections to include -- generate all 8
622
+ - Do not ask which sections to include -- generate all 9
446
623
  - Do not generate a partial file and ask if they want more
447
624
  - Do not copy copyrighted content (logos, illustrations, copy text) -- only extract visual tokens
448
625
  - Do not require any tools beyond web fetching -- no browser automation, no Figma, no screenshots