@kood/claude-code 0.1.6 → 0.1.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 +109 -216
- package/package.json +8 -2
- package/templates/hono/CLAUDE.md +59 -328
- package/templates/hono/docs/architecture/architecture.md +93 -747
- package/templates/hono/docs/deployment/cloudflare.md +59 -513
- package/templates/hono/docs/deployment/docker.md +41 -356
- package/templates/hono/docs/deployment/index.md +54 -190
- package/templates/hono/docs/deployment/railway.md +36 -306
- package/templates/hono/docs/deployment/vercel.md +49 -434
- package/templates/hono/docs/library/ai-sdk/index.md +53 -290
- package/templates/hono/docs/library/ai-sdk/openrouter.md +19 -387
- package/templates/hono/docs/library/ai-sdk/providers.md +28 -394
- package/templates/hono/docs/library/ai-sdk/streaming.md +52 -353
- package/templates/hono/docs/library/ai-sdk/structured-output.md +63 -395
- package/templates/hono/docs/library/ai-sdk/tools.md +62 -431
- package/templates/hono/docs/library/hono/env-setup.md +24 -313
- package/templates/hono/docs/library/hono/error-handling.md +34 -295
- package/templates/hono/docs/library/hono/index.md +29 -121
- package/templates/hono/docs/library/hono/middleware.md +21 -188
- package/templates/hono/docs/library/hono/rpc.md +40 -341
- package/templates/hono/docs/library/hono/validation.md +35 -195
- package/templates/hono/docs/library/pino/index.md +42 -333
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +64 -367
- package/templates/hono/docs/library/prisma/config.md +19 -260
- package/templates/hono/docs/library/prisma/index.md +67 -320
- package/templates/hono/docs/library/zod/index.md +53 -257
- package/templates/npx/CLAUDE.md +62 -274
- package/templates/npx/docs/references/patterns.md +160 -0
- package/templates/tanstack-start/CLAUDE.md +100 -256
- package/templates/tanstack-start/docs/architecture/architecture.md +44 -589
- package/templates/tanstack-start/docs/deployment/cloudflare.md +37 -424
- package/templates/tanstack-start/docs/deployment/index.md +57 -286
- package/templates/tanstack-start/docs/deployment/nitro.md +36 -318
- package/templates/tanstack-start/docs/deployment/railway.md +40 -409
- package/templates/tanstack-start/docs/deployment/vercel.md +43 -465
- package/templates/tanstack-start/docs/design/components.md +77 -311
- package/templates/tanstack-start/docs/design/index.md +113 -69
- package/templates/tanstack-start/docs/design/safe-area.md +51 -250
- package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
- package/templates/tanstack-start/docs/guides/conventions.md +103 -0
- package/templates/tanstack-start/docs/guides/env-setup.md +34 -340
- package/templates/tanstack-start/docs/guides/getting-started.md +22 -209
- package/templates/tanstack-start/docs/guides/hooks.md +166 -0
- package/templates/tanstack-start/docs/guides/routes.md +166 -0
- package/templates/tanstack-start/docs/guides/services.md +143 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
- package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
- package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
- package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
- package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
- package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
- package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
- package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
- package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
- package/templates/tanstack-start/docs/library/prisma/setup.md +12 -112
- package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +26 -97
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +34 -246
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
- package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
- package/templates/tanstack-start/docs/library/zod/index.md +31 -144
- package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
- package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
- package/templates/hono/docs/commands/git.md +0 -145
- package/templates/hono/docs/mcp/context7.md +0 -106
- package/templates/hono/docs/mcp/index.md +0 -176
- package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
- package/templates/hono/docs/mcp/serena.md +0 -269
- package/templates/hono/docs/mcp/sgrep.md +0 -105
- package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
- package/templates/npx/docs/commands/git.md +0 -145
- package/templates/npx/docs/mcp/index.md +0 -60
- package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
- package/templates/tanstack-start/docs/commands/git.md +0 -145
- package/templates/tanstack-start/docs/design/accessibility.md +0 -433
- package/templates/tanstack-start/docs/design/color.md +0 -235
- package/templates/tanstack-start/docs/design/spacing.md +0 -341
- package/templates/tanstack-start/docs/design/typography.md +0 -324
- package/templates/tanstack-start/docs/guides/best-practices.md +0 -950
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +0 -303
- package/templates/tanstack-start/docs/guides/prettier.md +0 -189
- package/templates/tanstack-start/docs/guides/project-templates.md +0 -710
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +0 -107
- package/templates/tanstack-start/docs/library/zod/basic-types.md +0 -186
- package/templates/tanstack-start/docs/mcp/context7.md +0 -204
- package/templates/tanstack-start/docs/mcp/index.md +0 -177
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
- package/templates/tanstack-start/docs/mcp/serena.md +0 -269
- package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +0 -292
|
@@ -1,315 +1,159 @@
|
|
|
1
|
-
# CLAUDE.md -
|
|
1
|
+
# CLAUDE.md - TanStack Start + React 작업 지침
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Instructions
|
|
4
|
+
@../../commands/git.md
|
|
5
|
+
@docs/library/tanstack-start/index.md
|
|
6
|
+
@docs/library/prisma/index.md
|
|
7
|
+
@docs/library/better-auth/index.md
|
|
8
|
+
@docs/library/tanstack-query/index.md
|
|
9
|
+
@docs/library/zod/index.md
|
|
10
|
+
@docs/design/index.md
|
|
4
11
|
|
|
5
12
|
---
|
|
6
13
|
|
|
7
|
-
##
|
|
14
|
+
## ⛔ NEVER DO
|
|
8
15
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
│ 특히 ⛔ NEVER DO 섹션의 규칙은 절대 위반하지 마세요. │
|
|
13
|
-
│ │
|
|
14
|
-
│ 📖 작업 유형별 상세 문서: docs/ 폴더 참조 │
|
|
15
|
-
└─────────────────────────────────────────────────────────────┘
|
|
16
|
-
```
|
|
16
|
+
### Git 커밋
|
|
17
|
+
- AI 표시 금지: "Generated with Claude Code", "🤖", "Co-Authored-By:" 포함 불가
|
|
18
|
+
- 커밋 메시지: 한 줄만, 이모지 금지
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
### Prisma
|
|
21
|
+
- 자동 실행 금지: `prisma db push/migrate/generate`
|
|
22
|
+
- `schema.prisma` 임의 변경 금지
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
❌ "🤖" 또는 AI 관련 이모지 포함 금지
|
|
26
|
-
❌ "Co-Authored-By:" 헤더 포함 금지
|
|
27
|
-
❌ AI/봇이 작성했다는 어떤 표시도 금지
|
|
28
|
-
❌ 커밋 메시지 여러 줄 작성 금지
|
|
29
|
-
❌ 커밋 메시지에 이모지 사용 금지
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Prisma 금지 사항
|
|
33
|
-
```
|
|
34
|
-
❌ prisma db push 자동 실행 금지
|
|
35
|
-
❌ prisma migrate 자동 실행 금지
|
|
36
|
-
❌ prisma generate 자동 실행 금지
|
|
37
|
-
❌ schema.prisma 임의 변경 금지 (요청된 것만)
|
|
38
|
-
```
|
|
24
|
+
### API 구현
|
|
25
|
+
- `/api` 라우터 생성 금지 (명시 요청 제외)
|
|
26
|
+
- Server Function: POST/PUT/PATCH → `inputValidator` 필수, 인증 필요 시 → `middleware` 필수
|
|
27
|
+
- handler 내부에서 수동 검증/인증 체크 금지
|
|
28
|
+
- 클라이언트에서 Server Function 직접 호출 금지 → TanStack Query 필수
|
|
39
29
|
|
|
40
|
-
###
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
❌ 클라이언트에서 Server Function 직접 호출 금지 → TanStack Query 필수
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 코드 검색 금지 사항
|
|
51
|
-
```
|
|
52
|
-
❌ grep, rg 등 기본 검색 도구 사용 금지
|
|
53
|
-
❌ find 명령어로 코드 검색 금지
|
|
54
|
-
✅ 코드베이스 검색 시 sgrep 사용 필수
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Custom Hook 순서 금지 사항
|
|
58
|
-
```
|
|
59
|
-
❌ Custom Hook 내부 순서 무시 금지
|
|
60
|
-
✅ 반드시 아래 순서 준수:
|
|
61
|
-
1. State (useState, zustand store)
|
|
62
|
-
2. Global Hooks (useParams, useNavigate, useQueryClient 등)
|
|
63
|
-
3. React Query (useQuery → useMutation 순서)
|
|
64
|
-
4. Event Handlers & Functions
|
|
65
|
-
5. useMemo
|
|
66
|
-
6. useEffect
|
|
67
|
-
```
|
|
30
|
+
### Custom Hook 순서
|
|
31
|
+
1. State (useState, zustand)
|
|
32
|
+
2. Global Hooks (useParams, useNavigate, useQueryClient)
|
|
33
|
+
3. React Query (useQuery → useMutation)
|
|
34
|
+
4. Event Handlers
|
|
35
|
+
5. useMemo
|
|
36
|
+
6. useEffect
|
|
68
37
|
|
|
69
|
-
### 코드 작성
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
✅ 코드 묶음 단위로 한글 주석 작성 (너무 세세하게 X)
|
|
73
|
-
✅ Prisma Multi-File 모든 요소에 한글 주석 필수
|
|
74
|
-
```
|
|
38
|
+
### 코드 작성
|
|
39
|
+
- UTF-8 인코딩, 코드 묶음 단위 한글 주석
|
|
40
|
+
- Prisma Multi-File: 모든 요소에 한글 주석 필수
|
|
75
41
|
|
|
76
|
-
### Prisma Multi-File 구조
|
|
42
|
+
### Prisma Multi-File 구조
|
|
77
43
|
```
|
|
78
|
-
prisma/
|
|
79
|
-
├──
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
│ ├── user.prisma # User 모델
|
|
83
|
-
│ ├── post.prisma # Post 모델
|
|
84
|
-
│ └── ... # 기타 모델별 파일
|
|
44
|
+
prisma/schema/
|
|
45
|
+
├── +base.prisma # datasource, generator
|
|
46
|
+
├── +enum.prisma # 모든 enum
|
|
47
|
+
└── [model].prisma # 모델별 파일
|
|
85
48
|
```
|
|
86
49
|
|
|
87
50
|
---
|
|
88
51
|
|
|
89
|
-
## ✅ ALWAYS DO
|
|
52
|
+
## ✅ ALWAYS DO
|
|
90
53
|
|
|
91
|
-
###
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
54
|
+
### 작업 전 문서 읽기
|
|
55
|
+
| 작업 | 문서 |
|
|
56
|
+
|------|------|
|
|
57
|
+
| UI | docs/design/ |
|
|
58
|
+
| API | docs/library/tanstack-start/ |
|
|
59
|
+
| DB | docs/library/prisma/ |
|
|
60
|
+
| 인증 | docs/library/better-auth/ |
|
|
98
61
|
|
|
99
|
-
###
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
103
|
-
라이브러리 문서 → Context7 사용
|
|
104
|
-
```
|
|
105
|
-
**상세**: `docs/mcp/` 참고
|
|
106
|
-
|
|
107
|
-
### 3. 복잡한 작업 시: Gemini Review 실행
|
|
108
|
-
```
|
|
109
|
-
아키텍처 설계/변경 → gemini-review (architecture)
|
|
110
|
-
구현 계획 검증 → gemini-review (plan)
|
|
111
|
-
복잡한 코드 리뷰 → gemini-review (code)
|
|
112
|
-
```
|
|
62
|
+
### MCP 도구
|
|
63
|
+
- 분석/디버깅: Sequential Thinking
|
|
64
|
+
- 라이브러리 문서: Context7
|
|
113
65
|
|
|
114
|
-
|
|
115
|
-
-
|
|
116
|
-
- 새로운 아키텍처 패턴 도입
|
|
117
|
-
- 보안 관련 코드 (인증, 권한, 암호화)
|
|
118
|
-
- 성능 크리티컬 코드
|
|
66
|
+
### Gemini Review (3개+ 파일 수정, 아키텍처 변경, 보안/성능 코드)
|
|
67
|
+
- architecture/plan/code 타입 선택
|
|
119
68
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
git add .
|
|
125
|
-
git commit -m "<prefix>: <설명>"
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**커밋 형식**: `<prefix>: <설명>` (한 줄, 본문 없음)
|
|
129
|
-
|
|
130
|
-
**Prefix**: `feat` | `fix` | `refactor` | `style` | `docs` | `test` | `chore` | `perf` | `ci`
|
|
131
|
-
|
|
132
|
-
**예시**:
|
|
133
|
-
```bash
|
|
134
|
-
feat: 사용자 로그인 기능 추가
|
|
135
|
-
fix: 세션 만료 오류 수정
|
|
136
|
-
docs: API 문서 업데이트
|
|
137
|
-
```
|
|
69
|
+
### Git 커밋
|
|
70
|
+
`<prefix>: <설명>` (한 줄)
|
|
71
|
+
- prefix: feat|fix|refactor|style|docs|test|chore|perf|ci
|
|
138
72
|
|
|
139
73
|
---
|
|
140
74
|
|
|
141
|
-
##
|
|
75
|
+
## Tech Stack
|
|
142
76
|
|
|
143
|
-
|
|
|
144
|
-
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
|
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
| **DB** | `docs/library/prisma/` | 🟡 해당 시 |
|
|
153
|
-
| **데이터 페칭** | `docs/library/tanstack-query/` | 🟡 해당 시 |
|
|
154
|
-
| **검증** | `docs/library/zod/` | 🟡 해당 시 |
|
|
155
|
-
| **배포** | `docs/deployment/` | 🟡 해당 시 |
|
|
77
|
+
| 기술 | 버전 | 주의 |
|
|
78
|
+
|------|------|------|
|
|
79
|
+
| TanStack Start | 최신 | - |
|
|
80
|
+
| TypeScript | 5.x | strict |
|
|
81
|
+
| Tailwind CSS | 4.x | @theme |
|
|
82
|
+
| Prisma | **7.x** | `prisma-client`, output 필수 |
|
|
83
|
+
| Zod | **4.x** | `z.email()`, `z.url()` |
|
|
84
|
+
| Better Auth | 최신 | - |
|
|
85
|
+
| TanStack Query | 5.x | - |
|
|
156
86
|
|
|
157
87
|
---
|
|
158
88
|
|
|
159
|
-
##
|
|
160
|
-
|
|
161
|
-
| 기술 | 버전 | 주의사항 |
|
|
162
|
-
|------|------|----------|
|
|
163
|
-
| TanStack Start | 최신 | Framework |
|
|
164
|
-
| TypeScript | 5.x | strict mode |
|
|
165
|
-
| Tailwind CSS | 4.x | `@theme` 사용 |
|
|
166
|
-
| Prisma | **7.x** | `prisma-client` (js 아님), output 필수 |
|
|
167
|
-
| Zod | **4.x** | `z.email()`, `z.url()` (string().email() 아님) |
|
|
168
|
-
| Better Auth | 최신 | 인증 |
|
|
169
|
-
| TanStack Query | 5.x | 데이터 페칭 |
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## 📁 Directory Structure
|
|
174
|
-
|
|
89
|
+
## Directory Structure
|
|
175
90
|
```
|
|
176
91
|
src/
|
|
177
|
-
├── routes/
|
|
178
|
-
│ ├── __root.tsx
|
|
179
|
-
│ ├── index.tsx
|
|
180
|
-
│ ├── $slug.tsx
|
|
181
|
-
│ └──
|
|
182
|
-
│ ├──
|
|
183
|
-
│ ├── -
|
|
184
|
-
│
|
|
185
|
-
|
|
186
|
-
├──
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
├── database/prisma.ts # Prisma Client
|
|
193
|
-
└── lib/ # 유틸리티
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Server Functions 위치 규칙 ⭐
|
|
197
|
-
```
|
|
198
|
-
공통 함수 (여러 라우트에서 사용) → @/functions/
|
|
199
|
-
라우트 전용 함수 (해당 라우트만) → routes/[경로]/-functions/
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
**`-` prefix**: 라우트에서 제외되는 폴더
|
|
92
|
+
├── routes/ # File-based routes
|
|
93
|
+
│ ├── __root.tsx
|
|
94
|
+
│ ├── index.tsx
|
|
95
|
+
│ ├── $slug.tsx
|
|
96
|
+
│ └── [path]/
|
|
97
|
+
│ ├── -components/ # 페이지 전용
|
|
98
|
+
│ ├── -hooks/
|
|
99
|
+
│ └── -functions/ # 페이지 전용 Server Functions
|
|
100
|
+
├── functions/ # 공통 Server Functions
|
|
101
|
+
├── components/ui/
|
|
102
|
+
├── middleware/
|
|
103
|
+
├── database/prisma.ts
|
|
104
|
+
└── lib/
|
|
105
|
+
```
|
|
106
|
+
- 공통 함수 → `@/functions/`, 라우트 전용 → `routes/[경로]/-functions/`
|
|
203
107
|
|
|
204
108
|
---
|
|
205
109
|
|
|
206
|
-
##
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
- **Routes**: `__root.tsx`, `$param.tsx`
|
|
211
|
-
|
|
212
|
-
### TypeScript
|
|
213
|
-
- `const` 선언 사용 (function 대신)
|
|
214
|
-
- 명시적 return type
|
|
215
|
-
- `interface` (객체) / `type` (유니온)
|
|
216
|
-
- `any` 금지 → `unknown` 사용
|
|
217
|
-
|
|
218
|
-
### Import
|
|
219
|
-
```typescript
|
|
220
|
-
// @/* → ./src/*
|
|
221
|
-
import { prisma } from '@/database/prisma'
|
|
222
|
-
import { getUsers } from '@/services/user'
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
**순서**: 외부 → 내부(@/) → 상대경로 → type imports
|
|
110
|
+
## Code Conventions
|
|
111
|
+
- 파일명: kebab-case, Routes: `__root.tsx`, `$param.tsx`
|
|
112
|
+
- TypeScript: const 선언, 명시적 return type, interface(객체)/type(유니온), any 금지→unknown
|
|
113
|
+
- Import 순서: 외부 → @/ → 상대경로 → type
|
|
226
114
|
|
|
227
115
|
---
|
|
228
116
|
|
|
229
|
-
##
|
|
117
|
+
## Quick Patterns
|
|
230
118
|
|
|
231
|
-
### Server Function (GET + 인증)
|
|
232
119
|
```typescript
|
|
233
|
-
//
|
|
120
|
+
// Server Function (GET + 인증)
|
|
234
121
|
export const getUsers = createServerFn({ method: 'GET' })
|
|
235
|
-
.middleware([authMiddleware])
|
|
122
|
+
.middleware([authMiddleware])
|
|
236
123
|
.handler(async () => prisma.user.findMany())
|
|
237
|
-
```
|
|
238
124
|
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
// ✅ 올바른 패턴: inputValidator + middleware 모두 사용
|
|
125
|
+
// Server Function (POST + Validation + 인증)
|
|
242
126
|
export const createUser = createServerFn({ method: 'POST' })
|
|
243
|
-
.middleware([authMiddleware])
|
|
244
|
-
.inputValidator(createUserSchema)
|
|
127
|
+
.middleware([authMiddleware])
|
|
128
|
+
.inputValidator(createUserSchema)
|
|
245
129
|
.handler(async ({ data }) => prisma.user.create({ data }))
|
|
246
|
-
```
|
|
247
130
|
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// ❌ handler 내부에서 수동 검증 금지
|
|
251
|
-
export const createUser = createServerFn({ method: 'POST' })
|
|
252
|
-
.handler(async ({ data }) => {
|
|
253
|
-
// ❌ 이렇게 하지 마세요!
|
|
254
|
-
if (!data.email) throw new Error('Email required')
|
|
255
|
-
const session = await getSession() // ❌ 수동 인증 체크 금지
|
|
256
|
-
// ...
|
|
257
|
-
})
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### Zod Schema (v4 문법!)
|
|
261
|
-
```typescript
|
|
131
|
+
// Zod v4
|
|
262
132
|
const schema = z.object({
|
|
263
|
-
email: z.email(),
|
|
133
|
+
email: z.email(),
|
|
264
134
|
name: z.string().min(1).trim(),
|
|
265
|
-
website: z.url().optional(),
|
|
135
|
+
website: z.url().optional(),
|
|
266
136
|
})
|
|
267
|
-
```
|
|
268
137
|
|
|
269
|
-
|
|
270
|
-
```tsx
|
|
138
|
+
// Route with Loader
|
|
271
139
|
export const Route = createFileRoute('/users')({
|
|
272
140
|
component: UsersPage,
|
|
273
141
|
loader: async () => ({ users: await getUsers() }),
|
|
274
142
|
})
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### TanStack Query (서버 연동 시 필수)
|
|
278
|
-
```tsx
|
|
279
|
-
// ✅ 데이터 조회: useQuery 필수
|
|
280
|
-
const { data } = useQuery({
|
|
281
|
-
queryKey: ['posts'],
|
|
282
|
-
queryFn: () => getServerPosts(),
|
|
283
|
-
})
|
|
284
143
|
|
|
285
|
-
//
|
|
144
|
+
// TanStack Query
|
|
145
|
+
const { data } = useQuery({ queryKey: ['posts'], queryFn: getServerPosts })
|
|
286
146
|
const mutation = useMutation({
|
|
287
147
|
mutationFn: createPost,
|
|
288
148
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
|
|
289
149
|
})
|
|
290
|
-
|
|
291
|
-
// ❌ 금지: Server Function을 TanStack Query 없이 직접 호출
|
|
292
|
-
// useEffect(() => { getServerPosts().then(setData) }, [])
|
|
293
150
|
```
|
|
294
151
|
|
|
295
152
|
---
|
|
296
153
|
|
|
297
|
-
##
|
|
298
|
-
|
|
299
|
-
-
|
|
300
|
-
-
|
|
301
|
-
-
|
|
302
|
-
-
|
|
303
|
-
- **Safe Area**: `tailwindcss-safe-area` 사용
|
|
304
|
-
|
|
305
|
-
**상세**: `docs/design/` 참고
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## 🔗 Quick Links
|
|
310
|
-
|
|
311
|
-
- [문서 가이드](./docs/README.md)
|
|
312
|
-
- [Git 규칙](./docs/git/git.md)
|
|
313
|
-
- [MCP 가이드](./docs/mcp/index.md)
|
|
314
|
-
- [디자인 가이드](./docs/design/index.md)
|
|
315
|
-
- [아키텍처](./docs/architecture/architecture.md)
|
|
154
|
+
## UI/UX
|
|
155
|
+
- 색상: 60-30-10 (배경-보조-강조)
|
|
156
|
+
- 간격: 8px 그리드
|
|
157
|
+
- 접근성: WCAG AA (대비 4.5:1+)
|
|
158
|
+
- 폰트: 2-3개
|
|
159
|
+
- Safe Area: tailwindcss-safe-area
|