@kood/claude-code 0.1.0
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.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
# Zod v4 - Schema Validation
|
|
2
|
+
|
|
3
|
+
> TypeScript-first 스키마 선언 및 검증 라이브러리
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ⚠️ 버전 주의
|
|
8
|
+
|
|
9
|
+
이 문서는 **Zod v4** 기준입니다. v3과 API가 다릅니다.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// ✅ v4 문법
|
|
13
|
+
z.email()
|
|
14
|
+
z.url()
|
|
15
|
+
z.uuid()
|
|
16
|
+
|
|
17
|
+
// ❌ v3 문법 (사용 금지)
|
|
18
|
+
z.string().email()
|
|
19
|
+
z.string().url()
|
|
20
|
+
z.string().uuid()
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 설치
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install zod
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 기본 타입
|
|
34
|
+
|
|
35
|
+
### Primitives
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { z } from 'zod'
|
|
39
|
+
|
|
40
|
+
// 문자열
|
|
41
|
+
const stringSchema = z.string()
|
|
42
|
+
|
|
43
|
+
// 숫자
|
|
44
|
+
const numberSchema = z.number()
|
|
45
|
+
|
|
46
|
+
// 불리언
|
|
47
|
+
const booleanSchema = z.boolean()
|
|
48
|
+
|
|
49
|
+
// BigInt
|
|
50
|
+
const bigintSchema = z.bigint()
|
|
51
|
+
|
|
52
|
+
// Date
|
|
53
|
+
const dateSchema = z.date()
|
|
54
|
+
|
|
55
|
+
// Undefined / Null
|
|
56
|
+
const undefinedSchema = z.undefined()
|
|
57
|
+
const nullSchema = z.null()
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 문자열 검증 (v4)
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
// ✅ v4 전용 메서드
|
|
64
|
+
z.email() // 이메일
|
|
65
|
+
z.url() // URL
|
|
66
|
+
z.uuid() // UUID
|
|
67
|
+
z.cuid() // CUID
|
|
68
|
+
z.ulid() // ULID
|
|
69
|
+
z.ip() // IP 주소
|
|
70
|
+
|
|
71
|
+
// 문자열 + 체이닝
|
|
72
|
+
z.string().min(1) // 최소 길이
|
|
73
|
+
z.string().max(100) // 최대 길이
|
|
74
|
+
z.string().length(10) // 정확한 길이
|
|
75
|
+
z.string().trim() // 앞뒤 공백 제거
|
|
76
|
+
z.string().toLowerCase() // 소문자 변환
|
|
77
|
+
z.string().toUpperCase() // 대문자 변환
|
|
78
|
+
z.string().startsWith('a') // 접두사
|
|
79
|
+
z.string().endsWith('z') // 접미사
|
|
80
|
+
z.string().includes('test') // 포함
|
|
81
|
+
z.string().regex(/^[a-z]+$/) // 정규식
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 숫자 검증
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
z.number().int() // 정수
|
|
88
|
+
z.number().positive() // 양수
|
|
89
|
+
z.number().negative() // 음수
|
|
90
|
+
z.number().nonnegative() // 0 이상
|
|
91
|
+
z.number().nonpositive() // 0 이하
|
|
92
|
+
z.number().min(1) // 최소값
|
|
93
|
+
z.number().max(100) // 최대값
|
|
94
|
+
z.number().multipleOf(5) // 배수
|
|
95
|
+
z.number().finite() // 유한수
|
|
96
|
+
z.number().safe() // 안전한 정수 범위
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 객체
|
|
102
|
+
|
|
103
|
+
### 기본 객체
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
const userSchema = z.object({
|
|
107
|
+
id: z.string(),
|
|
108
|
+
email: z.email(),
|
|
109
|
+
name: z.string().min(1).trim(),
|
|
110
|
+
age: z.number().int().positive(),
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
type User = z.infer<typeof userSchema>
|
|
114
|
+
// { id: string; email: string; name: string; age: number }
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Optional / Nullable
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const schema = z.object({
|
|
121
|
+
required: z.string(),
|
|
122
|
+
optional: z.string().optional(), // string | undefined
|
|
123
|
+
nullable: z.string().nullable(), // string | null
|
|
124
|
+
nullish: z.string().nullish(), // string | null | undefined
|
|
125
|
+
})
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 기본값
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
const schema = z.object({
|
|
132
|
+
name: z.string().default('Anonymous'),
|
|
133
|
+
role: z.enum(['user', 'admin']).default('user'),
|
|
134
|
+
active: z.boolean().default(true),
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Partial / Required
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
const userSchema = z.object({
|
|
142
|
+
name: z.string(),
|
|
143
|
+
email: z.email(),
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// 모든 필드 optional
|
|
147
|
+
const partialSchema = userSchema.partial()
|
|
148
|
+
// { name?: string; email?: string }
|
|
149
|
+
|
|
150
|
+
// 모든 필드 required
|
|
151
|
+
const requiredSchema = partialSchema.required()
|
|
152
|
+
// { name: string; email: string }
|
|
153
|
+
|
|
154
|
+
// 특정 필드만 partial
|
|
155
|
+
const mixedSchema = userSchema.partial({ email: true })
|
|
156
|
+
// { name: string; email?: string }
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Pick / Omit
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const userSchema = z.object({
|
|
163
|
+
id: z.string(),
|
|
164
|
+
name: z.string(),
|
|
165
|
+
email: z.email(),
|
|
166
|
+
password: z.string(),
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
// 특정 필드만 선택
|
|
170
|
+
const publicSchema = userSchema.pick({ id: true, name: true })
|
|
171
|
+
// { id: string; name: string }
|
|
172
|
+
|
|
173
|
+
// 특정 필드 제외
|
|
174
|
+
const createSchema = userSchema.omit({ id: true })
|
|
175
|
+
// { name: string; email: string; password: string }
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Extend / Merge
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
const baseSchema = z.object({
|
|
182
|
+
id: z.string(),
|
|
183
|
+
createdAt: z.date(),
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
// 확장
|
|
187
|
+
const userSchema = baseSchema.extend({
|
|
188
|
+
name: z.string(),
|
|
189
|
+
email: z.email(),
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
// 병합
|
|
193
|
+
const anotherSchema = z.object({
|
|
194
|
+
updatedAt: z.date(),
|
|
195
|
+
})
|
|
196
|
+
const mergedSchema = baseSchema.merge(anotherSchema)
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 배열
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// 기본 배열
|
|
205
|
+
z.array(z.string())
|
|
206
|
+
|
|
207
|
+
// 길이 제한
|
|
208
|
+
z.array(z.string()).min(1)
|
|
209
|
+
z.array(z.string()).max(10)
|
|
210
|
+
z.array(z.string()).length(5)
|
|
211
|
+
z.array(z.string()).nonempty()
|
|
212
|
+
|
|
213
|
+
// 중복 제거 (unique는 없음, transform 사용)
|
|
214
|
+
z.array(z.string()).transform((arr) => [...new Set(arr)])
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Enum / Union
|
|
220
|
+
|
|
221
|
+
### Enum
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
// Zod enum
|
|
225
|
+
const statusSchema = z.enum(['pending', 'active', 'completed'])
|
|
226
|
+
type Status = z.infer<typeof statusSchema>
|
|
227
|
+
// 'pending' | 'active' | 'completed'
|
|
228
|
+
|
|
229
|
+
// TypeScript enum 사용
|
|
230
|
+
enum Role {
|
|
231
|
+
User = 'user',
|
|
232
|
+
Admin = 'admin',
|
|
233
|
+
}
|
|
234
|
+
const roleSchema = z.nativeEnum(Role)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Union
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
// 기본 union
|
|
241
|
+
const stringOrNumber = z.union([z.string(), z.number()])
|
|
242
|
+
|
|
243
|
+
// Discriminated union
|
|
244
|
+
const responseSchema = z.discriminatedUnion('type', [
|
|
245
|
+
z.object({ type: z.literal('success'), data: z.unknown() }),
|
|
246
|
+
z.object({ type: z.literal('error'), message: z.string() }),
|
|
247
|
+
])
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Coerce (타입 변환)
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// Query parameter 등에서 유용
|
|
256
|
+
z.coerce.string() // any → string
|
|
257
|
+
z.coerce.number() // string → number
|
|
258
|
+
z.coerce.boolean() // 'true'/'false' → boolean
|
|
259
|
+
z.coerce.date() // string → Date
|
|
260
|
+
z.coerce.bigint() // string → bigint
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Transform
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// 값 변환
|
|
269
|
+
const schema = z.string().transform((val) => val.toUpperCase())
|
|
270
|
+
|
|
271
|
+
// 타입 변환
|
|
272
|
+
const numberToString = z.number().transform((n) => String(n))
|
|
273
|
+
|
|
274
|
+
// 복합 변환
|
|
275
|
+
const userSchema = z.object({
|
|
276
|
+
email: z.email().transform((e) => e.toLowerCase()),
|
|
277
|
+
name: z.string().transform((n) => n.trim()),
|
|
278
|
+
tags: z.string().transform((s) => s.split(',').map((t) => t.trim())),
|
|
279
|
+
})
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Refine (커스텀 검증)
|
|
285
|
+
|
|
286
|
+
### 단일 필드
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const passwordSchema = z.string().refine(
|
|
290
|
+
(password) => password.length >= 8 && /[A-Z]/.test(password),
|
|
291
|
+
{ message: '8자 이상, 대문자 포함 필요' }
|
|
292
|
+
)
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 객체 전체
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
const schema = z.object({
|
|
299
|
+
password: z.string().min(8),
|
|
300
|
+
confirmPassword: z.string(),
|
|
301
|
+
}).refine(
|
|
302
|
+
(data) => data.password === data.confirmPassword,
|
|
303
|
+
{
|
|
304
|
+
message: '비밀번호가 일치하지 않습니다',
|
|
305
|
+
path: ['confirmPassword'], // 에러 위치 지정
|
|
306
|
+
}
|
|
307
|
+
)
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### SuperRefine (고급)
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
const schema = z.string().superRefine((val, ctx) => {
|
|
314
|
+
if (val.length < 8) {
|
|
315
|
+
ctx.addIssue({
|
|
316
|
+
code: z.ZodIssueCode.too_small,
|
|
317
|
+
minimum: 8,
|
|
318
|
+
type: 'string',
|
|
319
|
+
inclusive: true,
|
|
320
|
+
message: '8자 이상 입력하세요',
|
|
321
|
+
})
|
|
322
|
+
}
|
|
323
|
+
if (!/[A-Z]/.test(val)) {
|
|
324
|
+
ctx.addIssue({
|
|
325
|
+
code: z.ZodIssueCode.custom,
|
|
326
|
+
message: '대문자를 포함하세요',
|
|
327
|
+
})
|
|
328
|
+
}
|
|
329
|
+
})
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 에러 처리
|
|
335
|
+
|
|
336
|
+
### safeParse
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
const schema = z.object({
|
|
340
|
+
email: z.email(),
|
|
341
|
+
age: z.number().min(0),
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
const result = schema.safeParse(input)
|
|
345
|
+
|
|
346
|
+
if (result.success) {
|
|
347
|
+
console.log(result.data) // 검증된 데이터
|
|
348
|
+
} else {
|
|
349
|
+
console.log(result.error.flatten())
|
|
350
|
+
// {
|
|
351
|
+
// formErrors: [],
|
|
352
|
+
// fieldErrors: {
|
|
353
|
+
// email: ['Invalid email'],
|
|
354
|
+
// age: ['Number must be greater than or equal to 0']
|
|
355
|
+
// }
|
|
356
|
+
// }
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### 커스텀 에러 메시지
|
|
361
|
+
|
|
362
|
+
```typescript
|
|
363
|
+
const schema = z.object({
|
|
364
|
+
email: z.email({ message: '올바른 이메일을 입력하세요' }),
|
|
365
|
+
name: z.string().min(1, { message: '이름을 입력하세요' }),
|
|
366
|
+
age: z.number()
|
|
367
|
+
.min(0, { message: '나이는 0 이상이어야 합니다' })
|
|
368
|
+
.max(150, { message: '나이는 150 이하여야 합니다' }),
|
|
369
|
+
})
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## Hono와 함께 사용
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import { Hono } from 'hono'
|
|
378
|
+
import { zValidator } from '@hono/zod-validator'
|
|
379
|
+
import { z } from 'zod'
|
|
380
|
+
|
|
381
|
+
const app = new Hono()
|
|
382
|
+
|
|
383
|
+
// ✅ v4 문법 사용
|
|
384
|
+
const createUserSchema = z.object({
|
|
385
|
+
email: z.email(),
|
|
386
|
+
name: z.string().min(1).trim(),
|
|
387
|
+
website: z.url().optional(),
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
app.post(
|
|
391
|
+
'/users',
|
|
392
|
+
zValidator('json', createUserSchema, (result, c) => {
|
|
393
|
+
if (!result.success) {
|
|
394
|
+
return c.json(
|
|
395
|
+
{ errors: result.error.flatten().fieldErrors },
|
|
396
|
+
400
|
|
397
|
+
)
|
|
398
|
+
}
|
|
399
|
+
}),
|
|
400
|
+
(c) => {
|
|
401
|
+
const data = c.req.valid('json')
|
|
402
|
+
return c.json({ user: data }, 201)
|
|
403
|
+
}
|
|
404
|
+
)
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 관련 문서
|
|
410
|
+
|
|
411
|
+
- [Hono 검증](../hono/validation.md)
|
|
412
|
+
- [복잡한 타입](./complex-types.md)
|
|
413
|
+
- [Transform](./transforms.md)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Context7
|
|
2
|
+
|
|
3
|
+
> 라이브러리 공식 문서 조회 도구
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 개요
|
|
8
|
+
|
|
9
|
+
Context7은 주요 라이브러리의 공식 문서를 조회하여 정확한 API 정보와 사용 패턴을 제공합니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 사용 시점
|
|
14
|
+
|
|
15
|
+
### ✅ 사용 권장
|
|
16
|
+
- **API 확인**: 라이브러리 함수/메서드 사용법
|
|
17
|
+
- **공식 패턴**: 권장되는 코드 패턴
|
|
18
|
+
- **버전별 차이**: 특정 버전의 API 확인
|
|
19
|
+
- **최신 정보**: 최신 릴리즈 기능 확인
|
|
20
|
+
|
|
21
|
+
### ❌ 사용 불필요
|
|
22
|
+
- 이미 알고 있는 기본 API
|
|
23
|
+
- 프로젝트 내부 코드 관련 질문
|
|
24
|
+
- 일반적인 프로그래밍 개념
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 지원 라이브러리
|
|
29
|
+
|
|
30
|
+
### 주요 지원
|
|
31
|
+
- **Hono**: 라우팅, 미들웨어, RPC
|
|
32
|
+
- **Zod**: 스키마 정의, 검증
|
|
33
|
+
- **Prisma**: ORM, 쿼리, 마이그레이션
|
|
34
|
+
- **TypeScript**: 타입 시스템
|
|
35
|
+
|
|
36
|
+
### 기타 지원
|
|
37
|
+
- React, Vue, Angular
|
|
38
|
+
- Express, Fastify
|
|
39
|
+
- 기타 주요 npm 패키지
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 사용 예시
|
|
44
|
+
|
|
45
|
+
### Hono 문서 조회
|
|
46
|
+
```
|
|
47
|
+
"Hono의 zValidator 사용법 조회"
|
|
48
|
+
"Hono middleware 작성 패턴 조회"
|
|
49
|
+
"Hono RPC client 설정 방법 조회"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Zod 문서 조회
|
|
53
|
+
```
|
|
54
|
+
"Zod v4의 z.email() 사용법 조회"
|
|
55
|
+
"Zod transform 패턴 조회"
|
|
56
|
+
"Zod discriminatedUnion 사용법 조회"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Prisma 문서 조회
|
|
60
|
+
```
|
|
61
|
+
"Prisma v7 generator 설정 조회"
|
|
62
|
+
"Prisma transaction 패턴 조회"
|
|
63
|
+
"Prisma relation 쿼리 방법 조회"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 장점
|
|
69
|
+
|
|
70
|
+
### 1. 정확한 정보
|
|
71
|
+
- 공식 문서 기반
|
|
72
|
+
- 검증된 코드 예시
|
|
73
|
+
|
|
74
|
+
### 2. 최신 정보
|
|
75
|
+
- 최신 버전 반영
|
|
76
|
+
- 업데이트된 API
|
|
77
|
+
|
|
78
|
+
### 3. 버전 특정
|
|
79
|
+
- 특정 버전 문서 조회
|
|
80
|
+
- 버전 간 차이 확인
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 워크플로우
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
1. 필요한 정보 파악
|
|
88
|
+
└─ 어떤 라이브러리의 어떤 기능?
|
|
89
|
+
|
|
90
|
+
2. Context7 조회
|
|
91
|
+
└─ 해당 라이브러리 문서 검색
|
|
92
|
+
|
|
93
|
+
3. 정보 확인
|
|
94
|
+
└─ API 시그니처, 사용 예시
|
|
95
|
+
|
|
96
|
+
4. 코드 적용
|
|
97
|
+
└─ 프로젝트에 맞게 적용
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 관련 문서
|
|
103
|
+
|
|
104
|
+
- [MCP 개요](./index.md)
|
|
105
|
+
- [sgrep](./sgrep.md)
|
|
106
|
+
- [Sequential Thinking](./sequential-thinking.md)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# MCP 도구 가이드
|
|
2
|
+
|
|
3
|
+
> Claude Code에서 사용하는 MCP (Model Context Protocol) 도구
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 MCP 도구 개요
|
|
8
|
+
|
|
9
|
+
| 도구 | 용도 | 사용 시점 |
|
|
10
|
+
|------|------|----------|
|
|
11
|
+
| **sgrep** | 코드 검색 | 코드베이스 검색 시 (grep/rg 대신) |
|
|
12
|
+
| **Sequential Thinking** | 복잡한 분석 | 디버깅, 아키텍처 분석 |
|
|
13
|
+
| **Context7** | 라이브러리 문서 | 공식 문서 참조 필요 시 |
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## sgrep - 코드 검색
|
|
18
|
+
|
|
19
|
+
> ⚠️ **필수**: 코드베이스 검색 시 grep/rg 대신 sgrep 사용
|
|
20
|
+
|
|
21
|
+
### 사용 시점
|
|
22
|
+
- 코드베이스에서 패턴 검색
|
|
23
|
+
- 함수/클래스 사용처 찾기
|
|
24
|
+
- 특정 패턴의 코드 찾기
|
|
25
|
+
|
|
26
|
+
### 장점
|
|
27
|
+
- AST 기반 시맨틱 검색
|
|
28
|
+
- 언어별 최적화된 패턴 매칭
|
|
29
|
+
- 정확한 코드 구조 인식
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Sequential Thinking - 분석 도구
|
|
34
|
+
|
|
35
|
+
> 복잡한 문제를 단계별로 분석
|
|
36
|
+
|
|
37
|
+
### 사용 시점
|
|
38
|
+
- 복잡한 버그 디버깅
|
|
39
|
+
- 아키텍처 분석/설계
|
|
40
|
+
- 성능 병목 분석
|
|
41
|
+
- 리팩토링 계획 수립
|
|
42
|
+
|
|
43
|
+
### 특징
|
|
44
|
+
- 단계별 사고 과정 기록
|
|
45
|
+
- 가설 설정 및 검증
|
|
46
|
+
- 체계적인 문제 해결
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Context7 - 라이브러리 문서
|
|
51
|
+
|
|
52
|
+
> 공식 라이브러리 문서 조회
|
|
53
|
+
|
|
54
|
+
### 사용 시점
|
|
55
|
+
- 라이브러리 API 확인
|
|
56
|
+
- 공식 문서 패턴 참조
|
|
57
|
+
- 최신 버전 사용법 확인
|
|
58
|
+
|
|
59
|
+
### 지원 라이브러리
|
|
60
|
+
- Hono
|
|
61
|
+
- Zod
|
|
62
|
+
- Prisma
|
|
63
|
+
- 기타 주요 라이브러리
|
|
64
|
+
|
|
65
|
+
### 사용 예시
|
|
66
|
+
```
|
|
67
|
+
Context7로 Hono middleware 문서 조회
|
|
68
|
+
Context7로 Zod v4 validation 문서 조회
|
|
69
|
+
Context7로 Prisma transaction 문서 조회
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## MCP 도구 선택 가이드
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
코드 검색이 필요한가?
|
|
78
|
+
├─ Yes → sgrep 사용
|
|
79
|
+
└─ No
|
|
80
|
+
├─ 복잡한 분석이 필요한가?
|
|
81
|
+
│ ├─ Yes → Sequential Thinking 사용
|
|
82
|
+
│ └─ No
|
|
83
|
+
│ └─ 라이브러리 문서가 필요한가?
|
|
84
|
+
│ ├─ Yes → Context7 사용
|
|
85
|
+
│ └─ No → 일반 도구 사용
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 관련 문서
|
|
91
|
+
|
|
92
|
+
- [sgrep 상세](./sgrep.md)
|
|
93
|
+
- [Sequential Thinking 상세](./sequential-thinking.md)
|
|
94
|
+
- [Context7 상세](./context7.md)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Sequential Thinking
|
|
2
|
+
|
|
3
|
+
> 복잡한 문제를 단계별로 분석하는 사고 도구
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 개요
|
|
8
|
+
|
|
9
|
+
Sequential Thinking은 복잡한 문제를 체계적으로 분석하고 해결하기 위한 MCP 도구입니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 사용 시점
|
|
14
|
+
|
|
15
|
+
### ✅ 사용 권장
|
|
16
|
+
- **복잡한 버그 디버깅**: 원인 파악이 어려운 버그
|
|
17
|
+
- **아키텍처 분석/설계**: 시스템 구조 이해 및 설계
|
|
18
|
+
- **성능 병목 분석**: 성능 문제 원인 파악
|
|
19
|
+
- **리팩토링 계획**: 대규모 코드 변경 계획
|
|
20
|
+
- **보안 취약점 분석**: 보안 이슈 탐지 및 해결
|
|
21
|
+
|
|
22
|
+
### ❌ 사용 불필요
|
|
23
|
+
- 단순한 코드 작성
|
|
24
|
+
- 명확한 버그 수정
|
|
25
|
+
- 간단한 질문 응답
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 분석 프로세스
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
1. 문제 정의
|
|
33
|
+
└─ 무엇을 해결해야 하는가?
|
|
34
|
+
|
|
35
|
+
2. 정보 수집
|
|
36
|
+
└─ 관련 코드, 로그, 에러 메시지
|
|
37
|
+
|
|
38
|
+
3. 가설 설정
|
|
39
|
+
└─ 가능한 원인들 나열
|
|
40
|
+
|
|
41
|
+
4. 가설 검증
|
|
42
|
+
└─ 각 가설을 코드/데이터로 검증
|
|
43
|
+
|
|
44
|
+
5. 결론 도출
|
|
45
|
+
└─ 검증된 원인과 해결책
|
|
46
|
+
|
|
47
|
+
6. 실행 계획
|
|
48
|
+
└─ 구체적인 수정 단계
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 예시 상황
|
|
54
|
+
|
|
55
|
+
### 복잡한 버그 디버깅
|
|
56
|
+
```
|
|
57
|
+
문제: "API 응답이 간헐적으로 느림"
|
|
58
|
+
|
|
59
|
+
Sequential Thinking 활용:
|
|
60
|
+
1. 느린 요청의 패턴 분석
|
|
61
|
+
2. 가능한 원인 나열 (DB, 네트워크, 코드)
|
|
62
|
+
3. 각 원인별 증거 수집
|
|
63
|
+
4. 병목 지점 확인
|
|
64
|
+
5. 해결책 제시
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 아키텍처 분석
|
|
68
|
+
```
|
|
69
|
+
문제: "마이크로서비스 분리 계획"
|
|
70
|
+
|
|
71
|
+
Sequential Thinking 활용:
|
|
72
|
+
1. 현재 모놀리스 구조 분석
|
|
73
|
+
2. 도메인 경계 식별
|
|
74
|
+
3. 의존성 그래프 작성
|
|
75
|
+
4. 분리 우선순위 결정
|
|
76
|
+
5. 마이그레이션 계획 수립
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 장점
|
|
82
|
+
|
|
83
|
+
### 1. 체계적 접근
|
|
84
|
+
- 단계별 사고 과정 기록
|
|
85
|
+
- 놓치는 부분 최소화
|
|
86
|
+
|
|
87
|
+
### 2. 가설 기반 분석
|
|
88
|
+
- 추측이 아닌 검증 기반
|
|
89
|
+
- 명확한 근거 제시
|
|
90
|
+
|
|
91
|
+
### 3. 재사용 가능
|
|
92
|
+
- 분석 과정 문서화
|
|
93
|
+
- 유사 문제에 적용 가능
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 관련 문서
|
|
98
|
+
|
|
99
|
+
- [MCP 개요](./index.md)
|
|
100
|
+
- [sgrep](./sgrep.md)
|
|
101
|
+
- [Context7](./context7.md)
|