@kood/claude-code 0.1.2 → 0.1.3
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 +12 -3
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/deployment/cloudflare.md +537 -190
- package/templates/hono/docs/deployment/docker.md +517 -0
- package/templates/hono/docs/deployment/index.md +181 -213
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +572 -0
- package/templates/hono/docs/git/git.md +285 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -0
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/git/git.md +307 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/deployment/cloudflare.md +234 -51
- package/templates/tanstack-start/docs/deployment/index.md +322 -32
- package/templates/tanstack-start/docs/deployment/nitro.md +201 -20
- package/templates/tanstack-start/docs/deployment/railway.md +305 -153
- package/templates/tanstack-start/docs/deployment/vercel.md +353 -78
- package/templates/tanstack-start/docs/git/{index.md → git.md} +81 -7
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -1
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
❌ Server Function에 middleware 누락 금지 (인증 필요 시)
|
|
45
45
|
❌ handler 내부에서 수동 검증 금지 (inputValidator 사용)
|
|
46
46
|
❌ handler 내부에서 수동 인증 체크 금지 (middleware 사용)
|
|
47
|
+
❌ 클라이언트에서 Server Function 직접 호출 금지 → TanStack Query 필수
|
|
47
48
|
```
|
|
48
49
|
|
|
49
50
|
### 코드 검색 금지 사항
|
|
@@ -53,6 +54,36 @@
|
|
|
53
54
|
✅ 코드베이스 검색 시 sgrep 사용 필수
|
|
54
55
|
```
|
|
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
|
+
│ └── ... # 기타 모델별 파일
|
|
85
|
+
```
|
|
86
|
+
|
|
56
87
|
---
|
|
57
88
|
|
|
58
89
|
## ✅ ALWAYS DO (필수 실행)
|
|
@@ -112,7 +143,7 @@ docs: API 문서 업데이트
|
|
|
112
143
|
| 작업 | 문서 경로 | 필독 여부 |
|
|
113
144
|
|------|----------|----------|
|
|
114
145
|
| **전체 가이드** | `docs/README.md` | 🔴 필수 |
|
|
115
|
-
| **Git 규칙** | `docs/git/
|
|
146
|
+
| **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
|
|
116
147
|
| **MCP 도구** | `docs/mcp/` | 🔴 필수 |
|
|
117
148
|
| **Gemini Review** | `docs/skills/gemini-review/` | 🟡 복잡한 작업 시 |
|
|
118
149
|
| **UI 개발** | `docs/design/` | 🟡 해당 시 |
|
|
@@ -243,17 +274,24 @@ export const Route = createFileRoute('/users')({
|
|
|
243
274
|
})
|
|
244
275
|
```
|
|
245
276
|
|
|
246
|
-
### TanStack Query
|
|
277
|
+
### TanStack Query (서버 연동 시 필수)
|
|
247
278
|
```tsx
|
|
279
|
+
// ✅ 데이터 조회: useQuery 필수
|
|
280
|
+
const getPosts = useServerFn(getServerPosts)
|
|
248
281
|
const { data } = useQuery({
|
|
249
282
|
queryKey: ['users'],
|
|
250
|
-
queryFn: () =>
|
|
283
|
+
queryFn: () => getPosts(),
|
|
251
284
|
})
|
|
252
285
|
|
|
286
|
+
// ✅ 데이터 변경: useMutation 필수
|
|
287
|
+
const createPostFn = useServerFn(createPost)
|
|
253
288
|
const mutation = useMutation({
|
|
254
|
-
mutationFn:
|
|
289
|
+
mutationFn: createPostFn,
|
|
255
290
|
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),
|
|
256
291
|
})
|
|
292
|
+
|
|
293
|
+
// ❌ 금지: Server Function 직접 호출
|
|
294
|
+
// useEffect(() => { getPosts().then(setData) }, [])
|
|
257
295
|
```
|
|
258
296
|
|
|
259
297
|
---
|
|
@@ -273,7 +311,7 @@ const mutation = useMutation({
|
|
|
273
311
|
## 🔗 Quick Links
|
|
274
312
|
|
|
275
313
|
- [문서 가이드](./docs/README.md)
|
|
276
|
-
- [Git 규칙](./docs/git/
|
|
314
|
+
- [Git 규칙](./docs/git/git.md)
|
|
277
315
|
- [MCP 가이드](./docs/mcp/index.md)
|
|
278
316
|
- [디자인 가이드](./docs/design/index.md)
|
|
279
317
|
- [아키텍처](./docs/architecture/architecture.md)
|
|
@@ -21,8 +21,9 @@ TanStack Start 애플리케이션의 기술 아키텍처 가이드입니다.
|
|
|
21
21
|
│ │
|
|
22
22
|
│ ┌────────────────────────────────────────────────────────────┐ │
|
|
23
23
|
│ │ Server Functions │ │
|
|
24
|
-
│ │ -
|
|
25
|
-
│ │ -
|
|
24
|
+
│ │ - src/functions/ → 글로벌 서버 함수 │ │
|
|
25
|
+
│ │ - routes/-functions/ → 페이지 전용 서버 함수 │ │
|
|
26
|
+
│ │ - middlewares/ → 공통 미들웨어 │ │
|
|
26
27
|
│ └────────────────────────────┬───────────────────────────────┘ │
|
|
27
28
|
│ │ │
|
|
28
29
|
│ ┌────────────────────────────▼───────────────────────────────┐ │
|
|
@@ -54,10 +55,17 @@ my-app/
|
|
|
54
55
|
│ ├── routes/ # 파일 기반 라우팅
|
|
55
56
|
│ │ ├── __root.tsx # Root layout
|
|
56
57
|
│ │ ├── index.tsx # Home (/)
|
|
58
|
+
│ │ ├── -functions/ # 글로벌 라우트 레벨 서버 함수
|
|
59
|
+
│ │ │ ├── index.ts # re-export
|
|
60
|
+
│ │ │ └── get-session.ts # 세션 조회 함수
|
|
57
61
|
│ │ └── users/
|
|
58
62
|
│ │ ├── index.tsx # /users
|
|
59
63
|
│ │ ├── $id.tsx # /users/:id
|
|
60
64
|
│ │ ├── route.tsx # route 설정 (선택)
|
|
65
|
+
│ │ ├── -functions/ # 페이지 전용 서버 함수
|
|
66
|
+
│ │ │ ├── index.ts # re-export
|
|
67
|
+
│ │ │ ├── get-users.ts # 사용자 목록 조회
|
|
68
|
+
│ │ │ └── create-user.ts # 사용자 생성
|
|
61
69
|
│ │ ├── -components/ # 페이지 전용 컴포넌트
|
|
62
70
|
│ │ │ └── user-card.tsx
|
|
63
71
|
│ │ ├── -sections/ # 섹션 분리
|
|
@@ -65,6 +73,14 @@ my-app/
|
|
|
65
73
|
│ │ │ └── user-filter-section.tsx
|
|
66
74
|
│ │ └── -hooks/ # 페이지 전용 훅
|
|
67
75
|
│ │ └── use-users.ts
|
|
76
|
+
│ ├── functions/ # 글로벌 서버 함수
|
|
77
|
+
│ │ ├── index.ts # re-export
|
|
78
|
+
│ │ ├── get-current-user.ts # 현재 사용자 조회
|
|
79
|
+
│ │ ├── validate-session.ts # 세션 검증
|
|
80
|
+
│ │ └── middlewares/ # 서버 함수 미들웨어
|
|
81
|
+
│ │ ├── index.ts # re-export
|
|
82
|
+
│ │ ├── auth.ts # 인증 미들웨어
|
|
83
|
+
│ │ └── rate-limit.ts # 레이트 리밋 미들웨어
|
|
68
84
|
│ ├── components/ # 공통 컴포넌트
|
|
69
85
|
│ │ └── ui/
|
|
70
86
|
│ │ ├── button.tsx
|
|
@@ -117,6 +133,7 @@ my-app/
|
|
|
117
133
|
routes/<route-name>/
|
|
118
134
|
├── index.tsx # 페이지 컴포넌트
|
|
119
135
|
├── route.tsx # route 설정 (loader, beforeLoad)
|
|
136
|
+
├── -functions/ # 페이지 전용 서버 함수
|
|
120
137
|
├── -components/ # 페이지 전용 컴포넌트
|
|
121
138
|
├── -sections/ # 섹션 분리 (복잡한 경우)
|
|
122
139
|
└── -hooks/ # 페이지 전용 훅
|
|
@@ -124,8 +141,9 @@ routes/<route-name>/
|
|
|
124
141
|
|
|
125
142
|
**특징**:
|
|
126
143
|
- `-` 접두사 폴더는 라우트에서 제외
|
|
127
|
-
- 페이지별로 컴포넌트, 섹션, 훅을 분리
|
|
144
|
+
- 페이지별로 서버 함수, 컴포넌트, 섹션, 훅을 분리
|
|
128
145
|
- Section은 UI 영역 단위, Component는 재사용 단위
|
|
146
|
+
- `-functions/`는 해당 페이지에서만 사용하는 서버 함수
|
|
129
147
|
|
|
130
148
|
```tsx
|
|
131
149
|
// routes/users/index.tsx
|
|
@@ -204,7 +222,119 @@ export const createUser = createServerFn({ method: 'POST' })
|
|
|
204
222
|
})
|
|
205
223
|
```
|
|
206
224
|
|
|
207
|
-
### 3.
|
|
225
|
+
### 3. Server Functions Layer
|
|
226
|
+
|
|
227
|
+
서버 함수를 체계적으로 구성합니다. 파일당 하나의 서버 함수만 정의합니다.
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
src/functions/ # 글로벌 서버 함수
|
|
231
|
+
├── index.ts # re-export
|
|
232
|
+
├── <function-name>.ts # 개별 서버 함수
|
|
233
|
+
└── middlewares/ # 서버 함수 미들웨어
|
|
234
|
+
├── index.ts # re-export
|
|
235
|
+
└── <middleware-name>.ts # 개별 미들웨어
|
|
236
|
+
|
|
237
|
+
routes/<route-name>/-functions/ # 페이지 전용 서버 함수
|
|
238
|
+
├── index.ts # re-export
|
|
239
|
+
└── <function-name>.ts # 개별 서버 함수
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**규칙**:
|
|
243
|
+
- **파일당 하나의 함수**: 각 파일에는 하나의 서버 함수만 정의
|
|
244
|
+
- **명확한 네이밍**: 파일명이 곧 함수의 역할 (`get-users.ts`, `create-user.ts`)
|
|
245
|
+
- **글로벌 vs 로컬**: 여러 페이지에서 사용 → `src/functions/`, 특정 페이지 전용 → `-functions/`
|
|
246
|
+
|
|
247
|
+
**글로벌 서버 함수** - 여러 페이지에서 공유:
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// src/functions/get-current-user.ts
|
|
251
|
+
import { createServerFn } from '@tanstack/react-start'
|
|
252
|
+
import { prisma } from '@/database/prisma'
|
|
253
|
+
import { authMiddleware } from './middlewares'
|
|
254
|
+
|
|
255
|
+
export const getCurrentUser = createServerFn({ method: 'GET' })
|
|
256
|
+
.middleware([authMiddleware])
|
|
257
|
+
.handler(async ({ context }) => {
|
|
258
|
+
return prisma.user.findUnique({
|
|
259
|
+
where: { id: context.userId },
|
|
260
|
+
})
|
|
261
|
+
})
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
// src/functions/index.ts
|
|
266
|
+
export { getCurrentUser } from './get-current-user'
|
|
267
|
+
export { validateSession } from './validate-session'
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**페이지 전용 서버 함수** - 특정 페이지에서만 사용:
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
// routes/users/-functions/get-users.ts
|
|
274
|
+
import { createServerFn } from '@tanstack/react-start'
|
|
275
|
+
import { prisma } from '@/database/prisma'
|
|
276
|
+
|
|
277
|
+
export const getUsers = createServerFn({ method: 'GET' })
|
|
278
|
+
.handler(async () => {
|
|
279
|
+
return prisma.user.findMany({
|
|
280
|
+
orderBy: { createdAt: 'desc' },
|
|
281
|
+
})
|
|
282
|
+
})
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// routes/users/-functions/create-user.ts
|
|
287
|
+
import { createServerFn } from '@tanstack/react-start'
|
|
288
|
+
import { prisma } from '@/database/prisma'
|
|
289
|
+
import { createUserSchema } from '@/services/user/schemas'
|
|
290
|
+
|
|
291
|
+
export const createUser = createServerFn({ method: 'POST' })
|
|
292
|
+
.inputValidator(createUserSchema)
|
|
293
|
+
.handler(async ({ data }) => {
|
|
294
|
+
return prisma.user.create({ data })
|
|
295
|
+
})
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
// routes/users/-functions/index.ts
|
|
300
|
+
export { getUsers } from './get-users'
|
|
301
|
+
export { createUser } from './create-user'
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**미들웨어** - 공통 로직 재사용:
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// src/functions/middlewares/auth.ts
|
|
308
|
+
import { createMiddleware } from '@tanstack/react-start'
|
|
309
|
+
|
|
310
|
+
export const authMiddleware = createMiddleware()
|
|
311
|
+
.server(async ({ next }) => {
|
|
312
|
+
const session = await getSession()
|
|
313
|
+
if (!session) {
|
|
314
|
+
throw new Error('Unauthorized')
|
|
315
|
+
}
|
|
316
|
+
return next({ context: { userId: session.userId } })
|
|
317
|
+
})
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
// src/functions/middlewares/rate-limit.ts
|
|
322
|
+
import { createMiddleware } from '@tanstack/react-start'
|
|
323
|
+
|
|
324
|
+
export const rateLimitMiddleware = createMiddleware()
|
|
325
|
+
.server(async ({ next }) => {
|
|
326
|
+
// 레이트 리밋 로직
|
|
327
|
+
return next()
|
|
328
|
+
})
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// src/functions/middlewares/index.ts
|
|
333
|
+
export { authMiddleware } from './auth'
|
|
334
|
+
export { rateLimitMiddleware } from './rate-limit'
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### 4. Database Layer (Data Access)
|
|
208
338
|
|
|
209
339
|
Prisma를 통한 데이터 액세스를 담당합니다.
|
|
210
340
|
|