@donotdev/cli 0.0.13 → 0.0.15

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.
Files changed (162) hide show
  1. package/dependencies-matrix.json +357 -89
  2. package/dist/bin/commands/agent-setup.d.ts +6 -0
  3. package/dist/bin/commands/agent-setup.d.ts.map +1 -0
  4. package/dist/bin/commands/agent-setup.js +629 -0
  5. package/dist/bin/commands/agent-setup.js.map +1 -0
  6. package/dist/bin/commands/build.js +131 -50
  7. package/dist/bin/commands/bump.js +137 -49
  8. package/dist/bin/commands/cacheout.js +50 -21
  9. package/dist/bin/commands/create-app.js +270 -261
  10. package/dist/bin/commands/create-project.js +418 -197
  11. package/dist/bin/commands/deploy.js +1752 -712
  12. package/dist/bin/commands/dev.js +151 -35
  13. package/dist/bin/commands/emu.js +228 -70
  14. package/dist/bin/commands/format.js +50 -21
  15. package/dist/bin/commands/lint.js +50 -21
  16. package/dist/bin/commands/preview.js +155 -35
  17. package/dist/bin/commands/supabase-setup.d.ts +6 -0
  18. package/dist/bin/commands/supabase-setup.d.ts.map +1 -0
  19. package/dist/bin/commands/supabase-setup.js +7 -0
  20. package/dist/bin/commands/supabase-setup.js.map +1 -0
  21. package/dist/bin/commands/sync-secrets.js +224 -46
  22. package/dist/bin/commands/type-check.d.ts +14 -0
  23. package/dist/bin/commands/type-check.d.ts.map +1 -0
  24. package/dist/bin/commands/type-check.js +314 -0
  25. package/dist/bin/commands/type-check.js.map +1 -0
  26. package/dist/bin/commands/wai.js +7399 -11
  27. package/dist/bin/dndev.js +27 -2
  28. package/dist/bin/donotdev.js +27 -2
  29. package/dist/index.js +3960 -2996
  30. package/package.json +2 -2
  31. package/templates/app-demo/src/App.tsx.example +1 -0
  32. package/templates/app-demo/src/pages/FullPage.tsx.example +2 -2
  33. package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +2 -2
  34. package/templates/app-demo/src/themes.css.example +5 -12
  35. package/templates/app-expo/.env.example +64 -0
  36. package/templates/app-expo/.expo/README.md.example +5 -0
  37. package/templates/app-expo/.gitignore.example +36 -0
  38. package/templates/app-expo/README.md.example +58 -0
  39. package/templates/app-expo/app/.gitkeep +2 -0
  40. package/templates/app-expo/app/_layout.tsx.example +41 -0
  41. package/templates/app-expo/app/form.tsx.example +52 -0
  42. package/templates/app-expo/app/index.tsx.example +89 -0
  43. package/templates/app-expo/app/list.tsx.example +32 -0
  44. package/templates/app-expo/app/profile.tsx.example +76 -0
  45. package/templates/app-expo/app/signin.tsx.example +53 -0
  46. package/templates/app-expo/app.json.example +39 -0
  47. package/templates/app-expo/babel.config.js.example +10 -0
  48. package/templates/app-expo/eas.json.example +20 -0
  49. package/templates/app-expo/expo-env.d.ts.example +4 -0
  50. package/templates/app-expo/metro.config.js.example +20 -0
  51. package/templates/app-expo/service-account-key.json.example +12 -0
  52. package/templates/app-expo/tsconfig.json.example +19 -0
  53. package/templates/app-next/.env.example +4 -33
  54. package/templates/app-next/src/app/ClientLayout.tsx.example +2 -0
  55. package/templates/app-next/src/app/layout.tsx.example +7 -6
  56. package/templates/app-next/src/globals.css.example +2 -11
  57. package/templates/app-next/src/pages/HomePage.tsx.example +1 -1
  58. package/templates/app-next/src/themes.css.example +10 -13
  59. package/templates/app-vite/.env.example +3 -32
  60. package/templates/app-vite/index.html.example +2 -24
  61. package/templates/app-vite/src/App.tsx.example +2 -0
  62. package/templates/app-vite/src/globals.css.example +2 -12
  63. package/templates/app-vite/src/pages/FormPageExample.tsx.example +1 -2
  64. package/templates/app-vite/src/pages/HomePage.tsx.example +1 -1
  65. package/templates/app-vite/src/themes.css.example +109 -79
  66. package/templates/app-vite/vercel.json.example +11 -0
  67. package/templates/functions-firebase/build.mjs.example +2 -72
  68. package/templates/functions-firebase/functions-firebase/.env.example.example +23 -25
  69. package/templates/functions-firebase/functions-firebase/build.mjs.example +2 -72
  70. package/templates/functions-firebase/functions-firebase/tsconfig.json.example +1 -1
  71. package/templates/functions-supabase/supabase/functions/cancel-subscription/index.ts.example +7 -0
  72. package/templates/functions-supabase/supabase/functions/change-plan/index.ts.example +11 -0
  73. package/templates/functions-supabase/supabase/functions/create-checkout-session/index.ts.example +11 -0
  74. package/templates/functions-supabase/supabase/functions/create-customer-portal/index.ts.example +7 -0
  75. package/templates/functions-supabase/supabase/functions/crud/index.ts.example +16 -0
  76. package/templates/functions-supabase/supabase/functions/delete-account/index.ts.example +7 -0
  77. package/templates/functions-supabase/supabase/functions/get-custom-claims/index.ts.example +7 -0
  78. package/templates/functions-supabase/supabase/functions/get-user-auth-status/index.ts.example +7 -0
  79. package/templates/functions-supabase/supabase/functions/refresh-subscription-status/index.ts.example +7 -0
  80. package/templates/functions-supabase/supabase/functions/remove-custom-claims/index.ts.example +7 -0
  81. package/templates/functions-supabase/supabase/functions/set-custom-claims/index.ts.example +7 -0
  82. package/templates/functions-supabase/supabase/migrations/20250101000000_idempotency.sql +24 -0
  83. package/templates/functions-supabase/supabase/migrations/20250101000001_rate_limits.sql +22 -0
  84. package/templates/functions-supabase/supabase/migrations/20250101000002_cleanup_jobs.sql +28 -0
  85. package/templates/functions-supabase/supabase/migrations/20250101000003_operation_metrics.sql +28 -0
  86. package/templates/functions-vercel/functions-vercel/tsconfig.json.example +1 -1
  87. package/templates/functions-vercel/functions-vercel/vercel.json.example +1 -1
  88. package/templates/functions-vercel/vercel.json.example +1 -1
  89. package/templates/github/github/workflows/firebase-deploy.yml.example +1 -1
  90. package/templates/github/workflows/firebase-deploy.yml.example +1 -1
  91. package/templates/overlay-firebase/env.fragment.example +34 -0
  92. package/templates/overlay-firebase/env.fragment.expo.example +34 -0
  93. package/templates/overlay-firebase/env.fragment.nextjs.example +34 -0
  94. package/templates/overlay-firebase/src/config/providers.expo.ts.example +49 -0
  95. package/templates/overlay-firebase/src/config/providers.ts.example +23 -0
  96. package/templates/overlay-supabase/env.fragment.example +7 -0
  97. package/templates/overlay-supabase/env.fragment.expo.example +7 -0
  98. package/templates/overlay-supabase/env.fragment.nextjs.example +7 -0
  99. package/templates/overlay-supabase/src/config/providers.expo.ts.example +35 -0
  100. package/templates/overlay-supabase/src/config/providers.ts.example +33 -0
  101. package/templates/overlay-supabase/vercel.headers.example +23 -0
  102. package/templates/overlay-supabase/vercel.json.example +22 -0
  103. package/templates/overlay-vercel/env.fragment.example +34 -0
  104. package/templates/overlay-vercel/env.fragment.nextjs.example +34 -0
  105. package/templates/overlay-vercel/src/config/providers.ts.example +24 -0
  106. package/templates/root-consumer/.claude/agents/architect.md.example +2 -310
  107. package/templates/root-consumer/.claude/agents/builder.md.example +2 -326
  108. package/templates/root-consumer/.claude/agents/coder.md.example +2 -83
  109. package/templates/root-consumer/.claude/agents/extractor.md.example +2 -231
  110. package/templates/root-consumer/.claude/agents/polisher.md.example +2 -132
  111. package/templates/root-consumer/.claude/agents/prompt-engineer.md.example +2 -81
  112. package/templates/root-consumer/.claude/commands/brainstorm.md.example +1 -1
  113. package/templates/root-consumer/.claude/commands/build.md.example +1 -1
  114. package/templates/root-consumer/.claude/commands/design.md.example +1 -1
  115. package/templates/root-consumer/.claude/commands/grill.md.example +30 -0
  116. package/templates/root-consumer/.claude/commands/polish.md.example +1 -1
  117. package/templates/root-consumer/.claude/commands/techdebt.md.example +28 -0
  118. package/templates/root-consumer/.clinerules.example +1 -0
  119. package/templates/root-consumer/.cursor/rules/no-docs.mdc.example +15 -0
  120. package/templates/root-consumer/.cursorrules.example +1 -0
  121. package/templates/root-consumer/.dndev/args.json.example +6 -0
  122. package/templates/root-consumer/.gemini/settings.json.example +2 -2
  123. package/templates/root-consumer/.github/copilot-instructions.md.example +1 -0
  124. package/templates/root-consumer/.windsurfrules.example +1 -0
  125. package/templates/root-consumer/AI.md.example +25 -108
  126. package/templates/root-consumer/CLAUDE.md.example +1 -128
  127. package/templates/root-consumer/CONVENTIONS.md.example +1 -0
  128. package/templates/root-consumer/GEMINI.md.example +1 -0
  129. package/templates/root-consumer/firebase.json.example +1 -1
  130. package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +54 -0
  131. package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +0 -18
  132. package/templates/root-consumer/guides/dndev/COMPONENTS_UI.md.example +1 -1
  133. package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +99 -30
  134. package/templates/root-consumer/guides/dndev/GOTCHAS.md.example +186 -0
  135. package/templates/root-consumer/guides/dndev/INDEX.md.example +4 -1
  136. package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +143 -12
  137. package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +9 -3
  138. package/templates/root-consumer/guides/dndev/SETUP_FUNCTIONS.md.example +12 -7
  139. package/templates/root-consumer/guides/dndev/SETUP_SOC2.md.example +234 -0
  140. package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +124 -0
  141. package/templates/root-consumer/guides/dndev/SETUP_THEMES.md.example +6 -2
  142. package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +176 -0
  143. package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +5 -9
  144. package/templates/root-consumer/guides/dndev/essences_reference.css.example +174 -0
  145. package/templates/root-consumer/guides/wai-way/agents/builder.md.example +10 -0
  146. package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +25 -5
  147. package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +13 -2
  148. package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +2 -2
  149. package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +47 -11
  150. package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +15 -4
  151. package/templates/root-consumer/guides/wai-way/spec_template.md.example +7 -6
  152. package/templates/app-payload/.env.example +0 -28
  153. package/templates/app-payload/README.md.example +0 -233
  154. package/templates/app-payload/collections/Company.ts.example +0 -125
  155. package/templates/app-payload/collections/Hero.ts.example +0 -62
  156. package/templates/app-payload/collections/Media.ts.example +0 -41
  157. package/templates/app-payload/collections/Products.ts.example +0 -115
  158. package/templates/app-payload/collections/Services.ts.example +0 -104
  159. package/templates/app-payload/collections/Testimonials.ts.example +0 -92
  160. package/templates/app-payload/collections/Users.ts.example +0 -35
  161. package/templates/app-payload/src/server.ts.example +0 -79
  162. package/templates/app-payload/tsconfig.json.example +0 -24
@@ -0,0 +1,176 @@
1
+ # Setup: Vercel
2
+
3
+ **From zero to deployed: Vercel hosting + API routes with Firebase data layer.**
4
+
5
+ ---
6
+
7
+ ## Architecture
8
+
9
+ Vercel is your **hosting and API platform** — it serves your frontend and runs serverless API routes.
10
+ Firebase is your **data layer** — Firestore (CRUD), Firebase Auth (users), Firebase Storage (files).
11
+
12
+ The framework generates API routes as Vercel Serverless Functions that talk to Firebase on the backend.
13
+
14
+ ---
15
+
16
+ ## Step 1: Create Firebase Project (Data Layer)
17
+
18
+ Even though you deploy to Vercel, you still need Firebase for data.
19
+
20
+ 1. Go to [Firebase Console](https://console.firebase.google.com) → Create a project
21
+ 2. Enable **Authentication** → Email/Password (+ OAuth providers if needed)
22
+ 3. Enable **Cloud Firestore** → Create Database → select region
23
+ 4. Enable **Storage** if your app uploads files
24
+
25
+ Get the Firebase web config from: **Project Settings → General → Your apps → Web app → SDK config**.
26
+
27
+ ---
28
+
29
+ ## Step 2: Run Setup
30
+
31
+ ```bash
32
+ dndev firebase:setup
33
+ ```
34
+
35
+ This writes Firebase SDK config to your app's `.env`. The `overlay-vercel` providers.ts initializes the Firebase client SDK.
36
+
37
+ ---
38
+
39
+ ## Step 3: Configure Vercel
40
+
41
+ 1. Create a [Vercel](https://vercel.com) account and link your Git repo
42
+ 2. Import the project in Vercel Dashboard
43
+ 3. Set the **Root Directory** to `apps/<your-app>` (or leave blank if monorepo auto-detected)
44
+ 4. Set **Framework Preset** to Vite (or Next.js if using Next)
45
+
46
+ **Environment Variables** (in Vercel Dashboard → Settings → Environment Variables):
47
+
48
+ Copy your Firebase vars from `.env`:
49
+ - `VITE_FIREBASE_API_KEY`
50
+ - `VITE_FIREBASE_PROJECT_ID`
51
+ - `VITE_FIREBASE_AUTH_DOMAIN`
52
+ - `VITE_FIREBASE_STORAGE_BUCKET`
53
+ - `VITE_FIREBASE_MESSAGING_SENDER_ID`
54
+ - `VITE_FIREBASE_APP_ID`
55
+
56
+ For Next.js apps, use `NEXT_PUBLIC_` prefix instead of `VITE_`.
57
+
58
+ **Server secrets** (for API routes):
59
+ - `STRIPE_SECRET_KEY`
60
+ - `STRIPE_WEBHOOK_SECRET`
61
+ - Any OAuth client secrets
62
+
63
+ ---
64
+
65
+ ## Step 4: API Routes (Functions)
66
+
67
+ Your backend functions are in `functions/` and deploy as Vercel Serverless Functions.
68
+
69
+ ```
70
+ functions/
71
+ ├── src/
72
+ │ ├── auth/ # Auth endpoints (signup, login, etc.)
73
+ │ ├── billing/ # Stripe endpoints (checkout, webhook, etc.)
74
+ │ ├── crud/ # CRUD endpoints (create, read, update, delete)
75
+ │ └── oauth/ # OAuth callback handlers
76
+ ├── vercel.json # Route configuration
77
+ ├── tsconfig.json
78
+ └── package.json
79
+ ```
80
+
81
+ Functions use the Firebase Admin SDK on the server side to access Firestore, verify auth tokens, etc.
82
+
83
+ ---
84
+
85
+ ## Step 5: Deploy
86
+
87
+ **Option A — Git push (recommended)**
88
+
89
+ Push to your connected branch. Vercel auto-deploys.
90
+
91
+ ```bash
92
+ git push origin main
93
+ ```
94
+
95
+ **Option B — Vercel CLI**
96
+
97
+ ```bash
98
+ npx vercel --prod
99
+ ```
100
+
101
+ ---
102
+
103
+ ## Environment Variables
104
+
105
+ | File | What Goes Here | Loaded By |
106
+ |------|---------------|-----------|
107
+ | `apps/<app>/.env` | Firebase config, license key, Stripe publishable key | Vite/Next.js (dev + build) |
108
+ | `apps/<app>/.env.local` | Local overrides (gitignored) | Vite/Next.js (overrides .env) |
109
+ | `apps/<app>/.env.production` | Production overrides | Vite/Next.js (build --mode production) |
110
+ | `functions/.env` | Server secrets: STRIPE_SECRET_KEY, OAuth secrets | API routes runtime |
111
+ | Vercel Dashboard | All production env vars (client + server) | Vercel runtime |
112
+
113
+ **Client vars** (browser-safe): `VITE_*` or `NEXT_PUBLIC_*` prefix.
114
+ **Server vars** (secrets): No prefix needed in Vercel Dashboard — only accessible in API routes.
115
+
116
+ ---
117
+
118
+ ## Local Development
119
+
120
+ ```bash
121
+ bun dev
122
+ ```
123
+
124
+ The app runs locally, talking to your Firebase project. API routes can be tested with:
125
+
126
+ ```bash
127
+ vercel dev
128
+ ```
129
+
130
+ Or use Firebase emulators for fully local development:
131
+
132
+ ```bash
133
+ dndev emu start
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Secrets
139
+
140
+ Server-side secrets go in `functions/.env` locally and in Vercel Dashboard for production.
141
+
142
+ **We NEVER ask for secret keys.** You place them yourself:
143
+
144
+ ```bash
145
+ # functions/.env
146
+ STRIPE_SECRET_KEY=sk_live_...
147
+ STRIPE_WEBHOOK_SECRET=whsec_...
148
+ ```
149
+
150
+ Then add the same values in Vercel Dashboard → Settings → Environment Variables.
151
+
152
+ See [ENV_SETUP.md → Secrets Philosophy](./ENV_SETUP.md#secrets-philosophy) for the full policy.
153
+
154
+ ---
155
+
156
+ ## Troubleshooting
157
+
158
+ **"Firebase config not loading"**
159
+ → Check `.env` is in your **app directory** (`apps/<app>/.env`), not repo root
160
+ → Vite vars must start with `VITE_`, Next.js vars with `NEXT_PUBLIC_`
161
+
162
+ **"401 / Permission denied on API routes"**
163
+ → Check Firebase service account key is configured in Vercel env vars
164
+ → Verify `GOOGLE_APPLICATION_CREDENTIALS` or inline credentials in API routes
165
+
166
+ **"CORS error"**
167
+ → Vercel handles CORS for same-origin requests automatically
168
+ → For cross-origin: add CORS headers in your API route handler
169
+
170
+ **"Build fails on Vercel"**
171
+ → Check Root Directory is set to your app directory
172
+ → Ensure `package.json` has correct `build` script
173
+
174
+ ---
175
+
176
+ **`dndev firebase:setup` → configure Vercel project → set env vars → `git push`. Vercel deploys automatically.**
@@ -226,18 +226,14 @@ navigate('/products', {
226
226
 
227
227
  ### 5. Query Parameters
228
228
 
229
- **✅ Use framework useSearchParams:**
229
+ **✅ Use framework useSearchParams (read-only, returns URLSearchParams directly):**
230
230
  ```tsx
231
231
  import { useSearchParams } from '@donotdev/ui/routing';
232
232
 
233
233
  function ProductList() {
234
- const [searchParams, setSearchParams] = useSearchParams();
234
+ const searchParams = useSearchParams();
235
235
  const page = searchParams.get('page') || '1';
236
-
237
- const handlePageChange = (newPage: string) => {
238
- setSearchParams({ page: newPage });
239
- };
240
-
236
+
241
237
  return <div>Page: {page}</div>;
242
238
  }
243
239
  ```
@@ -478,8 +474,8 @@ navigate('/products', { replace: true });
478
474
  // Route params
479
475
  const id = useRouteParam('id');
480
476
 
481
- // Query params
482
- const [searchParams, setSearchParams] = useSearchParams();
477
+ // Query params (read-only, returns URLSearchParams directly)
478
+ const searchParams = useSearchParams();
483
479
  const page = searchParams.get('page');
484
480
 
485
481
  // Navigation menu
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Reference: Framework essences (Brutalist, Luxury).
3
+ * Copy the blocks you need into your app's src/themes.css.
4
+ * Default essence = SaaS (Inter); these do not apply until you set the class on <html>.
5
+ *
6
+ * Fonts: Space Grotesk (Brutalist), Playfair Display (Luxury), Inter, Roboto are bundled in @donotdev/ui (no external requests).
7
+ */
8
+
9
+ /** =========================================================================
10
+ * Brutalist — Industrial, monospace body, Space Grotesk headlines, orange/black.
11
+ * Set <html class="brutalist"> to apply.
12
+ * ========================================================================= */
13
+ .brutalist {
14
+ --theme-icon: 'Construction';
15
+ --theme-label: 'Brutalist';
16
+ --theme-is-dark: 1;
17
+
18
+ /* 1. Core Colors - Black + white + industrial orange */
19
+ --background: #000000;
20
+ --foreground: #ffffff;
21
+ --primary: #f97316;
22
+ --secondary: #ffffff;
23
+ --accent: #f97316;
24
+
25
+ /* 2. Semantic */
26
+ --success: #22c55e;
27
+ --warning: #f97316;
28
+ --destructive: #dc2626;
29
+
30
+ /* 3. Surfaces - Dark, industrial */
31
+ --muted: #111111;
32
+ --muted-foreground: #888888;
33
+ --border: #ffffff;
34
+ --input: #111111;
35
+ --ring: #f97316;
36
+ --card: #000000;
37
+ --card-foreground: #f97316;
38
+ --popover: #000000;
39
+ --popover-foreground: #ffffff;
40
+ --surface-1: #0a0a0a;
41
+
42
+ /* 4. Text on Colors */
43
+ --primary-foreground: #ffffff;
44
+ --secondary-foreground: #000000;
45
+ --accent-foreground: #000000;
46
+ --success-foreground: #ffffff;
47
+ --warning-foreground: #000000;
48
+ --destructive-foreground: #ffffff;
49
+
50
+ /* 5. Radius - Hard zero */
51
+ --radius-interactive: 0;
52
+ --radius-surface: 0;
53
+ --radius-floating: 0;
54
+
55
+ /* 6. Typography - Monospace for body, Space Grotesk 700 for headings */
56
+ --font-family: var(--font-mono);
57
+ --font-headline: "Space Grotesk", var(--font-sans);
58
+ --font-weight-semibold: 700;
59
+ --font-weight-bold: 700;
60
+
61
+ /* 7. Borders */
62
+ --border-width: 2px;
63
+ --border-huge: 4px;
64
+
65
+ /* 8. Shadows — flat by default, hard offset on interactive */
66
+ --shadow-color: var(--foreground);
67
+ --shadow-sm: none;
68
+ --shadow-md: none;
69
+ --shadow-xl: 8px 8px 0px 0px var(--shadow-color);
70
+ --shadow-cta: 20px 20px 0px 0px var(--shadow-color);
71
+
72
+ /* 9. Per-variant shadows — only at xl level (elevated/clickable) */
73
+ --shadow-primary: none;
74
+ --shadow-primary-xl: 8px 8px 0px 0px var(--background);
75
+ --shadow-secondary: none;
76
+ --shadow-secondary-xl: 8px 8px 0px 0px var(--primary);
77
+
78
+ /* 10. Header padding for hard-offset shadows */
79
+ --header-shadow-padding: 0.75rem;
80
+ }
81
+
82
+ /* Body - grid background */
83
+ .brutalist body {
84
+ background-color: var(--background);
85
+ background-image:
86
+ linear-gradient(#111 1px, transparent 1px),
87
+ linear-gradient(90deg, #111 1px, transparent 1px);
88
+ background-size: 40px 40px;
89
+ }
90
+
91
+ /* Uppercase headings (both native elements and Text component levels) */
92
+ .brutalist {
93
+ :is(h1, h2, h3, h4, h5, h6),
94
+ [data-level^='h'] {
95
+ text-transform: uppercase;
96
+ }
97
+ }
98
+
99
+ /* Flat surface - no gradient glow */
100
+ .brutalist .dndev-surface { background: var(--card); }
101
+ .brutalist .dndev-surface[data-variant='outline'] { border: var(--border-width) solid var(--border); }
102
+
103
+ .brutalist .dndev-card[data-variant='outline'] {
104
+ background: transparent;
105
+ box-shadow: none;
106
+ }
107
+
108
+
109
+ /** =========================================================================
110
+ * Luxury — Playfair Display headlines, gold/cream, warm shadows.
111
+ * Set <html class="luxury"> to apply.
112
+ * ========================================================================= */
113
+ .luxury {
114
+ --theme-icon: 'Gem';
115
+ --theme-label: 'Luxury';
116
+ --theme-is-dark: 0;
117
+
118
+ /* 1. Core Colors */
119
+ --background: #faf8f5;
120
+ --foreground: #1c1917;
121
+ --primary: #b45309;
122
+ --secondary: #fef3c7;
123
+ --accent: #92400e;
124
+
125
+ /* 2. Semantic */
126
+ --success: #15803d;
127
+ --warning: #b45309;
128
+ --destructive: #b91c1c;
129
+
130
+ /* 3. Surfaces */
131
+ --muted: #fef9c3;
132
+ --muted-foreground: #78716c;
133
+ --border: #e7e5e4;
134
+ --border-hairline: 1px;
135
+ --input: #ffffff;
136
+ --ring: #b45309;
137
+ --card: #ffffff;
138
+ --card-foreground: #1c1917;
139
+ --popover: #ffffff;
140
+ --popover-foreground: #1c1917;
141
+ --surface-1: #faf8f5;
142
+
143
+ /* 4. Text on Colors */
144
+ --primary-foreground: #ffffff;
145
+ --secondary-foreground: #1c1917;
146
+ --accent-foreground: #ffffff;
147
+ --success-foreground: #ffffff;
148
+ --warning-foreground: #1c1917;
149
+ --destructive-foreground: #ffffff;
150
+
151
+ /* 5. Radius */
152
+ --radius-interactive: 0.375rem;
153
+ --radius-surface: 0.5rem;
154
+ --radius-floating: 0.5rem;
155
+
156
+ /* 6. Typography — lighter weights, serif headlines */
157
+ --font-family: var(--font-sans);
158
+ --font-headline: 'Playfair Display', var(--font-serif);
159
+ --font-weight-normal: 300;
160
+ --font-weight-medium: 400;
161
+ --font-weight-semibold: 500;
162
+ --font-weight-bold: 600;
163
+
164
+ /* 7. Spacing — generous, one notch above expressive */
165
+ --gap-sm: 0.75rem;
166
+ --gap-md: 1.5rem;
167
+ --gap-lg: 3rem;
168
+
169
+ /* 8. Shadows — warm gold-tinted, soft diffused */
170
+ --shadow-color: color-mix(in oklab, #b45309 8%, transparent);
171
+ --shadow-sm: 0 1px 3px var(--shadow-color);
172
+ --shadow-md: 0 4px 12px var(--shadow-color);
173
+ --shadow-xl: 0 8px 24px var(--shadow-color);
174
+ }
@@ -31,6 +31,10 @@ core_principles:
31
31
  - HARDCODE strings first - validate UX before i18n
32
32
  - Use framework components only - no custom CSS
33
33
  - Trust component defaults
34
+ - **70/30 Hierarchy:** Use `primary` variant for the North Star action; `outline`/`ghost` for others.
35
+ - **Benefit-First Copy:** For Heros/Cards, translate technical features into outcomes (e.g., 'Optimize Your Fleet' vs 'Manage Cars').
36
+ - **Success Intent:** Trust framework defaults for CRUD (automatic toasts/loaders). Only propose custom redirects or celebratory components for the 'North Star' action or if the user asks for more polish.
37
+ - **Spec Drift:** If you must deviate from the spec (field types, logic), log it in `spec_changes.md`. Do NOT modify `spec_template.md` directly.
34
38
 
35
39
  crud_pattern:
36
40
  list_page: |
@@ -83,5 +87,11 @@ Rules:
83
87
  3. HARDCODE all strings (no i18n yet)
84
88
  4. Use framework components only
85
89
 
90
+ **Apply UX Mandates:**
91
+ - **Visual Anchor:** Every page must have ONE clear primary focus (Hero or Main Card).
92
+ - **Mobile First:** Ensure all touch targets are > 44px.
93
+ - **Kano Filter:** Use 'Benefit' copy for marketing/dashboard pages. Use 'Utility' copy for forms.
94
+ - **Success Intent:** Trust framework defaults. Only propose custom redirects/celebration for the 'North Star' action.
95
+
86
96
  Build each page following the scaffolded patterns.
87
97
  ```
@@ -36,6 +36,10 @@ core_principles:
36
36
  - Define entity states and transitions
37
37
  - Capture business rules and validations explicitly
38
38
  - Never assume - always ask
39
+ - **UX Strategist:** Identify the "North Star" action (max 2 clicks from home).
40
+ - **Kano Prioritization:** Tag features as Must-Have vs Delighter.
41
+ - **Duty to Advise:** Challenge layouts with high friction (> 2 clicks). If the user overrides your advice, log it in **Section 11** of the spec and move on.
42
+ - **Spec Drift:** Any changes to the validated spec must be logged in `spec_changes.md` for human review.
39
43
 
40
44
  phase_0_brainstorm:
41
45
  goal: DEEPLY understand the app and produce COMPLETE validated spec
@@ -47,7 +51,7 @@ phase_0_brainstorm:
47
51
  questions:
48
52
  - "Describe your app in one paragraph. What problem does it solve?"
49
53
  - "Who is the primary user? Who else uses it?"
50
- - "What's the ONE thing a user MUST be able to do?"
54
+ - "What's the ONE thing a user MUST be able to do? (The North Star)"
51
55
  - "What makes this different from similar apps?"
52
56
  done_when: "Can explain the app to someone unfamiliar in 2 minutes"
53
57
 
@@ -111,17 +115,26 @@ phase_0_brainstorm:
111
115
  - "What happens when [entity status] changes unexpectedly?"
112
116
  done_when: "Common failure scenarios have defined handling"
113
117
 
114
- output: Filled spec_template.md with ALL sections complete, validated by user
118
+ 7_ux_intent:
119
+ purpose: "Plan the layout hierarchy and navigation flow"
120
+ questions:
121
+ - "Where should the shortcut for the North Star action live? (Goal: < 2 clicks)"
122
+ - "Which features are 'Delighters' (Marketing/Heroes) vs 'Must-Haves' (CRUD)?"
123
+ done_when: "Navigation hierarchy planned; high-friction paths challenged"
124
+
125
+ output: Filled spec_template.md with ALL sections complete, including Section 11 for overrides.
115
126
 
116
127
  phase_1_scaffold:
117
- goal: Create all pages from validated spec
128
+ goal: Create an Interactive Prototype from the validated spec
118
129
  prerequisite: "spec_template.md is COMPLETE with no empty sections or TBDs"
119
130
  steps:
120
131
  - Verify spec is truly complete
121
132
  - Create *Page.tsx files for each route in spec
122
- - Set PageMeta (namespace, icon, auth) from spec
133
+ - Set PageMeta (namespace, icon). **Set auth: false** temporarily so the user can click through the prototype without login.
134
+ - **Interactive Stubs:** Each page must contain its 'Role' (from spec) and 'Next Step' navigation buttons to related pages.
135
+ - **Friction Check:** If North Star path > 2 clicks, propose a 'Global Shortcut' (Header/Sidebar).
123
136
  - Verify app runs with bun dev
124
- output: All routes exist as stub pages with correct PageMeta
137
+ output: All routes exist as **Interactive Prototype Stubs** with navigation buttons.
125
138
 
126
139
  validation_checklist:
127
140
  before_filling_spec:
@@ -129,14 +142,21 @@ validation_checklist:
129
142
  - [ ] Can trace every page back to a user journey
130
143
  - [ ] Can answer "who can do X to Y?" for any entity/action
131
144
  - [ ] Can answer "what happens when Z fails?" for common scenarios
145
+ - [ ] **North Star identified:** Defined a max 2-click path for the core action.
132
146
 
133
147
  before_moving_to_scaffold:
134
148
  - [ ] Every user journey has numbered steps
135
149
  - [ ] Every entity has fields, states, permissions
136
150
  - [ ] Every business rule is explicit
151
+ - [ ] **Overrides logged:** Any intentional UX friction documented in Section 11.
137
152
  - [ ] No empty fields in spec_template.md
138
153
  - [ ] User has validated the spec
139
154
 
155
+ after_scaffold_validation:
156
+ - [ ] App is running and clickable.
157
+ - [ ] User has clicked through the "North Star" path.
158
+ - [ ] Sitemap and click-depth are validated in the browser.
159
+
140
160
  read_files:
141
161
  - "guides/wai-way/blueprints/0_brainstorm.md"
142
162
  - "guides/wai-way/spec_template.md"
@@ -21,7 +21,7 @@ persona:
21
21
 
22
22
  golden_rule: |
23
23
  THE SPEC IS YOUR TEST PLAN.
24
- READ the spec (Phase 0 output) for entities, permissions, journeys.
24
+ READ the spec (Phase 0 output) and `spec_changes.md` for entities, permissions, journeys.
25
25
  READ each entity file for access rules and fields.
26
26
  GENERATE tests that verify the spec is implemented correctly.
27
27
 
@@ -31,6 +31,8 @@ core_principles:
31
31
  - Configuration: app.ts, legal.ts, .env
32
32
  - Mobile check: 375px width
33
33
  - i18n is OPTIONAL and comes LAST
34
+ - **Contract Check:** Consult **Section 11** of the spec for intentional UX overrides. If a layout deviation is documented there, it is a **PASS**.
35
+ - **Heuristic Audit:** Verify 3-click rule for North Star, system status visibility (loaders), and visual hierarchy.
34
36
 
35
37
  test_generation:
36
38
  entity_tests:
@@ -53,6 +55,14 @@ test_generation:
53
55
  - No unauthenticated writes
54
56
  output: "tests/access/access-rules.test.ts"
55
57
 
58
+ ux_audit_checklist:
59
+ - [ ] **Contract Compliance:** Check Section 11 of spec for approved deviations.
60
+ - [ ] **Spec Drift Review:** Ensure all changes in `spec_changes.md` are documented and explained.
61
+ - [ ] **North Star Check:** Is the primary action reachable in < 3 clicks? (Unless overridden)
62
+ - [ ] **Hierarchy:** Does every page have a clear visual anchor (one primary focus)?
63
+ - [ ] **System Status:** Verify framework default feedback (Toasts/Loaders) is visible. Ask if 'North Star' action needs a custom 'Delighter' redirect.
64
+ - [ ] **Mobile:** Touch targets > 44px, no horizontal scroll.
65
+
56
66
  firestore_rules:
57
67
  source: "Entity access definitions"
58
68
  mapping:
@@ -116,7 +126,8 @@ Steps:
116
126
  6. Update app.ts, legal.ts, .env
117
127
  7. Run bun test — all must pass
118
128
  8. Mobile check at 375px
119
- 9. (Optional) Add i18n
129
+ 9. **UX Audit** (3-click rule, Visual Anchor, Mobile targets, and Spec Drift review)
130
+ 10. (Optional) Add i18n
120
131
 
121
132
  Call get_guide("TESTING") for testing patterns.
122
133
  ```
@@ -37,8 +37,7 @@ User provides idea
37
37
 
38
38
  Agent calls list_features() → matches needs to existing framework capabilities
39
39
 
40
- Agent asks IDENTITY questions (who, what, why)
41
-
40
+ Agent asks IDENTITY questions (who, what, why, and **Aesthetic Essence**)
42
41
  Agent asks USER JOURNEY questions (what do users DO step by step?)
43
42
 
44
43
  Agent asks DATA questions (what entities, relationships, states?)
@@ -66,6 +65,7 @@ Start broad, then narrow down:
66
65
  - "Who is the primary user? Secondary users?"
67
66
  - "What's the one thing a user MUST be able to do?"
68
67
  - "What makes this different from [similar apps]?"
68
+ - **Aesthetic Essence:** "Which visual 'vibe' fits the brand? SaaS (Clean/Modern), Luxury (Gold/Serif), or Brutalist (Orange/High-Contrast)?"
69
69
 
70
70
  **Don't proceed until you can explain the app to someone else.**
71
71
 
@@ -22,7 +22,18 @@ Preset comes from your completed spec (Phase 0).
22
22
 
23
23
  ---
24
24
 
25
- ## Step 2: Review Spec Pages
25
+ ## Step 2: Apply Aesthetic Essence
26
+
27
+ **READ:** `guides/dndev/essences_reference.css`
28
+
29
+ Apply the chosen essence (SaaS, Luxury, Brutalist) to your `src/themes.css`.
30
+ - If **SaaS**: Keep defaults.
31
+ - If **Luxury/Brutalist**: Copy the variables from the reference file into `src/themes.css`.
32
+ - If **Custom**: Adjust primary/secondary colors in `:root`.
33
+
34
+ ---
35
+
36
+ ## Step 3: Review Spec Pages
26
37
 
27
38
  From your spec, you have a list of pages. Now create them.
28
39
 
@@ -43,13 +54,16 @@ touch src/pages/ProductPage.tsx
43
54
 
44
55
  ---
45
56
 
46
- ## Step 4: Add PageMeta
57
+ ## Step 4: Create Interactive Prototype Stubs
47
58
 
48
59
  **READ:** `src/pages/HomePage.tsx` for PageMeta pattern.
49
60
 
61
+ For **each page**, create a functional stub that allows the user to validate the flow.
62
+
50
63
  ```tsx
51
64
  import type { PageMeta } from '@donotdev/core';
52
- import { PageContainer } from '@donotdev/ui';
65
+ import { PageContainer, Link } from '@donotdev/ui';
66
+ import { Section, Stack, Text, Card, Button } from '@donotdev/components';
53
67
  import { Info } from 'lucide-react';
54
68
 
55
69
  export const NAMESPACE = 'about';
@@ -57,22 +71,44 @@ export const NAMESPACE = 'about';
57
71
  export const meta: PageMeta = {
58
72
  namespace: NAMESPACE,
59
73
  icon: <Info />,
60
- // From spec:
61
- // auth: true, // Protected
62
- // auth: { required: true, role: 'admin' }, // Admin
63
- // hideFromMenu: true, // Form pages
74
+ // From spec: Set auth: false for the prototype phase so user can click through
75
+ auth: false,
64
76
  };
65
77
 
66
78
  export default function AboutPage() {
67
- return <PageContainer>About Page</PageContainer>;
79
+ return (
80
+ <PageContainer>
81
+ <Section title="About Page (Prototype Stub)">
82
+ <Stack gap="large">
83
+ <Text><strong>Role:</strong> [Describe the purpose of this page from the spec]</Text>
84
+
85
+ <Text level="h3">Navigate Flow:</Text>
86
+ <Stack direction="row" gap="medium">
87
+ <Link path="/dashboard">
88
+ <Button variant="outline">Go to Dashboard</Button>
89
+ </Link>
90
+ <Link path="/contact">
91
+ <Button variant="outline">Go to Contact</Button>
92
+ </Link>
93
+ </Stack>
94
+
95
+ {/* Placeholder for flow validation */}
96
+ <Card variant="outline" content={[`[Placeholder for ${NAMESPACE} core components]`]} />
97
+ </Stack>
98
+ </Section>
99
+ </PageContainer>
100
+ );
68
101
  }
69
102
  ```
70
103
 
104
+ **Goal:** The user should be able to `bun dev` and click through the entire app flow (the "North Star" path) to validate the architecture before you build any logic.
105
+
71
106
  ---
72
107
 
73
108
  ## Output
74
109
 
75
110
  - [ ] App runs with `bun dev`
76
- - [ ] All route files created (from spec)
77
- - [ ] PageMeta set with correct auth levels (from spec)
78
- - [ ] Navigation auto-generated
111
+ - [ ] All route files created as **Interactive Stubs**
112
+ - [ ] PageMeta set (auth: false for prototype validation)
113
+ - [ ] Navigation links included on each stub to related pages
114
+ - [ ] User has "clicked through" the flow and validated sitemap/friction
@@ -9,7 +9,18 @@
9
9
 
10
10
  ---
11
11
 
12
- ## Step 1: Read Page Patterns
12
+ ## Step 1: Apply UX Intent Rules
13
+
14
+ **Every page must follow the Designer Mandate:**
15
+ 1. **70/30 Hierarchy:** Only ONE `primary` variant button/card per view. Use `outline` or `muted` for everything else to direct the user's eye to the North Star.
16
+ 2. **Benefit-First Copy:** Do not use technical titles for Heros/Cards.
17
+ - ❌ "User Management" → ✅ "Empower Your Team"
18
+ - ❌ "Car List" → ✅ "Explore the Fleet"
19
+ 3. **Success Intent:** Ensure framework default toasts are working. Only add a custom celebratory view or Redirect for the **North Star** goal completion.
20
+
21
+ ---
22
+
23
+ ## Step 2: Read Page Patterns
13
24
 
14
25
  **READ:** `guides/wai-way/page_patterns.md` for all patterns:
15
26
  - Dashboard, List Page, Form Page
@@ -18,7 +29,7 @@
18
29
 
19
30
  ---
20
31
 
21
- ## Step 2: CRUD Pages
32
+ ## Step 3: CRUD Pages
22
33
 
23
34
  For each entity in spec:
24
35
 
@@ -60,7 +71,7 @@ export default function ProductPage() {
60
71
 
61
72
  ---
62
73
 
63
- ## Step 3: Dashboard Page
74
+ ## Step 4: Dashboard Page
64
75
 
65
76
  Copy Dashboard pattern from `page_patterns.md`:
66
77
  - Quick actions (cards with onClick)
@@ -69,7 +80,7 @@ Copy Dashboard pattern from `page_patterns.md`:
69
80
 
70
81
  ---
71
82
 
72
- ## Step 4: Landing Pages
83
+ ## Step 5: Landing Pages
73
84
 
74
85
  Copy Landing pattern from `page_patterns.md`:
75
86
  - HeroSection with CTAs