popeye-cli 1.0.1 → 1.1.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 (166) hide show
  1. package/README.md +521 -125
  2. package/dist/adapters/claude.d.ts +16 -4
  3. package/dist/adapters/claude.d.ts.map +1 -1
  4. package/dist/adapters/claude.js +679 -33
  5. package/dist/adapters/claude.js.map +1 -1
  6. package/dist/adapters/gemini.d.ts +55 -0
  7. package/dist/adapters/gemini.d.ts.map +1 -0
  8. package/dist/adapters/gemini.js +318 -0
  9. package/dist/adapters/gemini.js.map +1 -0
  10. package/dist/adapters/openai.d.ts.map +1 -1
  11. package/dist/adapters/openai.js +41 -7
  12. package/dist/adapters/openai.js.map +1 -1
  13. package/dist/auth/claude.d.ts +11 -9
  14. package/dist/auth/claude.d.ts.map +1 -1
  15. package/dist/auth/claude.js +107 -71
  16. package/dist/auth/claude.js.map +1 -1
  17. package/dist/auth/gemini.d.ts +58 -0
  18. package/dist/auth/gemini.d.ts.map +1 -0
  19. package/dist/auth/gemini.js +172 -0
  20. package/dist/auth/gemini.js.map +1 -0
  21. package/dist/auth/index.d.ts +11 -7
  22. package/dist/auth/index.d.ts.map +1 -1
  23. package/dist/auth/index.js +23 -5
  24. package/dist/auth/index.js.map +1 -1
  25. package/dist/auth/keychain.d.ts +20 -7
  26. package/dist/auth/keychain.d.ts.map +1 -1
  27. package/dist/auth/keychain.js +85 -29
  28. package/dist/auth/keychain.js.map +1 -1
  29. package/dist/auth/openai.d.ts +2 -2
  30. package/dist/auth/openai.d.ts.map +1 -1
  31. package/dist/auth/openai.js +30 -32
  32. package/dist/auth/openai.js.map +1 -1
  33. package/dist/cli/interactive.d.ts.map +1 -1
  34. package/dist/cli/interactive.js +1151 -110
  35. package/dist/cli/interactive.js.map +1 -1
  36. package/dist/config/defaults.d.ts +6 -1
  37. package/dist/config/defaults.d.ts.map +1 -1
  38. package/dist/config/defaults.js +10 -2
  39. package/dist/config/defaults.js.map +1 -1
  40. package/dist/config/index.d.ts +10 -0
  41. package/dist/config/index.d.ts.map +1 -1
  42. package/dist/config/index.js +19 -0
  43. package/dist/config/index.js.map +1 -1
  44. package/dist/config/schema.d.ts +20 -0
  45. package/dist/config/schema.d.ts.map +1 -1
  46. package/dist/config/schema.js +7 -0
  47. package/dist/config/schema.js.map +1 -1
  48. package/dist/generators/python.d.ts.map +1 -1
  49. package/dist/generators/python.js +1 -0
  50. package/dist/generators/python.js.map +1 -1
  51. package/dist/generators/typescript.d.ts.map +1 -1
  52. package/dist/generators/typescript.js +1 -0
  53. package/dist/generators/typescript.js.map +1 -1
  54. package/dist/state/index.d.ts +108 -0
  55. package/dist/state/index.d.ts.map +1 -1
  56. package/dist/state/index.js +551 -4
  57. package/dist/state/index.js.map +1 -1
  58. package/dist/state/registry.d.ts +52 -0
  59. package/dist/state/registry.d.ts.map +1 -0
  60. package/dist/state/registry.js +215 -0
  61. package/dist/state/registry.js.map +1 -0
  62. package/dist/types/cli.d.ts +4 -0
  63. package/dist/types/cli.d.ts.map +1 -1
  64. package/dist/types/cli.js.map +1 -1
  65. package/dist/types/consensus.d.ts +69 -4
  66. package/dist/types/consensus.d.ts.map +1 -1
  67. package/dist/types/consensus.js +24 -3
  68. package/dist/types/consensus.js.map +1 -1
  69. package/dist/types/workflow.d.ts +55 -0
  70. package/dist/types/workflow.d.ts.map +1 -1
  71. package/dist/types/workflow.js +16 -0
  72. package/dist/types/workflow.js.map +1 -1
  73. package/dist/workflow/auto-fix.d.ts +45 -0
  74. package/dist/workflow/auto-fix.d.ts.map +1 -0
  75. package/dist/workflow/auto-fix.js +274 -0
  76. package/dist/workflow/auto-fix.js.map +1 -0
  77. package/dist/workflow/consensus.d.ts +44 -2
  78. package/dist/workflow/consensus.d.ts.map +1 -1
  79. package/dist/workflow/consensus.js +565 -17
  80. package/dist/workflow/consensus.js.map +1 -1
  81. package/dist/workflow/execution-mode.d.ts +10 -4
  82. package/dist/workflow/execution-mode.d.ts.map +1 -1
  83. package/dist/workflow/execution-mode.js +547 -58
  84. package/dist/workflow/execution-mode.js.map +1 -1
  85. package/dist/workflow/index.d.ts +14 -2
  86. package/dist/workflow/index.d.ts.map +1 -1
  87. package/dist/workflow/index.js +69 -6
  88. package/dist/workflow/index.js.map +1 -1
  89. package/dist/workflow/milestone-workflow.d.ts +34 -0
  90. package/dist/workflow/milestone-workflow.d.ts.map +1 -0
  91. package/dist/workflow/milestone-workflow.js +414 -0
  92. package/dist/workflow/milestone-workflow.js.map +1 -0
  93. package/dist/workflow/plan-mode.d.ts +14 -1
  94. package/dist/workflow/plan-mode.d.ts.map +1 -1
  95. package/dist/workflow/plan-mode.js +589 -47
  96. package/dist/workflow/plan-mode.js.map +1 -1
  97. package/dist/workflow/plan-storage.d.ts +142 -0
  98. package/dist/workflow/plan-storage.d.ts.map +1 -0
  99. package/dist/workflow/plan-storage.js +331 -0
  100. package/dist/workflow/plan-storage.js.map +1 -0
  101. package/dist/workflow/project-verification.d.ts +37 -0
  102. package/dist/workflow/project-verification.d.ts.map +1 -0
  103. package/dist/workflow/project-verification.js +381 -0
  104. package/dist/workflow/project-verification.js.map +1 -0
  105. package/dist/workflow/task-workflow.d.ts +37 -0
  106. package/dist/workflow/task-workflow.d.ts.map +1 -0
  107. package/dist/workflow/task-workflow.js +383 -0
  108. package/dist/workflow/task-workflow.js.map +1 -0
  109. package/dist/workflow/test-runner.d.ts +1 -0
  110. package/dist/workflow/test-runner.d.ts.map +1 -1
  111. package/dist/workflow/test-runner.js +9 -5
  112. package/dist/workflow/test-runner.js.map +1 -1
  113. package/dist/workflow/ui-designer.d.ts +82 -0
  114. package/dist/workflow/ui-designer.d.ts.map +1 -0
  115. package/dist/workflow/ui-designer.js +234 -0
  116. package/dist/workflow/ui-designer.js.map +1 -0
  117. package/dist/workflow/ui-setup.d.ts +58 -0
  118. package/dist/workflow/ui-setup.d.ts.map +1 -0
  119. package/dist/workflow/ui-setup.js +685 -0
  120. package/dist/workflow/ui-setup.js.map +1 -0
  121. package/dist/workflow/ui-verification.d.ts +114 -0
  122. package/dist/workflow/ui-verification.d.ts.map +1 -0
  123. package/dist/workflow/ui-verification.js +258 -0
  124. package/dist/workflow/ui-verification.js.map +1 -0
  125. package/dist/workflow/workflow-logger.d.ts +110 -0
  126. package/dist/workflow/workflow-logger.d.ts.map +1 -0
  127. package/dist/workflow/workflow-logger.js +267 -0
  128. package/dist/workflow/workflow-logger.js.map +1 -0
  129. package/package.json +2 -2
  130. package/src/adapters/claude.ts +815 -34
  131. package/src/adapters/gemini.ts +373 -0
  132. package/src/adapters/openai.ts +40 -7
  133. package/src/auth/claude.ts +120 -78
  134. package/src/auth/gemini.ts +207 -0
  135. package/src/auth/index.ts +28 -8
  136. package/src/auth/keychain.ts +95 -28
  137. package/src/auth/openai.ts +29 -36
  138. package/src/cli/interactive.ts +1357 -115
  139. package/src/config/defaults.ts +10 -2
  140. package/src/config/index.ts +21 -0
  141. package/src/config/schema.ts +7 -0
  142. package/src/generators/python.ts +1 -0
  143. package/src/generators/typescript.ts +1 -0
  144. package/src/state/index.ts +713 -4
  145. package/src/state/registry.ts +278 -0
  146. package/src/types/cli.ts +4 -0
  147. package/src/types/consensus.ts +65 -6
  148. package/src/types/workflow.ts +35 -0
  149. package/src/workflow/auto-fix.ts +340 -0
  150. package/src/workflow/consensus.ts +750 -16
  151. package/src/workflow/execution-mode.ts +673 -74
  152. package/src/workflow/index.ts +95 -6
  153. package/src/workflow/milestone-workflow.ts +576 -0
  154. package/src/workflow/plan-mode.ts +696 -50
  155. package/src/workflow/plan-storage.ts +482 -0
  156. package/src/workflow/project-verification.ts +471 -0
  157. package/src/workflow/task-workflow.ts +525 -0
  158. package/src/workflow/test-runner.ts +10 -5
  159. package/src/workflow/ui-designer.ts +337 -0
  160. package/src/workflow/ui-setup.ts +797 -0
  161. package/src/workflow/ui-verification.ts +357 -0
  162. package/src/workflow/workflow-logger.ts +353 -0
  163. package/tests/config/config.test.ts +1 -1
  164. package/tests/types/consensus.test.ts +3 -3
  165. package/tests/workflow/plan-mode.test.ts +213 -0
  166. package/tests/workflow/test-runner.test.ts +5 -3
@@ -0,0 +1,685 @@
1
+ /**
2
+ * UI Setup Module
3
+ * Automatically sets up component libraries, design systems, and styling
4
+ * for a polished, professional UI without manual configuration
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { exec } from 'node:child_process';
9
+ import { promisify } from 'node:util';
10
+ const execAsync = promisify(exec);
11
+ /**
12
+ * Pre-defined professional themes
13
+ */
14
+ export const THEMES = {
15
+ modern: {
16
+ name: 'Modern Blue',
17
+ colors: {
18
+ primary: '221.2 83.2% 53.3%',
19
+ primaryForeground: '210 40% 98%',
20
+ secondary: '210 40% 96.1%',
21
+ secondaryForeground: '222.2 47.4% 11.2%',
22
+ accent: '210 40% 96.1%',
23
+ accentForeground: '222.2 47.4% 11.2%',
24
+ background: '0 0% 100%',
25
+ foreground: '222.2 84% 4.9%',
26
+ card: '0 0% 100%',
27
+ cardForeground: '222.2 84% 4.9%',
28
+ muted: '210 40% 96.1%',
29
+ mutedForeground: '215.4 16.3% 46.9%',
30
+ destructive: '0 84.2% 60.2%',
31
+ destructiveForeground: '210 40% 98%',
32
+ border: '214.3 31.8% 91.4%',
33
+ input: '214.3 31.8% 91.4%',
34
+ ring: '221.2 83.2% 53.3%',
35
+ },
36
+ borderRadius: '0.5rem',
37
+ fontFamily: 'Inter, system-ui, sans-serif',
38
+ },
39
+ elegant: {
40
+ name: 'Elegant Dark',
41
+ colors: {
42
+ primary: '262.1 83.3% 57.8%',
43
+ primaryForeground: '210 20% 98%',
44
+ secondary: '220 14.3% 95.9%',
45
+ secondaryForeground: '220.9 39.3% 11%',
46
+ accent: '220 14.3% 95.9%',
47
+ accentForeground: '220.9 39.3% 11%',
48
+ background: '0 0% 100%',
49
+ foreground: '224 71.4% 4.1%',
50
+ card: '0 0% 100%',
51
+ cardForeground: '224 71.4% 4.1%',
52
+ muted: '220 14.3% 95.9%',
53
+ mutedForeground: '220 8.9% 46.1%',
54
+ destructive: '0 84.2% 60.2%',
55
+ destructiveForeground: '210 20% 98%',
56
+ border: '220 13% 91%',
57
+ input: '220 13% 91%',
58
+ ring: '262.1 83.3% 57.8%',
59
+ },
60
+ borderRadius: '0.75rem',
61
+ fontFamily: 'Plus Jakarta Sans, system-ui, sans-serif',
62
+ },
63
+ minimal: {
64
+ name: 'Minimal Clean',
65
+ colors: {
66
+ primary: '240 5.9% 10%',
67
+ primaryForeground: '0 0% 98%',
68
+ secondary: '240 4.8% 95.9%',
69
+ secondaryForeground: '240 5.9% 10%',
70
+ accent: '240 4.8% 95.9%',
71
+ accentForeground: '240 5.9% 10%',
72
+ background: '0 0% 100%',
73
+ foreground: '240 10% 3.9%',
74
+ card: '0 0% 100%',
75
+ cardForeground: '240 10% 3.9%',
76
+ muted: '240 4.8% 95.9%',
77
+ mutedForeground: '240 3.8% 46.1%',
78
+ destructive: '0 84.2% 60.2%',
79
+ destructiveForeground: '0 0% 98%',
80
+ border: '240 5.9% 90%',
81
+ input: '240 5.9% 90%',
82
+ ring: '240 5.9% 10%',
83
+ },
84
+ borderRadius: '0.375rem',
85
+ fontFamily: 'system-ui, sans-serif',
86
+ },
87
+ vibrant: {
88
+ name: 'Vibrant Gradient',
89
+ colors: {
90
+ primary: '339 89.6% 51%',
91
+ primaryForeground: '0 0% 100%',
92
+ secondary: '217.2 91.2% 59.8%',
93
+ secondaryForeground: '0 0% 100%',
94
+ accent: '47.9 95.8% 53.1%',
95
+ accentForeground: '0 0% 9%',
96
+ background: '0 0% 100%',
97
+ foreground: '222.2 84% 4.9%',
98
+ card: '0 0% 100%',
99
+ cardForeground: '222.2 84% 4.9%',
100
+ muted: '210 40% 96.1%',
101
+ mutedForeground: '215.4 16.3% 46.9%',
102
+ destructive: '0 84.2% 60.2%',
103
+ destructiveForeground: '0 0% 100%',
104
+ border: '214.3 31.8% 91.4%',
105
+ input: '214.3 31.8% 91.4%',
106
+ ring: '339 89.6% 51%',
107
+ },
108
+ borderRadius: '1rem',
109
+ fontFamily: 'Poppins, system-ui, sans-serif',
110
+ },
111
+ };
112
+ /**
113
+ * Generate globals.css with theme
114
+ */
115
+ function generateGlobalsCss(theme) {
116
+ return `@tailwind base;
117
+ @tailwind components;
118
+ @tailwind utilities;
119
+
120
+ @layer base {
121
+ :root {
122
+ --background: ${theme.colors.background};
123
+ --foreground: ${theme.colors.foreground};
124
+ --card: ${theme.colors.card};
125
+ --card-foreground: ${theme.colors.cardForeground};
126
+ --popover: ${theme.colors.card};
127
+ --popover-foreground: ${theme.colors.cardForeground};
128
+ --primary: ${theme.colors.primary};
129
+ --primary-foreground: ${theme.colors.primaryForeground};
130
+ --secondary: ${theme.colors.secondary};
131
+ --secondary-foreground: ${theme.colors.secondaryForeground};
132
+ --muted: ${theme.colors.muted};
133
+ --muted-foreground: ${theme.colors.mutedForeground};
134
+ --accent: ${theme.colors.accent};
135
+ --accent-foreground: ${theme.colors.accentForeground};
136
+ --destructive: ${theme.colors.destructive};
137
+ --destructive-foreground: ${theme.colors.destructiveForeground};
138
+ --border: ${theme.colors.border};
139
+ --input: ${theme.colors.input};
140
+ --ring: ${theme.colors.ring};
141
+ --radius: ${theme.borderRadius};
142
+ }
143
+
144
+ .dark {
145
+ --background: 222.2 84% 4.9%;
146
+ --foreground: 210 40% 98%;
147
+ --card: 222.2 84% 4.9%;
148
+ --card-foreground: 210 40% 98%;
149
+ --popover: 222.2 84% 4.9%;
150
+ --popover-foreground: 210 40% 98%;
151
+ --primary: ${theme.colors.primary};
152
+ --primary-foreground: ${theme.colors.primaryForeground};
153
+ --secondary: 217.2 32.6% 17.5%;
154
+ --secondary-foreground: 210 40% 98%;
155
+ --muted: 217.2 32.6% 17.5%;
156
+ --muted-foreground: 215 20.2% 65.1%;
157
+ --accent: 217.2 32.6% 17.5%;
158
+ --accent-foreground: 210 40% 98%;
159
+ --destructive: 0 62.8% 30.6%;
160
+ --destructive-foreground: 210 40% 98%;
161
+ --border: 217.2 32.6% 17.5%;
162
+ --input: 217.2 32.6% 17.5%;
163
+ --ring: ${theme.colors.ring};
164
+ }
165
+ }
166
+
167
+ @layer base {
168
+ * {
169
+ @apply border-border;
170
+ }
171
+
172
+ body {
173
+ @apply bg-background text-foreground;
174
+ font-family: ${theme.fontFamily};
175
+ }
176
+ }
177
+
178
+ /* Custom utility classes */
179
+ @layer utilities {
180
+ .text-balance {
181
+ text-wrap: balance;
182
+ }
183
+
184
+ .glass {
185
+ @apply bg-white/80 backdrop-blur-lg border border-white/20;
186
+ }
187
+
188
+ .glass-dark {
189
+ @apply bg-black/40 backdrop-blur-lg border border-white/10;
190
+ }
191
+ }
192
+
193
+ /* Animation utilities */
194
+ @layer utilities {
195
+ .animate-in {
196
+ animation: animateIn 0.3s ease-out;
197
+ }
198
+
199
+ .animate-out {
200
+ animation: animateOut 0.2s ease-in;
201
+ }
202
+
203
+ @keyframes animateIn {
204
+ from {
205
+ opacity: 0;
206
+ transform: translateY(-10px);
207
+ }
208
+ to {
209
+ opacity: 1;
210
+ transform: translateY(0);
211
+ }
212
+ }
213
+
214
+ @keyframes animateOut {
215
+ from {
216
+ opacity: 1;
217
+ transform: translateY(0);
218
+ }
219
+ to {
220
+ opacity: 0;
221
+ transform: translateY(-10px);
222
+ }
223
+ }
224
+ }
225
+ `;
226
+ }
227
+ /**
228
+ * Generate Tailwind config for shadcn
229
+ */
230
+ function generateTailwindConfig(theme) {
231
+ return `import type { Config } from "tailwindcss";
232
+
233
+ const config: Config = {
234
+ darkMode: ["class"],
235
+ content: [
236
+ "./index.html",
237
+ "./src/**/*.{js,ts,jsx,tsx}",
238
+ ],
239
+ theme: {
240
+ container: {
241
+ center: true,
242
+ padding: "2rem",
243
+ screens: {
244
+ "2xl": "1400px",
245
+ },
246
+ },
247
+ extend: {
248
+ fontFamily: {
249
+ sans: ["${theme.fontFamily.split(',')[0]}", "system-ui", "sans-serif"],
250
+ },
251
+ colors: {
252
+ border: "hsl(var(--border))",
253
+ input: "hsl(var(--input))",
254
+ ring: "hsl(var(--ring))",
255
+ background: "hsl(var(--background))",
256
+ foreground: "hsl(var(--foreground))",
257
+ primary: {
258
+ DEFAULT: "hsl(var(--primary))",
259
+ foreground: "hsl(var(--primary-foreground))",
260
+ },
261
+ secondary: {
262
+ DEFAULT: "hsl(var(--secondary))",
263
+ foreground: "hsl(var(--secondary-foreground))",
264
+ },
265
+ destructive: {
266
+ DEFAULT: "hsl(var(--destructive))",
267
+ foreground: "hsl(var(--destructive-foreground))",
268
+ },
269
+ muted: {
270
+ DEFAULT: "hsl(var(--muted))",
271
+ foreground: "hsl(var(--muted-foreground))",
272
+ },
273
+ accent: {
274
+ DEFAULT: "hsl(var(--accent))",
275
+ foreground: "hsl(var(--accent-foreground))",
276
+ },
277
+ popover: {
278
+ DEFAULT: "hsl(var(--popover))",
279
+ foreground: "hsl(var(--popover-foreground))",
280
+ },
281
+ card: {
282
+ DEFAULT: "hsl(var(--card))",
283
+ foreground: "hsl(var(--card-foreground))",
284
+ },
285
+ },
286
+ borderRadius: {
287
+ lg: "var(--radius)",
288
+ md: "calc(var(--radius) - 2px)",
289
+ sm: "calc(var(--radius) - 4px)",
290
+ },
291
+ keyframes: {
292
+ "accordion-down": {
293
+ from: { height: "0" },
294
+ to: { height: "var(--radix-accordion-content-height)" },
295
+ },
296
+ "accordion-up": {
297
+ from: { height: "var(--radix-accordion-content-height)" },
298
+ to: { height: "0" },
299
+ },
300
+ },
301
+ animation: {
302
+ "accordion-down": "accordion-down 0.2s ease-out",
303
+ "accordion-up": "accordion-up 0.2s ease-out",
304
+ },
305
+ },
306
+ },
307
+ plugins: [require("tailwindcss-animate")],
308
+ };
309
+
310
+ export default config;
311
+ `;
312
+ }
313
+ /**
314
+ * Components to install based on project type
315
+ */
316
+ const COMPONENT_SETS = {
317
+ dashboard: [
318
+ 'button', 'card', 'input', 'label', 'select', 'table', 'tabs',
319
+ 'dialog', 'dropdown-menu', 'avatar', 'badge', 'skeleton',
320
+ 'tooltip', 'separator', 'scroll-area', 'sheet', 'toast',
321
+ ],
322
+ kanban: [
323
+ 'button', 'card', 'input', 'label', 'select', 'dialog',
324
+ 'dropdown-menu', 'avatar', 'badge', 'skeleton', 'tooltip',
325
+ 'separator', 'scroll-area', 'sheet', 'toast', 'popover',
326
+ 'context-menu', 'command',
327
+ ],
328
+ ecommerce: [
329
+ 'button', 'card', 'input', 'label', 'select', 'dialog',
330
+ 'carousel', 'avatar', 'badge', 'skeleton', 'tooltip',
331
+ 'separator', 'scroll-area', 'sheet', 'toast', 'accordion',
332
+ 'tabs', 'slider',
333
+ ],
334
+ blog: [
335
+ 'button', 'card', 'input', 'label', 'textarea', 'dialog',
336
+ 'avatar', 'badge', 'skeleton', 'separator', 'scroll-area',
337
+ 'toast', 'navigation-menu',
338
+ ],
339
+ default: [
340
+ 'button', 'card', 'input', 'label', 'select', 'dialog',
341
+ 'dropdown-menu', 'avatar', 'badge', 'skeleton', 'tooltip',
342
+ 'separator', 'toast',
343
+ ],
344
+ };
345
+ /**
346
+ * Detect project type from idea/specification
347
+ */
348
+ export function detectProjectType(idea) {
349
+ const lowerIdea = idea.toLowerCase();
350
+ if (lowerIdea.includes('kanban') || lowerIdea.includes('project manage') || lowerIdea.includes('task')) {
351
+ return 'kanban';
352
+ }
353
+ if (lowerIdea.includes('dashboard') || lowerIdea.includes('analytics') || lowerIdea.includes('admin')) {
354
+ return 'dashboard';
355
+ }
356
+ if (lowerIdea.includes('shop') || lowerIdea.includes('store') || lowerIdea.includes('ecommerce') || lowerIdea.includes('product')) {
357
+ return 'ecommerce';
358
+ }
359
+ if (lowerIdea.includes('blog') || lowerIdea.includes('article') || lowerIdea.includes('content')) {
360
+ return 'blog';
361
+ }
362
+ return 'default';
363
+ }
364
+ /**
365
+ * Setup complete UI system for a project
366
+ */
367
+ export async function setupUI(projectDir, options = {}, onProgress) {
368
+ const frontendDir = path.join(projectDir, 'packages', 'frontend');
369
+ const componentsInstalled = [];
370
+ try {
371
+ // Determine theme
372
+ const themeName = options.theme || 'modern';
373
+ const theme = THEMES[themeName] || THEMES.modern;
374
+ onProgress?.(`Using theme: ${theme.name}`);
375
+ // Determine project type
376
+ const projectType = options.projectType || (options.idea ? detectProjectType(options.idea) : 'default');
377
+ onProgress?.(`Detected project type: ${projectType}`);
378
+ // Check if frontend exists
379
+ const frontendExists = await fs.access(frontendDir).then(() => true).catch(() => false);
380
+ if (!frontendExists) {
381
+ return {
382
+ success: false,
383
+ theme: themeName,
384
+ componentsInstalled: [],
385
+ error: 'Frontend directory not found',
386
+ };
387
+ }
388
+ // Step 1: Install Tailwind and dependencies
389
+ onProgress?.('Installing Tailwind CSS and dependencies...');
390
+ await execAsync('npm install -D tailwindcss postcss autoprefixer tailwindcss-animate @tailwindcss/postcss', { cwd: frontendDir, timeout: 120000 });
391
+ // Step 2: Install shadcn/ui dependencies
392
+ onProgress?.('Installing UI component dependencies...');
393
+ await execAsync('npm install class-variance-authority clsx tailwind-merge lucide-react @radix-ui/react-slot', { cwd: frontendDir, timeout: 120000 });
394
+ // Step 3: Create lib/utils.ts
395
+ onProgress?.('Creating utility functions...');
396
+ const libDir = path.join(frontendDir, 'src', 'lib');
397
+ await fs.mkdir(libDir, { recursive: true });
398
+ await fs.writeFile(path.join(libDir, 'utils.ts'), `import { type ClassValue, clsx } from "clsx";
399
+ import { twMerge } from "tailwind-merge";
400
+
401
+ export function cn(...inputs: ClassValue[]) {
402
+ return twMerge(clsx(inputs));
403
+ }
404
+ `);
405
+ // Step 4: Create Tailwind config
406
+ onProgress?.('Configuring Tailwind CSS...');
407
+ await fs.writeFile(path.join(frontendDir, 'tailwind.config.ts'), generateTailwindConfig(theme));
408
+ // Step 5: Create PostCSS config
409
+ await fs.writeFile(path.join(frontendDir, 'postcss.config.js'), `export default {
410
+ plugins: {
411
+ tailwindcss: {},
412
+ autoprefixer: {},
413
+ },
414
+ };
415
+ `);
416
+ // Step 6: Create globals.css
417
+ onProgress?.('Setting up theme and styles...');
418
+ await fs.writeFile(path.join(frontendDir, 'src', 'index.css'), generateGlobalsCss(theme));
419
+ // Step 7: Create components directory structure
420
+ const componentsDir = path.join(frontendDir, 'src', 'components', 'ui');
421
+ await fs.mkdir(componentsDir, { recursive: true });
422
+ // Step 8: Install base components
423
+ const components = COMPONENT_SETS[projectType] || COMPONENT_SETS.default;
424
+ onProgress?.(`Installing ${components.length} UI components...`);
425
+ // Create button component (always needed)
426
+ await fs.writeFile(path.join(componentsDir, 'button.tsx'), generateButtonComponent());
427
+ componentsInstalled.push('button');
428
+ // Create card component
429
+ await fs.writeFile(path.join(componentsDir, 'card.tsx'), generateCardComponent());
430
+ componentsInstalled.push('card');
431
+ // Create input component
432
+ await fs.writeFile(path.join(componentsDir, 'input.tsx'), generateInputComponent());
433
+ componentsInstalled.push('input');
434
+ // Create badge component
435
+ await fs.writeFile(path.join(componentsDir, 'badge.tsx'), generateBadgeComponent());
436
+ componentsInstalled.push('badge');
437
+ // Create skeleton component
438
+ await fs.writeFile(path.join(componentsDir, 'skeleton.tsx'), generateSkeletonComponent());
439
+ componentsInstalled.push('skeleton');
440
+ // Step 9: Update main.tsx to import CSS
441
+ onProgress?.('Updating application entry point...');
442
+ const mainTsxPath = path.join(frontendDir, 'src', 'main.tsx');
443
+ let mainTsx = await fs.readFile(mainTsxPath, 'utf-8');
444
+ if (!mainTsx.includes("import './index.css'")) {
445
+ // Add CSS import at the top
446
+ mainTsx = `import './index.css';\n${mainTsx}`;
447
+ await fs.writeFile(mainTsxPath, mainTsx);
448
+ }
449
+ onProgress?.(`UI setup complete! Theme: ${theme.name}, Components: ${componentsInstalled.length}`);
450
+ return {
451
+ success: true,
452
+ theme: themeName,
453
+ componentsInstalled,
454
+ };
455
+ }
456
+ catch (error) {
457
+ return {
458
+ success: false,
459
+ theme: options.theme || 'modern',
460
+ componentsInstalled,
461
+ error: error instanceof Error ? error.message : 'Unknown error',
462
+ };
463
+ }
464
+ }
465
+ // Component generators
466
+ function generateButtonComponent() {
467
+ return `import * as React from "react";
468
+ import { Slot } from "@radix-ui/react-slot";
469
+ import { cva, type VariantProps } from "class-variance-authority";
470
+ import { cn } from "@/lib/utils";
471
+
472
+ const buttonVariants = cva(
473
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
474
+ {
475
+ variants: {
476
+ variant: {
477
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
478
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
479
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
480
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
481
+ ghost: "hover:bg-accent hover:text-accent-foreground",
482
+ link: "text-primary underline-offset-4 hover:underline",
483
+ },
484
+ size: {
485
+ default: "h-10 px-4 py-2",
486
+ sm: "h-9 rounded-md px-3",
487
+ lg: "h-11 rounded-md px-8",
488
+ icon: "h-10 w-10",
489
+ },
490
+ },
491
+ defaultVariants: {
492
+ variant: "default",
493
+ size: "default",
494
+ },
495
+ }
496
+ );
497
+
498
+ export interface ButtonProps
499
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
500
+ VariantProps<typeof buttonVariants> {
501
+ asChild?: boolean;
502
+ }
503
+
504
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
505
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
506
+ const Comp = asChild ? Slot : "button";
507
+ return (
508
+ <Comp
509
+ className={cn(buttonVariants({ variant, size, className }))}
510
+ ref={ref}
511
+ {...props}
512
+ />
513
+ );
514
+ }
515
+ );
516
+ Button.displayName = "Button";
517
+
518
+ export { Button, buttonVariants };
519
+ `;
520
+ }
521
+ function generateCardComponent() {
522
+ return `import * as React from "react";
523
+ import { cn } from "@/lib/utils";
524
+
525
+ const Card = React.forwardRef<
526
+ HTMLDivElement,
527
+ React.HTMLAttributes<HTMLDivElement>
528
+ >(({ className, ...props }, ref) => (
529
+ <div
530
+ ref={ref}
531
+ className={cn(
532
+ "rounded-lg border bg-card text-card-foreground shadow-sm",
533
+ className
534
+ )}
535
+ {...props}
536
+ />
537
+ ));
538
+ Card.displayName = "Card";
539
+
540
+ const CardHeader = React.forwardRef<
541
+ HTMLDivElement,
542
+ React.HTMLAttributes<HTMLDivElement>
543
+ >(({ className, ...props }, ref) => (
544
+ <div
545
+ ref={ref}
546
+ className={cn("flex flex-col space-y-1.5 p-6", className)}
547
+ {...props}
548
+ />
549
+ ));
550
+ CardHeader.displayName = "CardHeader";
551
+
552
+ const CardTitle = React.forwardRef<
553
+ HTMLParagraphElement,
554
+ React.HTMLAttributes<HTMLHeadingElement>
555
+ >(({ className, ...props }, ref) => (
556
+ <h3
557
+ ref={ref}
558
+ className={cn(
559
+ "text-2xl font-semibold leading-none tracking-tight",
560
+ className
561
+ )}
562
+ {...props}
563
+ />
564
+ ));
565
+ CardTitle.displayName = "CardTitle";
566
+
567
+ const CardDescription = React.forwardRef<
568
+ HTMLParagraphElement,
569
+ React.HTMLAttributes<HTMLParagraphElement>
570
+ >(({ className, ...props }, ref) => (
571
+ <p
572
+ ref={ref}
573
+ className={cn("text-sm text-muted-foreground", className)}
574
+ {...props}
575
+ />
576
+ ));
577
+ CardDescription.displayName = "CardDescription";
578
+
579
+ const CardContent = React.forwardRef<
580
+ HTMLDivElement,
581
+ React.HTMLAttributes<HTMLDivElement>
582
+ >(({ className, ...props }, ref) => (
583
+ <div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
584
+ ));
585
+ CardContent.displayName = "CardContent";
586
+
587
+ const CardFooter = React.forwardRef<
588
+ HTMLDivElement,
589
+ React.HTMLAttributes<HTMLDivElement>
590
+ >(({ className, ...props }, ref) => (
591
+ <div
592
+ ref={ref}
593
+ className={cn("flex items-center p-6 pt-0", className)}
594
+ {...props}
595
+ />
596
+ ));
597
+ CardFooter.displayName = "CardFooter";
598
+
599
+ export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };
600
+ `;
601
+ }
602
+ function generateInputComponent() {
603
+ return `import * as React from "react";
604
+ import { cn } from "@/lib/utils";
605
+
606
+ export interface InputProps
607
+ extends React.InputHTMLAttributes<HTMLInputElement> {}
608
+
609
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(
610
+ ({ className, type, ...props }, ref) => {
611
+ return (
612
+ <input
613
+ type={type}
614
+ className={cn(
615
+ "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
616
+ className
617
+ )}
618
+ ref={ref}
619
+ {...props}
620
+ />
621
+ );
622
+ }
623
+ );
624
+ Input.displayName = "Input";
625
+
626
+ export { Input };
627
+ `;
628
+ }
629
+ function generateBadgeComponent() {
630
+ return `import * as React from "react";
631
+ import { cva, type VariantProps } from "class-variance-authority";
632
+ import { cn } from "@/lib/utils";
633
+
634
+ const badgeVariants = cva(
635
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
636
+ {
637
+ variants: {
638
+ variant: {
639
+ default:
640
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
641
+ secondary:
642
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
643
+ destructive:
644
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
645
+ outline: "text-foreground",
646
+ },
647
+ },
648
+ defaultVariants: {
649
+ variant: "default",
650
+ },
651
+ }
652
+ );
653
+
654
+ export interface BadgeProps
655
+ extends React.HTMLAttributes<HTMLDivElement>,
656
+ VariantProps<typeof badgeVariants> {}
657
+
658
+ function Badge({ className, variant, ...props }: BadgeProps) {
659
+ return (
660
+ <div className={cn(badgeVariants({ variant }), className)} {...props} />
661
+ );
662
+ }
663
+
664
+ export { Badge, badgeVariants };
665
+ `;
666
+ }
667
+ function generateSkeletonComponent() {
668
+ return `import { cn } from "@/lib/utils";
669
+
670
+ function Skeleton({
671
+ className,
672
+ ...props
673
+ }: React.HTMLAttributes<HTMLDivElement>) {
674
+ return (
675
+ <div
676
+ className={cn("animate-pulse rounded-md bg-muted", className)}
677
+ {...props}
678
+ />
679
+ );
680
+ }
681
+
682
+ export { Skeleton };
683
+ `;
684
+ }
685
+ //# sourceMappingURL=ui-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-setup.js","sourceRoot":"","sources":["../../src/workflow/ui-setup.ts"],"names":[],"mappings":"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"}