@kood/claude-code 0.1.6 → 0.1.7
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 +21 -243
- package/package.json +1 -1
- package/templates/hono/CLAUDE.md +10 -6
- package/templates/hono/docs/deployment/index.md +5 -0
- package/templates/hono/docs/library/hono/index.md +6 -0
- package/templates/hono/docs/library/prisma/index.md +3 -0
- package/templates/npx/CLAUDE.md +8 -2
- package/templates/tanstack-start/CLAUDE.md +103 -255
- 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/accessibility.md +56 -326
- package/templates/tanstack-start/docs/design/color.md +37 -179
- package/templates/tanstack-start/docs/design/components.md +77 -311
- package/templates/tanstack-start/docs/design/index.md +24 -87
- package/templates/tanstack-start/docs/design/safe-area.md +51 -250
- package/templates/tanstack-start/docs/design/spacing.md +57 -276
- package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
- package/templates/tanstack-start/docs/design/typography.md +40 -284
- 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 +12 -99
- 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/setup.md +11 -70
- 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/basic-types.md +33 -145
- package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
- package/templates/tanstack-start/docs/library/zod/index.md +22 -150
- 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/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,163 @@
|
|
|
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
|
-
|
|
24
|
+
### API 구현
|
|
25
|
+
- `/api` 라우터 생성 금지 (명시 요청 제외)
|
|
26
|
+
- Server Function: POST/PUT/PATCH → `inputValidator` 필수, 인증 필요 시 → `middleware` 필수
|
|
27
|
+
- handler 내부에서 수동 검증/인증 체크 금지
|
|
28
|
+
- 클라이언트에서 Server Function 직접 호출 금지 → TanStack Query 필수
|
|
21
29
|
|
|
22
|
-
###
|
|
23
|
-
|
|
24
|
-
❌ "Generated with Claude Code" 포함 금지
|
|
25
|
-
❌ "🤖" 또는 AI 관련 이모지 포함 금지
|
|
26
|
-
❌ "Co-Authored-By:" 헤더 포함 금지
|
|
27
|
-
❌ AI/봇이 작성했다는 어떤 표시도 금지
|
|
28
|
-
❌ 커밋 메시지 여러 줄 작성 금지
|
|
29
|
-
❌ 커밋 메시지에 이모지 사용 금지
|
|
30
|
-
```
|
|
30
|
+
### 코드 검색
|
|
31
|
+
- `grep`/`rg`/`find` 금지 → `sgrep` 사용
|
|
31
32
|
|
|
32
|
-
###
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
### Custom Hook 순서
|
|
34
|
+
1. State (useState, zustand)
|
|
35
|
+
2. Global Hooks (useParams, useNavigate, useQueryClient)
|
|
36
|
+
3. React Query (useQuery → useMutation)
|
|
37
|
+
4. Event Handlers
|
|
38
|
+
5. useMemo
|
|
39
|
+
6. useEffect
|
|
39
40
|
|
|
40
|
-
###
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
❌ Server Function에 inputValidator 누락 금지 (POST/PUT/PATCH)
|
|
44
|
-
❌ Server Function에 middleware 누락 금지 (인증 필요 시)
|
|
45
|
-
❌ handler 내부에서 수동 검증 금지 (inputValidator 사용)
|
|
46
|
-
❌ handler 내부에서 수동 인증 체크 금지 (middleware 사용)
|
|
47
|
-
❌ 클라이언트에서 Server Function 직접 호출 금지 → TanStack Query 필수
|
|
48
|
-
```
|
|
41
|
+
### 코드 작성
|
|
42
|
+
- UTF-8 인코딩, 코드 묶음 단위 한글 주석
|
|
43
|
+
- Prisma Multi-File: 모든 요소에 한글 주석 필수
|
|
49
44
|
|
|
50
|
-
###
|
|
45
|
+
### Prisma Multi-File 구조
|
|
51
46
|
```
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
```
|
|
68
|
-
|
|
69
|
-
### 코드 작성 규칙
|
|
70
|
-
```
|
|
71
|
-
✅ 모든 한글 텍스트는 UTF-8 인코딩 유지
|
|
72
|
-
✅ 코드 묶음 단위로 한글 주석 작성 (너무 세세하게 X)
|
|
73
|
-
✅ Prisma Multi-File 모든 요소에 한글 주석 필수
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### Prisma Multi-File 구조 (필수)
|
|
77
|
-
```
|
|
78
|
-
prisma/
|
|
79
|
-
├── schema/
|
|
80
|
-
│ ├── +base.prisma # datasource, generator 설정
|
|
81
|
-
│ ├── +enum.prisma # 모든 enum 정의
|
|
82
|
-
│ ├── user.prisma # User 모델
|
|
83
|
-
│ ├── post.prisma # Post 모델
|
|
84
|
-
│ └── ... # 기타 모델별 파일
|
|
47
|
+
prisma/schema/
|
|
48
|
+
├── +base.prisma # datasource, generator
|
|
49
|
+
├── +enum.prisma # 모든 enum
|
|
50
|
+
└── [model].prisma # 모델별 파일
|
|
85
51
|
```
|
|
86
52
|
|
|
87
53
|
---
|
|
88
54
|
|
|
89
|
-
## ✅ ALWAYS DO
|
|
90
|
-
|
|
91
|
-
### 1. 작업 전: 관련 문서 읽기
|
|
92
|
-
```
|
|
93
|
-
UI 작업 → docs/design/ 읽기
|
|
94
|
-
API 작업 → docs/library/tanstack-start/ 읽기
|
|
95
|
-
DB 작업 → docs/library/prisma/ 읽기
|
|
96
|
-
인증 작업 → docs/library/better-auth/ 읽기
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 2. MCP 도구 적극 활용
|
|
100
|
-
```
|
|
101
|
-
코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
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
|
-
```
|
|
113
|
-
|
|
114
|
-
**실행 조건**:
|
|
115
|
-
- 3개 이상 파일 수정하는 기능 구현
|
|
116
|
-
- 새로운 아키텍처 패턴 도입
|
|
117
|
-
- 보안 관련 코드 (인증, 권한, 암호화)
|
|
118
|
-
- 성능 크리티컬 코드
|
|
119
|
-
|
|
120
|
-
**상세**: `docs/skills/gemini-review/SKILL.md` 참고
|
|
55
|
+
## ✅ ALWAYS DO
|
|
121
56
|
|
|
122
|
-
###
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
57
|
+
### 작업 전 문서 읽기
|
|
58
|
+
| 작업 | 문서 |
|
|
59
|
+
|------|------|
|
|
60
|
+
| UI | docs/design/ |
|
|
61
|
+
| API | docs/library/tanstack-start/ |
|
|
62
|
+
| DB | docs/library/prisma/ |
|
|
63
|
+
| 인증 | docs/library/better-auth/ |
|
|
127
64
|
|
|
128
|
-
|
|
65
|
+
### MCP 도구
|
|
66
|
+
- 코드 검색: sgrep
|
|
67
|
+
- 분석/디버깅: Sequential Thinking
|
|
68
|
+
- 라이브러리 문서: Context7
|
|
129
69
|
|
|
130
|
-
|
|
70
|
+
### Gemini Review (3개+ 파일 수정, 아키텍처 변경, 보안/성능 코드)
|
|
71
|
+
- architecture/plan/code 타입 선택
|
|
131
72
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
fix: 세션 만료 오류 수정
|
|
136
|
-
docs: API 문서 업데이트
|
|
137
|
-
```
|
|
73
|
+
### Git 커밋
|
|
74
|
+
`<prefix>: <설명>` (한 줄)
|
|
75
|
+
- prefix: feat|fix|refactor|style|docs|test|chore|perf|ci
|
|
138
76
|
|
|
139
77
|
---
|
|
140
78
|
|
|
141
|
-
##
|
|
142
|
-
|
|
143
|
-
| 작업 | 문서 경로 | 필독 여부 |
|
|
144
|
-
|------|----------|----------|
|
|
145
|
-
| **전체 가이드** | `docs/README.md` | 🔴 필수 |
|
|
146
|
-
| **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
|
|
147
|
-
| **MCP 도구** | `docs/mcp/` | 🔴 필수 |
|
|
148
|
-
| **Gemini Review** | `docs/skills/gemini-review/` | 🟡 복잡한 작업 시 |
|
|
149
|
-
| **UI 개발** | `docs/design/` | 🟡 해당 시 |
|
|
150
|
-
| **API 개발** | `docs/library/tanstack-start/` | 🟡 해당 시 |
|
|
151
|
-
| **인증** | `docs/library/better-auth/` | 🟡 해당 시 |
|
|
152
|
-
| **DB** | `docs/library/prisma/` | 🟡 해당 시 |
|
|
153
|
-
| **데이터 페칭** | `docs/library/tanstack-query/` | 🟡 해당 시 |
|
|
154
|
-
| **검증** | `docs/library/zod/` | 🟡 해당 시 |
|
|
155
|
-
| **배포** | `docs/deployment/` | 🟡 해당 시 |
|
|
156
|
-
|
|
157
|
-
---
|
|
79
|
+
## Tech Stack
|
|
158
80
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
|
162
|
-
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
|
166
|
-
|
|
|
167
|
-
|
|
|
168
|
-
| Better Auth | 최신 | 인증 |
|
|
169
|
-
| TanStack Query | 5.x | 데이터 페칭 |
|
|
81
|
+
| 기술 | 버전 | 주의 |
|
|
82
|
+
|------|------|------|
|
|
83
|
+
| TanStack Start | 최신 | - |
|
|
84
|
+
| TypeScript | 5.x | strict |
|
|
85
|
+
| Tailwind CSS | 4.x | @theme |
|
|
86
|
+
| Prisma | **7.x** | `prisma-client`, output 필수 |
|
|
87
|
+
| Zod | **4.x** | `z.email()`, `z.url()` |
|
|
88
|
+
| Better Auth | 최신 | - |
|
|
89
|
+
| TanStack Query | 5.x | - |
|
|
170
90
|
|
|
171
91
|
---
|
|
172
92
|
|
|
173
|
-
##
|
|
174
|
-
|
|
93
|
+
## Directory Structure
|
|
175
94
|
```
|
|
176
95
|
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**: 라우트에서 제외되는 폴더
|
|
96
|
+
├── routes/ # File-based routes
|
|
97
|
+
│ ├── __root.tsx
|
|
98
|
+
│ ├── index.tsx
|
|
99
|
+
│ ├── $slug.tsx
|
|
100
|
+
│ └── [path]/
|
|
101
|
+
│ ├── -components/ # 페이지 전용
|
|
102
|
+
│ ├── -hooks/
|
|
103
|
+
│ └── -functions/ # 페이지 전용 Server Functions
|
|
104
|
+
├── functions/ # 공통 Server Functions
|
|
105
|
+
├── components/ui/
|
|
106
|
+
├── middleware/
|
|
107
|
+
├── database/prisma.ts
|
|
108
|
+
└── lib/
|
|
109
|
+
```
|
|
110
|
+
- 공통 함수 → `@/functions/`, 라우트 전용 → `routes/[경로]/-functions/`
|
|
203
111
|
|
|
204
112
|
---
|
|
205
113
|
|
|
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
|
|
114
|
+
## Code Conventions
|
|
115
|
+
- 파일명: kebab-case, Routes: `__root.tsx`, `$param.tsx`
|
|
116
|
+
- TypeScript: const 선언, 명시적 return type, interface(객체)/type(유니온), any 금지→unknown
|
|
117
|
+
- Import 순서: 외부 → @/ → 상대경로 → type
|
|
226
118
|
|
|
227
119
|
---
|
|
228
120
|
|
|
229
|
-
##
|
|
121
|
+
## Quick Patterns
|
|
230
122
|
|
|
231
|
-
### Server Function (GET + 인증)
|
|
232
123
|
```typescript
|
|
233
|
-
//
|
|
124
|
+
// Server Function (GET + 인증)
|
|
234
125
|
export const getUsers = createServerFn({ method: 'GET' })
|
|
235
|
-
.middleware([authMiddleware])
|
|
126
|
+
.middleware([authMiddleware])
|
|
236
127
|
.handler(async () => prisma.user.findMany())
|
|
237
|
-
```
|
|
238
128
|
|
|
239
|
-
|
|
240
|
-
```typescript
|
|
241
|
-
// ✅ 올바른 패턴: inputValidator + middleware 모두 사용
|
|
129
|
+
// Server Function (POST + Validation + 인증)
|
|
242
130
|
export const createUser = createServerFn({ method: 'POST' })
|
|
243
|
-
.middleware([authMiddleware])
|
|
244
|
-
.inputValidator(createUserSchema)
|
|
131
|
+
.middleware([authMiddleware])
|
|
132
|
+
.inputValidator(createUserSchema)
|
|
245
133
|
.handler(async ({ data }) => prisma.user.create({ data }))
|
|
246
|
-
```
|
|
247
134
|
|
|
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
|
|
135
|
+
// Zod v4
|
|
262
136
|
const schema = z.object({
|
|
263
|
-
email: z.email(),
|
|
137
|
+
email: z.email(),
|
|
264
138
|
name: z.string().min(1).trim(),
|
|
265
|
-
website: z.url().optional(),
|
|
139
|
+
website: z.url().optional(),
|
|
266
140
|
})
|
|
267
|
-
```
|
|
268
141
|
|
|
269
|
-
|
|
270
|
-
```tsx
|
|
142
|
+
// Route with Loader
|
|
271
143
|
export const Route = createFileRoute('/users')({
|
|
272
144
|
component: UsersPage,
|
|
273
145
|
loader: async () => ({ users: await getUsers() }),
|
|
274
146
|
})
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### TanStack Query (서버 연동 시 필수)
|
|
278
|
-
```tsx
|
|
279
|
-
// ✅ 데이터 조회: useQuery 필수
|
|
280
|
-
const { data } = useQuery({
|
|
281
|
-
queryKey: ['posts'],
|
|
282
|
-
queryFn: () => getServerPosts(),
|
|
283
|
-
})
|
|
284
147
|
|
|
285
|
-
//
|
|
148
|
+
// TanStack Query
|
|
149
|
+
const { data } = useQuery({ queryKey: ['posts'], queryFn: getServerPosts })
|
|
286
150
|
const mutation = useMutation({
|
|
287
151
|
mutationFn: createPost,
|
|
288
152
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
|
|
289
153
|
})
|
|
290
|
-
|
|
291
|
-
// ❌ 금지: Server Function을 TanStack Query 없이 직접 호출
|
|
292
|
-
// useEffect(() => { getServerPosts().then(setData) }, [])
|
|
293
154
|
```
|
|
294
155
|
|
|
295
156
|
---
|
|
296
157
|
|
|
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)
|
|
158
|
+
## UI/UX
|
|
159
|
+
- 색상: 60-30-10 (배경-보조-강조)
|
|
160
|
+
- 간격: 8px 그리드
|
|
161
|
+
- 접근성: WCAG AA (대비 4.5:1+)
|
|
162
|
+
- 폰트: 2-3개
|
|
163
|
+
- Safe Area: tailwindcss-safe-area
|