@kood/claude-code 0.3.7 β 0.3.9
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 +1 -1
- package/package.json +1 -1
- package/templates/.claude/agents/code-reviewer.md +138 -123
- package/templates/.claude/agents/dependency-manager.md +99 -84
- package/templates/.claude/agents/deployment-validator.md +70 -55
- package/templates/.claude/agents/git-operator.md +78 -63
- package/templates/.claude/agents/implementation-executor.md +109 -94
- package/templates/.claude/agents/ko-to-en-translator.md +74 -0
- package/templates/.claude/agents/lint-fixer.md +93 -78
- package/templates/.claude/agents/refactor-advisor.md +136 -121
- package/templates/.claude/commands/agent-creator.md +199 -184
- package/templates/.claude/commands/bug-fix.md +207 -192
- package/templates/.claude/commands/command-creator.md +69 -53
- package/templates/.claude/commands/docs-creator.md +72 -56
- package/templates/.claude/commands/docs-refactor.md +41 -25
- package/templates/.claude/commands/execute.md +27 -11
- package/templates/.claude/commands/git-all.md +46 -31
- package/templates/.claude/commands/git-session.md +57 -41
- package/templates/.claude/commands/git.md +49 -33
- package/templates/.claude/commands/lint-fix.md +153 -137
- package/templates/.claude/commands/lint-init.md +76 -60
- package/templates/.claude/commands/plan.md +275 -259
- package/templates/.claude/commands/prd.md +39 -23
- package/templates/.claude/commands/pre-deploy.md +124 -108
- package/templates/.claude/commands/refactor.md +162 -146
- package/templates/.claude/commands/version-update.md +32 -16
- package/templates/hono/CLAUDE.md +28 -27
- package/templates/hono/docs/architecture.md +24 -24
- package/templates/hono/docs/deployment/cloudflare.md +18 -18
- package/templates/hono/docs/deployment/docker.md +13 -13
- package/templates/hono/docs/deployment/index.md +19 -19
- package/templates/hono/docs/deployment/railway.md +32 -32
- package/templates/hono/docs/deployment/vercel.md +29 -29
- package/templates/hono/docs/guides/conventions.md +57 -57
- package/templates/hono/docs/guides/env-setup.md +47 -47
- package/templates/hono/docs/guides/getting-started.md +27 -27
- package/templates/hono/docs/library/hono/error-handling.md +11 -11
- package/templates/hono/docs/library/hono/index.md +4 -4
- package/templates/hono/docs/library/hono/middleware.md +18 -18
- package/templates/hono/docs/library/hono/rpc.md +7 -7
- package/templates/hono/docs/library/hono/validation.md +6 -6
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +29 -29
- package/templates/hono/docs/library/prisma/config.md +16 -16
- package/templates/hono/docs/library/prisma/index.md +32 -32
- package/templates/hono/docs/library/t3-env/index.md +22 -22
- package/templates/hono/docs/library/zod/index.md +31 -31
- package/templates/nextjs/CLAUDE.md +54 -51
- package/templates/nextjs/docs/architecture.md +812 -0
- package/templates/nextjs/docs/design.md +183 -183
- package/templates/nextjs/docs/guides/conventions.md +86 -86
- package/templates/nextjs/docs/guides/getting-started.md +28 -28
- package/templates/nextjs/docs/guides/routes.md +32 -32
- package/templates/nextjs/docs/library/better-auth/index.md +70 -70
- package/templates/nextjs/docs/library/nextjs/app-router.md +43 -43
- package/templates/nextjs/docs/library/nextjs/caching.md +73 -73
- package/templates/nextjs/docs/library/nextjs/index.md +51 -51
- package/templates/nextjs/docs/library/nextjs/middleware.md +41 -41
- package/templates/nextjs/docs/library/nextjs/route-handlers.md +31 -31
- package/templates/nextjs/docs/library/nextjs/server-actions.md +34 -34
- package/templates/nextjs/docs/library/prisma/cloudflare-d1.md +20 -20
- package/templates/nextjs/docs/library/prisma/config.md +18 -18
- package/templates/nextjs/docs/library/prisma/crud.md +17 -17
- package/templates/nextjs/docs/library/prisma/index.md +18 -18
- package/templates/nextjs/docs/library/prisma/relations.md +16 -16
- package/templates/nextjs/docs/library/prisma/schema.md +23 -23
- package/templates/nextjs/docs/library/prisma/setup.md +6 -6
- package/templates/nextjs/docs/library/prisma/transactions.md +10 -10
- package/templates/nextjs/docs/library/tanstack-query/index.md +6 -6
- package/templates/nextjs/docs/library/tanstack-query/invalidation.md +20 -20
- package/templates/nextjs/docs/library/tanstack-query/optimistic-updates.md +4 -4
- package/templates/nextjs/docs/library/tanstack-query/use-mutation.md +15 -15
- package/templates/nextjs/docs/library/tanstack-query/use-query.md +22 -22
- package/templates/nextjs/docs/library/zod/complex-types.md +11 -11
- package/templates/nextjs/docs/library/zod/index.md +8 -8
- package/templates/nextjs/docs/library/zod/transforms.md +11 -11
- package/templates/nextjs/docs/library/zod/validation.md +9 -9
- package/templates/npx/CLAUDE.md +38 -37
- package/templates/npx/docs/library/commander/index.md +12 -12
- package/templates/npx/docs/library/fs-extra/index.md +9 -9
- package/templates/npx/docs/library/prompts/index.md +3 -3
- package/templates/npx/docs/references/patterns.md +12 -12
- package/templates/tanstack-start/CLAUDE.md +54 -53
- package/templates/tanstack-start/docs/architecture.md +128 -128
- package/templates/tanstack-start/docs/design.md +169 -169
- package/templates/tanstack-start/docs/guides/conventions.md +43 -43
- package/templates/tanstack-start/docs/guides/env-setup.md +35 -35
- package/templates/tanstack-start/docs/guides/getting-started.md +19 -19
- package/templates/tanstack-start/docs/guides/hooks.md +45 -45
- package/templates/tanstack-start/docs/guides/routes.md +54 -54
- package/templates/tanstack-start/docs/guides/services.md +45 -45
- package/templates/tanstack-start/docs/library/better-auth/index.md +68 -68
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +19 -19
- package/templates/tanstack-start/docs/library/prisma/config.md +16 -16
- package/templates/tanstack-start/docs/library/prisma/crud.md +17 -17
- package/templates/tanstack-start/docs/library/prisma/index.md +17 -17
- package/templates/tanstack-start/docs/library/prisma/relations.md +16 -16
- package/templates/tanstack-start/docs/library/prisma/schema.md +23 -23
- package/templates/tanstack-start/docs/library/prisma/setup.md +6 -6
- package/templates/tanstack-start/docs/library/prisma/transactions.md +10 -10
- package/templates/tanstack-start/docs/library/t3-env/index.md +21 -160
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +6 -6
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +19 -19
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +4 -4
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +14 -14
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +21 -21
- package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +9 -9
- package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +11 -11
- package/templates/tanstack-start/docs/library/tanstack-router/index.md +18 -18
- package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +17 -17
- package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +5 -5
- package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +10 -10
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +8 -8
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +15 -15
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +9 -9
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +6 -6
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +18 -18
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +4 -4
- package/templates/tanstack-start/docs/library/zod/complex-types.md +11 -11
- package/templates/tanstack-start/docs/library/zod/index.md +8 -8
- package/templates/tanstack-start/docs/library/zod/transforms.md +11 -11
- package/templates/tanstack-start/docs/library/zod/validation.md +9 -9
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# t3-env - Type-Safe Environment Variables
|
|
2
2
|
|
|
3
|
-
> Zod
|
|
3
|
+
> Zod-based type-safe environment variable management
|
|
4
4
|
|
|
5
5
|
<context>
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Purpose:** Server environment variable validation, runtime type safety
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
- Transform &
|
|
12
|
-
-
|
|
13
|
-
-
|
|
9
|
+
**Features:**
|
|
10
|
+
- Validation + type inference with Zod schemas
|
|
11
|
+
- Transform & default value support
|
|
12
|
+
- Runtime validation
|
|
13
|
+
- Framework agnostic
|
|
14
14
|
|
|
15
15
|
</context>
|
|
16
16
|
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
|
|
19
19
|
<forbidden>
|
|
20
20
|
|
|
21
|
-
|
|
|
22
|
-
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
21
|
+
| Category | Prohibited |
|
|
22
|
+
|----------|------------|
|
|
23
|
+
| **Direct Access** | Using `process.env` directly (env object required) |
|
|
24
|
+
| **Types** | Accessing env variables with any type |
|
|
25
|
+
| **Bypass Validation** | Using environment variables without schema definition |
|
|
26
26
|
|
|
27
27
|
</forbidden>
|
|
28
28
|
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
|
|
31
31
|
<required>
|
|
32
32
|
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
|
36
|
-
|
|
|
33
|
+
| Category | Required |
|
|
34
|
+
|----------|----------|
|
|
35
|
+
| **Installation** | `@t3-oss/env-core zod` |
|
|
36
|
+
| **Structure** | Create `src/env.ts` file |
|
|
37
37
|
| **Import** | `import { env } from '@/env'` |
|
|
38
38
|
|
|
39
39
|
</required>
|
|
@@ -114,7 +114,7 @@ import { env } from '@/env'
|
|
|
114
114
|
|
|
115
115
|
export const prisma = new PrismaClient({
|
|
116
116
|
datasourceUrl: env.DATABASE_URL,
|
|
117
|
-
// ^? string (
|
|
117
|
+
// ^? string (type-safe)
|
|
118
118
|
})
|
|
119
119
|
```
|
|
120
120
|
|
|
@@ -329,7 +329,7 @@ import { createMiddleware } from 'hono/factory'
|
|
|
329
329
|
import { env } from '@/env'
|
|
330
330
|
|
|
331
331
|
export const envMiddleware = createMiddleware(async (c, next) => {
|
|
332
|
-
// env
|
|
332
|
+
// Check if env object is initialized
|
|
333
333
|
if (!env.DATABASE_URL) {
|
|
334
334
|
return c.json({ error: 'Server misconfigured' }, 500)
|
|
335
335
|
}
|
|
@@ -363,10 +363,10 @@ app.use(
|
|
|
363
363
|
|
|
364
364
|
## Tips
|
|
365
365
|
|
|
366
|
-
|
|
|
367
|
-
|
|
368
|
-
| **Cloudflare** | `createWorkerEnv(env)`
|
|
369
|
-
| **Monorepo** |
|
|
366
|
+
| Scenario | Method |
|
|
367
|
+
|----------|--------|
|
|
368
|
+
| **Cloudflare** | Use `createWorkerEnv(env)` pattern |
|
|
369
|
+
| **Monorepo** | Separate `env.ts` per package |
|
|
370
370
|
| **Testing** | `.env.test` + `NODE_ENV=test` |
|
|
371
371
|
| **Docker** | `docker run -e DATABASE_URL=...` |
|
|
372
372
|
| **CI/CD** | GitHub Secrets β Environment Variables |
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# Zod v4 - Schema Validation
|
|
2
2
|
|
|
3
|
-
> TypeScript-first
|
|
3
|
+
> TypeScript-first schema validation
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Version Notice
|
|
8
8
|
|
|
9
9
|
```typescript
|
|
10
|
-
// β
v4
|
|
10
|
+
// β
v4 syntax
|
|
11
11
|
z.email()
|
|
12
12
|
z.url()
|
|
13
13
|
z.uuid()
|
|
14
14
|
|
|
15
|
-
// β v3
|
|
15
|
+
// β v3 syntax (prohibited)
|
|
16
16
|
z.string().email()
|
|
17
17
|
z.string().url()
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Installation
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
npm install zod
|
|
@@ -27,7 +27,7 @@ npm install zod
|
|
|
27
27
|
|
|
28
28
|
---
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Basic Types
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
33
|
import { z } from 'zod'
|
|
@@ -40,28 +40,28 @@ z.undefined()
|
|
|
40
40
|
z.null()
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
###
|
|
43
|
+
### Strings (v4)
|
|
44
44
|
|
|
45
45
|
```typescript
|
|
46
|
-
z.email() //
|
|
46
|
+
z.email() // Email
|
|
47
47
|
z.url() // URL
|
|
48
48
|
z.uuid() // UUID
|
|
49
|
-
z.string().min(1).max(100) //
|
|
50
|
-
z.string().trim() //
|
|
51
|
-
z.string().regex(/^[a-z]+$/) //
|
|
49
|
+
z.string().min(1).max(100) // Length
|
|
50
|
+
z.string().trim() // Trim whitespace
|
|
51
|
+
z.string().regex(/^[a-z]+$/) // Regex
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
###
|
|
54
|
+
### Numbers
|
|
55
55
|
|
|
56
56
|
```typescript
|
|
57
|
-
z.number().int() //
|
|
58
|
-
z.number().positive() //
|
|
57
|
+
z.number().int() // Integer
|
|
58
|
+
z.number().positive() // Positive
|
|
59
59
|
z.number().min(1).max(100)
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
---
|
|
63
63
|
|
|
64
|
-
##
|
|
64
|
+
## Objects
|
|
65
65
|
|
|
66
66
|
```typescript
|
|
67
67
|
const userSchema = z.object({
|
|
@@ -82,7 +82,7 @@ z.string().nullable() // string | null
|
|
|
82
82
|
z.string().nullish() // string | null | undefined
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
###
|
|
85
|
+
### Defaults
|
|
86
86
|
|
|
87
87
|
```typescript
|
|
88
88
|
z.string().default('Anonymous')
|
|
@@ -92,8 +92,8 @@ z.enum(['user', 'admin']).default('user')
|
|
|
92
92
|
### Partial / Pick / Omit
|
|
93
93
|
|
|
94
94
|
```typescript
|
|
95
|
-
userSchema.partial() //
|
|
96
|
-
userSchema.partial({ email: true }) //
|
|
95
|
+
userSchema.partial() // All fields optional
|
|
96
|
+
userSchema.partial({ email: true }) // Specific fields only
|
|
97
97
|
userSchema.pick({ id: true, name: true })
|
|
98
98
|
userSchema.omit({ password: true })
|
|
99
99
|
```
|
|
@@ -118,7 +118,7 @@ z.discriminatedUnion('type', [
|
|
|
118
118
|
|
|
119
119
|
---
|
|
120
120
|
|
|
121
|
-
## Coerce (
|
|
121
|
+
## Coerce (Type Conversion)
|
|
122
122
|
|
|
123
123
|
```typescript
|
|
124
124
|
z.coerce.number() // string β number
|
|
@@ -137,27 +137,27 @@ z.string().transform((s) => s.split(','))
|
|
|
137
137
|
|
|
138
138
|
---
|
|
139
139
|
|
|
140
|
-
## Refine (
|
|
140
|
+
## Refine (Custom Validation)
|
|
141
141
|
|
|
142
142
|
```typescript
|
|
143
|
-
//
|
|
143
|
+
// Single field
|
|
144
144
|
z.string().refine((val) => val.length >= 8, {
|
|
145
|
-
message: '8
|
|
145
|
+
message: 'Must be at least 8 characters',
|
|
146
146
|
})
|
|
147
147
|
|
|
148
|
-
//
|
|
148
|
+
// Entire object
|
|
149
149
|
z.object({
|
|
150
150
|
password: z.string().min(8),
|
|
151
151
|
confirmPassword: z.string(),
|
|
152
152
|
}).refine((data) => data.password === data.confirmPassword, {
|
|
153
|
-
message: '
|
|
153
|
+
message: 'Passwords do not match',
|
|
154
154
|
path: ['confirmPassword'],
|
|
155
155
|
})
|
|
156
156
|
```
|
|
157
157
|
|
|
158
158
|
---
|
|
159
159
|
|
|
160
|
-
##
|
|
160
|
+
## Error Handling
|
|
161
161
|
|
|
162
162
|
```typescript
|
|
163
163
|
const result = schema.safeParse(input)
|
|
@@ -170,16 +170,16 @@ if (result.success) {
|
|
|
170
170
|
}
|
|
171
171
|
```
|
|
172
172
|
|
|
173
|
-
###
|
|
173
|
+
### Custom Errors
|
|
174
174
|
|
|
175
175
|
```typescript
|
|
176
|
-
z.email({ message: '
|
|
177
|
-
z.string().min(1, { message: '
|
|
176
|
+
z.email({ message: 'Please enter a valid email' })
|
|
177
|
+
z.string().min(1, { message: 'Required field' })
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
---
|
|
181
181
|
|
|
182
|
-
## Hono
|
|
182
|
+
## Usage with Hono
|
|
183
183
|
|
|
184
184
|
```typescript
|
|
185
185
|
import { zValidator } from '@hono/zod-validator'
|
|
@@ -204,6 +204,6 @@ app.post('/users',
|
|
|
204
204
|
|
|
205
205
|
---
|
|
206
206
|
|
|
207
|
-
##
|
|
207
|
+
## Related Documentation
|
|
208
208
|
|
|
209
|
-
- [Hono
|
|
209
|
+
- [Hono Validation](../hono/validation.md)
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
<context>
|
|
6
6
|
|
|
7
|
-
**Purpose:** Next.js App Router
|
|
7
|
+
**Purpose:** Next.js App Router-based web application development guidelines
|
|
8
8
|
|
|
9
|
-
**Scope:** Full-stack React
|
|
9
|
+
**Scope:** Full-stack React application implementation
|
|
10
10
|
|
|
11
11
|
**Key Features:**
|
|
12
12
|
- App Router (file-based routing)
|
|
13
|
-
- Server Actions (
|
|
13
|
+
- Server Actions (type-safe API)
|
|
14
14
|
- Server/Client Components
|
|
15
15
|
- Route Handlers (REST API)
|
|
16
16
|
- Middleware
|
|
17
|
-
- Built-in Optimization (
|
|
17
|
+
- Built-in Optimization (images, fonts, scripts)
|
|
18
18
|
- Deployment (Vercel, Docker, Node.js)
|
|
19
19
|
|
|
20
20
|
</context>
|
|
@@ -35,14 +35,14 @@
|
|
|
35
35
|
|
|
36
36
|
<forbidden>
|
|
37
37
|
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
| **Git
|
|
41
|
-
| **Prisma** | `db push/migrate/generate
|
|
42
|
-
| **Server Actions** |
|
|
43
|
-
| **Route Handlers** | `/app/api
|
|
44
|
-
|
|
|
45
|
-
|
|
|
38
|
+
| Category | Forbidden Actions |
|
|
39
|
+
|----------|-------------------|
|
|
40
|
+
| **Git Commits** | AI markers (`Generated with Claude Code`, `π€`, `Co-Authored-By:`), multi-line messages, emojis |
|
|
41
|
+
| **Prisma** | Auto-running `db push/migrate/generate`, unauthorized `schema.prisma` modifications |
|
|
42
|
+
| **Server Actions** | Direct definition in client components, usage without try-catch, missing Zod validation (POST/PUT/PATCH) |
|
|
43
|
+
| **Route Handlers** | Creation outside `/app/api/`, creation when Server Actions are suitable |
|
|
44
|
+
| **Client** | Direct Server Action calls (use TanStack Query), missing `"use client"` |
|
|
45
|
+
| **Code Search** | Bash grep/rg/find commands (use ast-grep or dedicated tools) |
|
|
46
46
|
|
|
47
47
|
</forbidden>
|
|
48
48
|
|
|
@@ -50,17 +50,18 @@
|
|
|
50
50
|
|
|
51
51
|
<required>
|
|
52
52
|
|
|
53
|
-
|
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
| **
|
|
60
|
-
|
|
|
61
|
-
| **
|
|
62
|
-
|
|
|
63
|
-
| **
|
|
53
|
+
| Task | Required Actions |
|
|
54
|
+
|------|------------------|
|
|
55
|
+
| **Before Starting** | Read relevant docs (UI β design, API β nextjs, DB β prisma, auth β next-auth) |
|
|
56
|
+
| **Document Search** | Use serena mcp (document indexing/search, context length optimization) |
|
|
57
|
+
| **Code Search** | Use ast-grep (function/component/pattern search) |
|
|
58
|
+
| **Complex Tasks** | Sequential Thinking MCP (5+ step tasks) |
|
|
59
|
+
| **Large Changes** | gemini-review (3+ file changes, architectural decisions) |
|
|
60
|
+
| **Server Actions** | `"use server"` declaration, Zod validation (POST/PUT/PATCH), try-catch + revalidatePath/redirect |
|
|
61
|
+
| **Client API** | Call Server Actions via TanStack Query (`useQuery`/`useMutation`) |
|
|
62
|
+
| **Custom Hook Order** | State β Global Hooks (useParams, useRouter, useSearchParams) β React Query β Handlers β Memo β Effect |
|
|
63
|
+
| **Code Writing** | UTF-8 encoding, Korean comments per code block, const function declarations |
|
|
64
|
+
| **Prisma** | Multi-File structure (`prisma/schema/`), Korean comments required for all elements |
|
|
64
65
|
|
|
65
66
|
</required>
|
|
66
67
|
|
|
@@ -68,15 +69,15 @@
|
|
|
68
69
|
|
|
69
70
|
<tech_stack>
|
|
70
71
|
|
|
71
|
-
|
|
|
72
|
-
|
|
73
|
-
| Next.js | **15.x** | App Router
|
|
72
|
+
| Technology | Version | Note |
|
|
73
|
+
|------------|---------|------|
|
|
74
|
+
| Next.js | **15.x** | App Router only |
|
|
74
75
|
| React | **19.x** | Server Components |
|
|
75
76
|
| TypeScript | 5.x | strict |
|
|
76
77
|
| Tailwind CSS | 4.x | @theme |
|
|
77
|
-
| Prisma | **7.x** | `prisma-client`, output
|
|
78
|
+
| Prisma | **7.x** | `prisma-client`, output required |
|
|
78
79
|
| Zod | **4.x** | `z.email()`, `z.url()` |
|
|
79
|
-
| NextAuth.js | **5.x** (Auth.js) | App Router
|
|
80
|
+
| NextAuth.js | **5.x** (Auth.js) | App Router support |
|
|
80
81
|
| TanStack Query | 5.x | - |
|
|
81
82
|
|
|
82
83
|
</tech_stack>
|
|
@@ -91,39 +92,41 @@ src/
|
|
|
91
92
|
β βββ page.tsx # Home page
|
|
92
93
|
β βββ [slug]/
|
|
93
94
|
β β βββ page.tsx # Dynamic route
|
|
94
|
-
β β
|
|
95
|
+
β β βββ _components/ # Page-specific components (required)
|
|
96
|
+
β β βββ _hooks/ # Page-specific hooks (required)
|
|
97
|
+
β β βββ _actions/ # Page-specific Server Actions (required)
|
|
95
98
|
β βββ api/
|
|
96
99
|
β β βββ [endpoint]/
|
|
97
100
|
β β βββ route.ts # Route Handler (REST API)
|
|
98
|
-
β βββ
|
|
99
|
-
βββ
|
|
100
|
-
βββ components/ui/ # UI μ»΄ν¬λνΈ (Server Components)
|
|
101
|
+
β βββ _actions/ # Shared Server Actions
|
|
102
|
+
βββ components/ui/ # Shared UI components (Server Components)
|
|
101
103
|
βββ middleware.ts # Middleware
|
|
102
104
|
βββ database/prisma.ts
|
|
103
105
|
βββ lib/
|
|
104
106
|
```
|
|
105
107
|
|
|
106
|
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
- Server
|
|
110
|
-
-
|
|
108
|
+
**Required Rules:**
|
|
109
|
+
- Each page MUST have `_components/`, `_hooks/`, `_actions/` folders (regardless of line count)
|
|
110
|
+
- Custom Hooks MUST be separated into `_hooks/` folder regardless of page size
|
|
111
|
+
- Server Components by default β use `"use client"` only when necessary
|
|
112
|
+
- Server Actions: global (`app/_actions/`) or page-specific (`[route]/_actions/`)
|
|
113
|
+
- Route Handlers only in `/app/api/` path
|
|
111
114
|
</structure>
|
|
112
115
|
|
|
113
116
|
---
|
|
114
117
|
|
|
115
118
|
<conventions>
|
|
116
119
|
|
|
117
|
-
|
|
118
|
-
TypeScript: const
|
|
119
|
-
Import
|
|
120
|
+
File names: kebab-case, Routes: `page.tsx`, `layout.tsx`, `[slug]/page.tsx`
|
|
121
|
+
TypeScript: const declarations, explicit return types, interface (objects)/type (unions), anyβunknown
|
|
122
|
+
Import order: external β @/ β relative β type
|
|
120
123
|
|
|
121
124
|
Prisma Multi-File:
|
|
122
125
|
```
|
|
123
126
|
prisma/schema/
|
|
124
127
|
βββ +base.prisma # datasource, generator
|
|
125
128
|
βββ +enum.prisma # enum
|
|
126
|
-
βββ [model].prisma #
|
|
129
|
+
βββ [model].prisma # per model (Korean comments required!)
|
|
127
130
|
```
|
|
128
131
|
|
|
129
132
|
</conventions>
|
|
@@ -133,7 +136,7 @@ prisma/schema/
|
|
|
133
136
|
<quick_patterns>
|
|
134
137
|
|
|
135
138
|
```typescript
|
|
136
|
-
// Server Action (
|
|
139
|
+
// Server Action (file top)
|
|
137
140
|
"use server"
|
|
138
141
|
|
|
139
142
|
export async function createPost(formData: FormData) {
|
|
@@ -147,7 +150,7 @@ export async function createPost(formData: FormData) {
|
|
|
147
150
|
return post
|
|
148
151
|
}
|
|
149
152
|
|
|
150
|
-
// Server Action (
|
|
153
|
+
// Server Action (with auth)
|
|
151
154
|
"use server"
|
|
152
155
|
|
|
153
156
|
import { auth } from "@/lib/auth"
|
|
@@ -206,12 +209,12 @@ export default async function PostsPage() {
|
|
|
206
209
|
|
|
207
210
|
<ui_ux>
|
|
208
211
|
|
|
209
|
-
|
|
|
210
|
-
|
|
211
|
-
|
|
|
212
|
-
|
|
|
213
|
-
|
|
|
214
|
-
|
|
|
212
|
+
| Principle | Value |
|
|
213
|
+
|-----------|-------|
|
|
214
|
+
| Color | 60-30-10 (background-secondary-accent) |
|
|
215
|
+
| Spacing | 8px grid |
|
|
216
|
+
| Accessibility | WCAG AA (contrast 4.5:1+) |
|
|
217
|
+
| Fonts | 2-3 types |
|
|
215
218
|
| Safe Area | tailwindcss-safe-area |
|
|
216
219
|
|
|
217
220
|
</ui_ux>
|
|
@@ -221,8 +224,8 @@ export default async function PostsPage() {
|
|
|
221
224
|
<docs_structure>
|
|
222
225
|
```
|
|
223
226
|
docs/
|
|
224
|
-
βββ guides/ #
|
|
227
|
+
βββ guides/ # Getting started, conventions, patterns
|
|
225
228
|
βββ library/ # nextjs, prisma, next-auth, tanstack-query, zod
|
|
226
|
-
βββ design.md # UI/UX
|
|
229
|
+
βββ design.md # UI/UX guide
|
|
227
230
|
```
|
|
228
231
|
</docs_structure>
|