popeye-cli 1.0.1 → 1.2.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 (216) hide show
  1. package/.env.example +24 -1
  2. package/CONTRIBUTING.md +275 -0
  3. package/OPEN_SOURCE_MANIFESTO.md +172 -0
  4. package/README.md +832 -123
  5. package/dist/adapters/claude.d.ts +19 -4
  6. package/dist/adapters/claude.d.ts.map +1 -1
  7. package/dist/adapters/claude.js +908 -42
  8. package/dist/adapters/claude.js.map +1 -1
  9. package/dist/adapters/gemini.d.ts +55 -0
  10. package/dist/adapters/gemini.d.ts.map +1 -0
  11. package/dist/adapters/gemini.js +318 -0
  12. package/dist/adapters/gemini.js.map +1 -0
  13. package/dist/adapters/grok.d.ts +73 -0
  14. package/dist/adapters/grok.d.ts.map +1 -0
  15. package/dist/adapters/grok.js +430 -0
  16. package/dist/adapters/grok.js.map +1 -0
  17. package/dist/adapters/openai.d.ts +1 -1
  18. package/dist/adapters/openai.d.ts.map +1 -1
  19. package/dist/adapters/openai.js +47 -8
  20. package/dist/adapters/openai.js.map +1 -1
  21. package/dist/auth/claude.d.ts +11 -9
  22. package/dist/auth/claude.d.ts.map +1 -1
  23. package/dist/auth/claude.js +107 -71
  24. package/dist/auth/claude.js.map +1 -1
  25. package/dist/auth/gemini.d.ts +58 -0
  26. package/dist/auth/gemini.d.ts.map +1 -0
  27. package/dist/auth/gemini.js +172 -0
  28. package/dist/auth/gemini.js.map +1 -0
  29. package/dist/auth/grok.d.ts +73 -0
  30. package/dist/auth/grok.d.ts.map +1 -0
  31. package/dist/auth/grok.js +211 -0
  32. package/dist/auth/grok.js.map +1 -0
  33. package/dist/auth/index.d.ts +14 -7
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +41 -6
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/keychain.d.ts +20 -7
  38. package/dist/auth/keychain.d.ts.map +1 -1
  39. package/dist/auth/keychain.js +85 -29
  40. package/dist/auth/keychain.js.map +1 -1
  41. package/dist/auth/openai.d.ts +2 -2
  42. package/dist/auth/openai.d.ts.map +1 -1
  43. package/dist/auth/openai.js +30 -32
  44. package/dist/auth/openai.js.map +1 -1
  45. package/dist/cli/commands/auth.d.ts +1 -1
  46. package/dist/cli/commands/auth.d.ts.map +1 -1
  47. package/dist/cli/commands/auth.js +79 -8
  48. package/dist/cli/commands/auth.js.map +1 -1
  49. package/dist/cli/commands/create.d.ts.map +1 -1
  50. package/dist/cli/commands/create.js +15 -4
  51. package/dist/cli/commands/create.js.map +1 -1
  52. package/dist/cli/interactive.d.ts.map +1 -1
  53. package/dist/cli/interactive.js +1494 -114
  54. package/dist/cli/interactive.js.map +1 -1
  55. package/dist/config/defaults.d.ts +9 -1
  56. package/dist/config/defaults.d.ts.map +1 -1
  57. package/dist/config/defaults.js +19 -2
  58. package/dist/config/defaults.js.map +1 -1
  59. package/dist/config/index.d.ts +19 -0
  60. package/dist/config/index.d.ts.map +1 -1
  61. package/dist/config/index.js +33 -1
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/config/schema.d.ts +47 -0
  64. package/dist/config/schema.d.ts.map +1 -1
  65. package/dist/config/schema.js +29 -1
  66. package/dist/config/schema.js.map +1 -1
  67. package/dist/generators/fullstack.d.ts +32 -0
  68. package/dist/generators/fullstack.d.ts.map +1 -0
  69. package/dist/generators/fullstack.js +497 -0
  70. package/dist/generators/fullstack.js.map +1 -0
  71. package/dist/generators/index.d.ts +4 -3
  72. package/dist/generators/index.d.ts.map +1 -1
  73. package/dist/generators/index.js +15 -1
  74. package/dist/generators/index.js.map +1 -1
  75. package/dist/generators/python.d.ts +17 -1
  76. package/dist/generators/python.d.ts.map +1 -1
  77. package/dist/generators/python.js +34 -20
  78. package/dist/generators/python.js.map +1 -1
  79. package/dist/generators/templates/fullstack.d.ts +113 -0
  80. package/dist/generators/templates/fullstack.d.ts.map +1 -0
  81. package/dist/generators/templates/fullstack.js +1004 -0
  82. package/dist/generators/templates/fullstack.js.map +1 -0
  83. package/dist/generators/typescript.d.ts +19 -1
  84. package/dist/generators/typescript.d.ts.map +1 -1
  85. package/dist/generators/typescript.js +37 -20
  86. package/dist/generators/typescript.js.map +1 -1
  87. package/dist/state/index.d.ts +108 -0
  88. package/dist/state/index.d.ts.map +1 -1
  89. package/dist/state/index.js +551 -4
  90. package/dist/state/index.js.map +1 -1
  91. package/dist/state/registry.d.ts +52 -0
  92. package/dist/state/registry.d.ts.map +1 -0
  93. package/dist/state/registry.js +215 -0
  94. package/dist/state/registry.js.map +1 -0
  95. package/dist/types/cli.d.ts +8 -0
  96. package/dist/types/cli.d.ts.map +1 -1
  97. package/dist/types/cli.js.map +1 -1
  98. package/dist/types/consensus.d.ts +186 -4
  99. package/dist/types/consensus.d.ts.map +1 -1
  100. package/dist/types/consensus.js +35 -3
  101. package/dist/types/consensus.js.map +1 -1
  102. package/dist/types/project.d.ts +76 -0
  103. package/dist/types/project.d.ts.map +1 -1
  104. package/dist/types/project.js +1 -1
  105. package/dist/types/project.js.map +1 -1
  106. package/dist/types/workflow.d.ts +217 -16
  107. package/dist/types/workflow.d.ts.map +1 -1
  108. package/dist/types/workflow.js +40 -1
  109. package/dist/types/workflow.js.map +1 -1
  110. package/dist/workflow/auto-fix.d.ts +45 -0
  111. package/dist/workflow/auto-fix.d.ts.map +1 -0
  112. package/dist/workflow/auto-fix.js +274 -0
  113. package/dist/workflow/auto-fix.js.map +1 -0
  114. package/dist/workflow/consensus.d.ts +70 -2
  115. package/dist/workflow/consensus.d.ts.map +1 -1
  116. package/dist/workflow/consensus.js +872 -17
  117. package/dist/workflow/consensus.js.map +1 -1
  118. package/dist/workflow/execution-mode.d.ts +10 -4
  119. package/dist/workflow/execution-mode.d.ts.map +1 -1
  120. package/dist/workflow/execution-mode.js +547 -58
  121. package/dist/workflow/execution-mode.js.map +1 -1
  122. package/dist/workflow/index.d.ts +14 -2
  123. package/dist/workflow/index.d.ts.map +1 -1
  124. package/dist/workflow/index.js +69 -6
  125. package/dist/workflow/index.js.map +1 -1
  126. package/dist/workflow/milestone-workflow.d.ts +34 -0
  127. package/dist/workflow/milestone-workflow.d.ts.map +1 -0
  128. package/dist/workflow/milestone-workflow.js +414 -0
  129. package/dist/workflow/milestone-workflow.js.map +1 -0
  130. package/dist/workflow/plan-mode.d.ts +80 -3
  131. package/dist/workflow/plan-mode.d.ts.map +1 -1
  132. package/dist/workflow/plan-mode.js +767 -49
  133. package/dist/workflow/plan-mode.js.map +1 -1
  134. package/dist/workflow/plan-storage.d.ts +386 -0
  135. package/dist/workflow/plan-storage.d.ts.map +1 -0
  136. package/dist/workflow/plan-storage.js +878 -0
  137. package/dist/workflow/plan-storage.js.map +1 -0
  138. package/dist/workflow/project-verification.d.ts +37 -0
  139. package/dist/workflow/project-verification.d.ts.map +1 -0
  140. package/dist/workflow/project-verification.js +381 -0
  141. package/dist/workflow/project-verification.js.map +1 -0
  142. package/dist/workflow/task-workflow.d.ts +37 -0
  143. package/dist/workflow/task-workflow.d.ts.map +1 -0
  144. package/dist/workflow/task-workflow.js +386 -0
  145. package/dist/workflow/task-workflow.js.map +1 -0
  146. package/dist/workflow/test-runner.d.ts +9 -0
  147. package/dist/workflow/test-runner.d.ts.map +1 -1
  148. package/dist/workflow/test-runner.js +101 -5
  149. package/dist/workflow/test-runner.js.map +1 -1
  150. package/dist/workflow/ui-designer.d.ts +82 -0
  151. package/dist/workflow/ui-designer.d.ts.map +1 -0
  152. package/dist/workflow/ui-designer.js +234 -0
  153. package/dist/workflow/ui-designer.js.map +1 -0
  154. package/dist/workflow/ui-setup.d.ts +58 -0
  155. package/dist/workflow/ui-setup.d.ts.map +1 -0
  156. package/dist/workflow/ui-setup.js +685 -0
  157. package/dist/workflow/ui-setup.js.map +1 -0
  158. package/dist/workflow/ui-verification.d.ts +114 -0
  159. package/dist/workflow/ui-verification.d.ts.map +1 -0
  160. package/dist/workflow/ui-verification.js +258 -0
  161. package/dist/workflow/ui-verification.js.map +1 -0
  162. package/dist/workflow/workflow-logger.d.ts +110 -0
  163. package/dist/workflow/workflow-logger.d.ts.map +1 -0
  164. package/dist/workflow/workflow-logger.js +267 -0
  165. package/dist/workflow/workflow-logger.js.map +1 -0
  166. package/dist/workflow/workspace-manager.d.ts +342 -0
  167. package/dist/workflow/workspace-manager.d.ts.map +1 -0
  168. package/dist/workflow/workspace-manager.js +733 -0
  169. package/dist/workflow/workspace-manager.js.map +1 -0
  170. package/package.json +2 -2
  171. package/src/adapters/claude.ts +1067 -47
  172. package/src/adapters/gemini.ts +373 -0
  173. package/src/adapters/grok.ts +492 -0
  174. package/src/adapters/openai.ts +48 -9
  175. package/src/auth/claude.ts +120 -78
  176. package/src/auth/gemini.ts +207 -0
  177. package/src/auth/grok.ts +255 -0
  178. package/src/auth/index.ts +47 -9
  179. package/src/auth/keychain.ts +95 -28
  180. package/src/auth/openai.ts +29 -36
  181. package/src/cli/commands/auth.ts +89 -10
  182. package/src/cli/commands/create.ts +13 -4
  183. package/src/cli/interactive.ts +1774 -142
  184. package/src/config/defaults.ts +19 -2
  185. package/src/config/index.ts +36 -1
  186. package/src/config/schema.ts +30 -1
  187. package/src/generators/fullstack.ts +551 -0
  188. package/src/generators/index.ts +25 -1
  189. package/src/generators/python.ts +65 -20
  190. package/src/generators/templates/fullstack.ts +1047 -0
  191. package/src/generators/typescript.ts +69 -20
  192. package/src/state/index.ts +713 -4
  193. package/src/state/registry.ts +278 -0
  194. package/src/types/cli.ts +8 -0
  195. package/src/types/consensus.ts +197 -6
  196. package/src/types/project.ts +82 -1
  197. package/src/types/workflow.ts +90 -1
  198. package/src/workflow/auto-fix.ts +340 -0
  199. package/src/workflow/consensus.ts +1180 -16
  200. package/src/workflow/execution-mode.ts +673 -74
  201. package/src/workflow/index.ts +95 -6
  202. package/src/workflow/milestone-workflow.ts +576 -0
  203. package/src/workflow/plan-mode.ts +924 -50
  204. package/src/workflow/plan-storage.ts +1282 -0
  205. package/src/workflow/project-verification.ts +471 -0
  206. package/src/workflow/task-workflow.ts +528 -0
  207. package/src/workflow/test-runner.ts +120 -5
  208. package/src/workflow/ui-designer.ts +337 -0
  209. package/src/workflow/ui-setup.ts +797 -0
  210. package/src/workflow/ui-verification.ts +357 -0
  211. package/src/workflow/workflow-logger.ts +353 -0
  212. package/src/workflow/workspace-manager.ts +912 -0
  213. package/tests/config/config.test.ts +1 -1
  214. package/tests/types/consensus.test.ts +3 -3
  215. package/tests/workflow/plan-mode.test.ts +213 -0
  216. package/tests/workflow/test-runner.test.ts +5 -3
@@ -0,0 +1,82 @@
1
+ /**
2
+ * UI Designer Module
3
+ * Generates UI design specifications from natural language project ideas
4
+ * Ensures Popeye handles all UI/UX automatically without user intervention
5
+ */
6
+ import { type DesignTheme } from './ui-setup.js';
7
+ /**
8
+ * UI Design Intent - what the user wants their app to look like
9
+ */
10
+ export interface UIDesignIntent {
11
+ /** Overall style preference */
12
+ style: 'modern' | 'elegant' | 'minimal' | 'vibrant' | 'professional' | 'playful';
13
+ /** Target audience */
14
+ audience: 'business' | 'consumer' | 'developer' | 'creative' | 'general';
15
+ /** Industry/domain */
16
+ industry?: string;
17
+ /** Color preferences */
18
+ colorPreference?: 'warm' | 'cool' | 'neutral' | 'colorful' | 'monochrome';
19
+ /** Key UI features needed */
20
+ features: string[];
21
+ /** Accessibility requirements */
22
+ accessibilityLevel: 'A' | 'AA' | 'AAA';
23
+ /** Dark mode support */
24
+ darkMode: boolean;
25
+ /** Mobile-first design */
26
+ mobileFirst: boolean;
27
+ }
28
+ /**
29
+ * Complete UI specification generated by the designer
30
+ */
31
+ export interface UISpecification {
32
+ /** The design intent derived from the idea */
33
+ intent: UIDesignIntent;
34
+ /** Selected theme */
35
+ theme: DesignTheme;
36
+ /** Theme name for reference */
37
+ themeName: string;
38
+ /** Project type detection */
39
+ projectType: string;
40
+ /** Components recommended for this project */
41
+ recommendedComponents: string[];
42
+ /** Layout patterns to use */
43
+ layoutPatterns: string[];
44
+ /** Navigation style */
45
+ navigationStyle: 'sidebar' | 'topbar' | 'bottom-tabs' | 'hybrid';
46
+ /** Key pages to create */
47
+ keyPages: Array<{
48
+ name: string;
49
+ route: string;
50
+ description: string;
51
+ layout: string;
52
+ }>;
53
+ /** Design system notes for code generation */
54
+ designNotes: string;
55
+ }
56
+ /**
57
+ * Analyze the project idea and generate UI design intent
58
+ */
59
+ export declare function analyzeUIIntent(idea: string, onProgress?: (message: string) => void): Promise<UIDesignIntent>;
60
+ /**
61
+ * Generate complete UI specification from intent
62
+ */
63
+ export declare function generateUISpecification(idea: string, intent: UIDesignIntent, onProgress?: (message: string) => void): Promise<UISpecification>;
64
+ /**
65
+ * Generate design system prompt for code generation
66
+ * This is injected into Claude's context when generating UI code
67
+ */
68
+ export declare function generateDesignSystemPrompt(spec: UISpecification): string;
69
+ /**
70
+ * Main function: Design UI from idea
71
+ * Call this early in the Popeye workflow to establish UI direction
72
+ */
73
+ export declare function designUI(idea: string, onProgress?: (message: string) => void): Promise<UISpecification>;
74
+ /**
75
+ * Save UI specification to project
76
+ */
77
+ export declare function saveUISpecification(projectDir: string, spec: UISpecification): Promise<void>;
78
+ /**
79
+ * Load UI specification from project
80
+ */
81
+ export declare function loadUISpecification(projectDir: string): Promise<UISpecification | null>;
82
+ //# sourceMappingURL=ui-designer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-designer.d.ts","sourceRoot":"","sources":["../../src/workflow/ui-designer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;IAEjF,sBAAsB;IACtB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IAEzE,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IAE1E,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,iCAAiC;IACjC,kBAAkB,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;IAEvC,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;IAElB,0BAA0B;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,MAAM,EAAE,cAAc,CAAC;IAEvB,qBAAqB;IACrB,KAAK,EAAE,WAAW,CAAC;IAEnB,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAElB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IAEpB,8CAA8C;IAC9C,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAEhC,6BAA6B;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,uBAAuB;IACvB,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC;IAEjE,0BAA0B;IAC1B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IAEH,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,cAAc,CAAC,CAmDzB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,eAAe,CAAC,CAgG1B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAuCxE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,eAAe,CAAC,CAY1B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWjC"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * UI Designer Module
3
+ * Generates UI design specifications from natural language project ideas
4
+ * Ensures Popeye handles all UI/UX automatically without user intervention
5
+ */
6
+ import { generateCode } from '../adapters/claude.js';
7
+ import { THEMES, detectProjectType } from './ui-setup.js';
8
+ /**
9
+ * Analyze the project idea and generate UI design intent
10
+ */
11
+ export async function analyzeUIIntent(idea, onProgress) {
12
+ onProgress?.('Analyzing project idea for UI intent...');
13
+ const prompt = `Analyze this project idea and determine the UI design intent. Return ONLY a JSON object (no markdown, no explanation).
14
+
15
+ Project Idea: "${idea}"
16
+
17
+ Return JSON with this exact structure:
18
+ {
19
+ "style": "modern" | "elegant" | "minimal" | "vibrant" | "professional" | "playful",
20
+ "audience": "business" | "consumer" | "developer" | "creative" | "general",
21
+ "industry": "string or null",
22
+ "colorPreference": "warm" | "cool" | "neutral" | "colorful" | "monochrome",
23
+ "features": ["list of UI features needed like forms, tables, charts, cards, etc"],
24
+ "accessibilityLevel": "AA",
25
+ "darkMode": true or false,
26
+ "mobileFirst": true or false
27
+ }
28
+
29
+ Consider:
30
+ - Who will use this app (business users need clean/professional, consumers want modern/friendly)
31
+ - What type of data/content will be displayed
32
+ - What interactions are needed
33
+ - The overall mood/tone of the application`;
34
+ try {
35
+ const result = await generateCode(prompt, '');
36
+ if (result.success && result.response) {
37
+ // Parse the JSON response
38
+ const jsonMatch = result.response.match(/\{[\s\S]*\}/);
39
+ if (jsonMatch) {
40
+ const intent = JSON.parse(jsonMatch[0]);
41
+ onProgress?.(`UI Intent: ${intent.style} style for ${intent.audience} audience`);
42
+ return intent;
43
+ }
44
+ }
45
+ }
46
+ catch {
47
+ onProgress?.('Using default UI intent (analysis failed)');
48
+ }
49
+ // Default intent if analysis fails
50
+ return {
51
+ style: 'modern',
52
+ audience: 'general',
53
+ colorPreference: 'cool',
54
+ features: ['cards', 'forms', 'buttons', 'navigation'],
55
+ accessibilityLevel: 'AA',
56
+ darkMode: true,
57
+ mobileFirst: true,
58
+ };
59
+ }
60
+ /**
61
+ * Generate complete UI specification from intent
62
+ */
63
+ export async function generateUISpecification(idea, intent, onProgress) {
64
+ onProgress?.('Generating UI specification...');
65
+ // Select theme based on intent
66
+ let themeName;
67
+ switch (intent.style) {
68
+ case 'elegant':
69
+ case 'professional':
70
+ themeName = 'elegant';
71
+ break;
72
+ case 'minimal':
73
+ themeName = 'minimal';
74
+ break;
75
+ case 'vibrant':
76
+ case 'playful':
77
+ themeName = 'vibrant';
78
+ break;
79
+ default:
80
+ themeName = 'modern';
81
+ }
82
+ // Override based on audience if style is generic
83
+ if (intent.style === 'professional' && intent.audience === 'business') {
84
+ themeName = 'minimal';
85
+ }
86
+ const theme = THEMES[themeName];
87
+ const projectType = detectProjectType(idea);
88
+ onProgress?.(`Selected theme: ${theme.name}`);
89
+ onProgress?.(`Project type: ${projectType}`);
90
+ // Generate detailed specification using Claude
91
+ const prompt = `Generate a UI specification for this project. Return ONLY a JSON object (no markdown).
92
+
93
+ Project Idea: "${idea}"
94
+ Style: ${intent.style}
95
+ Audience: ${intent.audience}
96
+ Project Type: ${projectType}
97
+
98
+ Return JSON:
99
+ {
100
+ "recommendedComponents": ["list of shadcn/ui components needed"],
101
+ "layoutPatterns": ["grid", "flex", "etc"],
102
+ "navigationStyle": "sidebar" | "topbar" | "bottom-tabs" | "hybrid",
103
+ "keyPages": [
104
+ {
105
+ "name": "Page Name",
106
+ "route": "/route",
107
+ "description": "What this page does",
108
+ "layout": "dashboard" | "form" | "list" | "detail" | "kanban" | "landing"
109
+ }
110
+ ],
111
+ "designNotes": "Brief notes for consistent design (colors, spacing, component usage)"
112
+ }`;
113
+ try {
114
+ const result = await generateCode(prompt, '');
115
+ if (result.success && result.response) {
116
+ const jsonMatch = result.response.match(/\{[\s\S]*\}/);
117
+ if (jsonMatch) {
118
+ const spec = JSON.parse(jsonMatch[0]);
119
+ return {
120
+ intent,
121
+ theme,
122
+ themeName,
123
+ projectType,
124
+ recommendedComponents: spec.recommendedComponents || [],
125
+ layoutPatterns: spec.layoutPatterns || ['flex', 'grid'],
126
+ navigationStyle: spec.navigationStyle || 'sidebar',
127
+ keyPages: spec.keyPages || [],
128
+ designNotes: spec.designNotes || '',
129
+ };
130
+ }
131
+ }
132
+ }
133
+ catch {
134
+ onProgress?.('Using default specification (generation failed)');
135
+ }
136
+ // Default specification
137
+ return {
138
+ intent,
139
+ theme,
140
+ themeName,
141
+ projectType,
142
+ recommendedComponents: ['button', 'card', 'input', 'dialog', 'dropdown-menu', 'avatar', 'badge'],
143
+ layoutPatterns: ['flex', 'grid'],
144
+ navigationStyle: 'sidebar',
145
+ keyPages: [
146
+ { name: 'Dashboard', route: '/', description: 'Main dashboard', layout: 'dashboard' },
147
+ { name: 'Settings', route: '/settings', description: 'User settings', layout: 'form' },
148
+ ],
149
+ designNotes: `Use ${theme.name} theme consistently. Maintain ${intent.style} aesthetic throughout.`,
150
+ };
151
+ }
152
+ /**
153
+ * Generate design system prompt for code generation
154
+ * This is injected into Claude's context when generating UI code
155
+ */
156
+ export function generateDesignSystemPrompt(spec) {
157
+ return `
158
+ ## UI Design System
159
+
160
+ You are generating code for a ${spec.intent.style} ${spec.projectType} application.
161
+
162
+ ### Theme: ${spec.theme.name}
163
+ - Primary color: hsl(${spec.theme.colors.primary})
164
+ - Border radius: ${spec.theme.borderRadius}
165
+ - Font: ${spec.theme.fontFamily}
166
+
167
+ ### Components to Use
168
+ Always use these shadcn/ui components (from @/components/ui/):
169
+ ${spec.recommendedComponents.map(c => `- ${c}`).join('\n')}
170
+
171
+ ### Layout Patterns
172
+ ${spec.layoutPatterns.map(p => `- ${p}`).join('\n')}
173
+
174
+ ### Navigation
175
+ Use ${spec.navigationStyle} navigation pattern.
176
+
177
+ ### Accessibility
178
+ - Target WCAG ${spec.intent.accessibilityLevel} compliance
179
+ - All interactive elements must be keyboard accessible
180
+ - Use semantic HTML elements
181
+ - Include proper ARIA labels
182
+
183
+ ### Mobile Responsiveness
184
+ ${spec.intent.mobileFirst ? 'Design mobile-first, then scale up for larger screens.' : 'Design for desktop, with responsive adjustments for mobile.'}
185
+
186
+ ### Dark Mode
187
+ ${spec.intent.darkMode ? 'Support dark mode with class-based toggling.' : 'Light mode only.'}
188
+
189
+ ### Design Notes
190
+ ${spec.designNotes}
191
+
192
+ ### Key Pages
193
+ ${spec.keyPages.map(p => `- ${p.name} (${p.route}): ${p.description} - Use ${p.layout} layout`).join('\n')}
194
+ `;
195
+ }
196
+ /**
197
+ * Main function: Design UI from idea
198
+ * Call this early in the Popeye workflow to establish UI direction
199
+ */
200
+ export async function designUI(idea, onProgress) {
201
+ onProgress?.('Starting UI design process...');
202
+ // Step 1: Analyze the idea to understand intent
203
+ const intent = await analyzeUIIntent(idea, onProgress);
204
+ // Step 2: Generate complete specification
205
+ const spec = await generateUISpecification(idea, intent, onProgress);
206
+ onProgress?.(`UI design complete: ${spec.theme.name} theme with ${spec.recommendedComponents.length} components`);
207
+ return spec;
208
+ }
209
+ /**
210
+ * Save UI specification to project
211
+ */
212
+ export async function saveUISpecification(projectDir, spec) {
213
+ const { promises: fs } = await import('node:fs');
214
+ const path = await import('node:path');
215
+ const specPath = path.join(projectDir, '.popeye', 'ui-spec.json');
216
+ await fs.mkdir(path.dirname(specPath), { recursive: true });
217
+ await fs.writeFile(specPath, JSON.stringify(spec, null, 2));
218
+ }
219
+ /**
220
+ * Load UI specification from project
221
+ */
222
+ export async function loadUISpecification(projectDir) {
223
+ const { promises: fs } = await import('node:fs');
224
+ const path = await import('node:path');
225
+ try {
226
+ const specPath = path.join(projectDir, '.popeye', 'ui-spec.json');
227
+ const content = await fs.readFile(specPath, 'utf-8');
228
+ return JSON.parse(content);
229
+ }
230
+ catch {
231
+ return null;
232
+ }
233
+ }
234
+ //# sourceMappingURL=ui-designer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-designer.js","sourceRoot":"","sources":["../../src/workflow/ui-designer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
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
+ /**
7
+ * Design theme configuration
8
+ */
9
+ export interface DesignTheme {
10
+ name: string;
11
+ colors: {
12
+ primary: string;
13
+ primaryForeground: string;
14
+ secondary: string;
15
+ secondaryForeground: string;
16
+ accent: string;
17
+ accentForeground: string;
18
+ background: string;
19
+ foreground: string;
20
+ card: string;
21
+ cardForeground: string;
22
+ muted: string;
23
+ mutedForeground: string;
24
+ destructive: string;
25
+ destructiveForeground: string;
26
+ border: string;
27
+ input: string;
28
+ ring: string;
29
+ };
30
+ borderRadius: string;
31
+ fontFamily: string;
32
+ }
33
+ /**
34
+ * Pre-defined professional themes
35
+ */
36
+ export declare const THEMES: Record<string, DesignTheme>;
37
+ /**
38
+ * UI Setup result
39
+ */
40
+ export interface UISetupResult {
41
+ success: boolean;
42
+ theme: string;
43
+ componentsInstalled: string[];
44
+ error?: string;
45
+ }
46
+ /**
47
+ * Detect project type from idea/specification
48
+ */
49
+ export declare function detectProjectType(idea: string): string;
50
+ /**
51
+ * Setup complete UI system for a project
52
+ */
53
+ export declare function setupUI(projectDir: string, options?: {
54
+ theme?: string;
55
+ projectType?: string;
56
+ idea?: string;
57
+ }, onProgress?: (message: string) => void): Promise<UISetupResult>;
58
+ //# sourceMappingURL=ui-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-setup.d.ts","sourceRoot":"","sources":["../../src/workflow/ui-setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiG9C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8OD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACV,EACN,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,aAAa,CAAC,CAqJxB"}