create-nene 0.1.2 → 0.3.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/dist/index.js +185 -62
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/.cursor/rules/backend-patterns.mdc +68 -0
- package/templates/default/.cursor/rules/frontend-patterns.mdc +135 -0
- package/templates/default/.cursor/rules/nene-architecture.mdc +95 -0
- package/templates/default/.cursor/rules/shared-package.mdc +68 -0
- package/templates/default/.cursor/rules/task-management.mdc +71 -0
- package/templates/default/README.md +42 -25
- package/templates/default/_gitignore +10 -17
- package/templates/default/apps/api/nest-cli.json +8 -0
- package/templates/default/apps/api/package.json +36 -0
- package/templates/default/apps/api/src/app.controller.ts +12 -0
- package/templates/default/apps/api/src/app.module.ts +19 -0
- package/templates/default/apps/api/src/app.service.ts +8 -0
- package/templates/default/apps/api/src/config/configuration.ts +6 -0
- package/templates/default/apps/api/src/health/health.controller.ts +12 -0
- package/templates/default/apps/api/src/health/health.module.ts +9 -0
- package/templates/default/apps/api/src/health/health.service.ts +12 -0
- package/templates/default/apps/api/src/main.ts +32 -0
- package/templates/default/apps/api/tsconfig.json +26 -0
- package/templates/default/apps/web/next.config.ts +7 -0
- package/templates/default/apps/web/package.json +28 -0
- package/templates/default/apps/web/postcss.config.mjs +9 -0
- package/templates/default/apps/web/src/app/globals.css +63 -0
- package/templates/default/apps/web/src/app/layout.tsx +36 -0
- package/templates/default/apps/web/src/app/page.tsx +375 -0
- package/templates/default/apps/web/tailwind.config.ts +26 -0
- package/templates/default/{tsconfig.json → apps/web/tsconfig.json} +11 -8
- package/templates/default/docs/API.md +55 -0
- package/templates/default/docs/kanban/DOING/_gitkeep +0 -0
- package/templates/default/docs/kanban/DONE/01-project-setup.md +24 -0
- package/templates/default/docs/kanban/README.md +60 -0
- package/templates/default/docs/kanban/TODO/01-database-integration.md +24 -0
- package/templates/default/docs/overview/ARCHITECTURE.md +59 -0
- package/templates/default/docs/pages/README.md +50 -0
- package/templates/default/package.json +16 -17
- package/templates/default/packages/shared/package.json +29 -0
- package/templates/default/packages/shared/src/constants/index.ts +13 -0
- package/templates/default/packages/shared/src/index.ts +3 -0
- package/templates/default/packages/shared/src/types/index.ts +21 -0
- package/templates/default/packages/shared/tsconfig.json +17 -0
- package/templates/default/packages/shared/tsup.config.ts +10 -0
- package/templates/default/pnpm-workspace.yaml +3 -0
- package/templates/default/scripts/dev.sh +59 -0
- package/templates/default/turbo.json +14 -0
- package/templates/default/eslint.config.mjs +0 -10
- package/templates/default/src/app/layout.tsx +0 -14
- package/templates/default/src/app/page.tsx +0 -29
- package/templates/default/src/server/api/hello.ts +0 -14
- package/templates/default/src/server/index.ts +0 -3
- package/templates/minimal/README.md +0 -11
- package/templates/minimal/_gitignore +0 -6
- package/templates/minimal/package.json +0 -22
- package/templates/minimal/src/app/layout.tsx +0 -9
- package/templates/minimal/src/app/page.tsx +0 -7
- package/templates/minimal/tsconfig.json +0 -19
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { Inter, JetBrains_Mono } from 'next/font/google';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
|
|
5
|
+
const inter = Inter({
|
|
6
|
+
subsets: ['latin'],
|
|
7
|
+
variable: '--font-inter',
|
|
8
|
+
display: 'swap',
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const jetbrainsMono = JetBrains_Mono({
|
|
12
|
+
subsets: ['latin'],
|
|
13
|
+
variable: '--font-jetbrains-mono',
|
|
14
|
+
display: 'swap',
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const metadata: Metadata = {
|
|
18
|
+
title: 'nene.js | Local Development',
|
|
19
|
+
description: 'A full-stack app built with Next.js and NestJS',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default function RootLayout({
|
|
23
|
+
children,
|
|
24
|
+
}: {
|
|
25
|
+
children: React.ReactNode;
|
|
26
|
+
}) {
|
|
27
|
+
return (
|
|
28
|
+
<html lang="en" className="dark">
|
|
29
|
+
<body
|
|
30
|
+
className={`${inter.variable} ${jetbrainsMono.variable} font-display`}
|
|
31
|
+
>
|
|
32
|
+
{children}
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { API_ROUTES } from '@app/shared';
|
|
5
|
+
|
|
6
|
+
interface HealthStatus {
|
|
7
|
+
status: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
uptime: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type ServiceStatus = 'checking' | 'active' | 'inactive';
|
|
13
|
+
|
|
14
|
+
const EXAMPLE_PROMPT =
|
|
15
|
+
'Turn this nene.js project into a blog with real-time comments. Use a light theme with modern fonts. Skip auth for now (add it as a TODO), and let anyone write posts and comments.';
|
|
16
|
+
|
|
17
|
+
function StatusBadge({ status }: { status: ServiceStatus }) {
|
|
18
|
+
if (status === 'checking') {
|
|
19
|
+
return (
|
|
20
|
+
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-white/10 text-slate-400">
|
|
21
|
+
Checking…
|
|
22
|
+
</span>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if (status === 'active') {
|
|
26
|
+
return (
|
|
27
|
+
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-white/10 text-white">
|
|
28
|
+
Active
|
|
29
|
+
</span>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
return (
|
|
33
|
+
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-500/20 text-red-400 border border-red-500/30">
|
|
34
|
+
Inactive
|
|
35
|
+
</span>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default function Home() {
|
|
40
|
+
const [apiStatus, setApiStatus] = useState<ServiceStatus>('checking');
|
|
41
|
+
const [health, setHealth] = useState<HealthStatus | null>(null);
|
|
42
|
+
const [copied, setCopied] = useState(false);
|
|
43
|
+
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const checkHealth = async () => {
|
|
46
|
+
try {
|
|
47
|
+
const res = await fetch(`http://localhost:4000${API_ROUTES.HEALTH}`);
|
|
48
|
+
const data = await res.json();
|
|
49
|
+
setHealth(data);
|
|
50
|
+
setApiStatus('active');
|
|
51
|
+
} catch {
|
|
52
|
+
setApiStatus('inactive');
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
checkHealth();
|
|
57
|
+
const interval = setInterval(checkHealth, 10000);
|
|
58
|
+
return () => clearInterval(interval);
|
|
59
|
+
}, []);
|
|
60
|
+
|
|
61
|
+
const allOperational = apiStatus === 'active';
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div className="bg-background-dark text-slate-200 min-h-screen flex flex-col items-center">
|
|
65
|
+
{/* Top Navigation */}
|
|
66
|
+
<header className="w-full max-w-[1200px] flex items-center justify-between px-6 py-8">
|
|
67
|
+
<div className="flex items-center gap-2">
|
|
68
|
+
<div className="size-8 bg-primary rounded-lg flex items-center justify-center text-background-dark font-bold text-sm">
|
|
69
|
+
N
|
|
70
|
+
</div>
|
|
71
|
+
<h1 className="text-2xl font-bold tracking-tight text-white glow-text">
|
|
72
|
+
nene.js
|
|
73
|
+
</h1>
|
|
74
|
+
</div>
|
|
75
|
+
<nav className="hidden md:flex items-center gap-8 text-sm font-medium text-slate-400">
|
|
76
|
+
<a
|
|
77
|
+
className="hover:text-primary transition-colors"
|
|
78
|
+
href="https://github.com/rossjang/nenejs"
|
|
79
|
+
target="_blank"
|
|
80
|
+
rel="noopener noreferrer"
|
|
81
|
+
>
|
|
82
|
+
GitHub
|
|
83
|
+
</a>
|
|
84
|
+
<a
|
|
85
|
+
className="hover:text-primary transition-colors"
|
|
86
|
+
href="https://github.com/rossjang/nenejs"
|
|
87
|
+
target="_blank"
|
|
88
|
+
rel="noopener noreferrer"
|
|
89
|
+
>
|
|
90
|
+
Docs
|
|
91
|
+
</a>
|
|
92
|
+
<a
|
|
93
|
+
className="hover:text-primary transition-colors"
|
|
94
|
+
href="http://localhost:4000/api"
|
|
95
|
+
target="_blank"
|
|
96
|
+
rel="noopener noreferrer"
|
|
97
|
+
>
|
|
98
|
+
API
|
|
99
|
+
</a>
|
|
100
|
+
</nav>
|
|
101
|
+
</header>
|
|
102
|
+
|
|
103
|
+
<main className="w-full max-w-[960px] px-6 flex flex-col items-center">
|
|
104
|
+
{/* Hero Title */}
|
|
105
|
+
<div className="text-center mt-8 mb-12">
|
|
106
|
+
<h2 className="text-white text-4xl font-bold mb-4">
|
|
107
|
+
Scaffold successful.
|
|
108
|
+
</h2>
|
|
109
|
+
<p className="text-slate-400 text-lg">
|
|
110
|
+
Happy hacking! Your development environment is ready to go.
|
|
111
|
+
</p>
|
|
112
|
+
</div>
|
|
113
|
+
|
|
114
|
+
{/* Live Status Panel */}
|
|
115
|
+
<div className="w-full glass-panel rounded-xl overflow-hidden mb-12">
|
|
116
|
+
<div className="px-6 py-4 border-b border-white/5 bg-white/5 flex items-center justify-between">
|
|
117
|
+
<h3 className="text-xs uppercase tracking-widest font-bold text-slate-500">
|
|
118
|
+
Live Status Panel
|
|
119
|
+
</h3>
|
|
120
|
+
<div className="flex items-center gap-2">
|
|
121
|
+
<span
|
|
122
|
+
className={`size-2 rounded-full ${
|
|
123
|
+
allOperational
|
|
124
|
+
? 'bg-green-500 pulse-dot'
|
|
125
|
+
: 'bg-red-500 pulse-dot-red'
|
|
126
|
+
}`}
|
|
127
|
+
/>
|
|
128
|
+
<span
|
|
129
|
+
className={`text-[10px] font-mono font-bold uppercase ${
|
|
130
|
+
allOperational ? 'text-green-500' : 'text-red-500'
|
|
131
|
+
}`}
|
|
132
|
+
>
|
|
133
|
+
{allOperational
|
|
134
|
+
? 'All Systems Operational'
|
|
135
|
+
: 'Service Degraded'}
|
|
136
|
+
</span>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
<div className="overflow-x-auto">
|
|
140
|
+
<table className="w-full text-left">
|
|
141
|
+
<thead>
|
|
142
|
+
<tr className="text-xs text-slate-500 border-b border-white/5">
|
|
143
|
+
<th className="px-6 py-4 font-medium uppercase tracking-wider">
|
|
144
|
+
Service
|
|
145
|
+
</th>
|
|
146
|
+
<th className="px-6 py-4 font-medium uppercase tracking-wider">
|
|
147
|
+
Port
|
|
148
|
+
</th>
|
|
149
|
+
<th className="px-6 py-4 font-medium uppercase tracking-wider text-right">
|
|
150
|
+
Status
|
|
151
|
+
</th>
|
|
152
|
+
</tr>
|
|
153
|
+
</thead>
|
|
154
|
+
<tbody className="divide-y divide-white/5">
|
|
155
|
+
{/* Frontend */}
|
|
156
|
+
<tr className="group hover:bg-white/[0.02] transition-colors">
|
|
157
|
+
<td className="px-6 py-5 text-sm font-medium text-white flex items-center gap-3">
|
|
158
|
+
<span className="text-primary">■</span>
|
|
159
|
+
Frontend (Next.js)
|
|
160
|
+
</td>
|
|
161
|
+
<td className="px-6 py-5 text-sm font-mono text-primary">
|
|
162
|
+
3000
|
|
163
|
+
</td>
|
|
164
|
+
<td className="px-6 py-5 text-right">
|
|
165
|
+
<StatusBadge status="active" />
|
|
166
|
+
</td>
|
|
167
|
+
</tr>
|
|
168
|
+
{/* Backend */}
|
|
169
|
+
<tr className="group hover:bg-white/[0.02] transition-colors">
|
|
170
|
+
<td className="px-6 py-5 text-sm font-medium text-white flex items-center gap-3">
|
|
171
|
+
<span className="text-primary">▶</span>
|
|
172
|
+
Backend (NestJS)
|
|
173
|
+
{health && (
|
|
174
|
+
<span className="text-xs text-slate-500 font-mono">
|
|
175
|
+
uptime {Math.floor(health.uptime)}s
|
|
176
|
+
</span>
|
|
177
|
+
)}
|
|
178
|
+
</td>
|
|
179
|
+
<td className="px-6 py-5 text-sm font-mono text-primary">
|
|
180
|
+
4000
|
|
181
|
+
</td>
|
|
182
|
+
<td className="px-6 py-5 text-right">
|
|
183
|
+
<StatusBadge status={apiStatus} />
|
|
184
|
+
</td>
|
|
185
|
+
</tr>
|
|
186
|
+
{/* Shared Package */}
|
|
187
|
+
<tr className="group hover:bg-white/[0.02] transition-colors">
|
|
188
|
+
<td className="px-6 py-5 text-sm font-medium text-white flex items-center gap-3">
|
|
189
|
+
<span className="text-primary">◆</span>
|
|
190
|
+
Shared Package
|
|
191
|
+
</td>
|
|
192
|
+
<td className="px-6 py-5 text-sm font-mono text-slate-500">
|
|
193
|
+
—
|
|
194
|
+
</td>
|
|
195
|
+
<td className="px-6 py-5 text-right">
|
|
196
|
+
<span className="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-primary/20 text-primary border border-primary/30">
|
|
197
|
+
Compiled
|
|
198
|
+
</span>
|
|
199
|
+
</td>
|
|
200
|
+
</tr>
|
|
201
|
+
</tbody>
|
|
202
|
+
</table>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
|
|
206
|
+
{/* 3-Column Grid */}
|
|
207
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 w-full mb-16">
|
|
208
|
+
{/* Card 1: Project Structure */}
|
|
209
|
+
<div className="glass-panel rounded-xl p-6 flex flex-col h-full">
|
|
210
|
+
<div className="flex items-center gap-2 mb-4">
|
|
211
|
+
<span className="text-primary text-lg">📁</span>
|
|
212
|
+
<h4 className="font-bold text-white text-sm">
|
|
213
|
+
Project Structure
|
|
214
|
+
</h4>
|
|
215
|
+
</div>
|
|
216
|
+
<div className="bg-black/40 rounded-lg p-3 font-mono text-[11px] leading-relaxed text-slate-400 flex-grow">
|
|
217
|
+
<div className="flex items-center gap-2 mb-1">
|
|
218
|
+
<span>📂</span>
|
|
219
|
+
<span>apps/</span>
|
|
220
|
+
</div>
|
|
221
|
+
<div className="ml-4 flex items-center gap-2 text-slate-300">
|
|
222
|
+
<span>📁</span>
|
|
223
|
+
<span>
|
|
224
|
+
web/{' '}
|
|
225
|
+
<span className="text-[10px] text-slate-600 opacity-80">
|
|
226
|
+
(Next.js)
|
|
227
|
+
</span>
|
|
228
|
+
</span>
|
|
229
|
+
</div>
|
|
230
|
+
<div className="ml-4 flex items-center gap-2 mb-2 text-slate-300">
|
|
231
|
+
<span>📁</span>
|
|
232
|
+
<span>
|
|
233
|
+
api/{' '}
|
|
234
|
+
<span className="text-[10px] text-slate-600 opacity-80">
|
|
235
|
+
(NestJS)
|
|
236
|
+
</span>
|
|
237
|
+
</span>
|
|
238
|
+
</div>
|
|
239
|
+
<div className="flex items-center gap-2 mb-1">
|
|
240
|
+
<span>📂</span>
|
|
241
|
+
<span>packages/</span>
|
|
242
|
+
</div>
|
|
243
|
+
<div className="ml-4 flex items-center gap-2 text-slate-500">
|
|
244
|
+
<span>📁</span>
|
|
245
|
+
<span>shared/</span>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
{/* Card 2: Add a Feature */}
|
|
251
|
+
<div className="glass-panel rounded-xl p-6 flex flex-col h-full border-primary/20">
|
|
252
|
+
<div className="flex items-center gap-2 mb-4">
|
|
253
|
+
<span className="text-primary text-lg">✨</span>
|
|
254
|
+
<h4 className="font-bold text-white text-sm">Add a Feature</h4>
|
|
255
|
+
</div>
|
|
256
|
+
<p className="text-slate-400 text-xs leading-relaxed mb-3">
|
|
257
|
+
Copy the prompt below and paste it into Cursor AI to instantly
|
|
258
|
+
scaffold a full-stack feature:
|
|
259
|
+
</p>
|
|
260
|
+
<div className="mt-auto flex flex-col gap-2">
|
|
261
|
+
<div
|
|
262
|
+
className="relative group bg-primary/10 border border-primary/20 rounded-lg p-3 pr-9 text-[11px] leading-relaxed text-primary/90 font-mono cursor-pointer hover:bg-primary/15 transition-colors"
|
|
263
|
+
onClick={() => {
|
|
264
|
+
navigator.clipboard.writeText(EXAMPLE_PROMPT);
|
|
265
|
+
setCopied(true);
|
|
266
|
+
setTimeout(() => setCopied(false), 2000);
|
|
267
|
+
}}
|
|
268
|
+
title="Click to copy"
|
|
269
|
+
>
|
|
270
|
+
“{EXAMPLE_PROMPT}”
|
|
271
|
+
<span className="absolute top-2.5 right-2.5 text-primary/60 group-hover:text-primary transition-colors">
|
|
272
|
+
{copied ? (
|
|
273
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
274
|
+
<polyline points="20 6 9 17 4 12" />
|
|
275
|
+
</svg>
|
|
276
|
+
) : (
|
|
277
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
|
278
|
+
<rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
|
|
279
|
+
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
|
|
280
|
+
</svg>
|
|
281
|
+
)}
|
|
282
|
+
</span>
|
|
283
|
+
</div>
|
|
284
|
+
<p className="text-[10px] text-slate-600 text-right">
|
|
285
|
+
{copied ? 'Copied!' : 'Click to copy — then paste into Cursor AI'}
|
|
286
|
+
</p>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
{/* Card 3: API & Docs */}
|
|
291
|
+
<div className="glass-panel rounded-xl p-6 flex flex-col h-full">
|
|
292
|
+
<div className="flex items-center gap-2 mb-4">
|
|
293
|
+
<span className="text-primary text-lg">📖</span>
|
|
294
|
+
<h4 className="font-bold text-white text-sm">API & Docs</h4>
|
|
295
|
+
</div>
|
|
296
|
+
<div className="space-y-3">
|
|
297
|
+
<a
|
|
298
|
+
className="flex items-center justify-between group p-2 rounded-lg hover:bg-white/5 transition-colors"
|
|
299
|
+
href="https://github.com/rossjang/nenejs"
|
|
300
|
+
target="_blank"
|
|
301
|
+
rel="noopener noreferrer"
|
|
302
|
+
>
|
|
303
|
+
<span className="text-xs text-slate-300">
|
|
304
|
+
Framework Overview
|
|
305
|
+
</span>
|
|
306
|
+
<span className="text-slate-600 group-hover:text-primary text-sm transition-colors">
|
|
307
|
+
→
|
|
308
|
+
</span>
|
|
309
|
+
</a>
|
|
310
|
+
<a
|
|
311
|
+
className="flex items-center justify-between group p-2 rounded-lg hover:bg-white/5 transition-colors"
|
|
312
|
+
href="http://localhost:4000/api"
|
|
313
|
+
target="_blank"
|
|
314
|
+
rel="noopener noreferrer"
|
|
315
|
+
>
|
|
316
|
+
<span className="text-xs text-slate-300">API Reference</span>
|
|
317
|
+
<span className="text-slate-600 group-hover:text-primary text-sm transition-colors">
|
|
318
|
+
→
|
|
319
|
+
</span>
|
|
320
|
+
</a>
|
|
321
|
+
<a
|
|
322
|
+
className="flex items-center justify-between group p-2 rounded-lg hover:bg-white/5 transition-colors"
|
|
323
|
+
href="https://github.com/rossjang/nenejs"
|
|
324
|
+
target="_blank"
|
|
325
|
+
rel="noopener noreferrer"
|
|
326
|
+
>
|
|
327
|
+
<span className="text-xs text-slate-300">
|
|
328
|
+
Deployment Guide
|
|
329
|
+
</span>
|
|
330
|
+
<span className="text-slate-600 group-hover:text-primary text-sm transition-colors">
|
|
331
|
+
→
|
|
332
|
+
</span>
|
|
333
|
+
</a>
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
</main>
|
|
338
|
+
|
|
339
|
+
{/* Footer */}
|
|
340
|
+
<footer className="mt-auto w-full py-10 flex flex-col items-center border-t border-white/5">
|
|
341
|
+
<div className="flex gap-6 mb-4">
|
|
342
|
+
<a
|
|
343
|
+
className="text-slate-500 hover:text-white transition-colors text-xs"
|
|
344
|
+
href="https://github.com/rossjang/nenejs"
|
|
345
|
+
target="_blank"
|
|
346
|
+
rel="noopener noreferrer"
|
|
347
|
+
>
|
|
348
|
+
GitHub
|
|
349
|
+
</a>
|
|
350
|
+
<a
|
|
351
|
+
className="text-slate-500 hover:text-white transition-colors text-xs"
|
|
352
|
+
href="https://github.com/rossjang/nenejs"
|
|
353
|
+
target="_blank"
|
|
354
|
+
rel="noopener noreferrer"
|
|
355
|
+
>
|
|
356
|
+
Documentation
|
|
357
|
+
</a>
|
|
358
|
+
<a
|
|
359
|
+
className="text-slate-500 hover:text-white transition-colors text-xs"
|
|
360
|
+
href="https://github.com/rossjang/nenejs"
|
|
361
|
+
target="_blank"
|
|
362
|
+
rel="noopener noreferrer"
|
|
363
|
+
>
|
|
364
|
+
Changelog
|
|
365
|
+
</a>
|
|
366
|
+
</div>
|
|
367
|
+
<p className="text-slate-600 text-[10px] font-mono">
|
|
368
|
+
Edit{' '}
|
|
369
|
+
<span className="text-slate-500">apps/web/src/app/page.tsx</span> to
|
|
370
|
+
customize this page
|
|
371
|
+
</p>
|
|
372
|
+
</footer>
|
|
373
|
+
</div>
|
|
374
|
+
);
|
|
375
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Config } from 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
content: [
|
|
5
|
+
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
+
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
7
|
+
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
8
|
+
],
|
|
9
|
+
darkMode: 'class',
|
|
10
|
+
theme: {
|
|
11
|
+
extend: {
|
|
12
|
+
colors: {
|
|
13
|
+
primary: '#05b7d6',
|
|
14
|
+
'background-dark': '#0a0a0a',
|
|
15
|
+
'panel-dark': '#121212',
|
|
16
|
+
},
|
|
17
|
+
fontFamily: {
|
|
18
|
+
display: ['var(--font-inter)', 'Inter', 'sans-serif'],
|
|
19
|
+
mono: ['var(--font-jetbrains-mono)', 'JetBrains Mono', 'monospace'],
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
plugins: [],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default config;
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"target": "
|
|
4
|
-
"lib": ["dom", "dom.iterable", "
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
5
|
"allowJs": true,
|
|
6
6
|
"skipLibCheck": true,
|
|
7
7
|
"strict": true,
|
|
8
8
|
"noEmit": true,
|
|
9
9
|
"esModuleInterop": true,
|
|
10
|
-
"module": "
|
|
10
|
+
"module": "esnext",
|
|
11
11
|
"moduleResolution": "bundler",
|
|
12
12
|
"resolveJsonModule": true,
|
|
13
13
|
"isolatedModules": true,
|
|
14
|
-
"jsx": "
|
|
14
|
+
"jsx": "preserve",
|
|
15
15
|
"incremental": true,
|
|
16
|
-
"
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
17
21
|
"paths": {
|
|
18
|
-
"@/*": ["./src/*"]
|
|
19
|
-
"@server/*": ["./src/server/*"]
|
|
22
|
+
"@/*": ["./src/*"]
|
|
20
23
|
}
|
|
21
24
|
},
|
|
22
|
-
"include": ["
|
|
25
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
23
26
|
"exclude": ["node_modules"]
|
|
24
27
|
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Base URL
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
http://localhost:4000/api
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Endpoints
|
|
10
|
+
|
|
11
|
+
### Health Check
|
|
12
|
+
|
|
13
|
+
#### GET /api/health
|
|
14
|
+
|
|
15
|
+
Check if the API server is running.
|
|
16
|
+
|
|
17
|
+
**Response:**
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"status": "ok",
|
|
21
|
+
"timestamp": "2024-01-01T00:00:00.000Z",
|
|
22
|
+
"uptime": 123.456
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Root
|
|
27
|
+
|
|
28
|
+
#### GET /api
|
|
29
|
+
|
|
30
|
+
Returns a welcome message.
|
|
31
|
+
|
|
32
|
+
**Response:**
|
|
33
|
+
```
|
|
34
|
+
Welcome to the API!
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Error Handling
|
|
38
|
+
|
|
39
|
+
All errors follow this format:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"statusCode": 400,
|
|
44
|
+
"message": "Error description",
|
|
45
|
+
"error": "Bad Request"
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Authentication
|
|
50
|
+
|
|
51
|
+
(To be implemented)
|
|
52
|
+
|
|
53
|
+
## Rate Limiting
|
|
54
|
+
|
|
55
|
+
(To be implemented)
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Project Setup
|
|
2
|
+
|
|
3
|
+
- **Status**: DONE
|
|
4
|
+
- **Priority**: High
|
|
5
|
+
- **Created**: 2025-01-01
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
Initial project scaffolding with nene.js CLI.
|
|
10
|
+
|
|
11
|
+
## Checklist
|
|
12
|
+
|
|
13
|
+
- [x] Monorepo setup with Turborepo
|
|
14
|
+
- [x] Next.js frontend (apps/web)
|
|
15
|
+
- [x] NestJS backend (apps/api)
|
|
16
|
+
- [x] Shared package (packages/shared)
|
|
17
|
+
- [x] Health check endpoint
|
|
18
|
+
- [x] CORS configuration
|
|
19
|
+
- [x] Request validation with class-validator
|
|
20
|
+
- [x] Development scripts (pnpm dev)
|
|
21
|
+
|
|
22
|
+
## Notes
|
|
23
|
+
|
|
24
|
+
Project created with `npm create nene@latest`.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Kanban Board
|
|
2
|
+
|
|
3
|
+
Task management board for this project.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Status
|
|
8
|
+
|
|
9
|
+
| Status | Count |
|
|
10
|
+
| ------ | ----- |
|
|
11
|
+
| TODO | 1 |
|
|
12
|
+
| DOING | 0 |
|
|
13
|
+
| DONE | 1 |
|
|
14
|
+
|
|
15
|
+
## How It Works
|
|
16
|
+
|
|
17
|
+
Tasks are managed as markdown files in three folders:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
docs/kanban/
|
|
21
|
+
├── TODO/ # Tasks to be done
|
|
22
|
+
├── DOING/ # Tasks in progress
|
|
23
|
+
└── DONE/ # Completed tasks
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Task File Format
|
|
27
|
+
|
|
28
|
+
Each task file should follow this format:
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
# Task Title
|
|
32
|
+
|
|
33
|
+
- **Status**: TODO / DOING / DONE
|
|
34
|
+
- **Priority**: High / Medium / Low
|
|
35
|
+
- **Created**: YYYY-MM-DD
|
|
36
|
+
|
|
37
|
+
## Description
|
|
38
|
+
|
|
39
|
+
What needs to be done.
|
|
40
|
+
|
|
41
|
+
## Checklist
|
|
42
|
+
|
|
43
|
+
- [ ] Step 1
|
|
44
|
+
- [ ] Step 2
|
|
45
|
+
|
|
46
|
+
## Notes
|
|
47
|
+
|
|
48
|
+
Any relevant context or references.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Workflow
|
|
52
|
+
|
|
53
|
+
1. Create a new `.md` file in `TODO/`
|
|
54
|
+
2. When starting work, move it to `DOING/`
|
|
55
|
+
3. When finished, move it to `DONE/` and check off all items
|
|
56
|
+
4. Update the counts in this README
|
|
57
|
+
|
|
58
|
+
## Priority Order
|
|
59
|
+
|
|
60
|
+
1. `TODO/01-database-integration.md` - Database setup
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Database Integration
|
|
2
|
+
|
|
3
|
+
- **Status**: TODO
|
|
4
|
+
- **Priority**: High
|
|
5
|
+
- **Created**: 2025-01-01
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
Set up database integration for the NestJS backend. Choose and configure an ORM (e.g., Prisma, TypeORM) and connect it to a database.
|
|
10
|
+
|
|
11
|
+
## Checklist
|
|
12
|
+
|
|
13
|
+
- [ ] Choose database (PostgreSQL recommended)
|
|
14
|
+
- [ ] Install and configure ORM
|
|
15
|
+
- [ ] Set up database connection in `apps/api`
|
|
16
|
+
- [ ] Add DATABASE_URL to environment variables
|
|
17
|
+
- [ ] Create initial migration
|
|
18
|
+
- [ ] Update `docs/overview/ARCHITECTURE.md` with database details
|
|
19
|
+
- [ ] Update `docs/API.md` if new endpoints are added
|
|
20
|
+
|
|
21
|
+
## Notes
|
|
22
|
+
|
|
23
|
+
- Consider using Prisma for type-safe database access
|
|
24
|
+
- The shared package can export Prisma-generated types for frontend use
|