stitch-forge 0.3.1

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 (145) hide show
  1. package/.claude/skills/forge-build/SKILL.md +79 -0
  2. package/.claude/skills/forge-design/SKILL.md +64 -0
  3. package/.claude/skills/forge-discover/SKILL.md +139 -0
  4. package/.claude/skills/forge-generate/SKILL.md +77 -0
  5. package/.claude/skills/forge-preview/SKILL.md +26 -0
  6. package/.claude/skills/forge-research/SKILL.md +42 -0
  7. package/.claude/skills/forge-sync/SKILL.md +45 -0
  8. package/DESIGN.md +113 -0
  9. package/LICENSE +21 -0
  10. package/README.es.md +242 -0
  11. package/README.md +242 -0
  12. package/dist/adapters/astro.d.ts +8 -0
  13. package/dist/adapters/astro.js +24 -0
  14. package/dist/adapters/astro.js.map +1 -0
  15. package/dist/adapters/index.d.ts +3 -0
  16. package/dist/adapters/index.js +9 -0
  17. package/dist/adapters/index.js.map +1 -0
  18. package/dist/adapters/nextjs.d.ts +7 -0
  19. package/dist/adapters/nextjs.js +136 -0
  20. package/dist/adapters/nextjs.js.map +1 -0
  21. package/dist/adapters/static.d.ts +7 -0
  22. package/dist/adapters/static.js +43 -0
  23. package/dist/adapters/static.js.map +1 -0
  24. package/dist/adapters/types.d.ts +22 -0
  25. package/dist/adapters/types.js +6 -0
  26. package/dist/adapters/types.js.map +1 -0
  27. package/dist/commands/build.d.ts +7 -0
  28. package/dist/commands/build.js +98 -0
  29. package/dist/commands/build.js.map +1 -0
  30. package/dist/commands/design.d.ts +3 -0
  31. package/dist/commands/design.js +39 -0
  32. package/dist/commands/design.js.map +1 -0
  33. package/dist/commands/discover.d.ts +9 -0
  34. package/dist/commands/discover.js +91 -0
  35. package/dist/commands/discover.js.map +1 -0
  36. package/dist/commands/generate.d.ts +7 -0
  37. package/dist/commands/generate.js +105 -0
  38. package/dist/commands/generate.js.map +1 -0
  39. package/dist/commands/init.d.ts +1 -0
  40. package/dist/commands/init.js +99 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/preview.d.ts +5 -0
  43. package/dist/commands/preview.js +41 -0
  44. package/dist/commands/preview.js.map +1 -0
  45. package/dist/commands/research.d.ts +1 -0
  46. package/dist/commands/research.js +38 -0
  47. package/dist/commands/research.js.map +1 -0
  48. package/dist/commands/sync.d.ts +1 -0
  49. package/dist/commands/sync.js +53 -0
  50. package/dist/commands/sync.js.map +1 -0
  51. package/dist/commands/workflow.d.ts +1 -0
  52. package/dist/commands/workflow.js +38 -0
  53. package/dist/commands/workflow.js.map +1 -0
  54. package/dist/index.d.ts +2 -0
  55. package/dist/index.js +113 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/mcp/auth.d.ts +15 -0
  58. package/dist/mcp/auth.js +56 -0
  59. package/dist/mcp/auth.js.map +1 -0
  60. package/dist/mcp/client.d.ts +65 -0
  61. package/dist/mcp/client.js +302 -0
  62. package/dist/mcp/client.js.map +1 -0
  63. package/dist/mcp/tools.d.ts +26 -0
  64. package/dist/mcp/tools.js +46 -0
  65. package/dist/mcp/tools.js.map +1 -0
  66. package/dist/research/business-researcher.d.ts +41 -0
  67. package/dist/research/business-researcher.js +888 -0
  68. package/dist/research/business-researcher.js.map +1 -0
  69. package/dist/research/crawler.d.ts +11 -0
  70. package/dist/research/crawler.js +56 -0
  71. package/dist/research/crawler.js.map +1 -0
  72. package/dist/research/design-synthesizer.d.ts +46 -0
  73. package/dist/research/design-synthesizer.js +628 -0
  74. package/dist/research/design-synthesizer.js.map +1 -0
  75. package/dist/research/differ.d.ts +19 -0
  76. package/dist/research/differ.js +58 -0
  77. package/dist/research/differ.js.map +1 -0
  78. package/dist/research/known-state.json +68 -0
  79. package/dist/research/research-cache.d.ts +6 -0
  80. package/dist/research/research-cache.js +62 -0
  81. package/dist/research/research-cache.js.map +1 -0
  82. package/dist/research/types.d.ts +98 -0
  83. package/dist/research/types.js +6 -0
  84. package/dist/research/types.js.map +1 -0
  85. package/dist/research/updater.d.ts +5 -0
  86. package/dist/research/updater.js +43 -0
  87. package/dist/research/updater.js.map +1 -0
  88. package/dist/templates/design-md.d.ts +52 -0
  89. package/dist/templates/design-md.js +315 -0
  90. package/dist/templates/design-md.js.map +1 -0
  91. package/dist/templates/prompts.d.ts +31 -0
  92. package/dist/templates/prompts.js +39 -0
  93. package/dist/templates/prompts.js.map +1 -0
  94. package/dist/templates/workflows.d.ts +9 -0
  95. package/dist/templates/workflows.js +21 -0
  96. package/dist/templates/workflows.js.map +1 -0
  97. package/dist/tui/App.d.ts +1 -0
  98. package/dist/tui/App.js +87 -0
  99. package/dist/tui/App.js.map +1 -0
  100. package/dist/tui/Dashboard.d.ts +5 -0
  101. package/dist/tui/Dashboard.js +23 -0
  102. package/dist/tui/Dashboard.js.map +1 -0
  103. package/dist/tui/DesignEditor.d.ts +6 -0
  104. package/dist/tui/DesignEditor.js +76 -0
  105. package/dist/tui/DesignEditor.js.map +1 -0
  106. package/dist/tui/PromptBuilder.d.ts +5 -0
  107. package/dist/tui/PromptBuilder.js +102 -0
  108. package/dist/tui/PromptBuilder.js.map +1 -0
  109. package/dist/tui/components/QuotaMeter.d.ts +8 -0
  110. package/dist/tui/components/QuotaMeter.js +10 -0
  111. package/dist/tui/components/QuotaMeter.js.map +1 -0
  112. package/dist/tui/components/ScreenCard.d.ts +7 -0
  113. package/dist/tui/components/ScreenCard.js +6 -0
  114. package/dist/tui/components/ScreenCard.js.map +1 -0
  115. package/dist/tui/components/Spinner.d.ts +5 -0
  116. package/dist/tui/components/Spinner.js +7 -0
  117. package/dist/tui/components/Spinner.js.map +1 -0
  118. package/dist/tui/components/StatusBar.d.ts +7 -0
  119. package/dist/tui/components/StatusBar.js +6 -0
  120. package/dist/tui/components/StatusBar.js.map +1 -0
  121. package/dist/utils/config.d.ts +26 -0
  122. package/dist/utils/config.js +66 -0
  123. package/dist/utils/config.js.map +1 -0
  124. package/dist/utils/design-validator.d.ts +44 -0
  125. package/dist/utils/design-validator.js +396 -0
  126. package/dist/utils/design-validator.js.map +1 -0
  127. package/dist/utils/logger.d.ts +8 -0
  128. package/dist/utils/logger.js +10 -0
  129. package/dist/utils/logger.js.map +1 -0
  130. package/dist/utils/output-validator.d.ts +18 -0
  131. package/dist/utils/output-validator.js +194 -0
  132. package/dist/utils/output-validator.js.map +1 -0
  133. package/dist/utils/preview.d.ts +4 -0
  134. package/dist/utils/preview.js +49 -0
  135. package/dist/utils/preview.js.map +1 -0
  136. package/dist/utils/prompt-enhancer.d.ts +21 -0
  137. package/dist/utils/prompt-enhancer.js +104 -0
  138. package/dist/utils/prompt-enhancer.js.map +1 -0
  139. package/dist/utils/quota.d.ts +18 -0
  140. package/dist/utils/quota.js +49 -0
  141. package/dist/utils/quota.js.map +1 -0
  142. package/dist/utils/validators.d.ts +125 -0
  143. package/dist/utils/validators.js +110 -0
  144. package/dist/utils/validators.js.map +1 -0
  145. package/package.json +77 -0
@@ -0,0 +1,315 @@
1
+ export const INDUSTRY_PALETTES = {
2
+ retail: { primary: { name: 'Retail Red', hex: '#DC0C0C' }, secondary: { name: 'Value Gold', hex: '#F5B800' } },
3
+ grocery: { primary: { name: 'Fresh Green', hex: '#2D8F4E' }, secondary: { name: 'Harvest Orange', hex: '#E87B35' } },
4
+ discount: { primary: { name: 'Bold Red', hex: '#CC1100' }, secondary: { name: 'Savings Yellow', hex: '#FFBF00' } },
5
+ fintech: { primary: { name: 'Trust Navy', hex: '#0F2B5B' }, secondary: { name: 'Signal Blue', hex: '#2563EB' } },
6
+ saas: { primary: { name: 'Product Blue', hex: '#1E40AF' }, secondary: { name: 'Action Indigo', hex: '#6366F1' } },
7
+ healthcare: { primary: { name: 'Medical Teal', hex: '#0D7377' }, secondary: { name: 'Care Blue', hex: '#38BDF8' } },
8
+ wellness: { primary: { name: 'Sage', hex: '#6B8F5E' }, secondary: { name: 'Terracotta', hex: '#C4704B' } },
9
+ education: { primary: { name: 'Academic Blue', hex: '#1E3A8A' }, secondary: { name: 'Knowledge Amber', hex: '#D97706' } },
10
+ food: { primary: { name: 'Appetite Red', hex: '#B91C1C' }, secondary: { name: 'Warm Spice', hex: '#D97706' }, accent: { name: 'Fresh Herb', hex: '#16A34A' } },
11
+ fashion: { primary: { name: 'Noir', hex: '#1A1A1A' }, secondary: { name: 'Rose Gold', hex: '#C4917B' } },
12
+ technology: { primary: { name: 'Deep Slate', hex: '#1E293B' }, secondary: { name: 'Electric Cyan', hex: '#06B6D4' } },
13
+ realestate: { primary: { name: 'Estate Green', hex: '#1B4332' }, secondary: { name: 'Copper', hex: '#B87333' } },
14
+ legal: { primary: { name: 'Barrister Navy', hex: '#1E2D4F' }, secondary: { name: 'Parchment Gold', hex: '#B8860B' } },
15
+ nonprofit: { primary: { name: 'Purpose Teal', hex: '#0F766E' }, secondary: { name: 'Heart Coral', hex: '#F97066' } },
16
+ };
17
+ export function matchIndustry(industry) {
18
+ const lower = industry.toLowerCase();
19
+ for (const [key, palette] of Object.entries(INDUSTRY_PALETTES)) {
20
+ if (lower.includes(key))
21
+ return palette;
22
+ }
23
+ // Fuzzy matches
24
+ if (/tienda|store|shop|mercado|supermarket|supermercado|despensa/.test(lower))
25
+ return INDUSTRY_PALETTES.retail;
26
+ if (/descuento|discount|hard.?discount|barato|ahorro|budget/.test(lower))
27
+ return INDUSTRY_PALETTES.discount;
28
+ if (/banco|bank|pago|payment|dinero|money|crypto|finanza/.test(lower))
29
+ return INDUSTRY_PALETTES.fintech;
30
+ if (/salud|health|medic|clinic|hospital|doctor|pharma/.test(lower))
31
+ return INDUSTRY_PALETTES.healthcare;
32
+ if (/comida|restauran|café|coffee|bakery|panader/.test(lower))
33
+ return INDUSTRY_PALETTES.food;
34
+ if (/escuela|school|university|academia|curso|learn|educa/.test(lower))
35
+ return INDUSTRY_PALETTES.education;
36
+ if (/ropa|cloth|moda|apparel|boutique|luxury/.test(lower))
37
+ return INDUSTRY_PALETTES.fashion;
38
+ if (/software|app|plataforma|platform|tech|digital|ai|cloud/.test(lower))
39
+ return INDUSTRY_PALETTES.technology;
40
+ if (/inmobili|property|real.?estate|bienes.?raices/.test(lower))
41
+ return INDUSTRY_PALETTES.realestate;
42
+ if (/yoga|spa|bienestar|organic|natural/.test(lower))
43
+ return INDUSTRY_PALETTES.wellness;
44
+ if (/ong|fundaci|caridad|charity|social.?impact/.test(lower))
45
+ return INDUSTRY_PALETTES.nonprofit;
46
+ if (/abogad|lawyer|legal|notari|juridi/.test(lower))
47
+ return INDUSTRY_PALETTES.legal;
48
+ return INDUSTRY_PALETTES.saas; // default for unrecognized
49
+ }
50
+ export const AESTHETIC_MODIFIERS = {
51
+ bold: {
52
+ surface: { name: 'Soft White', hex: '#FAFAF8' },
53
+ onSurface: { name: 'Charcoal', hex: '#2D2D2D' },
54
+ muted: { name: 'Warm Gray', hex: '#E8E6E1' },
55
+ headingFont: '"Space Grotesk", sans-serif',
56
+ bodyFont: '"Libre Franklin", sans-serif',
57
+ monoFont: '"JetBrains Mono", monospace',
58
+ iconStyle: 'Lucide icons, 24px default, 2px stroke, solid style',
59
+ borderRadius: '6px buttons, 8px cards, 4px badges',
60
+ shadowStyle: 'Hard shadow: 4px 4px 0px On-Surface for emphasis, subtle elevation elsewhere',
61
+ },
62
+ elegant: {
63
+ surface: { name: 'Pearl', hex: '#F8F6F0' },
64
+ onSurface: { name: 'Deep Charcoal', hex: '#2B2B2B' },
65
+ muted: { name: 'Oyster', hex: '#E5E0D8' },
66
+ headingFont: '"DM Serif Display", serif',
67
+ bodyFont: '"Source Sans 3", sans-serif',
68
+ monoFont: '"IBM Plex Mono", monospace',
69
+ iconStyle: 'Lucide icons, 20px default, 1.5px stroke, outline style',
70
+ borderRadius: '4px buttons, 8px cards, 2px badges',
71
+ shadowStyle: 'Subtle: 0 1px 3px rgba(0,0,0,0.08), larger on hover',
72
+ },
73
+ warm: {
74
+ surface: { name: 'Cream', hex: '#FDF8F0' },
75
+ onSurface: { name: 'Espresso', hex: '#3B2F2F' },
76
+ muted: { name: 'Sand', hex: '#EDE5D8' },
77
+ headingFont: '"Outfit", sans-serif',
78
+ bodyFont: '"Instrument Sans", sans-serif',
79
+ monoFont: '"JetBrains Mono", monospace',
80
+ iconStyle: 'Phosphor icons, 24px default, regular weight, duotone style',
81
+ borderRadius: '8px buttons, 12px cards, 20px badges',
82
+ shadowStyle: 'Warm: 0 4px 12px rgba(59,47,47,0.06)',
83
+ },
84
+ playful: {
85
+ surface: { name: 'Snow', hex: '#FAFBFC' },
86
+ onSurface: { name: 'Ink', hex: '#1E1E2E' },
87
+ muted: { name: 'Lavender Mist', hex: '#EDE9FE' },
88
+ headingFont: '"Sora", sans-serif',
89
+ bodyFont: '"Nunito Sans", sans-serif',
90
+ monoFont: '"Fira Code", monospace',
91
+ iconStyle: 'Phosphor icons, 24px default, bold weight, filled style',
92
+ borderRadius: '12px buttons, 16px cards, 100px badges (pill)',
93
+ shadowStyle: 'Colorful: 0 4px 14px rgba(124,58,237,0.10)',
94
+ },
95
+ minimal: {
96
+ surface: { name: 'White', hex: '#FFFFFF' },
97
+ onSurface: { name: 'Slate', hex: '#334155' },
98
+ muted: { name: 'Cool Gray', hex: '#F1F5F9' },
99
+ headingFont: '"Instrument Serif", serif',
100
+ bodyFont: '"Geist", sans-serif',
101
+ monoFont: '"Geist Mono", monospace',
102
+ iconStyle: 'Lucide icons, 20px default, 1.5px stroke, outline style',
103
+ borderRadius: '4px buttons, 6px cards, 2px badges',
104
+ shadowStyle: 'None by default, 0 1px 2px rgba(0,0,0,0.05) on hover',
105
+ },
106
+ confident: {
107
+ surface: { name: 'Clean White', hex: '#FFFFFF' },
108
+ onSurface: { name: 'Dark Graphite', hex: '#333333' },
109
+ muted: { name: 'Soft Gray', hex: '#F4F4F5' },
110
+ headingFont: '"DM Sans", sans-serif',
111
+ bodyFont: '"Nunito Sans", sans-serif',
112
+ monoFont: '"JetBrains Mono", monospace',
113
+ iconStyle: 'Heroicons outline, 20px default, 1.5px stroke',
114
+ borderRadius: '6px buttons, 8px cards, 4px badges',
115
+ shadowStyle: '0 2px 8px rgba(0,0,0,0.06), lift on hover',
116
+ },
117
+ };
118
+ export function matchAesthetic(aesthetic) {
119
+ const lower = aesthetic.toLowerCase();
120
+ if (/bold|industrial|strong|powerful|edgy|striking/.test(lower))
121
+ return AESTHETIC_MODIFIERS.bold;
122
+ if (/elegant|premium|luxury|corporate|formal|sophisticated/.test(lower))
123
+ return AESTHETIC_MODIFIERS.elegant;
124
+ if (/warm|organic|natural|earthy|cozy|friendly|welcoming/.test(lower))
125
+ return AESTHETIC_MODIFIERS.warm;
126
+ if (/playful|vibrant|fun|creative|colorful|energetic|bright/.test(lower))
127
+ return AESTHETIC_MODIFIERS.playful;
128
+ if (/minimal|clean|simple|understated|quiet|sparse/.test(lower))
129
+ return AESTHETIC_MODIFIERS.minimal;
130
+ if (/confident|modern|trustworthy|reliable|accessible|smart/.test(lower))
131
+ return AESTHETIC_MODIFIERS.confident;
132
+ return AESTHETIC_MODIFIERS.confident;
133
+ }
134
+ // ─── Audience-aware imagery ─────────────────────────────────────────
135
+ export function generateImageryGuidelines(industry, audience) {
136
+ const lower = `${industry} ${audience}`.toLowerCase();
137
+ if (/famili|familia|hogar|casa|home|parent|madre|padre/.test(lower))
138
+ return 'Warm lifestyle photography of real families — shopping, cooking, sharing meals together. Natural indoor lighting, authentic (not staged). Product photography on clean backgrounds. Hero images: wide 16:9 with people, not just products.';
139
+ if (/developer|engineer|cto|technical|programm/.test(lower))
140
+ return 'Clean product screenshots, code editor views, terminal interfaces. Technical diagrams with brand colors. Abstract geometric patterns for backgrounds. Developer-friendly, no corporate stock photos.';
141
+ if (/executive|cfo|ceo|director|manager|enterprise/.test(lower))
142
+ return 'Professional editorial photography, conference rooms, skyline views. Data visualization graphics. Polished headshots. Muted tones, sharp focus, 16:9 hero, 3:4 portraits.';
143
+ if (/joven|young|student|millennial|gen.?z|teen|creativ/.test(lower))
144
+ return 'Dynamic, candid photography with saturated colors. User-generated content style. Bold compositions, unusual angles. 1:1 for social, 16:9 for hero, 9:16 for mobile stories.';
145
+ if (/salud|health|patient|wellness|bienestar/.test(lower))
146
+ return 'Calming photography with natural light and soft focus. Real people in wellness settings. Green and white dominant imagery. Avoid clinical/sterile aesthetics.';
147
+ if (/investor|financ|dinero|ahorro|saving/.test(lower))
148
+ return 'Clean data visualizations, growth charts, abstract financial patterns. Professional but approachable. Avoid cliché money/coin imagery.';
149
+ return 'Professional photography that reflects the target audience authentically. 16:9 hero images, 4:3 feature images, 1:1 team/product shots. Natural lighting preferred. Avoid generic stock photography.';
150
+ }
151
+ // ─── Industry-specific Do's and Don'ts ──────────────────────────────
152
+ export function generateDosAndDonts(industry, audience) {
153
+ const baseDos = [
154
+ 'Use consistent spacing from the scale',
155
+ 'Maintain high contrast (4.5:1 minimum) for text readability',
156
+ 'Use Primary color sparingly — reserve for CTAs and key emphasis',
157
+ 'Use asymmetric or non-standard layouts for at least one section',
158
+ 'Vary card sizes and spacing to create visual rhythm',
159
+ 'Vary section backgrounds (alternate between Surface and Muted)',
160
+ ];
161
+ const baseDonts = [
162
+ "Don't use Inter, Poppins, or system sans-serif as the primary font",
163
+ "Don't use purple-to-blue gradients anywhere",
164
+ "Don't use uniform border-radius (>12px) on all elements",
165
+ "Don't use standard three-column icon grids as the second page section",
166
+ "Don't use generic stock illustrations (3D blobs, abstract shapes)",
167
+ "Don't center-align body text longer than 2 lines",
168
+ ];
169
+ const lower = `${industry} ${audience}`.toLowerCase();
170
+ const extraDos = [];
171
+ const extraDonts = [];
172
+ // Retail / discount specific
173
+ if (/retail|tienda|store|shop|discount|descuento|supermercado|grocery|despensa/.test(lower)) {
174
+ extraDos.push('Show prices prominently in every product display');
175
+ extraDos.push('Use real product photography, never illustrations for products');
176
+ extraDos.push('Show concrete savings amounts (pesos, not percentages)');
177
+ extraDonts.push("Don't make it look cheap — maintain a confident, trustworthy tone throughout");
178
+ extraDonts.push("Don't use dark backgrounds for main content areas");
179
+ extraDonts.push("Don't hide pricing behind clicks — visibility builds trust");
180
+ }
181
+ // Fintech / financial
182
+ if (/fintech|bank|financ|payment|pago|crypto/.test(lower)) {
183
+ extraDos.push('Use data visualizations and charts to show growth/savings');
184
+ extraDos.push('Include security trust signals (badges, certifications)');
185
+ extraDonts.push("Don't use playful or casual language for financial data");
186
+ extraDonts.push("Don't use red for positive financial metrics (red = loss in finance)");
187
+ }
188
+ // SaaS / technology (exclude retail/grocery matches)
189
+ if (/saas|software|platform|app\b|cloud|ai\b/.test(lower) && !/retail|tienda|store|grocery|supermercado/.test(lower)) {
190
+ extraDos.push('Include code examples or API references where relevant');
191
+ extraDos.push('Show product screenshots with realistic data, not lorem ipsum');
192
+ extraDonts.push("Don't use marketing jargon without substance ('revolutionize', 'seamless')");
193
+ extraDonts.push("Don't show empty-state UIs in marketing screenshots");
194
+ }
195
+ // Mexican / Latin American market
196
+ if (/mexican|mexico|méxico|latin|familia|barrio/.test(lower)) {
197
+ extraDos.push('Use Spanish-language copy that feels natural, not translated');
198
+ extraDos.push('Reflect local culture authentically — avoid stereotypes');
199
+ extraDonts.push("Don't use American/European stock photography for Mexican audiences");
200
+ extraDonts.push("Don't use English text in customer-facing UI elements");
201
+ }
202
+ // Healthcare / wellness
203
+ if (/health|salud|wellness|bienestar|medic|clinic/.test(lower)) {
204
+ extraDos.push('Use calming color tones and generous whitespace');
205
+ extraDos.push('Ensure WCAG AAA compliance for critical health information');
206
+ extraDonts.push("Don't use aggressive CTAs or urgency tactics for health content");
207
+ }
208
+ // Education
209
+ if (/educa|school|escuela|university|learn|curso|academy/.test(lower)) {
210
+ extraDos.push('Use clear visual hierarchy for learning paths and course structure');
211
+ extraDos.push('Include progress indicators and achievement elements');
212
+ extraDonts.push("Don't make navigation complex — students need clear paths");
213
+ }
214
+ return {
215
+ dos: [...baseDos, ...extraDos],
216
+ donts: [...baseDonts, ...extraDonts],
217
+ };
218
+ }
219
+ // ─── Visual theme description ───────────────────────────────────────
220
+ function generateThemeDescription(brief) {
221
+ const { companyName, industry, targetAudience, aesthetic } = brief;
222
+ const toneWord = aesthetic.split(/\s+/)[0];
223
+ return `${aesthetic} design language for ${companyName}, a ${industry} brand. Every screen should feel intentionally crafted for ${targetAudience} — not generic, not templated. The visual identity balances a ${toneWord} tone with the practical needs of ${targetAudience}, creating an experience that feels both professional and human.`;
224
+ }
225
+ // ─── Main generator ─────────────────────────────────────────────────
226
+ export function generateDesignMdTemplate(brief) {
227
+ const industryPalette = matchIndustry(brief.industry);
228
+ const aesthetic = matchAesthetic(brief.aesthetic);
229
+ const imagery = generateImageryGuidelines(brief.industry, brief.targetAudience);
230
+ const { dos, donts } = generateDosAndDonts(brief.industry, brief.targetAudience);
231
+ const themeDesc = generateThemeDescription(brief);
232
+ const primary = brief.primaryColor || industryPalette.primary.hex;
233
+ const primaryName = brief.primaryColor ? 'Brand Primary' : industryPalette.primary.name;
234
+ const secondary = brief.secondaryColor || industryPalette.secondary.hex;
235
+ const secondaryName = brief.secondaryColor ? 'Brand Secondary' : industryPalette.secondary.name;
236
+ const accentRow = industryPalette.accent
237
+ ? `| Accent | ${industryPalette.accent.name} | ${industryPalette.accent.hex} | Tertiary highlights, category markers |\n`
238
+ : '';
239
+ return `# ${brief.companyName} — Design System
240
+
241
+ ## 1. Visual Theme & Atmosphere
242
+
243
+ ${themeDesc}
244
+
245
+ ## 2. Color Palette & Roles
246
+
247
+ | Role | Name | Hex | Usage |
248
+ |------|------|-----|-------|
249
+ | Primary | ${primaryName} | ${primary} | Main brand color, CTAs, key UI elements |
250
+ | Secondary | ${secondaryName} | ${secondary} | Supporting elements, hover states, accents |
251
+ ${accentRow}| Surface | ${aesthetic.surface.name} | ${aesthetic.surface.hex} | Background, cards |
252
+ | On-Surface | ${aesthetic.onSurface.name} | ${aesthetic.onSurface.hex} | Body text on surface |
253
+ | Error | Signal Red | #DC2626 | Error states, destructive actions |
254
+ | Success | Verified Green | #16A34A | Success states, confirmations |
255
+ | Muted | ${aesthetic.muted.name} | ${aesthetic.muted.hex} | Disabled states, section alternates |
256
+ | Border | Light Border | #E5E5E5 | Card borders, dividers, input outlines |
257
+
258
+ ## 3. Typography
259
+
260
+ - **Heading**: ${aesthetic.headingFont}
261
+ - **Body**: ${aesthetic.bodyFont}
262
+ - **Mono**: ${aesthetic.monoFont}
263
+
264
+ | Element | Size | Weight | Line Height |
265
+ |---------|------|--------|-------------|
266
+ | H1 | 2.75rem | 700 | 1.15 |
267
+ | H2 | 2rem | 700 | 1.2 |
268
+ | H3 | 1.375rem | 600 | 1.3 |
269
+ | Body | 1rem | 400 | 1.6 |
270
+ | Small | 0.875rem | 400 | 1.5 |
271
+
272
+ ## 4. Spacing & Layout
273
+
274
+ - **Base unit**: 4px
275
+ - **Scale**: 4, 8, 12, 16, 24, 32, 48, 64, 96
276
+ - **Max content width**: 1200px
277
+ - **Grid**: 12-column, 20px gutter
278
+ - **Breakpoints**: 640px (sm), 768px (md), 1024px (lg), 1280px (xl)
279
+ - **Section vertical padding**: 64px desktop, 40px mobile
280
+
281
+ ## 5. Component Patterns
282
+
283
+ ### Buttons
284
+ - Primary: filled with Primary color, white text, ${aesthetic.borderRadius.split(',')[0]}, 14px 28px padding
285
+ - Secondary: outline with Primary border, Primary text
286
+ - Ghost: no background, Primary text, hover shows Muted background
287
+
288
+ ### Cards
289
+ - Surface background, 1px Border color, ${aesthetic.borderRadius.split(',')[1]?.trim() || '8px'}, 20px padding
290
+ - Shadow: ${aesthetic.shadowStyle}
291
+ - Hover: slight elevation increase
292
+
293
+ ### Inputs
294
+ - 1px Border color, ${aesthetic.borderRadius.split(',')[0]}, 12px 16px padding
295
+ - Focus: Primary border, subtle Primary ring
296
+ - Error: Error border, Error text below
297
+
298
+ ## 6. Iconography
299
+
300
+ ${aesthetic.iconStyle}
301
+
302
+ ## 7. Imagery Guidelines
303
+
304
+ ${imagery}
305
+
306
+ ## 8. Do's and Don'ts
307
+
308
+ ### Do
309
+ ${dos.map(d => `- ${d}`).join('\n')}
310
+
311
+ ### Don't
312
+ ${donts.map(d => `- ${d}`).join('\n')}
313
+ `;
314
+ }
315
+ //# sourceMappingURL=design-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-md.js","sourceRoot":"","sources":["../../src/templates/design-md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface ScreenSpec {
2
+ productName: string;
3
+ productDescription: string;
4
+ pageType: string;
5
+ targetUser: string;
6
+ visualTone: string;
7
+ sections: string[];
8
+ hasDesignMd: boolean;
9
+ }
10
+ export interface RefinementSpec {
11
+ screenName: string;
12
+ sectionTarget: string;
13
+ change: string;
14
+ details?: string[];
15
+ }
16
+ /**
17
+ * Build an initial generation prompt using zoom-out-zoom-in framework.
18
+ */
19
+ export declare function buildInitialPrompt(spec: ScreenSpec): string;
20
+ /**
21
+ * Build a refinement prompt (one change at a time).
22
+ */
23
+ export declare function buildRefinementPrompt(spec: RefinementSpec): string;
24
+ /**
25
+ * Build a localization prompt (apply after layout is established).
26
+ */
27
+ export declare function buildLocalePrompt(language: string): string;
28
+ /**
29
+ * Build a multi-screen consistency prefix.
30
+ */
31
+ export declare function buildConsistencyPrefix(referenceScreen: string): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Build an initial generation prompt using zoom-out-zoom-in framework.
3
+ */
4
+ export function buildInitialPrompt(spec) {
5
+ const designRef = spec.hasDesignMd
6
+ ? 'Following the imported design system, '
7
+ : '';
8
+ const sectionList = spec.sections
9
+ .map((s, i) => `${i + 1}. ${s}`)
10
+ .join('\n');
11
+ return `${designRef}A ${spec.visualTone} ${spec.pageType} for "${spec.productName}," a ${spec.productDescription}.
12
+ Designed for ${spec.targetUser}.
13
+
14
+ Include these sections:
15
+ ${sectionList}`;
16
+ }
17
+ /**
18
+ * Build a refinement prompt (one change at a time).
19
+ */
20
+ export function buildRefinementPrompt(spec) {
21
+ let prompt = `On the ${spec.sectionTarget} of ${spec.screenName}, ${spec.change}.`;
22
+ if (spec.details && spec.details.length > 0) {
23
+ prompt += '\n' + spec.details.map(d => `- ${d}`).join('\n');
24
+ }
25
+ return prompt;
26
+ }
27
+ /**
28
+ * Build a localization prompt (apply after layout is established).
29
+ */
30
+ export function buildLocalePrompt(language) {
31
+ return `Switch all text content to ${language}.`;
32
+ }
33
+ /**
34
+ * Build a multi-screen consistency prefix.
35
+ */
36
+ export function buildConsistencyPrefix(referenceScreen) {
37
+ return `Following the same design language as the ${referenceScreen}, `;
38
+ }
39
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/templates/prompts.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW;QAChC,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,kBAAkB;eACnG,IAAI,CAAC,UAAU;;;EAG5B,WAAW,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAoB;IACxD,IAAI,MAAM,GAAG,UAAU,IAAI,CAAC,aAAa,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;IAEnF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,8BAA8B,QAAQ,GAAG,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,eAAuB;IAC5D,OAAO,6CAA6C,eAAe,IAAI,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface WorkflowStep {
2
+ name: string;
3
+ command: string;
4
+ description: string;
5
+ dependsOn?: string;
6
+ }
7
+ export declare const WORKFLOW_REDESIGN: WorkflowStep[];
8
+ export declare const WORKFLOW_NEW_APP: WorkflowStep[];
9
+ export declare function getWorkflow(type: 'redesign' | 'new-app'): WorkflowStep[];
@@ -0,0 +1,21 @@
1
+ export const WORKFLOW_REDESIGN = [
2
+ { name: 'design', command: 'forge design', description: 'Define brand identity and design tokens → Write DESIGN.md' },
3
+ { name: 'import', command: 'manual', description: 'Import DESIGN.md into Stitch project (manual step in Stitch UI)' },
4
+ { name: 'homepage', command: 'forge generate', description: 'Generate homepage first (establishes visual language)', dependsOn: 'import' },
5
+ { name: 'refine-home', command: 'forge generate', description: 'Refine homepage with 3-5 incremental prompts', dependsOn: 'homepage' },
6
+ { name: 'internal-pages', command: 'forge generate', description: 'Generate internal pages one at a time, referencing homepage style', dependsOn: 'refine-home' },
7
+ { name: 'sync', command: 'forge sync', description: 'Sync all screens to local', dependsOn: 'internal-pages' },
8
+ { name: 'build', command: 'forge build --auto', description: 'Build Astro site from screens', dependsOn: 'sync' },
9
+ ];
10
+ export const WORKFLOW_NEW_APP = [
11
+ { name: 'brainstorm', command: 'forge generate', description: 'Start with high-level prompt to brainstorm direction' },
12
+ { name: 'pick-direction', command: 'manual', description: 'Pick best direction from brainstorm output' },
13
+ { name: 'drill-screens', command: 'forge generate', description: 'Generate screens one by one from chosen direction', dependsOn: 'pick-direction' },
14
+ { name: 'extract-design', command: 'forge sync', description: 'Extract DESIGN.md from established screens (Stitch auto-generates)', dependsOn: 'drill-screens' },
15
+ { name: 'remaining-screens', command: 'forge generate', description: 'Use DESIGN.md for remaining screens', dependsOn: 'extract-design' },
16
+ { name: 'build', command: 'forge build --auto', description: 'Build site from all screens', dependsOn: 'remaining-screens' },
17
+ ];
18
+ export function getWorkflow(type) {
19
+ return type === 'redesign' ? WORKFLOW_REDESIGN : WORKFLOW_NEW_APP;
20
+ }
21
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/templates/workflows.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,2DAA2D,EAAE;IACrH,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,iEAAiE,EAAE;IACrH,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,uDAAuD,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC1I,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,8CAA8C,EAAE,SAAS,EAAE,UAAU,EAAE;IACtI,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mEAAmE,EAAE,SAAS,EAAE,aAAa,EAAE;IACjK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,2BAA2B,EAAE,SAAS,EAAE,gBAAgB,EAAE;IAC9G,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,+BAA+B,EAAE,SAAS,EAAE,MAAM,EAAE;CAClH,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,sDAAsD,EAAE;IACtH,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;IACxG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,mDAAmD,EAAE,SAAS,EAAE,gBAAgB,EAAE;IACnJ,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,oEAAoE,EAAE,SAAS,EAAE,eAAe,EAAE;IAChK,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,qCAAqC,EAAE,SAAS,EAAE,gBAAgB,EAAE;IACzI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,6BAA6B,EAAE,SAAS,EAAE,mBAAmB,EAAE;CAC7H,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAA4B;IACtD,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACpE,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function renderApp(): void;
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { render, Box, Text, useInput, useApp } from 'ink';
4
+ import SelectInput from 'ink-select-input';
5
+ import { Dashboard } from './Dashboard.js';
6
+ import { PromptBuilder } from './PromptBuilder.js';
7
+ import { DesignEditor } from './DesignEditor.js';
8
+ import { Spinner } from './components/Spinner.js';
9
+ import { listScreenFiles, openInBrowser } from '../utils/preview.js';
10
+ import { crawlSources } from '../research/crawler.js';
11
+ import { diffAgainstKnownState } from '../research/differ.js';
12
+ import { getKnownState } from '../research/updater.js';
13
+ import { resolve, join } from 'node:path';
14
+ const MENU_ITEMS = [
15
+ { label: '📊 Dashboard — Project overview & quota', value: 'dashboard' },
16
+ { label: '🎨 Design — Create/edit DESIGN.md', value: 'design' },
17
+ { label: '🖼️ Generate — Build a screen prompt', value: 'generate' },
18
+ { label: '👁️ Preview — Open screens in browser', value: 'preview' },
19
+ { label: '🔬 Research — Check for updates', value: 'research' },
20
+ ];
21
+ function App() {
22
+ const [view, setView] = useState('menu');
23
+ const [researchStatus, setResearchStatus] = useState('idle');
24
+ const [researchResults, setResearchResults] = useState(null);
25
+ const [researchError, setResearchError] = useState(null);
26
+ const [previewMessage, setPreviewMessage] = useState(null);
27
+ const { exit } = useApp();
28
+ useInput((input, key) => {
29
+ if (key.ctrl && input === 'c') {
30
+ exit();
31
+ }
32
+ if (input === 'q' && view === 'menu') {
33
+ exit();
34
+ }
35
+ if (input === 'q' && view !== 'generate' && view !== 'design') {
36
+ setView('menu');
37
+ }
38
+ });
39
+ const handleSelect = (item) => {
40
+ setView(item.value);
41
+ };
42
+ const goBack = () => setView('menu');
43
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "\u2726 Stitch Forge" }), _jsx(Text, { dimColor: true, children: " v0.2.0" })] }), view === 'menu' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "Select an action:" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: MENU_ITEMS, onSelect: handleSelect }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "q: quit ctrl+c: exit" }) })] })), view === 'dashboard' && (_jsx(Dashboard, { onAction: (action) => {
44
+ if (action === 'generate')
45
+ setView('generate');
46
+ if (action === 'preview')
47
+ setView('preview');
48
+ } })), view === 'design' && (_jsx(DesignEditor, { onBack: goBack })), view === 'generate' && (_jsx(PromptBuilder, { onBack: goBack })), view === 'preview' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Preview \u2014 Open Screens in Browser" }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: (() => {
49
+ const screens = listScreenFiles();
50
+ if (screens.length === 0) {
51
+ return (_jsxs(_Fragment, { children: [_jsx(Text, { color: "yellow", children: "No screens found in screens/." }), _jsxs(Text, { dimColor: true, children: ["Run ", _jsx(Text, { bold: true, children: "forge generate" }), " to create screens first."] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press q to go back" }) })] }));
52
+ }
53
+ return (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: "Select a screen to open in your browser:" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: screens.map(s => ({ label: s, value: s })), onSelect: (item) => {
54
+ const screenPath = resolve(join('screens', `${item.value}.html`));
55
+ openInBrowser(screenPath).then(() => {
56
+ setPreviewMessage(`Opened ${item.value} in browser.`);
57
+ }).catch(() => {
58
+ setPreviewMessage(`Could not open ${item.value}. Open manually: ${screenPath}`);
59
+ });
60
+ } }) }), previewMessage && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "green", children: previewMessage }) })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press q to go back" }) })] }));
61
+ })() })] })), view === 'research' && (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Research \u2014 Stitch Updates" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [researchStatus === 'idle' && (_jsxs(_Fragment, { children: [_jsx(Text, { children: "Check if Google Stitch has any updates (new models, tools, features)." }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: [
62
+ { label: '🔍 Run research now', value: 'run' },
63
+ ], onSelect: () => {
64
+ setResearchStatus('running');
65
+ setResearchError(null);
66
+ crawlSources()
67
+ .then(crawlResults => {
68
+ const knownState = getKnownState();
69
+ const diff = diffAgainstKnownState(crawlResults, knownState);
70
+ if (diff.hasChanges) {
71
+ setResearchResults(diff.changes.map(c => `[${c.severity}] ${c.category}: ${c.description}`).join('\n'));
72
+ }
73
+ else {
74
+ setResearchResults('No changes detected. Knowledge base is current.');
75
+ }
76
+ setResearchStatus('done');
77
+ })
78
+ .catch(err => {
79
+ setResearchError(err instanceof Error ? err.message : 'Unknown error');
80
+ setResearchStatus('done');
81
+ });
82
+ } }) })] })), researchStatus === 'running' && (_jsx(Spinner, { label: "Checking for Stitch updates..." })), researchStatus === 'done' && (_jsxs(_Fragment, { children: [researchError ? (_jsxs(Text, { color: "red", children: ["Research failed: ", researchError] })) : (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", children: "Research complete!" }), researchResults && (_jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsx(Text, { children: researchResults }) }))] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Press q to go back" }) })] }))] })] }))] }));
83
+ }
84
+ export function renderApp() {
85
+ render(_jsx(App, {}));
86
+ }
87
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/tui/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ interface DashboardProps {
2
+ onAction?: (action: string) => void;
3
+ }
4
+ export declare function Dashboard({ onAction }: DashboardProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import SelectInput from 'ink-select-input';
4
+ import { getConfig, configExists } from '../utils/config.js';
5
+ import { getQuotaStatus } from '../utils/quota.js';
6
+ import { QuotaMeter } from './components/QuotaMeter.js';
7
+ import { ScreenCard } from './components/ScreenCard.js';
8
+ import { StatusBar } from './components/StatusBar.js';
9
+ const QUICK_ACTIONS = [
10
+ { label: '🖼️ Generate a new screen', value: 'generate' },
11
+ { label: '🔄 Sync screens from Stitch', value: 'sync' },
12
+ { label: '👁️ Preview a screen', value: 'preview' },
13
+ { label: '🏗️ Build site', value: 'build' },
14
+ ];
15
+ export function Dashboard({ onAction }) {
16
+ if (!configExists()) {
17
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "No project configured" }), _jsxs(Text, { children: ["Run ", _jsx(Text, { bold: true, children: "forge init" }), " to set up your project first."] }), _jsx(Text, { dimColor: true, children: "This will create your config file and connect to Stitch." })] }));
18
+ }
19
+ const config = getConfig();
20
+ const quota = getQuotaStatus();
21
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Project Overview" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: ["Name: ", _jsx(Text, { bold: true, children: config.projectName || '(not set)' })] }), _jsxs(Text, { children: ["Project ID: ", _jsx(Text, { dimColor: true, children: config.projectId || '(not set)' })] }), config.lastSync && (_jsxs(Text, { children: ["Last sync: ", _jsx(Text, { dimColor: true, children: new Date(config.lastSync).toLocaleString() })] }))] })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Quota" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(QuotaMeter, { label: "Flash (fast)", used: quota.flash.used, limit: quota.flash.limit }), _jsx(QuotaMeter, { label: "Pro (quality)", used: quota.pro.used, limit: quota.pro.limit }), _jsxs(Text, { dimColor: true, children: ["Resets: ", quota.resetDate] })] })] }), config.screens.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { bold: true, children: ["Screens (", config.screens.length, ")"] }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: config.screens.map((screen) => (_jsx(ScreenCard, { name: screen.name, route: screen.route, lastSynced: screen.lastSynced }, screen.id))) })] })), config.screens.length === 0 && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { dimColor: true, children: "No screens yet. Generate your first one below!" }) })), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Quick Actions" }), _jsx(Box, { marginTop: 1, children: _jsx(SelectInput, { items: QUICK_ACTIONS, onSelect: (item) => onAction?.(item.value) }) })] }), _jsx(StatusBar, { projectName: config.projectName, model: config.defaultModel === 'GEMINI_2_5_FLASH' ? 'Flash' : 'Pro' })] }));
22
+ }
23
+ //# sourceMappingURL=Dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../src/tui/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface DesignEditorProps {
2
+ onBack?: () => void;
3
+ onGenerate?: () => void;
4
+ }
5
+ export declare function DesignEditor({ onBack, onGenerate }: DesignEditorProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};