@polymorphism-tech/morph-spec 4.11.1 → 4.12.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.
Files changed (28) hide show
  1. package/README.md +2 -2
  2. package/claude-plugin.json +1 -1
  3. package/docs/CHEATSHEET.md +1 -1
  4. package/docs/QUICKSTART.md +1 -1
  5. package/framework/agents.json +16 -6
  6. package/framework/hooks/claude-code/post-tool-use/agent-complete.js +122 -0
  7. package/framework/hooks/shared/dispatch-helpers.js +17 -0
  8. package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
  9. package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
  10. package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
  11. package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
  12. package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
  13. package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
  14. package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
  15. package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +248 -14
  16. package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
  17. package/framework/standards/STANDARDS.json +31 -0
  18. package/framework/standards/frontend/design-system/aesthetic-direction.md +60 -7
  19. package/framework/standards/frontend/design-system/design-trends.md +171 -0
  20. package/framework/templates/context/CONTEXT.md +2 -2
  21. package/framework/templates/context/design-system.md +346 -211
  22. package/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +1 -1
  23. package/package.json +1 -1
  24. package/src/commands/mcp/mcp-setup.js +28 -6
  25. package/src/commands/project/init.js +20 -1
  26. package/src/lib/generators/design-system-generator.js +340 -51
  27. package/src/lib/validators/design-system/design-system-validator.js +11 -5
  28. package/src/utils/hooks-installer.js +11 -1
@@ -1,211 +1,346 @@
1
- # Design System — [PROJECT_NAME]
2
-
3
- > **Template** — copy to `.morph/context/design-system.md` and fill in TODOs.
4
-
5
- Living document. All agents read this before any UI work. All design decisions land here.
6
-
7
- ---
8
-
9
- ## Aesthetic Direction
10
-
11
- - **Direction**: [Minimal Refined / Editorial / Soft Professional / Industrial / Modern Luxury]
12
- - **Tone**: [TODO: 1-2 sentences about the feel]
13
- - **Differentiator**: [TODO: The 1 memorable element of this interface]
14
- - **Font Pair**: [Display font] + [Body font]
15
- - **Color Philosophy**: [Dominant color] + [Accent color] — [1-sentence rationale]
16
- - **Motion Personality**: [subtle / expressive / playful / precise]
17
- - **Visual Density**: [compact / balanced / spacious]
18
- - **Composition**: [TODO: Layout approach]
19
-
20
- ---
21
-
22
- ## Color Tokens
23
-
24
- ```css
25
- :root {
26
- /* Dominant palette */
27
- --color-primary: #TODO;
28
- --color-primary-light: #TODO;
29
- --color-primary-dark: #TODO;
30
-
31
- /* Sharp accent */
32
- --color-accent: #TODO;
33
- --color-accent-hover: #TODO;
34
-
35
- /* Neutrals */
36
- --color-neutral-50: #f9fafb;
37
- --color-neutral-100: #f3f4f6;
38
- --color-neutral-200: #e5e7eb;
39
- --color-neutral-300: #d1d5db;
40
- --color-neutral-400: #9ca3af;
41
- --color-neutral-500: #6b7280;
42
- --color-neutral-600: #4b5563;
43
- --color-neutral-700: #374151;
44
- --color-neutral-800: #1f2937;
45
- --color-neutral-900: #111827;
46
-
47
- /* Surface */
48
- --color-surface: #ffffff;
49
- --color-surface-alt: #f8f9fa;
50
- --color-border: rgba(0,0,0,0.08);
51
-
52
- /* Semantic */
53
- --color-success: #22c55e;
54
- --color-warning: #f59e0b;
55
- --color-error: #ef4444;
56
- --color-info: #3b82f6;
57
-
58
- /* Text */
59
- --color-text-primary: #TODO;
60
- --color-text-secondary: #TODO;
61
- --color-text-muted: #9ca3af;
62
- }
63
- ```
64
-
65
- ---
66
-
67
- ## Typography
68
-
69
- ```css
70
- :root {
71
- /* Font families */
72
- --font-display: '[TODO: Display font]', serif;
73
- --font-body: '[TODO: Body font]', sans-serif;
74
- --font-mono: 'JetBrains Mono', monospace;
75
-
76
- /* Scale */
77
- --text-xs: 0.75rem; /* 12px */
78
- --text-sm: 0.875rem; /* 14px */
79
- --text-base: 1rem; /* 16px */
80
- --text-lg: 1.125rem; /* 18px */
81
- --text-xl: 1.25rem; /* 20px */
82
- --text-2xl: 1.5rem; /* 24px */
83
- --text-3xl: 1.875rem; /* 30px */
84
- --text-4xl: 2.25rem; /* 36px */
85
-
86
- /* Weights */
87
- --font-weight-regular: 400;
88
- --font-weight-medium: 500;
89
- --font-weight-semibold: 600;
90
- --font-weight-bold: 700;
91
-
92
- /* Line heights */
93
- --leading-tight: 1.25;
94
- --leading-normal: 1.5;
95
- --leading-relaxed: 1.75;
96
- }
97
- ```
98
-
99
- ---
100
-
101
- ## Motion Tokens
102
-
103
- ```css
104
- :root {
105
- /* Durations */
106
- --duration-instant: 0.05s;
107
- --duration-fast: 0.15s;
108
- --duration-base: 0.3s;
109
- --duration-slow: 0.5s;
110
- --duration-slower: 0.8s;
111
-
112
- /* Easings */
113
- --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
114
- --easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
115
- --easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
116
- --easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
117
- --easing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
118
- }
119
- ```
120
-
121
- ### Framer Motion mapping (TypeScript)
122
-
123
- ```typescript
124
- // Map CSS tokens to Framer Motion values
125
- export const durations = {
126
- instant: 0.05,
127
- fast: 0.15,
128
- base: 0.3,
129
- slow: 0.5,
130
- slower: 0.8,
131
- } as const;
132
-
133
- export const easings = {
134
- standard: [0.4, 0, 0.2, 1] as const,
135
- decelerate: [0, 0, 0.2, 1] as const,
136
- accelerate: [0.4, 0, 1, 1] as const,
137
- bounce: [0.34, 1.56, 0.64, 1] as const,
138
- spring: [0.68, -0.55, 0.265, 1.55] as const,
139
- };
140
- ```
141
-
142
- ---
143
-
144
- ## Spacing Tokens
145
-
146
- ```css
147
- :root {
148
- /* 4px base grid */
149
- --space-1: 0.25rem; /* 4px */
150
- --space-2: 0.5rem; /* 8px */
151
- --space-3: 0.75rem; /* 12px */
152
- --space-4: 1rem; /* 16px */
153
- --space-5: 1.25rem; /* 20px */
154
- --space-6: 1.5rem; /* 24px */
155
- --space-8: 2rem; /* 32px */
156
- --space-10: 2.5rem; /* 40px */
157
- --space-12: 3rem; /* 48px */
158
- --space-16: 4rem; /* 64px */
159
- --space-20: 5rem; /* 80px */
160
- --space-24: 6rem; /* 96px */
161
-
162
- /* Container */
163
- --container-padding: var(--space-8);
164
- --grid-gap: var(--space-6);
165
- }
166
- ```
167
-
168
- ---
169
-
170
- ## Border Radius Tokens
171
-
172
- ```css
173
- :root {
174
- --radius-none: 0;
175
- --radius-sm: 0.25rem; /* 4px */
176
- --radius-base: 0.375rem; /* 6px */
177
- --radius-md: 0.5rem; /* 8px */
178
- --radius-lg: 0.75rem; /* 12px */
179
- --radius-xl: 1rem; /* 16px */
180
- --radius-2xl: 1.5rem; /* 24px */
181
- --radius-full: 9999px;
182
- }
183
- ```
184
-
185
- ---
186
-
187
- ## Shadow Tokens
188
-
189
- ```css
190
- :root {
191
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
192
- --shadow-base: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);
193
- --shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06);
194
- --shadow-lg: 0 10px 15px rgba(0,0,0,0.1), 0 4px 6px rgba(0,0,0,0.05);
195
- --shadow-xl: 0 20px 25px rgba(0,0,0,0.1), 0 10px 10px rgba(0,0,0,0.04);
196
- --shadow-lift: 0 8px 30px rgba(0,0,0,0.12); /* Card hover lift */
197
- }
198
- ```
199
-
200
- ---
201
-
202
- ## Changelog
203
-
204
- > Living record — every agent that adds tokens or design decisions registers here.
205
- > Format: `- YYYY-MM-DD [agent-id] Description of addition/change`
206
-
207
- <!-- Entries below this line, newest first -->
208
-
209
- ---
210
-
211
- *MORPH-SPEC by Polymorphism Tech*
1
+ # Design System — [PROJECT_NAME]
2
+
3
+ > **Template** — copy to `.morph/context/design-system.md` and fill in sections marked `/* CUSTOMIZE */`.
4
+
5
+ Living document. All agents read this before any UI work. All design decisions land here.
6
+
7
+ > **Ref:** Consult `framework/standards/frontend/design-system/design-trends.md` for modern techniques catalog.
8
+
9
+ ---
10
+
11
+ ## Aesthetic Direction
12
+
13
+ - **Direction**: [TODO: Minimal Refined / Editorial / Soft Professional / Industrial / Modern Luxury]
14
+ - **Tone**: [TODO: 1-2 sentences about the feel]
15
+ - **Differentiator**: [TODO: The 1 memorable element of this interface]
16
+ - **Font Pair**: Sora Variable (display) + Plus Jakarta Sans Variable (body) /* CUSTOMIZE */
17
+ - **Color Philosophy**: Deep indigo dominant + Rose accent — modern, bold, not generic /* CUSTOMIZE */
18
+ - **Motion Personality**: spring-based, purposeful /* CUSTOMIZE */
19
+ - **Visual Density**: balanced /* CUSTOMIZE */
20
+ - **Composition**: [TODO: Layout approach — see Domain Patterns below for guidance]
21
+ - **Selected Trends**: [TODO: Fill from Step 1.3 trend research — e.g., Bento Grid, Glassmorphism]
22
+
23
+ ---
24
+
25
+ ## Color Tokens
26
+
27
+ ```css
28
+ :root {
29
+ /* Dominant palette — deep indigo /* CUSTOMIZE */ */
30
+ --color-primary: #6366f1;
31
+ --color-primary-light: #818cf8;
32
+ --color-primary-dark: #4f46e5;
33
+ --color-primary-rgb: 99, 102, 241; /* For colored shadows: rgba(var(--color-primary-rgb), 0.3) */
34
+
35
+ /* Sharp accent — rose /* CUSTOMIZE */ */
36
+ --color-accent: #f43f5e;
37
+ --color-accent-hover: #e11d48;
38
+
39
+ /* Neutrals (dark-first) */
40
+ --color-neutral-50: #fafafa;
41
+ --color-neutral-100: #f4f4f5;
42
+ --color-neutral-200: #e4e4e7;
43
+ --color-neutral-300: #d4d4d8;
44
+ --color-neutral-400: #a1a1aa;
45
+ --color-neutral-500: #71717a;
46
+ --color-neutral-600: #52525b;
47
+ --color-neutral-700: #3f3f46;
48
+ --color-neutral-800: #27272a;
49
+ --color-neutral-900: #18181b;
50
+ --color-neutral-950: #09090b;
51
+
52
+ /* Surfaces (elevation via luminance — dark-first) */
53
+ --color-surface-0: #0a0a0f; /* Base background */
54
+ --color-surface-1: #12121a; /* Cards */
55
+ --color-surface-2: #1a1a24; /* Elevated cards, dropdowns */
56
+ --color-surface-3: #22222e; /* Modals, popovers */
57
+ --color-surface-4: #2a2a38; /* Hover states */
58
+
59
+ /* Light mode overrides (apply via .light or @media (prefers-color-scheme: light)) */
60
+ /* --color-surface-0: #ffffff;
61
+ --color-surface-1: #fafafa;
62
+ --color-surface-2: #f4f4f5;
63
+ --color-surface-3: #e4e4e7;
64
+ --color-surface-4: #d4d4d8; */
65
+
66
+ --color-border: rgba(255, 255, 255, 0.08);
67
+
68
+ /* Semantic */
69
+ --color-success: #22c55e;
70
+ --color-warning: #f59e0b;
71
+ --color-error: #ef4444;
72
+ --color-info: #3b82f6;
73
+
74
+ /* Text (luminance hierarchy — dark-first) */
75
+ --color-text-primary: #f0f0f5; /* 95% luminance */
76
+ --color-text-secondary: #a0a0b0; /* 65% luminance */
77
+ --color-text-muted: #606070; /* 40% luminance */
78
+ }
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Typography
84
+
85
+ ```css
86
+ :root {
87
+ /* Font families — Variable Fonts /* CUSTOMIZE */ */
88
+ --font-display: 'Sora Variable', 'Sora', sans-serif;
89
+ --font-body: 'Plus Jakarta Sans Variable', 'Plus Jakarta Sans', sans-serif;
90
+ --font-mono: 'JetBrains Mono Variable', 'JetBrains Mono', monospace;
91
+
92
+ /* Fluid scale (clamp for responsive without breakpoints) */
93
+ --text-xs: clamp(0.7rem, 0.65rem + 0.25vw, 0.75rem); /* ~12px */
94
+ --text-sm: clamp(0.8rem, 0.75rem + 0.25vw, 0.875rem); /* ~14px */
95
+ --text-base: clamp(0.9rem, 0.85rem + 0.25vw, 1rem); /* ~16px */
96
+ --text-lg: clamp(1rem, 0.9rem + 0.5vw, 1.125rem); /* ~18px */
97
+ --text-xl: clamp(1.1rem, 1rem + 0.5vw, 1.25rem); /* ~20px */
98
+ --text-2xl: clamp(1.25rem, 1.1rem + 0.75vw, 1.5rem); /* ~24px */
99
+ --text-3xl: clamp(1.5rem, 1.25rem + 1.25vw, 1.875rem); /* ~30px */
100
+ --text-4xl: clamp(1.875rem, 1.5rem + 1.875vw, 2.25rem); /* ~36px */
101
+ --text-5xl: clamp(2.25rem, 1.75rem + 2.5vw, 3rem); /* ~48px */
102
+
103
+ /* Weights (variable font range) */
104
+ --font-weight-regular: 400;
105
+ --font-weight-medium: 500;
106
+ --font-weight-semibold: 600;
107
+ --font-weight-bold: 700;
108
+ --font-weight-extrabold: 800;
109
+
110
+ /* Line heights */
111
+ --leading-tight: 1.2;
112
+ --leading-snug: 1.35;
113
+ --leading-normal: 1.5;
114
+ --leading-relaxed: 1.75;
115
+
116
+ /* Variable font features */
117
+ --font-display-hover-weight: 'wght' 800; /* For interactive headings */
118
+ }
119
+ ```
120
+
121
+ ---
122
+
123
+ ## Motion Tokens
124
+
125
+ ```css
126
+ :root {
127
+ /* Durations */
128
+ --duration-instant: 0.05s;
129
+ --duration-fast: 0.15s;
130
+ --duration-base: 0.3s;
131
+ --duration-slow: 0.5s;
132
+ --duration-slower: 0.8s;
133
+
134
+ /* Standard easings */
135
+ --easing-standard: cubic-bezier(0.4, 0, 0.2, 1);
136
+ --easing-decelerate: cubic-bezier(0, 0, 0.2, 1);
137
+ --easing-accelerate: cubic-bezier(0.4, 0, 1, 1);
138
+
139
+ /* Spring / bounce easings */
140
+ --easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
141
+ --easing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
142
+ --easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275);
143
+
144
+ /* Scroll-driven (use with animation-timeline: scroll()) */
145
+ --scroll-reveal-distance: 20px;
146
+ --scroll-reveal-duration: var(--duration-slow);
147
+ }
148
+
149
+ /* Accessibility — MANDATORY */
150
+ @media (prefers-reduced-motion: reduce) {
151
+ *, *::before, *::after {
152
+ animation-duration: 0.01ms !important;
153
+ transition-duration: 0.01ms !important;
154
+ }
155
+ }
156
+ ```
157
+
158
+ ### Framer Motion mapping (TypeScript)
159
+
160
+ ```typescript
161
+ export const durations = {
162
+ instant: 0.05,
163
+ fast: 0.15,
164
+ base: 0.3,
165
+ slow: 0.5,
166
+ slower: 0.8,
167
+ } as const;
168
+
169
+ export const easings = {
170
+ standard: [0.4, 0, 0.2, 1] as const,
171
+ decelerate: [0, 0, 0.2, 1] as const,
172
+ accelerate: [0.4, 0, 1, 1] as const,
173
+ bounce: [0.34, 1.56, 0.64, 1] as const,
174
+ spring: [0.68, -0.55, 0.265, 1.55] as const,
175
+ elastic: [0.175, 0.885, 0.32, 1.275] as const,
176
+ };
177
+
178
+ export const springConfigs = {
179
+ gentle: { stiffness: 120, damping: 14 },
180
+ snappy: { stiffness: 300, damping: 20 },
181
+ bouncy: { stiffness: 400, damping: 10 },
182
+ } as const;
183
+ ```
184
+
185
+ ---
186
+
187
+ ## Spacing Tokens
188
+
189
+ ```css
190
+ :root {
191
+ /* 4px base grid */
192
+ --space-1: 0.25rem; /* 4px */
193
+ --space-2: 0.5rem; /* 8px */
194
+ --space-3: 0.75rem; /* 12px */
195
+ --space-4: 1rem; /* 16px */
196
+ --space-5: 1.25rem; /* 20px */
197
+ --space-6: 1.5rem; /* 24px */
198
+ --space-8: 2rem; /* 32px */
199
+ --space-10: 2.5rem; /* 40px */
200
+ --space-12: 3rem; /* 48px */
201
+ --space-16: 4rem; /* 64px */
202
+ --space-20: 5rem; /* 80px */
203
+ --space-24: 6rem; /* 96px */
204
+
205
+ /* Container */
206
+ --container-padding: var(--space-8);
207
+ --grid-gap: var(--space-6);
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Border Radius Tokens
214
+
215
+ ```css
216
+ :root {
217
+ --radius-none: 0;
218
+ --radius-sm: 0.25rem; /* 4px */
219
+ --radius-base: 0.375rem; /* 6px */
220
+ --radius-md: 0.5rem; /* 8px */
221
+ --radius-lg: 0.75rem; /* 12px */
222
+ --radius-xl: 1rem; /* 16px */
223
+ --radius-2xl: 1.5rem; /* 24px */
224
+ --radius-full: 9999px;
225
+ }
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Shadow Tokens
231
+
232
+ ```css
233
+ :root {
234
+ /* Standard shadows */
235
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
236
+ --shadow-base: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
237
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);
238
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
239
+ --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
240
+
241
+ /* Layered shadows (more realistic depth) */
242
+ --shadow-layered-sm: 0 1px 1px rgba(0,0,0,0.04), 0 2px 4px rgba(0,0,0,0.04);
243
+ --shadow-layered-md: 0 1px 2px rgba(0,0,0,0.03), 0 4px 8px rgba(0,0,0,0.04), 0 12px 24px rgba(0,0,0,0.05);
244
+ --shadow-layered-lg: 0 2px 4px rgba(0,0,0,0.02), 0 8px 16px rgba(0,0,0,0.04), 0 24px 48px rgba(0,0,0,0.06);
245
+
246
+ /* Colored shadows (use element's accent color) */
247
+ --shadow-colored-sm: 0 4px 14px rgba(var(--color-primary-rgb), 0.15);
248
+ --shadow-colored-md: 0 8px 24px rgba(var(--color-primary-rgb), 0.25);
249
+ --shadow-colored-lg: 0 12px 40px rgba(var(--color-primary-rgb), 0.35);
250
+
251
+ /* Interaction shadows */
252
+ --shadow-lift: 0 8px 30px rgba(0, 0, 0, 0.12); /* Card hover lift */
253
+ --shadow-focus: 0 0 0 3px rgba(var(--color-primary-rgb), 0.4); /* Focus ring */
254
+ }
255
+ ```
256
+
257
+ ---
258
+
259
+ ## Design Trends (Active)
260
+
261
+ > Ref: `framework/standards/frontend/design-system/design-trends.md` for full catalog with implementation details.
262
+
263
+ Agents MUST consider these modern techniques when filling this template. Select 2-3 that fit the project's direction and domain:
264
+
265
+ | Technique | Best For | Direction Fit |
266
+ |-----------|----------|---------------|
267
+ | Bento Grid | Dashboards, landing pages | Industrial, Editorial |
268
+ | Glassmorphism | Navigation, overlays, cards | Soft Professional, Modern Luxury |
269
+ | Aurora Gradients | Hero backgrounds, empty states | Editorial, Modern Luxury |
270
+ | Variable Fonts | Interactive headings, responsive weight | All directions |
271
+ | Scroll-Driven Animations | Narratives, reveals, progress | Editorial, Modern Luxury |
272
+ | Perspective Cards (3D) | Product cards, pricing, features | Modern Luxury |
273
+ | Noise Texture | Backgrounds, surfaces | Minimal Refined |
274
+ | Colored Shadows | CTAs, hover states, cards | Soft Professional, Modern Luxury |
275
+ | Dark Mode First | Data-heavy apps, developer tools | Industrial, Minimal Refined |
276
+ | Fluid Typography | Responsive headings | All directions |
277
+
278
+ ---
279
+
280
+ ## Domain Patterns
281
+
282
+ Choose patterns based on the project domain:
283
+
284
+ | Domain | Layout | Key Components | Visual Approach |
285
+ |--------|--------|---------------|----------------|
286
+ | **SaaS Dashboard** | Bento grid + sidebar | KPI cards, data tables, charts | Controlled density, skeleton loaders, dark default |
287
+ | **E-commerce** | Product grid + asymmetric hero | Product cards, CTA buttons, filters | Image-first, hover lift, colored shadows on CTA |
288
+ | **Landing Page** | Full-width sections | Hero, features, testimonials, CTA | Aurora gradients, scroll reveals, fluid typography |
289
+ | **Internal Tool** | Dense sidebar + content | Forms, tables, status indicators | Minimal effects, compact spacing, monospace data |
290
+ | **Social/Community** | Card feed + drawer nav | Post cards, avatars, notifications | Glassmorphism overlays, spring animations |
291
+
292
+ ---
293
+
294
+ ## Advanced Effects
295
+
296
+ ```css
297
+ :root {
298
+ /* Glassmorphism */
299
+ --glass-blur: 12px;
300
+ --glass-saturation: 180%;
301
+ --glass-bg-light: rgba(255, 255, 255, 0.15);
302
+ --glass-bg-dark: rgba(0, 0, 0, 0.25);
303
+ --glass-border: rgba(255, 255, 255, 0.18);
304
+
305
+ /* Aurora gradient (animate with @keyframes) */
306
+ --aurora-gradient: conic-gradient(from 0deg at 50% 50%,
307
+ var(--color-primary), var(--color-accent), #fbbf24, var(--color-primary));
308
+ --aurora-speed: 15s;
309
+
310
+ /* Noise texture (inline SVG) */
311
+ --noise-texture: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
312
+
313
+ /* 3D / Perspective */
314
+ --perspective-card: perspective(1000px);
315
+ --perspective-hover-rotate: rotateX(-2deg) rotateY(3deg) translateZ(10px);
316
+
317
+ /* Container queries */
318
+ --container-sm: 400px;
319
+ --container-md: 600px;
320
+ --container-lg: 800px;
321
+
322
+ /* View Transitions (CSS) */
323
+ --view-transition-duration: 0.3s;
324
+ --view-transition-easing: var(--easing-decelerate);
325
+ }
326
+
327
+ /* View Transitions API support */
328
+ ::view-transition-old(root),
329
+ ::view-transition-new(root) {
330
+ animation-duration: var(--view-transition-duration);
331
+ animation-timing-function: var(--view-transition-easing);
332
+ }
333
+ ```
334
+
335
+ ---
336
+
337
+ ## Changelog
338
+
339
+ > Living record — every agent that adds tokens or design decisions registers here.
340
+ > Format: `- YYYY-MM-DD [agent-id] Description of addition/change`
341
+
342
+ <!-- Entries below this line, newest first -->
343
+
344
+ ---
345
+
346
+ *MORPH-SPEC by Polymorphism Tech*
@@ -114,7 +114,7 @@ Frontend deliverables typically include:
114
114
  3. Wire up API calls/services last (after UI is structured)
115
115
  4. Test each component with loading + error + empty states
116
116
  5. After every 3 tasks, run: `morph-spec task done {{FEATURE_NAME}} <task-id>`
117
- 6. If design system validator blocks you, check `framework/standards/css-design-system.md`
117
+ 6. If design system validator blocks you, check `framework/standards/frontend/design-system/aesthetic-direction.md` and `framework/standards/frontend/design-system/design-trends.md`
118
118
 
119
119
  ## Report Back When Done
120
120
  Provide a summary of:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polymorphism-tech/morph-spec",
3
- "version": "4.11.1",
3
+ "version": "4.12.0",
4
4
  "description": "MORPH-SPEC: AI-First development framework with validation pipeline and multi-stack support",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -211,12 +211,17 @@ async function setupSpecificMcp(targetPath, name, stack, existingMcps) {
211
211
  }]);
212
212
 
213
213
  if (installNow) {
214
- const spinner = ora(`Configuring ${name}...`).start();
215
- const result = await installAutoMcps(targetPath, { [name]: mcpEntry });
216
- if (result.added.length > 0) {
217
- spinner.succeed(`${name} MCP configured (authenticate via /mcp in Claude Code)`);
218
- } else {
219
- spinner.info(`${name} MCP already configured`);
214
+ console.log(chalk.cyan(` Launching ${name} OAuth authentication...`));
215
+ try {
216
+ const { execSync } = await import('child_process');
217
+ execSync(`claude mcp add --transport http ${name} ${mcpEntry.install.config.url}`, {
218
+ stdio: 'inherit',
219
+ timeout: 120000
220
+ });
221
+ console.log(chalk.green(` ✓ ${name} MCP configured via OAuth`));
222
+ } catch {
223
+ const instructions = generateSetupInstructions(name, mcpEntry);
224
+ console.log(chalk.yellow(` Setup cancelled. Run later: ${instructions.cliCommand}`));
220
225
  }
221
226
  }
222
227
 
@@ -323,6 +328,23 @@ async function interactiveWizard(targetPath, stack, existingMcps) {
323
328
  }]);
324
329
 
325
330
  if (setupNow) {
331
+ // Remote MCPs — launch OAuth via claude mcp add
332
+ if (isRemoteMcp(entry.install.config)) {
333
+ console.log(chalk.cyan(` Launching ${capitalizedName} OAuth...`));
334
+ try {
335
+ const { execSync } = await import('child_process');
336
+ execSync(`claude mcp add --transport http ${name} ${entry.install.config.url}`, {
337
+ stdio: 'inherit',
338
+ timeout: 120000
339
+ });
340
+ console.log(chalk.green(` ✓ ${capitalizedName} configured via OAuth`));
341
+ } catch {
342
+ const instructions = generateSetupInstructions(name, entry);
343
+ console.log(chalk.yellow(` Setup cancelled. Run later: ${instructions.cliCommand}`));
344
+ }
345
+ continue;
346
+ }
347
+
326
348
  const credentialValues = {};
327
349
  for (const cred of entry.install.credentials) {
328
350
  const { value } = await inquirer.prompt([{