@kood/claude-code 0.2.4 → 0.3.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.
Files changed (130) hide show
  1. package/dist/index.js +13 -8
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/code-reviewer.md +371 -19
  4. package/templates/.claude/agents/dependency-manager.md +197 -0
  5. package/templates/.claude/agents/deployment-validator.md +136 -0
  6. package/templates/.claude/agents/git-operator.md +147 -0
  7. package/templates/.claude/agents/implementation-executor.md +202 -0
  8. package/templates/.claude/agents/lint-fixer.md +155 -0
  9. package/templates/.claude/agents/refactor-advisor.md +339 -29
  10. package/templates/.claude/commands/agent-creator.md +355 -0
  11. package/templates/.claude/commands/docs-creator.md +404 -163
  12. package/templates/.claude/commands/docs-refactor.md +400 -113
  13. package/templates/.claude/commands/execute.md +357 -185
  14. package/templates/.claude/commands/git-all.md +16 -70
  15. package/templates/.claude/commands/git-session.md +36 -68
  16. package/templates/.claude/commands/git.md +20 -69
  17. package/templates/.claude/commands/lint-fix.md +164 -107
  18. package/templates/.claude/commands/lint-init.md +142 -168
  19. package/templates/.claude/commands/plan.md +300 -84
  20. package/templates/.claude/commands/prd.md +613 -0
  21. package/templates/.claude/commands/pre-deploy.md +242 -0
  22. package/templates/.claude/commands/subagent-creator.md +118 -0
  23. package/templates/.claude/commands/version-update.md +45 -57
  24. package/templates/hono/CLAUDE.md +99 -54
  25. package/templates/hono/docs/guides/conventions.md +352 -0
  26. package/templates/hono/docs/guides/env-setup.md +347 -0
  27. package/templates/hono/docs/guides/getting-started.md +239 -0
  28. package/templates/hono/docs/library/hono/error-handling.md +20 -29
  29. package/templates/hono/docs/library/hono/index.md +25 -52
  30. package/templates/hono/docs/library/hono/middleware.md +16 -75
  31. package/templates/hono/docs/library/hono/rpc.md +7 -35
  32. package/templates/hono/docs/library/hono/validation.md +25 -45
  33. package/templates/hono/docs/library/t3-env/index.md +374 -0
  34. package/templates/npx/CLAUDE.md +165 -65
  35. package/templates/npx/docs/library/commander/index.md +10 -73
  36. package/templates/npx/docs/library/fs-extra/index.md +21 -113
  37. package/templates/npx/docs/library/prompts/index.md +30 -176
  38. package/templates/npx/docs/references/patterns.md +75 -48
  39. package/templates/tanstack-start/CLAUDE.md +101 -77
  40. package/templates/tanstack-start/docs/architecture.md +427 -0
  41. package/templates/tanstack-start/docs/design.md +558 -0
  42. package/templates/tanstack-start/docs/guides/conventions.md +132 -32
  43. package/templates/tanstack-start/docs/guides/env-setup.md +127 -62
  44. package/templates/tanstack-start/docs/guides/getting-started.md +81 -20
  45. package/templates/tanstack-start/docs/guides/hooks.md +241 -36
  46. package/templates/tanstack-start/docs/guides/routes.md +213 -61
  47. package/templates/tanstack-start/docs/guides/services.md +260 -24
  48. package/templates/tanstack-start/docs/library/better-auth/index.md +469 -16
  49. package/templates/tanstack-start/docs/library/t3-env/index.md +307 -0
  50. package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -21
  51. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +22 -35
  52. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +7 -24
  53. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +26 -39
  54. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +23 -26
  55. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +32 -147
  56. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +25 -167
  57. package/templates/tanstack-start/docs/library/tanstack-router/index.md +39 -74
  58. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +46 -116
  59. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +35 -154
  60. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +32 -171
  61. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +7 -15
  62. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +16 -23
  63. package/templates/tanstack-start/docs/library/zod/complex-types.md +12 -31
  64. package/templates/tanstack-start/docs/library/zod/index.md +18 -35
  65. package/templates/tanstack-start/docs/library/zod/transforms.md +11 -25
  66. package/templates/tanstack-start/docs/library/zod/validation.md +12 -34
  67. package/templates/.claude/agents/debug-detective.md +0 -37
  68. package/templates/.claude/agents/test-writer.md +0 -41
  69. package/templates/.claude/commands/feedback.md +0 -199
  70. package/templates/.claude/commands/ts-fix.md +0 -176
  71. package/templates/.claude/skills/command-creator/LICENSE.txt +0 -202
  72. package/templates/.claude/skills/command-creator/SKILL.md +0 -245
  73. package/templates/.claude/skills/command-creator/scripts/init_command.py +0 -244
  74. package/templates/.claude/skills/command-creator/scripts/package_command.py +0 -125
  75. package/templates/.claude/skills/command-creator/scripts/quick_validate.py +0 -143
  76. package/templates/.claude/skills/frontend-design/SKILL.md +0 -310
  77. package/templates/.claude/skills/frontend-design/references/animation-patterns.md +0 -446
  78. package/templates/.claude/skills/frontend-design/references/colors-2026.md +0 -244
  79. package/templates/.claude/skills/frontend-design/references/typography-2026.md +0 -302
  80. package/templates/.claude/skills/gemini-review/SKILL.md +0 -118
  81. package/templates/.claude/skills/gemini-review/references/checklists.md +0 -129
  82. package/templates/.claude/skills/gemini-review/references/prompt-templates.md +0 -274
  83. package/templates/.claude/skills/skill-creator/LICENSE.txt +0 -202
  84. package/templates/.claude/skills/skill-creator/SKILL.md +0 -184
  85. package/templates/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
  86. package/templates/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
  87. package/templates/.claude/skills/skill-creator/scripts/quick_validate.py +0 -65
  88. package/templates/hono/docs/library/ai-sdk/index.md +0 -190
  89. package/templates/hono/docs/library/ai-sdk/openrouter.md +0 -111
  90. package/templates/hono/docs/library/ai-sdk/providers.md +0 -102
  91. package/templates/hono/docs/library/ai-sdk/streaming.md +0 -146
  92. package/templates/hono/docs/library/ai-sdk/structured-output.md +0 -161
  93. package/templates/hono/docs/library/ai-sdk/tools.md +0 -144
  94. package/templates/hono/docs/library/drizzle/cloudflare-d1.md +0 -247
  95. package/templates/hono/docs/library/drizzle/config.md +0 -167
  96. package/templates/hono/docs/library/drizzle/index.md +0 -259
  97. package/templates/hono/docs/library/hono/env-setup.md +0 -169
  98. package/templates/hono/docs/library/pino/index.md +0 -146
  99. package/templates/tanstack-start/docs/architecture/architecture.md +0 -243
  100. package/templates/tanstack-start/docs/deployment/cloudflare.md +0 -132
  101. package/templates/tanstack-start/docs/deployment/index.md +0 -163
  102. package/templates/tanstack-start/docs/deployment/nitro.md +0 -110
  103. package/templates/tanstack-start/docs/deployment/railway.md +0 -147
  104. package/templates/tanstack-start/docs/deployment/vercel.md +0 -135
  105. package/templates/tanstack-start/docs/design/components.md +0 -175
  106. package/templates/tanstack-start/docs/design/index.md +0 -151
  107. package/templates/tanstack-start/docs/design/safe-area.md +0 -118
  108. package/templates/tanstack-start/docs/design/tailwind-setup.md +0 -156
  109. package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +0 -472
  110. package/templates/tanstack-start/docs/library/ai-sdk/index.md +0 -264
  111. package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +0 -371
  112. package/templates/tanstack-start/docs/library/ai-sdk/providers.md +0 -403
  113. package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +0 -320
  114. package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +0 -454
  115. package/templates/tanstack-start/docs/library/ai-sdk/tools.md +0 -473
  116. package/templates/tanstack-start/docs/library/better-auth/2fa.md +0 -48
  117. package/templates/tanstack-start/docs/library/better-auth/advanced.md +0 -55
  118. package/templates/tanstack-start/docs/library/better-auth/plugins.md +0 -34
  119. package/templates/tanstack-start/docs/library/better-auth/session.md +0 -47
  120. package/templates/tanstack-start/docs/library/better-auth/setup.md +0 -41
  121. package/templates/tanstack-start/docs/library/drizzle/cloudflare-d1.md +0 -147
  122. package/templates/tanstack-start/docs/library/drizzle/config.md +0 -118
  123. package/templates/tanstack-start/docs/library/drizzle/crud.md +0 -205
  124. package/templates/tanstack-start/docs/library/drizzle/index.md +0 -79
  125. package/templates/tanstack-start/docs/library/drizzle/relations.md +0 -202
  126. package/templates/tanstack-start/docs/library/drizzle/schema.md +0 -154
  127. package/templates/tanstack-start/docs/library/drizzle/setup.md +0 -96
  128. package/templates/tanstack-start/docs/library/drizzle/transactions.md +0 -127
  129. package/templates/tanstack-start/docs/library/pino/index.md +0 -320
  130. /package/templates/hono/docs/{architecture/architecture.md → architecture.md} +0 -0
@@ -1,40 +1,36 @@
1
- # Hono - Web Framework
1
+ # Hono
2
2
 
3
- > Web Standards 기반 초경량 서버 프레임워크
3
+ > Web Standards 기반 초경량 프레임워크
4
4
 
5
- @env-setup.md
5
+ <references>
6
6
  @middleware.md
7
7
  @validation.md
8
8
  @error-handling.md
9
9
  @rpc.md
10
+ </references>
10
11
 
11
12
  ---
12
13
 
13
- ## 설치
14
-
14
+ <setup>
15
15
  ```bash
16
16
  npm install hono
17
17
  ```
18
+ </setup>
18
19
 
19
20
  ---
20
21
 
21
- ## 기본 사용법
22
+ <quick_patterns>
23
+
24
+ ## 라우트
22
25
 
23
26
  ```typescript
24
27
  import { Hono } from 'hono'
25
28
 
26
29
  const app = new Hono()
27
30
 
28
- app.get('/', (c) => c.text('Hello Hono!'))
31
+ app.get('/', (c) => c.text('Hello'))
29
32
  app.post('/', (c) => c.text('POST /'))
30
-
31
- // 동적 파라미터
32
- app.get('/users/:id', (c) => {
33
- const id = c.req.param('id')
34
- return c.json({ id })
35
- })
36
-
37
- // 여러 파라미터
33
+ app.get('/users/:id', (c) => c.json({ id: c.req.param('id') }))
38
34
  app.get('/posts/:postId/comments/:commentId', (c) => {
39
35
  const { postId, commentId } = c.req.param()
40
36
  return c.json({ postId, commentId })
@@ -43,13 +39,9 @@ app.get('/posts/:postId/comments/:commentId', (c) => {
43
39
  export default app
44
40
  ```
45
41
 
46
- ---
47
-
48
- ## 라우트 그룹화
42
+ ## 라우트 그룹
49
43
 
50
44
  ```typescript
51
- const app = new Hono()
52
-
53
45
  const users = new Hono()
54
46
  users.get('/', (c) => c.json({ users: [] }))
55
47
  users.get('/:id', (c) => c.json({ id: c.req.param('id') }))
@@ -58,13 +50,10 @@ users.post('/', (c) => c.json({ created: true }, 201))
58
50
  app.route('/users', users)
59
51
  ```
60
52
 
61
- ---
62
-
63
- ## Context (c)
64
-
65
- ### Request
53
+ ## Context
66
54
 
67
55
  ```typescript
56
+ // Request
68
57
  app.get('/info', (c) => {
69
58
  const url = c.req.url
70
59
  const path = c.req.path
@@ -74,11 +63,8 @@ app.get('/info', (c) => {
74
63
  const auth = c.req.header('Authorization')
75
64
  return c.json({ url, path, method })
76
65
  })
77
- ```
78
-
79
- ### Request Body
80
66
 
81
- ```typescript
67
+ // Body
82
68
  app.post('/json', async (c) => {
83
69
  const body = await c.req.json()
84
70
  return c.json(body)
@@ -88,21 +74,16 @@ app.post('/form', async (c) => {
88
74
  const body = await c.req.parseBody()
89
75
  return c.json(body)
90
76
  })
91
- ```
92
-
93
- ### Response
94
77
 
95
- ```typescript
96
- c.text('Hello') // Text
97
- c.json({ message: 'Hello' }) // JSON
98
- c.json({ id: 1 }, 201) // JSON + status
99
- c.html('<h1>Hello</h1>') // HTML
100
- c.redirect('/new') // Redirect
101
- c.notFound() // 404
78
+ // Response
79
+ c.text('Hello')
80
+ c.json({ message: 'Hello' })
81
+ c.json({ id: 1 }, 201)
82
+ c.html('<h1>Hello</h1>')
83
+ c.redirect('/new')
84
+ c.notFound()
102
85
  ```
103
86
 
104
- ---
105
-
106
87
  ## Bindings & Variables
107
88
 
108
89
  ```typescript
@@ -118,13 +99,13 @@ type Variables = {
118
99
 
119
100
  const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()
120
101
 
121
- // 환경 변수 접근
102
+ // 환경 변수
122
103
  app.get('/', (c) => {
123
104
  const dbUrl = c.env.DATABASE_URL
124
105
  return c.json({ connected: true })
125
106
  })
126
107
 
127
- // Variables 설정/사용
108
+ // Variables
128
109
  app.use(async (c, next) => {
129
110
  c.set('userId', '123')
130
111
  await next()
@@ -136,12 +117,4 @@ app.get('/me', (c) => {
136
117
  })
137
118
  ```
138
119
 
139
- ---
140
-
141
- ## 관련 문서
142
-
143
- - [환경 변수 설정](./env-setup.md)
144
- - [미들웨어](./middleware.md)
145
- - [Zod 검증](./validation.md)
146
- - [에러 처리](./error-handling.md)
147
- - [RPC Client](./rpc.md)
120
+ </quick_patterns>
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 요청/응답 처리 파이프라인
4
4
 
5
- ---
5
+ <patterns>
6
6
 
7
7
  ## 기본 사용법
8
8
 
@@ -15,11 +15,8 @@ const app = new Hono()
15
15
 
16
16
  app.use(logger()) // 모든 라우트
17
17
  app.use('/api/*', cors()) // 특정 경로
18
- ```
19
-
20
- ### 실행 순서
21
18
 
22
- ```typescript
19
+ // 실행 순서
23
20
  app.use(async (c, next) => {
24
21
  console.log('1. 요청 전')
25
22
  await next()
@@ -34,17 +31,13 @@ app.use(async (c, next) => {
34
31
  // 출력: 1 → 2 → handler → 3 → 4
35
32
  ```
36
33
 
37
- ---
38
-
39
34
  ## 커스텀 미들웨어
40
35
 
41
36
  ```typescript
42
37
  import { createMiddleware } from 'hono/factory'
43
38
  import { HTTPException } from 'hono/http-exception'
44
39
 
45
- type Env = {
46
- Variables: { userId: string }
47
- }
40
+ type Env = { Variables: { userId: string } }
48
41
 
49
42
  export const authMiddleware = createMiddleware<Env>(async (c, next) => {
50
43
  const token = c.req.header('Authorization')?.replace('Bearer ', '')
@@ -64,68 +57,6 @@ app.get('/me', authMiddleware, (c) => {
64
57
  })
65
58
  ```
66
59
 
67
- ---
68
-
69
- ## 내장 미들웨어
70
-
71
- ### Logger
72
-
73
- ```typescript
74
- import { logger } from 'hono/logger'
75
- app.use(logger())
76
- ```
77
-
78
- ### CORS
79
-
80
- ```typescript
81
- import { cors } from 'hono/cors'
82
-
83
- app.use('/api/*', cors({
84
- origin: ['https://example.com'],
85
- allowMethods: ['GET', 'POST', 'PUT', 'DELETE'],
86
- allowHeaders: ['Content-Type', 'Authorization'],
87
- credentials: true,
88
- }))
89
- ```
90
-
91
- ### Bearer Auth
92
-
93
- ```typescript
94
- import { bearerAuth } from 'hono/bearer-auth'
95
-
96
- app.use('/api/*', bearerAuth({
97
- verifyToken: async (token) => token === 'valid-token',
98
- }))
99
- ```
100
-
101
- ### Secure Headers
102
-
103
- ```typescript
104
- import { secureHeaders } from 'hono/secure-headers'
105
- app.use(secureHeaders())
106
- ```
107
-
108
- ### Request ID
109
-
110
- ```typescript
111
- import { requestId } from 'hono/request-id'
112
-
113
- app.use('*', requestId())
114
-
115
- app.get('/', (c) => {
116
- return c.text(`Request ID: ${c.get('requestId')}`)
117
- })
118
- ```
119
-
120
- ### Compress
121
-
122
- ```typescript
123
- import { compress } from 'hono/compress'
124
- app.use(compress())
125
- ```
126
-
127
- ---
128
-
129
60
  ## 타입 안전 미들웨어
130
61
 
131
62
  ```typescript
@@ -159,9 +90,19 @@ app.get('/users', (c) => {
159
90
  })
160
91
  ```
161
92
 
93
+ </patterns>
94
+
162
95
  ---
163
96
 
164
- ## 관련 문서
97
+ <builtin>
98
+
99
+ | 미들웨어 | 사용 |
100
+ |---------|------|
101
+ | **logger** | `app.use(logger())` |
102
+ | **cors** | `app.use('/api/*', cors({ origin: ['https://example.com'] }))` |
103
+ | **bearerAuth** | `app.use('/api/*', bearerAuth({ verifyToken: async (t) => t === 'valid' }))` |
104
+ | **secureHeaders** | `app.use(secureHeaders())` |
105
+ | **requestId** | `app.use(requestId())` → `c.get('requestId')` |
106
+ | **compress** | `app.use(compress())` |
165
107
 
166
- - [기본 사용법](./index.md)
167
- - [에러 처리](./error-handling.md)
108
+ </builtin>
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Type-safe API 호출
4
4
 
5
- ---
5
+ <patterns>
6
6
 
7
7
  ## 서버 설정
8
8
 
@@ -26,14 +26,11 @@ const app = new Hono()
26
26
  }
27
27
  )
28
28
 
29
- // 타입 export 필수
30
- export type AppType = typeof app
29
+ export type AppType = typeof app // 필수
31
30
  export default app
32
31
  ```
33
32
 
34
- ---
35
-
36
- ## 클라이언트 사용
33
+ ## 클라이언트
37
34
 
38
35
  ```typescript
39
36
  // client.ts
@@ -54,13 +51,7 @@ const data = await res.json() // { id: string, name: string }
54
51
  const res = await client.users.$post({
55
52
  json: { name: 'John', email: 'john@example.com' },
56
53
  })
57
- ```
58
-
59
- ---
60
54
 
61
- ## 요청 옵션
62
-
63
- ```typescript
64
55
  // Query
65
56
  const res = await client.search.$get({
66
57
  query: { q: 'hono', page: '1' },
@@ -76,21 +67,14 @@ const res = await client.posts.$post(
76
67
  { json: { title: 'Test' } },
77
68
  { headers: { 'X-Custom': 'value' } }
78
69
  )
79
- ```
80
-
81
- ---
82
70
 
83
- ## 클라이언트 설정
84
-
85
- ```typescript
71
+ // Config
86
72
  const client = hc<AppType>('http://localhost:8787/', {
87
73
  headers: { Authorization: 'Bearer TOKEN' },
88
74
  init: { credentials: 'include' },
89
75
  })
90
76
  ```
91
77
 
92
- ---
93
-
94
78
  ## 타입 추론
95
79
 
96
80
  ```typescript
@@ -103,9 +87,7 @@ type UserResponse = InferResponseType<typeof client.users[':id'].$get>
103
87
  // { id: string; name: string }
104
88
  ```
105
89
 
106
- ---
107
-
108
- ## CRUD 예제
90
+ ## CRUD 래퍼
109
91
 
110
92
  ```typescript
111
93
  const userApi = {
@@ -134,20 +116,10 @@ const userApi = {
134
116
  return res.json()
135
117
  },
136
118
  }
137
- ```
138
-
139
- ---
140
119
 
141
- ## URL 생성
142
-
143
- ```typescript
120
+ // URL 생성
144
121
  const url = client.posts[':id'].$url({ param: { id: '123' } })
145
122
  console.log(url.pathname) // /posts/123
146
123
  ```
147
124
 
148
- ---
149
-
150
- ## 관련 문서
151
-
152
- - [기본 사용법](./index.md)
153
- - [Zod 검증](./validation.md)
125
+ </patterns>
@@ -2,40 +2,38 @@
2
2
 
3
3
  > @hono/zod-validator로 타입 안전 요청 검증
4
4
 
5
- ---
6
-
7
- ## 설치
8
-
5
+ <setup>
9
6
  ```bash
10
7
  npm install zod @hono/zod-validator
11
8
  ```
9
+ </setup>
12
10
 
13
11
  ---
14
12
 
15
- ## 기본 사용법
13
+ <patterns>
16
14
 
17
- ### JSON Body
15
+ ## JSON Body
18
16
 
19
17
  ```typescript
20
18
  import { zValidator } from '@hono/zod-validator'
21
19
  import { z } from 'zod'
22
20
 
23
- // ✅ Zod v4 문법
24
21
  const createUserSchema = z.object({
25
- email: z.email(), // v4
22
+ email: z.email(), // v4
26
23
  name: z.string().min(1).trim(),
27
- website: z.url().optional(), // v4
24
+ website: z.url().optional(), // v4
28
25
  })
29
26
 
30
27
  app.post('/users', zValidator('json', createUserSchema), (c) => {
31
- const data = c.req.valid('json') // 타입 추론됨
28
+ const data = c.req.valid('json')
32
29
  return c.json({ user: data }, 201)
33
30
  })
34
31
  ```
35
32
 
36
- ### Query Parameter
33
+ ## Query / Param / Header
37
34
 
38
35
  ```typescript
36
+ // Query
39
37
  const searchSchema = z.object({
40
38
  q: z.string(),
41
39
  page: z.coerce.number().positive().optional(),
@@ -46,11 +44,8 @@ app.get('/search', zValidator('query', searchSchema), (c) => {
46
44
  const { q, page = 1, limit = 10 } = c.req.valid('query')
47
45
  return c.json({ query: q, page, limit })
48
46
  })
49
- ```
50
47
 
51
- ### Path Parameter
52
-
53
- ```typescript
48
+ // Param
54
49
  app.get('/users/:id',
55
50
  zValidator('param', z.object({ id: z.string().uuid() })),
56
51
  (c) => {
@@ -58,23 +53,16 @@ app.get('/users/:id',
58
53
  return c.json({ id })
59
54
  }
60
55
  )
61
- ```
62
56
 
63
- ### Header
64
-
65
- ```typescript
66
- // 헤더 이름은 소문자
67
- const headerSchema = z.object({
68
- 'x-api-key': z.string().uuid(),
69
- })
70
-
71
- app.get('/api/protected', zValidator('header', headerSchema), (c) => {
72
- return c.json({ apiKey: c.req.valid('header')['x-api-key'] })
73
- })
57
+ // Header (소문자!)
58
+ app.get('/api/protected',
59
+ zValidator('header', z.object({ 'x-api-key': z.string().uuid() })),
60
+ (c) => {
61
+ return c.json({ apiKey: c.req.valid('header')['x-api-key'] })
62
+ }
63
+ )
74
64
  ```
75
65
 
76
- ---
77
-
78
66
  ## 복합 검증
79
67
 
80
68
  ```typescript
@@ -92,9 +80,7 @@ app.post(
92
80
  )
93
81
  ```
94
82
 
95
- ---
96
-
97
- ## 커스텀 에러 처리
83
+ ## 커스텀 에러
98
84
 
99
85
  ```typescript
100
86
  app.post(
@@ -114,13 +100,10 @@ app.post(
114
100
  )
115
101
  ```
116
102
 
117
- ---
118
-
119
- ## 재사용 가능한 스키마
120
-
121
- ### validators/user.ts
103
+ ## 재사용 스키마
122
104
 
123
105
  ```typescript
106
+ // validators/user.ts
124
107
  import { z } from 'zod'
125
108
 
126
109
  export const createUserSchema = z.object({
@@ -134,12 +117,14 @@ export const updateUserSchema = createUserSchema.partial()
134
117
  export type CreateUserInput = z.infer<typeof createUserSchema>
135
118
  ```
136
119
 
120
+ </patterns>
121
+
137
122
  ---
138
123
 
139
- ## 고급 패턴
124
+ <advanced>
140
125
 
141
126
  ```typescript
142
- // Coerce (타입 변환)
127
+ // Coerce
143
128
  z.coerce.number() // string → number
144
129
  z.coerce.boolean() // 'true' → boolean
145
130
  z.coerce.date() // string → Date
@@ -160,9 +145,4 @@ z.object({
160
145
  })
161
146
  ```
162
147
 
163
- ---
164
-
165
- ## 관련 문서
166
-
167
- - [Zod 가이드](../zod/index.md)
168
- - [에러 처리](./error-handling.md)
148
+ </advanced>