@kood/claude-code 0.1.2 → 0.1.4
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 +129 -5
- 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/commands/git.md +275 -0
- package/templates/hono/docs/deployment/cloudflare.md +527 -190
- package/templates/hono/docs/deployment/docker.md +514 -0
- package/templates/hono/docs/deployment/index.md +179 -214
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +567 -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 -3
- 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/commands/git.md +275 -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/commands/git.md +275 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +223 -50
- package/templates/tanstack-start/docs/deployment/index.md +320 -30
- package/templates/tanstack-start/docs/deployment/nitro.md +195 -14
- package/templates/tanstack-start/docs/deployment/railway.md +302 -150
- package/templates/tanstack-start/docs/deployment/vercel.md +345 -75
- 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 -5
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/prisma/setup.md +0 -7
- 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
- package/templates/tanstack-start/docs/git/index.md +0 -203
|
@@ -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
|
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
# Git 워크플로우
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## ⛔ NEVER (절대 금지)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
❌ 커밋에 "Generated with Claude Code" 포함
|
|
9
|
+
❌ 커밋에 "🤖" 또는 AI 관련 이모지 포함
|
|
10
|
+
❌ 커밋에 "Co-Authored-By:" 헤더 포함
|
|
11
|
+
❌ 커밋에 AI/봇이 작성했다는 어떤 표시도 포함
|
|
12
|
+
❌ 커밋 메시지 여러 줄 작성
|
|
13
|
+
❌ 커밋 메시지에 이모지 사용
|
|
14
|
+
❌ 커밋 메시지에 마침표(.) 사용
|
|
15
|
+
❌ 여러 작업을 하나의 커밋으로 퉁치기
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## ✅ ALWAYS (필수)
|
|
21
|
+
|
|
22
|
+
### 작업 완료 후 반드시 실행
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git add <관련 파일들>
|
|
26
|
+
git commit -m "<prefix>: <설명>"
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### ⭐ 커밋 분리 원칙
|
|
30
|
+
|
|
31
|
+
**하나의 커밋 = 하나의 논리적 변경 단위**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# ❌ 잘못된 방식: 모든 작업을 하나로 퉁침
|
|
35
|
+
git add .
|
|
36
|
+
git commit -m "feat: 여러 기능 추가"
|
|
37
|
+
|
|
38
|
+
# ✅ 올바른 방식: 논리적 단위로 분리
|
|
39
|
+
git add src/auth/
|
|
40
|
+
git commit -m "feat: 사용자 인증 기능 추가"
|
|
41
|
+
|
|
42
|
+
git add src/users/
|
|
43
|
+
git commit -m "feat: 사용자 관리 기능 추가"
|
|
44
|
+
|
|
45
|
+
git add docs/
|
|
46
|
+
git commit -m "docs: API 문서 업데이트"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 📝 커밋 형식
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
<prefix>: <설명>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**한 줄로 간결하게** 작성합니다. 본문이나 푸터는 작성하지 않습니다.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 🏷 Prefix 목록
|
|
62
|
+
|
|
63
|
+
| Prefix | 용도 | 예시 |
|
|
64
|
+
|--------|------|------|
|
|
65
|
+
| `feat` | 새로운 기능 | `feat: 사용자 인증 기능 추가` |
|
|
66
|
+
| `fix` | 버그 수정 | `fix: 토큰 검증 오류 수정` |
|
|
67
|
+
| `refactor` | 리팩토링 | `refactor: 인증 로직 분리` |
|
|
68
|
+
| `style` | 코드 스타일 | `style: prettier 적용` |
|
|
69
|
+
| `docs` | 문서 수정 | `docs: API 문서 업데이트` |
|
|
70
|
+
| `test` | 테스트 | `test: 인증 테스트 추가` |
|
|
71
|
+
| `chore` | 빌드/설정 | `chore: 의존성 업데이트` |
|
|
72
|
+
| `perf` | 성능 개선 | `perf: 쿼리 최적화` |
|
|
73
|
+
| `ci` | CI/CD | `ci: GitHub Actions 추가` |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## ✅ 올바른 예시
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
feat: 사용자 로그인 기능 추가
|
|
81
|
+
fix: 세션 만료 오류 수정
|
|
82
|
+
refactor: 서비스 클래스 구조 개선
|
|
83
|
+
docs: README 설치 가이드 추가
|
|
84
|
+
chore: 의존성 버전 업그레이드
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## ❌ 잘못된 예시
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# prefix 없음
|
|
93
|
+
사용자 인증 기능 추가함
|
|
94
|
+
|
|
95
|
+
# 마침표 불필요
|
|
96
|
+
feat: 사용자 인증 추가.
|
|
97
|
+
|
|
98
|
+
# 대문자 사용
|
|
99
|
+
FEAT: 사용자 인증 추가
|
|
100
|
+
|
|
101
|
+
# scope 불필요
|
|
102
|
+
feat(auth): 인증 추가
|
|
103
|
+
|
|
104
|
+
# AI 작성 표시 (절대 금지!)
|
|
105
|
+
feat: 로그인 기능 추가
|
|
106
|
+
|
|
107
|
+
🤖 Generated with Claude Code
|
|
108
|
+
|
|
109
|
+
# Co-Author 표시 (절대 금지!)
|
|
110
|
+
feat: 로그인 기능 추가
|
|
111
|
+
|
|
112
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
113
|
+
|
|
114
|
+
# 여러 줄 본문 (금지)
|
|
115
|
+
feat: 로그인 기능 추가
|
|
116
|
+
|
|
117
|
+
- 이메일 인증 추가
|
|
118
|
+
- 세션 관리 구현
|
|
119
|
+
|
|
120
|
+
# 여러 작업을 하나로 퉁침 (금지)
|
|
121
|
+
feat: 로그인, 회원가입, 프로필 기능 추가
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 🔄 작업 흐름
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 1. 작업 전 최신 코드 동기화
|
|
130
|
+
git pull origin main
|
|
131
|
+
|
|
132
|
+
# 2. 기능 A 작업 완료 → 커밋
|
|
133
|
+
git add src/feature-a/
|
|
134
|
+
git commit -m "feat: 기능 A 구현"
|
|
135
|
+
|
|
136
|
+
# 3. 기능 B 작업 완료 → 커밋
|
|
137
|
+
git add src/feature-b/
|
|
138
|
+
git commit -m "feat: 기능 B 구현"
|
|
139
|
+
|
|
140
|
+
# 4. 문서 작업 완료 → 커밋
|
|
141
|
+
git add docs/
|
|
142
|
+
git commit -m "docs: 기능 문서 추가"
|
|
143
|
+
|
|
144
|
+
# 5. 푸시
|
|
145
|
+
git push origin main
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 📦 커밋 분리 가이드
|
|
151
|
+
|
|
152
|
+
### 언제 커밋을 분리해야 하나요?
|
|
153
|
+
|
|
154
|
+
| 상황 | 커밋 분리 |
|
|
155
|
+
|------|----------|
|
|
156
|
+
| 서로 다른 기능 구현 | ✅ 분리 |
|
|
157
|
+
| 버그 수정 + 새 기능 | ✅ 분리 |
|
|
158
|
+
| 코드 변경 + 문서 변경 | ✅ 분리 |
|
|
159
|
+
| 리팩토링 + 기능 추가 | ✅ 분리 |
|
|
160
|
+
| 동일 기능의 관련 파일들 | 🔄 묶어도 됨 |
|
|
161
|
+
| 동일 기능의 타입 + 구현 | 🔄 묶어도 됨 |
|
|
162
|
+
|
|
163
|
+
### 예시: 사용자 관리 기능 개발
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# 1. 인증 기능 커밋
|
|
167
|
+
git add src/auth/
|
|
168
|
+
git commit -m "feat: 사용자 인증 기능 추가"
|
|
169
|
+
|
|
170
|
+
# 2. 사용자 관리 커밋
|
|
171
|
+
git add src/users/
|
|
172
|
+
git commit -m "feat: 사용자 CRUD 기능 추가"
|
|
173
|
+
|
|
174
|
+
# 3. 유효성 검사 커밋
|
|
175
|
+
git add src/validators/
|
|
176
|
+
git commit -m "feat: 입력값 유효성 검사 추가"
|
|
177
|
+
|
|
178
|
+
# 4. 테스트 커밋
|
|
179
|
+
git add tests/
|
|
180
|
+
git commit -m "test: 사용자 관리 테스트 추가"
|
|
181
|
+
|
|
182
|
+
# 5. 문서 커밋
|
|
183
|
+
git add docs/
|
|
184
|
+
git commit -m "docs: 사용자 API 문서 추가"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 🌿 브랜치 전략
|
|
190
|
+
|
|
191
|
+
### 간단한 프로젝트
|
|
192
|
+
```
|
|
193
|
+
main ← 모든 작업 직접 커밋
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 팀 프로젝트
|
|
197
|
+
```
|
|
198
|
+
main
|
|
199
|
+
└── feature/기능명
|
|
200
|
+
└── fix/버그명
|
|
201
|
+
└── hotfix/긴급수정
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### 브랜치 명명
|
|
205
|
+
```bash
|
|
206
|
+
feature/user-authentication
|
|
207
|
+
feature/payment-integration
|
|
208
|
+
fix/session-error
|
|
209
|
+
hotfix/security-patch
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 📋 자주 사용하는 명령어
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# 상태 확인
|
|
218
|
+
git status
|
|
219
|
+
|
|
220
|
+
# 변경 내용 확인
|
|
221
|
+
git diff
|
|
222
|
+
|
|
223
|
+
# 최근 커밋 로그
|
|
224
|
+
git log --oneline -10
|
|
225
|
+
|
|
226
|
+
# 커밋 취소 (작업 내용 유지)
|
|
227
|
+
git reset --soft HEAD~1
|
|
228
|
+
|
|
229
|
+
# 스테이징 취소
|
|
230
|
+
git restore --staged .
|
|
231
|
+
|
|
232
|
+
# 변경사항 임시 저장
|
|
233
|
+
git stash
|
|
234
|
+
git stash pop
|
|
235
|
+
|
|
236
|
+
# 특정 파일만 스테이징
|
|
237
|
+
git add <파일경로>
|
|
238
|
+
|
|
239
|
+
# 대화형 스테이징 (부분 커밋용)
|
|
240
|
+
git add -p
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## 📚 .gitignore
|
|
246
|
+
|
|
247
|
+
```gitignore
|
|
248
|
+
# Dependencies
|
|
249
|
+
node_modules/
|
|
250
|
+
|
|
251
|
+
# Build
|
|
252
|
+
dist/
|
|
253
|
+
.output/
|
|
254
|
+
build/
|
|
255
|
+
|
|
256
|
+
# Environment
|
|
257
|
+
.env
|
|
258
|
+
.env.local
|
|
259
|
+
.env.*.local
|
|
260
|
+
|
|
261
|
+
# IDE
|
|
262
|
+
.idea/
|
|
263
|
+
.vscode/
|
|
264
|
+
*.swp
|
|
265
|
+
|
|
266
|
+
# OS
|
|
267
|
+
.DS_Store
|
|
268
|
+
|
|
269
|
+
# Cache
|
|
270
|
+
.cache/
|
|
271
|
+
.turbo/
|
|
272
|
+
|
|
273
|
+
# Logs
|
|
274
|
+
*.log
|
|
275
|
+
```
|