popeye-cli 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +184 -31
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +54 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts +29 -0
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +90 -7
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts +4 -1
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +36 -316
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +18 -3
- package/dist/generators/doc-parser.d.ts.map +1 -1
- package/dist/generators/doc-parser.js +81 -10
- package/dist/generators/doc-parser.js.map +1 -1
- package/dist/generators/frontend-design-analyzer.d.ts +30 -0
- package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
- package/dist/generators/frontend-design-analyzer.js +208 -0
- package/dist/generators/frontend-design-analyzer.js.map +1 -0
- package/dist/generators/shared-packages.d.ts +45 -0
- package/dist/generators/shared-packages.d.ts.map +1 -0
- package/dist/generators/shared-packages.js +456 -0
- package/dist/generators/shared-packages.js.map +1 -0
- package/dist/generators/templates/index.d.ts +4 -0
- package/dist/generators/templates/index.d.ts.map +1 -1
- package/dist/generators/templates/index.js +4 -0
- package/dist/generators/templates/index.js.map +1 -1
- package/dist/generators/templates/website-components.d.ts.map +1 -1
- package/dist/generators/templates/website-components.js +36 -11
- package/dist/generators/templates/website-components.js.map +1 -1
- package/dist/generators/templates/website-config.d.ts +15 -1
- package/dist/generators/templates/website-config.d.ts.map +1 -1
- package/dist/generators/templates/website-config.js +155 -13
- package/dist/generators/templates/website-config.js.map +1 -1
- package/dist/generators/templates/website-landing.d.ts +24 -0
- package/dist/generators/templates/website-landing.d.ts.map +1 -0
- package/dist/generators/templates/website-landing.js +276 -0
- package/dist/generators/templates/website-landing.js.map +1 -0
- package/dist/generators/templates/website-layout.d.ts +42 -0
- package/dist/generators/templates/website-layout.d.ts.map +1 -0
- package/dist/generators/templates/website-layout.js +408 -0
- package/dist/generators/templates/website-layout.js.map +1 -0
- package/dist/generators/templates/website-pricing.d.ts +11 -0
- package/dist/generators/templates/website-pricing.d.ts.map +1 -0
- package/dist/generators/templates/website-pricing.js +313 -0
- package/dist/generators/templates/website-pricing.js.map +1 -0
- package/dist/generators/templates/website-sections.d.ts +102 -0
- package/dist/generators/templates/website-sections.d.ts.map +1 -0
- package/dist/generators/templates/website-sections.js +444 -0
- package/dist/generators/templates/website-sections.js.map +1 -0
- package/dist/generators/templates/website.d.ts +10 -50
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +12 -788
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-scanner.d.ts +37 -0
- package/dist/generators/website-content-scanner.d.ts.map +1 -0
- package/dist/generators/website-content-scanner.js +165 -0
- package/dist/generators/website-content-scanner.js.map +1 -0
- package/dist/generators/website-context.d.ts +38 -2
- package/dist/generators/website-context.d.ts.map +1 -1
- package/dist/generators/website-context.js +179 -19
- package/dist/generators/website-context.js.map +1 -1
- package/dist/generators/website-debug.d.ts +68 -0
- package/dist/generators/website-debug.d.ts.map +1 -0
- package/dist/generators/website-debug.js +93 -0
- package/dist/generators/website-debug.js.map +1 -0
- package/dist/generators/website.d.ts +2 -0
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +66 -4
- package/dist/generators/website.js.map +1 -1
- package/dist/generators/workspace-root.d.ts +27 -0
- package/dist/generators/workspace-root.d.ts.map +1 -0
- package/dist/generators/workspace-root.js +100 -0
- package/dist/generators/workspace-root.js.map +1 -0
- package/dist/state/index.d.ts +8 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +11 -0
- package/dist/state/index.js.map +1 -1
- package/dist/types/consensus.d.ts +3 -0
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +1 -0
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/tester.d.ts +138 -0
- package/dist/types/tester.d.ts.map +1 -0
- package/dist/types/tester.js +110 -0
- package/dist/types/tester.js.map +1 -0
- package/dist/types/workflow.d.ts +151 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +14 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts +15 -0
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +52 -0
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/auto-fix-bundler.d.ts +37 -0
- package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
- package/dist/workflow/auto-fix-bundler.js +320 -0
- package/dist/workflow/auto-fix-bundler.js.map +1 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -1
- package/dist/workflow/auto-fix.js +10 -3
- package/dist/workflow/auto-fix.js.map +1 -1
- package/dist/workflow/execution-mode.js +2 -2
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +13 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/overview.d.ts.map +1 -1
- package/dist/workflow/overview.js +4 -0
- package/dist/workflow/overview.js.map +1 -1
- package/dist/workflow/plan-mode.d.ts +4 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +69 -5
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/task-workflow.d.ts +5 -0
- package/dist/workflow/task-workflow.d.ts.map +1 -1
- package/dist/workflow/task-workflow.js +172 -6
- package/dist/workflow/task-workflow.js.map +1 -1
- package/dist/workflow/tester.d.ts +120 -0
- package/dist/workflow/tester.d.ts.map +1 -0
- package/dist/workflow/tester.js +589 -0
- package/dist/workflow/tester.js.map +1 -0
- package/dist/workflow/website-strategy.d.ts +9 -0
- package/dist/workflow/website-strategy.d.ts.map +1 -1
- package/dist/workflow/website-strategy.js +73 -1
- package/dist/workflow/website-strategy.js.map +1 -1
- package/dist/workflow/website-updater.d.ts.map +1 -1
- package/dist/workflow/website-updater.js +15 -4
- package/dist/workflow/website-updater.js.map +1 -1
- package/dist/workflow/workflow-logger.d.ts +1 -1
- package/dist/workflow/workflow-logger.d.ts.map +1 -1
- package/dist/workflow/workflow-logger.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/create.ts +58 -4
- package/src/cli/interactive.ts +96 -7
- package/src/generators/all.ts +44 -332
- package/src/generators/doc-parser.ts +87 -10
- package/src/generators/frontend-design-analyzer.ts +261 -0
- package/src/generators/shared-packages.ts +500 -0
- package/src/generators/templates/index.ts +4 -0
- package/src/generators/templates/website-components.ts +36 -11
- package/src/generators/templates/website-config.ts +166 -13
- package/src/generators/templates/website-landing.ts +331 -0
- package/src/generators/templates/website-layout.ts +443 -0
- package/src/generators/templates/website-pricing.ts +330 -0
- package/src/generators/templates/website-sections.ts +541 -0
- package/src/generators/templates/website.ts +38 -851
- package/src/generators/website-content-scanner.ts +208 -0
- package/src/generators/website-context.ts +248 -20
- package/src/generators/website-debug.ts +130 -0
- package/src/generators/website.ts +71 -3
- package/src/generators/workspace-root.ts +113 -0
- package/src/state/index.ts +15 -0
- package/src/types/consensus.ts +3 -0
- package/src/types/index.ts +21 -0
- package/src/types/tester.ts +136 -0
- package/src/types/workflow.ts +32 -0
- package/src/upgrade/handlers.ts +65 -0
- package/src/workflow/auto-fix-bundler.ts +392 -0
- package/src/workflow/auto-fix.ts +11 -3
- package/src/workflow/execution-mode.ts +2 -2
- package/src/workflow/index.ts +13 -0
- package/src/workflow/overview.ts +6 -0
- package/src/workflow/plan-mode.ts +81 -7
- package/src/workflow/task-workflow.ts +227 -5
- package/src/workflow/tester.ts +723 -0
- package/src/workflow/website-strategy.ts +75 -1
- package/src/workflow/website-updater.ts +17 -6
- package/src/workflow/workflow-logger.ts +2 -0
- package/tests/cli/project-naming.test.ts +136 -0
- package/tests/generators/doc-parser.test.ts +121 -0
- package/tests/generators/frontend-design-analyzer.test.ts +90 -0
- package/tests/generators/quality-gate.test.ts +183 -0
- package/tests/generators/shared-packages.test.ts +83 -0
- package/tests/generators/website-components.test.ts +1 -1
- package/tests/generators/website-config.test.ts +84 -0
- package/tests/generators/website-content-scanner.test.ts +181 -0
- package/tests/generators/website-context.test.ts +109 -0
- package/tests/generators/website-debug.test.ts +77 -0
- package/tests/generators/website-landing.test.ts +188 -0
- package/tests/generators/website-pricing.test.ts +98 -0
- package/tests/generators/website-sections.test.ts +245 -0
- package/tests/generators/workspace-root.test.ts +105 -0
- package/tests/types/tester.test.ts +174 -0
- package/tests/upgrade/handlers.test.ts +162 -0
- package/tests/workflow/auto-fix-bundler.test.ts +242 -0
- package/tests/workflow/plan-mode.test.ts +111 -1
- package/tests/workflow/tester.test.ts +401 -0
- package/tests/workflow/website-strategy.test.ts +55 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Website layout and utility page generators
|
|
3
|
+
* Layout, globals CSS, sitemap, robots, docs, blog, readme, spec, test
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Escape a string for safe use inside JSX template literals
|
|
7
|
+
*/
|
|
8
|
+
function escapeJsx(str) {
|
|
9
|
+
return str
|
|
10
|
+
.replace(/\\/g, '\\\\')
|
|
11
|
+
.replace(/'/g, "\\'")
|
|
12
|
+
.replace(/`/g, '\\`')
|
|
13
|
+
.replace(/\$/g, '\\$');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert hex color to HSL string for CSS custom properties
|
|
17
|
+
* Returns format: "H S% L%"
|
|
18
|
+
*/
|
|
19
|
+
function hexToHslString(hex) {
|
|
20
|
+
const h = hex.replace('#', '');
|
|
21
|
+
const r = parseInt(h.substring(0, 2), 16) / 255;
|
|
22
|
+
const g = parseInt(h.substring(2, 4), 16) / 255;
|
|
23
|
+
const b = parseInt(h.substring(4, 6), 16) / 255;
|
|
24
|
+
const max = Math.max(r, g, b);
|
|
25
|
+
const min = Math.min(r, g, b);
|
|
26
|
+
const l = (max + min) / 2;
|
|
27
|
+
if (max === min) {
|
|
28
|
+
return `0 0% ${Math.round(l * 100)}%`;
|
|
29
|
+
}
|
|
30
|
+
const d = max - min;
|
|
31
|
+
const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
32
|
+
let hue = 0;
|
|
33
|
+
if (max === r) {
|
|
34
|
+
hue = ((g - b) / d + (g < b ? 6 : 0)) / 6;
|
|
35
|
+
}
|
|
36
|
+
else if (max === g) {
|
|
37
|
+
hue = ((b - r) / d + 2) / 6;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
hue = ((r - g) / d + 4) / 6;
|
|
41
|
+
}
|
|
42
|
+
return `${Math.round(hue * 360)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate root layout.tsx with metadata
|
|
46
|
+
*/
|
|
47
|
+
export function generateWebsiteLayout(projectName, context) {
|
|
48
|
+
const title = projectName
|
|
49
|
+
.split('-')
|
|
50
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
51
|
+
.join(' ');
|
|
52
|
+
const strategy = context?.strategy;
|
|
53
|
+
const displayName = context?.productName || title;
|
|
54
|
+
const desc = strategy?.messaging.longDescription
|
|
55
|
+
|| context?.description
|
|
56
|
+
|| `${displayName} - Your modern web application`;
|
|
57
|
+
const keywords = strategy?.seoStrategy.primaryKeywords
|
|
58
|
+
? strategy.seoStrategy.primaryKeywords.map(k => `'${escapeJsx(k)}'`).join(', ')
|
|
59
|
+
: `'${projectName}', 'web app', 'nextjs'`;
|
|
60
|
+
return `import type { Metadata } from 'next';
|
|
61
|
+
import { Inter } from 'next/font/google';
|
|
62
|
+
import './globals.css';
|
|
63
|
+
|
|
64
|
+
const inter = Inter({
|
|
65
|
+
subsets: ['latin'],
|
|
66
|
+
variable: '--font-inter',
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
|
|
70
|
+
|
|
71
|
+
export const metadata: Metadata = {
|
|
72
|
+
metadataBase: new URL(BASE_URL),
|
|
73
|
+
title: {
|
|
74
|
+
default: '${escapeJsx(displayName)}',
|
|
75
|
+
template: '%s | ${escapeJsx(displayName)}',
|
|
76
|
+
},
|
|
77
|
+
description: '${escapeJsx(desc)}',
|
|
78
|
+
keywords: [${keywords}],
|
|
79
|
+
authors: [{ name: '${escapeJsx(displayName)} Team' }],
|
|
80
|
+
creator: '${escapeJsx(displayName)}',
|
|
81
|
+
openGraph: {
|
|
82
|
+
type: 'website',
|
|
83
|
+
locale: 'en_US',
|
|
84
|
+
url: BASE_URL,
|
|
85
|
+
siteName: '${escapeJsx(displayName)}',
|
|
86
|
+
title: '${escapeJsx(displayName)}',
|
|
87
|
+
description: '${escapeJsx(desc)}',
|
|
88
|
+
},
|
|
89
|
+
twitter: {
|
|
90
|
+
card: 'summary_large_image',
|
|
91
|
+
title: '${escapeJsx(displayName)}',
|
|
92
|
+
description: '${escapeJsx(desc)}',
|
|
93
|
+
},
|
|
94
|
+
robots: {
|
|
95
|
+
index: true,
|
|
96
|
+
follow: true,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export default function RootLayout({
|
|
101
|
+
children,
|
|
102
|
+
}: {
|
|
103
|
+
children: React.ReactNode;
|
|
104
|
+
}) {
|
|
105
|
+
return (
|
|
106
|
+
<html lang="en" className={inter.variable}>
|
|
107
|
+
<body className="min-h-screen bg-background text-foreground antialiased">
|
|
108
|
+
{children}
|
|
109
|
+
</body>
|
|
110
|
+
</html>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Generate globals.css with full CSS variable set
|
|
117
|
+
*/
|
|
118
|
+
export function generateWebsiteGlobalsCss(context) {
|
|
119
|
+
const primaryHsl = context?.brand?.primaryColor
|
|
120
|
+
? hexToHslString(context.brand.primaryColor)
|
|
121
|
+
: '199 89% 48%';
|
|
122
|
+
return `@tailwind base;
|
|
123
|
+
@tailwind components;
|
|
124
|
+
@tailwind utilities;
|
|
125
|
+
|
|
126
|
+
@layer base {
|
|
127
|
+
:root {
|
|
128
|
+
--background: 0 0% 100%;
|
|
129
|
+
--foreground: 222.2 84% 4.9%;
|
|
130
|
+
--primary: ${primaryHsl};
|
|
131
|
+
--primary-foreground: 210 40% 98%;
|
|
132
|
+
--muted: 210 40% 96%;
|
|
133
|
+
--muted-foreground: 215 16% 47%;
|
|
134
|
+
--accent: 210 40% 96%;
|
|
135
|
+
--accent-foreground: 222.2 47% 11%;
|
|
136
|
+
--card: 0 0% 100%;
|
|
137
|
+
--card-foreground: 222.2 84% 4.9%;
|
|
138
|
+
--border: 214 32% 91%;
|
|
139
|
+
--ring: ${primaryHsl};
|
|
140
|
+
--radius: 0.5rem;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
body {
|
|
144
|
+
@apply bg-background text-foreground;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
html {
|
|
149
|
+
scroll-behavior: smooth;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@layer components {
|
|
153
|
+
.container {
|
|
154
|
+
@apply mx-auto max-w-7xl px-4 sm:px-6 lg:px-8;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Generate sitemap.ts
|
|
161
|
+
*/
|
|
162
|
+
export function generateWebsiteSitemap(projectName) {
|
|
163
|
+
return `import { MetadataRoute } from 'next';
|
|
164
|
+
|
|
165
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
166
|
+
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
|
|
167
|
+
|
|
168
|
+
return [
|
|
169
|
+
{
|
|
170
|
+
url: baseUrl,
|
|
171
|
+
lastModified: new Date(),
|
|
172
|
+
changeFrequency: 'weekly',
|
|
173
|
+
priority: 1,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
url: \`\${baseUrl}/pricing\`,
|
|
177
|
+
lastModified: new Date(),
|
|
178
|
+
changeFrequency: 'monthly',
|
|
179
|
+
priority: 0.8,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
url: \`\${baseUrl}/docs\`,
|
|
183
|
+
lastModified: new Date(),
|
|
184
|
+
changeFrequency: 'weekly',
|
|
185
|
+
priority: 0.8,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
url: \`\${baseUrl}/blog\`,
|
|
189
|
+
lastModified: new Date(),
|
|
190
|
+
changeFrequency: 'daily',
|
|
191
|
+
priority: 0.7,
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
`;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Generate robots.ts
|
|
199
|
+
*/
|
|
200
|
+
export function generateWebsiteRobots(projectName) {
|
|
201
|
+
return `import { MetadataRoute } from 'next';
|
|
202
|
+
|
|
203
|
+
export default function robots(): MetadataRoute.Robots {
|
|
204
|
+
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://${projectName}.com';
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
rules: [
|
|
208
|
+
{
|
|
209
|
+
userAgent: '*',
|
|
210
|
+
allow: '/',
|
|
211
|
+
disallow: ['/api/', '/admin/'],
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
sitemap: \`\${baseUrl}/sitemap.xml\`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Generate website README
|
|
221
|
+
*/
|
|
222
|
+
export function generateWebsiteReadme(projectName) {
|
|
223
|
+
const title = projectName
|
|
224
|
+
.split('-')
|
|
225
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
226
|
+
.join(' ');
|
|
227
|
+
return `# ${title} Website
|
|
228
|
+
|
|
229
|
+
Next.js marketing website with SEO optimization.
|
|
230
|
+
|
|
231
|
+
## Getting Started
|
|
232
|
+
|
|
233
|
+
\`\`\`bash
|
|
234
|
+
# Install dependencies
|
|
235
|
+
npm install
|
|
236
|
+
|
|
237
|
+
# Run development server (port 3001)
|
|
238
|
+
npm run dev
|
|
239
|
+
|
|
240
|
+
# Build for production
|
|
241
|
+
npm run build
|
|
242
|
+
|
|
243
|
+
# Run production server
|
|
244
|
+
npm start
|
|
245
|
+
\`\`\`
|
|
246
|
+
|
|
247
|
+
## SEO Features
|
|
248
|
+
|
|
249
|
+
- Server-side rendering (SSR)
|
|
250
|
+
- Auto-generated sitemap
|
|
251
|
+
- robots.txt configuration
|
|
252
|
+
- OpenGraph and Twitter meta tags
|
|
253
|
+
- Structured data support (Organization + SoftwareApplication + FAQ)
|
|
254
|
+
|
|
255
|
+
## Project Structure
|
|
256
|
+
|
|
257
|
+
\`\`\`
|
|
258
|
+
src/
|
|
259
|
+
app/
|
|
260
|
+
layout.tsx # Root layout with metadata
|
|
261
|
+
page.tsx # Landing page (10 sections)
|
|
262
|
+
pricing/ # Pricing page with comparison
|
|
263
|
+
docs/ # Documentation
|
|
264
|
+
blog/ # Blog
|
|
265
|
+
sitemap.ts # Auto-generated sitemap
|
|
266
|
+
robots.ts # robots.txt config
|
|
267
|
+
components/ # UI components (Header, Footer, JsonLd)
|
|
268
|
+
lib/ # Utilities
|
|
269
|
+
content/
|
|
270
|
+
blog/ # MDX blog posts
|
|
271
|
+
docs/ # MDX documentation
|
|
272
|
+
\`\`\`
|
|
273
|
+
|
|
274
|
+
## Development
|
|
275
|
+
|
|
276
|
+
- Port: 3001 (to avoid conflicts with frontend on 5173)
|
|
277
|
+
- API URL: Configure via NEXT_PUBLIC_APP_URL
|
|
278
|
+
`;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Generate website spec JSON with optional context
|
|
282
|
+
*/
|
|
283
|
+
export function generateWebsiteSpec(projectName, context) {
|
|
284
|
+
const title = projectName
|
|
285
|
+
.split('-')
|
|
286
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
287
|
+
.join(' ');
|
|
288
|
+
const displayName = context?.productName || title;
|
|
289
|
+
const tagline = context?.tagline || context?.description || 'Build something amazing';
|
|
290
|
+
const primaryColor = context?.brand?.primaryColor || '#0ea5e9';
|
|
291
|
+
return JSON.stringify({
|
|
292
|
+
version: '1.0',
|
|
293
|
+
brand: {
|
|
294
|
+
name: displayName,
|
|
295
|
+
tagline,
|
|
296
|
+
colors: {
|
|
297
|
+
primary: primaryColor,
|
|
298
|
+
secondary: '#64748b',
|
|
299
|
+
accent: '#f59e0b',
|
|
300
|
+
background: '#ffffff',
|
|
301
|
+
foreground: '#0f172a',
|
|
302
|
+
},
|
|
303
|
+
typography: {
|
|
304
|
+
headingFont: 'Inter',
|
|
305
|
+
bodyFont: 'Inter',
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
seo: {
|
|
309
|
+
title: displayName,
|
|
310
|
+
description: context?.description || `${displayName} - Your modern web application`,
|
|
311
|
+
keywords: [projectName, 'web app', 'nextjs', 'saas'],
|
|
312
|
+
locale: 'en_US',
|
|
313
|
+
},
|
|
314
|
+
pages: [
|
|
315
|
+
{ name: 'Home', path: '/', type: 'landing' },
|
|
316
|
+
{ name: 'Pricing', path: '/pricing', type: 'pricing' },
|
|
317
|
+
{ name: 'Documentation', path: '/docs', type: 'docs' },
|
|
318
|
+
{ name: 'Blog', path: '/blog', type: 'blog' },
|
|
319
|
+
],
|
|
320
|
+
cta: {
|
|
321
|
+
primary: { text: 'Get Started', href: '/pricing' },
|
|
322
|
+
secondary: { text: 'Learn More', href: '/docs' },
|
|
323
|
+
},
|
|
324
|
+
features: {
|
|
325
|
+
analytics: true,
|
|
326
|
+
newsletter: false,
|
|
327
|
+
mdxBlog: true,
|
|
328
|
+
docsSearch: false,
|
|
329
|
+
},
|
|
330
|
+
}, null, 2);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Generate sample test for website
|
|
334
|
+
*/
|
|
335
|
+
export function generateWebsiteTest(projectName) {
|
|
336
|
+
const title = projectName
|
|
337
|
+
.split('-')
|
|
338
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
339
|
+
.join(' ');
|
|
340
|
+
return `import { describe, it, expect } from 'vitest';
|
|
341
|
+
import { render, screen } from '@testing-library/react';
|
|
342
|
+
import HomePage from '@/app/page';
|
|
343
|
+
|
|
344
|
+
describe('HomePage', () => {
|
|
345
|
+
it('renders the title', () => {
|
|
346
|
+
render(<HomePage />);
|
|
347
|
+
expect(screen.getByRole('heading', { level: 1 })).toHaveTextContent('${title}');
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('renders the call-to-action buttons', () => {
|
|
351
|
+
render(<HomePage />);
|
|
352
|
+
expect(screen.getByRole('link', { name: /get started/i })).toBeInTheDocument();
|
|
353
|
+
expect(screen.getByRole('link', { name: /learn more/i })).toBeInTheDocument();
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
`;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Generate docs page placeholder
|
|
360
|
+
*/
|
|
361
|
+
export function generateWebsiteDocsPage() {
|
|
362
|
+
return `import type { Metadata } from 'next';
|
|
363
|
+
|
|
364
|
+
export const metadata: Metadata = {
|
|
365
|
+
title: 'Documentation',
|
|
366
|
+
description: 'Learn how to use our platform with comprehensive documentation.',
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
export default function DocsPage() {
|
|
370
|
+
return (
|
|
371
|
+
<main className="py-20">
|
|
372
|
+
<div className="container">
|
|
373
|
+
<h1 className="text-4xl font-bold text-foreground">Documentation</h1>
|
|
374
|
+
<p className="mt-4 text-lg text-muted-foreground">
|
|
375
|
+
Documentation coming soon...
|
|
376
|
+
</p>
|
|
377
|
+
</div>
|
|
378
|
+
</main>
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
`;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Generate blog listing page placeholder
|
|
385
|
+
*/
|
|
386
|
+
export function generateWebsiteBlogPage() {
|
|
387
|
+
return `import type { Metadata } from 'next';
|
|
388
|
+
|
|
389
|
+
export const metadata: Metadata = {
|
|
390
|
+
title: 'Blog',
|
|
391
|
+
description: 'Latest news, updates, and insights from our team.',
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
export default function BlogPage() {
|
|
395
|
+
return (
|
|
396
|
+
<main className="py-20">
|
|
397
|
+
<div className="container">
|
|
398
|
+
<h1 className="text-4xl font-bold text-foreground">Blog</h1>
|
|
399
|
+
<p className="mt-4 text-lg text-muted-foreground">
|
|
400
|
+
Blog posts coming soon...
|
|
401
|
+
</p>
|
|
402
|
+
</div>
|
|
403
|
+
</main>
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
`;
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=website-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-layout.js","sourceRoot":"","sources":["../../../src/generators/templates/website-layout.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAE1B,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAE1D,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmB,EACnB,OAA+B;IAE/B,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;IACnC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IAClD,MAAM,IAAI,GAAG,QAAQ,EAAE,SAAS,CAAC,eAAe;WAC3C,OAAO,EAAE,WAAW;WACpB,GAAG,WAAW,gCAAgC,CAAC;IAEpD,MAAM,QAAQ,GAAG,QAAQ,EAAE,WAAW,CAAC,eAAe;QACpD,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC,IAAI,WAAW,wBAAwB,CAAC;IAE5C,OAAO;;;;;;;;;gEASuD,WAAW;;;;;gBAK3D,SAAS,CAAC,WAAW,CAAC;sBAChB,SAAS,CAAC,WAAW,CAAC;;kBAE1B,SAAS,CAAC,IAAI,CAAC;eAClB,QAAQ;uBACA,SAAS,CAAC,WAAW,CAAC;cAC/B,SAAS,CAAC,WAAW,CAAC;;;;;iBAKnB,SAAS,CAAC,WAAW,CAAC;cACzB,SAAS,CAAC,WAAW,CAAC;oBAChB,SAAS,CAAC,IAAI,CAAC;;;;cAIrB,SAAS,CAAC,WAAW,CAAC;oBAChB,SAAS,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;CAqBlC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAA+B;IAE/B,MAAM,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY;QAC7C,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC;QAC5C,CAAC,CAAC,aAAa,CAAC;IAElB,OAAO;;;;;;;;iBAQQ,UAAU;;;;;;;;;cASb,UAAU;;;;;;;;;;;;;;;;;;CAkBvB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,OAAO;;;iEAGwD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B3E,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,OAAO;;;iEAGwD,WAAW;;;;;;;;;;;;;CAa3E,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,KAAK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDlB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,OAA+B;IAE/B,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,IAAI,yBAAyB,CAAC;IACtF,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,IAAI,SAAS,CAAC;IAE/D,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,MAAM,EAAE;gBACN,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,SAAS;gBACpB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS;aACtB;YACD,UAAU,EAAE;gBACV,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,OAAO;aAClB;SACF;QACD,GAAG,EAAE;YACH,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,GAAG,WAAW,gCAAgC;YACnF,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;YACpD,MAAM,EAAE,OAAO;SAChB;QACD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;YAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;YACtD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;YACtD,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;SAC9C;QACD,GAAG,EAAE;YACH,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE;YAClD,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;SACjD;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;SAClB;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO;;;;;;;2EAOkE,KAAK;;;;;;;;;CAS/E,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;CAmBR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing page generator with monthly/annual toggle, feature comparison,
|
|
3
|
+
* pricing FAQ, and enterprise CTA section
|
|
4
|
+
*/
|
|
5
|
+
import type { WebsiteContentContext } from '../website-context.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate pricing page with optional context-driven tiers, comparison, and FAQ
|
|
8
|
+
* Rendered as client component for monthly/annual toggle
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateWebsitePricingPage(_projectName: string, context?: WebsiteContentContext): string;
|
|
11
|
+
//# sourceMappingURL=website-pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-pricing.d.ts","sourceRoot":"","sources":["../../../src/generators/templates/website-pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAanE;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CAgQR"}
|