@auto-engineer/generate-react-client 1.112.0 → 1.113.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/package.json CHANGED
@@ -19,13 +19,13 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "debug": "^4.4.1",
22
- "@auto-engineer/file-upload": "1.112.0",
23
- "@auto-engineer/message-bus": "1.112.0"
22
+ "@auto-engineer/file-upload": "1.113.0",
23
+ "@auto-engineer/message-bus": "1.113.0"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/debug": "^4.1.12"
27
27
  },
28
- "version": "1.112.0",
28
+ "version": "1.113.0",
29
29
  "scripts": {
30
30
  "build": "tsc && tsx ../../scripts/fix-esm-imports.ts && cp -r starter dist/",
31
31
  "test-cli": "tsx test-cli.ts",
@@ -1,5 +0,0 @@
1
- export declare function buildThemeSystemPrompt(): string;
2
- export declare function buildThemeUserPrompt(modelJson: unknown): string;
3
- export declare function parseThemeCss(text: string): string;
4
- export declare function generateThemeCss(modelJson: unknown): Promise<string>;
5
- //# sourceMappingURL=generate-theme.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-theme.d.ts","sourceRoot":"","sources":["../../src/generate-theme.ts"],"names":[],"mappings":"AAoKA,wBAAgB,sBAAsB,IAAI,MAAM,CAgE/C;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAmD/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBlD;AAsBD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB1E"}
@@ -1,316 +0,0 @@
1
- import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
2
- import { generateText } from 'ai';
3
- import createDebug from 'debug';
4
- const debug = createDebug('auto:generate-react-client:theme');
5
- function requireEnv(name) {
6
- const value = process.env[name];
7
- if (!value) {
8
- throw new Error(`Missing required environment variable: ${name}`);
9
- }
10
- return value;
11
- }
12
- function createModel() {
13
- const name = requireEnv('CUSTOM_PROVIDER_NAME');
14
- const baseURL = requireEnv('CUSTOM_PROVIDER_BASE_URL');
15
- const apiKey = requireEnv('CUSTOM_PROVIDER_API_KEY');
16
- const model = requireEnv('CUSTOM_PROVIDER_DEFAULT_MODEL');
17
- return createOpenAICompatible({ name, baseURL, apiKey }).chatModel(model);
18
- }
19
- const TEMPLATE_CSS = `@import "tailwindcss";
20
- @import "tw-animate-css";
21
-
22
- @custom-variant dark (&:is(.dark *));
23
-
24
- @theme inline {
25
- --color-background: var(--background);
26
- --color-foreground: var(--foreground);
27
- --color-card: var(--card);
28
- --color-card-foreground: var(--card-foreground);
29
- --color-popover: var(--popover);
30
- --color-popover-foreground: var(--popover-foreground);
31
- --color-primary: var(--primary);
32
- --color-primary-foreground: var(--primary-foreground);
33
- --color-secondary: var(--secondary);
34
- --color-secondary-foreground: var(--secondary-foreground);
35
- --color-muted: var(--muted);
36
- --color-muted-foreground: var(--muted-foreground);
37
- --color-accent: var(--accent);
38
- --color-accent-foreground: var(--accent-foreground);
39
- --color-destructive: var(--destructive);
40
- --color-destructive-foreground: var(--destructive-foreground);
41
- --color-border: var(--border);
42
- --color-input: var(--input);
43
- --color-ring: var(--ring);
44
- --color-chart-1: var(--chart-1);
45
- --color-chart-2: var(--chart-2);
46
- --color-chart-3: var(--chart-3);
47
- --color-chart-4: var(--chart-4);
48
- --color-chart-5: var(--chart-5);
49
- --color-sidebar: var(--sidebar);
50
- --color-sidebar-foreground: var(--sidebar-foreground);
51
- --color-sidebar-primary: var(--sidebar-primary);
52
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
53
- --color-sidebar-accent: var(--sidebar-accent);
54
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
55
- --color-sidebar-border: var(--sidebar-border);
56
- --color-sidebar-ring: var(--sidebar-ring);
57
- --radius-sm: calc(var(--radius) - 4px);
58
- --radius-md: calc(var(--radius) - 2px);
59
- --radius-lg: var(--radius);
60
- --radius-xl: calc(var(--radius) + 4px);
61
- --font-sans: var(--font-sans);
62
- --font-heading: var(--font-heading);
63
- --shadow-xs: var(--shadow-xs);
64
- --shadow-sm: var(--shadow-sm);
65
- --shadow-md: var(--shadow-md);
66
- --shadow-lg: var(--shadow-lg);
67
- --shadow-2xl: var(--shadow-2xl);
68
- }
69
-
70
- :root {
71
- --radius: 0.625rem;
72
- --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
73
- --font-heading: "Inter", ui-sans-serif, system-ui, sans-serif;
74
- --spacing: 0.25rem;
75
- --tracking-tight: -0.025em;
76
- --tracking-wide: 0.025em;
77
- --leading-normal: 1.5;
78
- --leading-relaxed: 1.75;
79
- --shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 5%);
80
- --shadow-sm: 0 1px 3px 0 oklch(0 0 0 / 10%), 0 1px 2px -1px oklch(0 0 0 / 10%);
81
- --shadow-md: 0 4px 6px -1px oklch(0 0 0 / 10%), 0 2px 4px -2px oklch(0 0 0 / 10%);
82
- --shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 10%), 0 4px 6px -4px oklch(0 0 0 / 10%);
83
- --shadow-2xl: 0 25px 50px -12px oklch(0 0 0 / 25%);
84
- --background: oklch(1 0 0);
85
- --foreground: oklch(0.145 0 0);
86
- --card: oklch(1 0 0);
87
- --card-foreground: oklch(0.145 0 0);
88
- --popover: oklch(1 0 0);
89
- --popover-foreground: oklch(0.145 0 0);
90
- --primary: oklch(0.205 0 0);
91
- --primary-foreground: oklch(0.985 0 0);
92
- --secondary: oklch(0.97 0 0);
93
- --secondary-foreground: oklch(0.205 0 0);
94
- --muted: oklch(0.97 0 0);
95
- --muted-foreground: oklch(0.556 0 0);
96
- --accent: oklch(0.97 0 0);
97
- --accent-foreground: oklch(0.205 0 0);
98
- --destructive: oklch(0.577 0.245 27.325);
99
- --border: oklch(0.922 0 0);
100
- --input: oklch(0.922 0 0);
101
- --ring: oklch(0.708 0 0);
102
- --chart-1: oklch(0.646 0.222 41.116);
103
- --chart-2: oklch(0.6 0.118 184.704);
104
- --chart-3: oklch(0.398 0.07 227.392);
105
- --chart-4: oklch(0.828 0.189 84.429);
106
- --chart-5: oklch(0.769 0.188 70.08);
107
- --sidebar: oklch(0.985 0 0);
108
- --sidebar-foreground: oklch(0.145 0 0);
109
- --sidebar-primary: oklch(0.205 0 0);
110
- --sidebar-primary-foreground: oklch(0.985 0 0);
111
- --sidebar-accent: oklch(0.97 0 0);
112
- --sidebar-accent-foreground: oklch(0.205 0 0);
113
- --sidebar-border: oklch(0.922 0 0);
114
- --sidebar-ring: oklch(0.708 0 0);
115
- }
116
-
117
- .dark {
118
- --background: oklch(0.129 0.042 264.695);
119
- --foreground: oklch(0.985 0 0);
120
- --card: oklch(0.205 0 0);
121
- --card-foreground: oklch(0.985 0 0);
122
- --popover: oklch(0.205 0 0);
123
- --popover-foreground: oklch(0.985 0 0);
124
- --primary: oklch(0.922 0 0);
125
- --primary-foreground: oklch(0.205 0 0);
126
- --secondary: oklch(0.269 0 0);
127
- --secondary-foreground: oklch(0.985 0 0);
128
- --muted: oklch(0.269 0 0);
129
- --muted-foreground: oklch(0.708 0 0);
130
- --accent: oklch(0.269 0 0);
131
- --accent-foreground: oklch(0.985 0 0);
132
- --destructive: oklch(0.704 0.191 22.216);
133
- --border: oklch(1 0 0 / 10%);
134
- --input: oklch(1 0 0 / 15%);
135
- --ring: oklch(0.556 0 0);
136
- --chart-1: oklch(0.488 0.243 264.376);
137
- --chart-2: oklch(0.696 0.17 162.48);
138
- --chart-3: oklch(0.769 0.188 70.08);
139
- --chart-4: oklch(0.627 0.265 303.9);
140
- --chart-5: oklch(0.645 0.246 16.439);
141
- --sidebar: oklch(0.205 0 0);
142
- --sidebar-foreground: oklch(0.985 0 0);
143
- --sidebar-primary: oklch(0.488 0.243 264.376);
144
- --sidebar-primary-foreground: oklch(0.985 0 0);
145
- --sidebar-accent: oklch(0.269 0 0);
146
- --sidebar-accent-foreground: oklch(0.985 0 0);
147
- --sidebar-border: oklch(1 0 0 / 10%);
148
- --sidebar-ring: oklch(0.556 0 0);
149
- }
150
-
151
- @layer base {
152
- * {
153
- @apply border-border outline-ring/50;
154
- }
155
- body {
156
- @apply bg-background text-foreground;
157
- }
158
- }`;
159
- export function buildThemeSystemPrompt() {
160
- return `You are a design system specialist who generates themed CSS for web applications. Given a narrative model describing an application's domain, you infer the app's personality and generate a complete index.css with appropriate theming.
161
-
162
- ## Color Personality Mapping
163
- - Blue/Indigo (hue 240-270) = trust, professionalism, enterprise (banking, finance, corporate)
164
- - Green (hue 140-160) = growth, nature, health, wellness (fitness, healthcare, eco)
165
- - Gold/Amber (hue 70-90) = luxury, premium, sophisticated (fashion, jewelry, high-end)
166
- - Pink/Rose (hue 340-360) = fun, creative, playful (social, kids, entertainment)
167
- - Red/Orange (hue 15-45) = energy, urgency, action (sports, gaming, deals)
168
- - Purple (hue 280-310) = creativity, wisdom, innovation (education, AI, art)
169
- - Teal/Cyan (hue 180-200) = modern, clean, technical (dev tools, SaaS, analytics)
170
-
171
- ## Color Rules
172
- - All colors MUST use oklch(L C H) format
173
- - Greys should be slightly saturated with the dominant hue (warm or cool, never pure grey with chroma 0 for primary/accent colors)
174
- - Background/foreground must have >= 4.5:1 contrast ratio (WCAG AA)
175
- - Never use true black; use very dark saturated tones
176
- - Light mode: background L=0.97-1.0, foreground L=0.1-0.2
177
- - Dark mode: background L=0.1-0.15 with blue-tinted hue, use alpha transparency for borders
178
-
179
- ## Border Radius
180
- - 0rem = stark/brutalist
181
- - 0.25rem = formal/serious
182
- - 0.5-0.625rem = neutral/balanced
183
- - 0.75-1rem = playful/friendly
184
-
185
- ## Font Selection (Google Fonts)
186
- Pick a Google Font that matches the domain personality:
187
- - Neutral sans-serif (Inter, DM Sans) for utility/SaaS apps
188
- - Rounded sans-serif (Nunito, Quicksand) for playful/consumer apps
189
- - Serif (Playfair Display, Lora) for elegant/editorial apps
190
- - Monospace-influenced (Space Grotesk, JetBrains Mono) for developer tools
191
- - Only use typefaces with 5+ weights available
192
- - You may use the same font for both --font-sans and --font-heading, or pick a complementary heading font
193
-
194
- ## Shadow System
195
- 5 elevation levels (xs, sm, md, lg, 2xl):
196
- - Use two-part shadows (direct light + ambient) for higher elevations
197
- - Flat/minimal shadows for serious/professional apps
198
- - Deeper/more dramatic shadows for playful/consumer apps
199
-
200
- ## Spacing Density
201
- - --spacing base unit: 0.25rem (dense/compact for dashboards) vs 0.3rem (comfortable for content-heavy)
202
-
203
- ## Typography
204
- - --tracking-tight: tighter letter-spacing for headlines (e.g., -0.025em to -0.05em)
205
- - --tracking-wide: wider letter-spacing for all-caps or labels (e.g., 0.025em to 0.1em)
206
- - --leading-normal: base line height (1.5 for readable text)
207
- - --leading-relaxed: generous line height for content-heavy apps (1.625-1.75)
208
- - Values should match the app's content density
209
-
210
- ## Output Format
211
- Output a COMPLETE index.css inside a \`\`\`css code block. The CSS must:
212
- 1. Start with a Google Fonts @import at the very top (before @import "tailwindcss")
213
- 2. Keep @import "tailwindcss" and @import "tw-animate-css"
214
- 3. Keep @custom-variant dark (&:is(.dark *))
215
- 4. In @theme inline, keep ALL existing --color-* variable mappings and --radius-* calculations, and ADD: --font-sans, --font-heading, --shadow-xs, --shadow-sm, --shadow-md, --shadow-lg, --shadow-2xl
216
- 5. In :root, set ALL CSS variables with themed oklch values, PLUS: --font-sans, --font-heading, --spacing, --tracking-tight, --tracking-wide, --leading-normal, --leading-relaxed, --shadow-xs through --shadow-2xl
217
- 6. In .dark, set ALL CSS variables with dark mode oklch values
218
- 7. Keep the @layer base block unchanged
219
-
220
- Here is the template CSS structure to follow (change the values, keep the structure):
221
-
222
- ${TEMPLATE_CSS}`;
223
- }
224
- export function buildThemeUserPrompt(modelJson) {
225
- const model = modelJson;
226
- const lines = [];
227
- lines.push('Here is the narrative model for the application:\n');
228
- const narratives = model.narratives;
229
- if (Array.isArray(narratives)) {
230
- for (const narrative of narratives) {
231
- lines.push(`## Narrative: ${narrative.name ?? 'Unnamed'}`);
232
- if (narrative.description) {
233
- lines.push(`Description: ${narrative.description}`);
234
- }
235
- const slices = narrative.slices;
236
- if (Array.isArray(slices)) {
237
- for (const slice of slices) {
238
- lines.push(` - Slice: ${slice.name ?? 'Unnamed'} (type: ${slice.type ?? 'unknown'})`);
239
- if (slice.description) {
240
- lines.push(` Description: ${slice.description}`);
241
- }
242
- const messages = slice.messages;
243
- if (messages) {
244
- const msgTypes = ['commands', 'events', 'states', 'queries'];
245
- for (const msgType of msgTypes) {
246
- const items = messages[msgType];
247
- if (Array.isArray(items) && items.length > 0) {
248
- const names = items.map((m) => m.name ?? 'unnamed').join(', ');
249
- lines.push(` ${msgType}: ${names}`);
250
- }
251
- }
252
- }
253
- }
254
- }
255
- lines.push('');
256
- }
257
- }
258
- if (model.name) {
259
- lines.push(`Application name: ${model.name}`);
260
- }
261
- if (model.description) {
262
- lines.push(`Application description: ${model.description}`);
263
- }
264
- lines.push('\nBased on these narratives, infer the application domain and personality, then generate a themed index.css.');
265
- return lines.join('\n');
266
- }
267
- export function parseThemeCss(text) {
268
- const fencedMatch = text.match(/```css\s*\n([\s\S]*?)```/);
269
- if (fencedMatch) {
270
- return validateCss(fencedMatch[1].trim());
271
- }
272
- const bareFencedMatch = text.match(/```\s*\n([\s\S]*?)```/);
273
- if (bareFencedMatch) {
274
- return validateCss(bareFencedMatch[1].trim());
275
- }
276
- if (text.includes('@import "tailwindcss"') && text.includes('@theme inline')) {
277
- return validateCss(text.trim());
278
- }
279
- throw new Error('Could not extract CSS from AI response');
280
- }
281
- function validateCss(css) {
282
- const required = [
283
- '@import "tailwindcss"',
284
- '@theme inline',
285
- ':root',
286
- '.dark',
287
- '@layer base',
288
- '--background',
289
- '--primary',
290
- 'oklch',
291
- ];
292
- const missing = required.filter((token) => !css.includes(token));
293
- if (missing.length > 0) {
294
- throw new Error(`Generated CSS is missing required sections: ${missing.join(', ')}`);
295
- }
296
- return css;
297
- }
298
- export async function generateThemeCss(modelJson) {
299
- debug('Starting theme generation from narrative model');
300
- const systemPrompt = buildThemeSystemPrompt();
301
- const userPrompt = buildThemeUserPrompt(modelJson);
302
- debug('System prompt length: %d chars', systemPrompt.length);
303
- debug('User prompt length: %d chars', userPrompt.length);
304
- const { text } = await generateText({
305
- model: createModel(),
306
- messages: [
307
- { role: 'system', content: systemPrompt },
308
- { role: 'user', content: userPrompt },
309
- ],
310
- });
311
- debug('Received AI response, length: %d chars', text.length);
312
- const css = parseThemeCss(text);
313
- debug('Successfully parsed and validated theme CSS');
314
- return css;
315
- }
316
- //# sourceMappingURL=generate-theme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-theme.js","sourceRoot":"","sources":["../../src/generate-theme.ts"],"names":[],"mappings":"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"}