@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.
Files changed (63) hide show
  1. package/dist/index.js +129 -5
  2. package/package.json +2 -2
  3. package/templates/hono/CLAUDE.md +20 -2
  4. package/templates/hono/docs/architecture/architecture.md +909 -0
  5. package/templates/hono/docs/commands/git.md +275 -0
  6. package/templates/hono/docs/deployment/cloudflare.md +527 -190
  7. package/templates/hono/docs/deployment/docker.md +514 -0
  8. package/templates/hono/docs/deployment/index.md +179 -214
  9. package/templates/hono/docs/deployment/railway.md +416 -0
  10. package/templates/hono/docs/deployment/vercel.md +567 -0
  11. package/templates/hono/docs/library/ai-sdk/index.md +427 -0
  12. package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
  13. package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
  14. package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
  15. package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
  16. package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
  17. package/templates/hono/docs/library/hono/env-setup.md +458 -0
  18. package/templates/hono/docs/library/hono/index.md +1 -3
  19. package/templates/hono/docs/library/pino/index.md +437 -0
  20. package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
  21. package/templates/hono/docs/library/prisma/config.md +362 -0
  22. package/templates/hono/docs/library/prisma/index.md +86 -13
  23. package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
  24. package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
  25. package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
  26. package/templates/npx/CLAUDE.md +309 -0
  27. package/templates/npx/docs/commands/git.md +275 -0
  28. package/templates/npx/docs/library/commander/index.md +164 -0
  29. package/templates/npx/docs/library/fs-extra/index.md +171 -0
  30. package/templates/npx/docs/library/prompts/index.md +253 -0
  31. package/templates/npx/docs/mcp/index.md +60 -0
  32. package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
  33. package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
  34. package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
  35. package/templates/tanstack-start/CLAUDE.md +43 -5
  36. package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
  37. package/templates/tanstack-start/docs/commands/git.md +275 -0
  38. package/templates/tanstack-start/docs/deployment/cloudflare.md +223 -50
  39. package/templates/tanstack-start/docs/deployment/index.md +320 -30
  40. package/templates/tanstack-start/docs/deployment/nitro.md +195 -14
  41. package/templates/tanstack-start/docs/deployment/railway.md +302 -150
  42. package/templates/tanstack-start/docs/deployment/vercel.md +345 -75
  43. package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
  44. package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
  45. package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
  46. package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
  47. package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
  48. package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
  49. package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
  50. package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
  51. package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
  52. package/templates/tanstack-start/docs/library/pino/index.md +320 -0
  53. package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
  54. package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
  55. package/templates/tanstack-start/docs/library/prisma/index.md +3 -5
  56. package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
  57. package/templates/tanstack-start/docs/library/prisma/setup.md +0 -7
  58. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
  59. package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
  60. package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
  61. package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
  62. package/templates/hono/docs/git/index.md +0 -180
  63. package/templates/tanstack-start/docs/git/index.md +0 -203
@@ -0,0 +1,437 @@
1
+ # Pino - Structured Logging
2
+
3
+ > 초고속 JSON 로거
4
+
5
+ ---
6
+
7
+ ## 왜 console.log 대신 Pino를 사용해야 하나요?
8
+
9
+ | 항목 | console.log | Pino |
10
+ |------|-------------|------|
11
+ | **출력 형식** | 비정형 텍스트 | 구조화된 JSON |
12
+ | **성능** | 느림 | 초고속 (30x 빠름) |
13
+ | **로그 레벨** | 없음 | debug, info, warn, error, fatal |
14
+ | **컨텍스트 추가** | 수동 문자열 연결 | 자동 객체 바인딩 |
15
+ | **프로덕션 분석** | 어려움 | JSON 파싱으로 쉬움 |
16
+ | **Child Logger** | 불가 | 요청별 컨텍스트 분리 |
17
+
18
+ ---
19
+
20
+ ## 설치
21
+
22
+ ```bash
23
+ # pino + pino-pretty (개발용 포맷터)
24
+ npm install pino pino-pretty
25
+
26
+ # pino-http (HTTP 요청 로깅)
27
+ npm install pino-http
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 기본 설정
33
+
34
+ ### lib/logger.ts
35
+
36
+ ```typescript
37
+ import pino from 'pino'
38
+
39
+ const isDev = process.env.NODE_ENV === 'development'
40
+
41
+ export const logger = pino({
42
+ level: isDev ? 'debug' : 'info',
43
+ transport: isDev
44
+ ? {
45
+ target: 'pino-pretty',
46
+ options: {
47
+ colorize: true,
48
+ translateTime: 'SYS:yyyy-mm-dd HH:MM:ss',
49
+ ignore: 'pid,hostname',
50
+ },
51
+ }
52
+ : undefined,
53
+ })
54
+ ```
55
+
56
+ ### 환경별 출력
57
+
58
+ **개발 환경** (pino-pretty):
59
+ ```
60
+ 2024-01-15 10:30:45 INFO: User created successfully
61
+ userId: "user_123"
62
+ email: "user@example.com"
63
+ ```
64
+
65
+ **프로덕션** (JSON):
66
+ ```json
67
+ {"level":30,"time":1705312245000,"msg":"User created successfully","userId":"user_123","email":"user@example.com"}
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Hono와 통합
73
+
74
+ ### 방법 1: pino-http 미들웨어
75
+
76
+ ```typescript
77
+ // middleware/logger.ts
78
+ import { createMiddleware } from 'hono/factory'
79
+ import { pinoHttp } from 'pino-http'
80
+ import { logger } from '@/lib/logger'
81
+
82
+ type Env = {
83
+ Variables: {
84
+ log: pino.Logger
85
+ }
86
+ }
87
+
88
+ export const loggerMiddleware = createMiddleware<Env>(async (c, next) => {
89
+ // Hono의 request-id를 pino-http에 전달
90
+ c.env.incoming.id = c.req.header('x-request-id') ?? crypto.randomUUID()
91
+
92
+ // pino-http 미들웨어 실행
93
+ await new Promise((resolve) =>
94
+ pinoHttp({ logger })(c.env.incoming, c.env.outgoing, () => resolve(undefined))
95
+ )
96
+
97
+ // child logger를 변수로 설정
98
+ c.set('log', c.env.incoming.log)
99
+
100
+ await next()
101
+ })
102
+ ```
103
+
104
+ ### 방법 2: 간단한 커스텀 미들웨어 (권장)
105
+
106
+ ```typescript
107
+ // middleware/logger.ts
108
+ import { createMiddleware } from 'hono/factory'
109
+ import { logger } from '@/lib/logger'
110
+ import type { Logger } from 'pino'
111
+
112
+ type Env = {
113
+ Variables: {
114
+ log: Logger
115
+ requestId: string
116
+ }
117
+ }
118
+
119
+ export const loggerMiddleware = createMiddleware<Env>(async (c, next) => {
120
+ const requestId = c.req.header('x-request-id') ?? crypto.randomUUID()
121
+ const start = Date.now()
122
+
123
+ // 요청별 child logger 생성
124
+ const log = logger.child({
125
+ requestId,
126
+ method: c.req.method,
127
+ path: c.req.path,
128
+ })
129
+
130
+ c.set('log', log)
131
+ c.set('requestId', requestId)
132
+
133
+ log.info('Request started')
134
+
135
+ await next()
136
+
137
+ const duration = Date.now() - start
138
+ log.info({ status: c.res.status, duration: `${duration}ms` }, 'Request completed')
139
+ })
140
+ ```
141
+
142
+ ### App에 적용
143
+
144
+ ```typescript
145
+ // index.ts
146
+ import { Hono } from 'hono'
147
+ import { loggerMiddleware } from '@/middleware/logger'
148
+
149
+ const app = new Hono()
150
+
151
+ // 모든 라우트에 로깅 미들웨어 적용
152
+ app.use(loggerMiddleware)
153
+
154
+ app.get('/users/:id', async (c) => {
155
+ const log = c.get('log')
156
+ const id = c.req.param('id')
157
+
158
+ log.info({ userId: id }, 'Fetching user')
159
+
160
+ const user = await prisma.user.findUnique({ where: { id } })
161
+
162
+ if (!user) {
163
+ log.warn({ userId: id }, 'User not found')
164
+ return c.json({ error: 'User not found' }, 404)
165
+ }
166
+
167
+ log.debug({ user }, 'User fetched')
168
+ return c.json({ user })
169
+ })
170
+
171
+ export default app
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 로그 레벨
177
+
178
+ ```typescript
179
+ const log = c.get('log')
180
+
181
+ log.trace('매우 상세한 디버깅 정보') // level: 10
182
+ log.debug('디버깅 정보') // level: 20
183
+ log.info('일반 정보') // level: 30
184
+ log.warn('경고') // level: 40
185
+ log.error('에러') // level: 50
186
+ log.fatal('치명적 에러') // level: 60
187
+ ```
188
+
189
+ ### 레벨별 사용 가이드
190
+
191
+ | 레벨 | 용도 | 예시 |
192
+ |------|------|------|
193
+ | `trace` | 매우 상세한 흐름 추적 | 함수 진입/종료, 변수 값 |
194
+ | `debug` | 개발 중 디버깅 | 쿼리 결과, 중간 계산값 |
195
+ | `info` | 주요 이벤트 | 사용자 생성, 결제 완료 |
196
+ | `warn` | 주의 필요 | 재시도 발생, 느린 쿼리 |
197
+ | `error` | 에러 발생 | API 실패, 예외 처리 |
198
+ | `fatal` | 시스템 중단 | 서버 시작 실패 |
199
+
200
+ ---
201
+
202
+ ## 구조화된 로깅 패턴
203
+
204
+ ### 객체와 메시지 함께 로깅
205
+
206
+ ```typescript
207
+ // ✅ 올바른 패턴: 객체 먼저, 메시지 나중
208
+ log.info({ userId: '123', action: 'login' }, 'User logged in')
209
+
210
+ // ❌ 잘못된 패턴: 문자열 연결
211
+ log.info('User ' + userId + ' logged in') // 구조화되지 않음
212
+ ```
213
+
214
+ ### 에러 로깅
215
+
216
+ ```typescript
217
+ app.get('/risky', async (c) => {
218
+ const log = c.get('log')
219
+
220
+ try {
221
+ await riskyOperation()
222
+ } catch (error) {
223
+ // ✅ err 키로 에러 객체 전달 (스택 트레이스 자동 포함)
224
+ log.error({ err: error, context: 'riskyOperation' }, 'Operation failed')
225
+ throw error
226
+ }
227
+ })
228
+ ```
229
+
230
+ **출력**:
231
+ ```json
232
+ {
233
+ "level": 50,
234
+ "time": 1705312245000,
235
+ "requestId": "req_abc123",
236
+ "method": "GET",
237
+ "path": "/risky",
238
+ "err": {
239
+ "type": "Error",
240
+ "message": "Connection refused",
241
+ "stack": "Error: Connection refused\n at ..."
242
+ },
243
+ "context": "riskyOperation",
244
+ "msg": "Operation failed"
245
+ }
246
+ ```
247
+
248
+ ---
249
+
250
+ ## 서비스 레이어에서 사용
251
+
252
+ ### Child Logger 전달 패턴
253
+
254
+ ```typescript
255
+ // services/user.ts
256
+ import type { Logger } from 'pino'
257
+ import { prisma } from '@/database/prisma'
258
+
259
+ export const createUser = async (
260
+ data: CreateUserInput,
261
+ log: Logger // child logger 전달받음
262
+ ) => {
263
+ log.info({ email: data.email }, 'Creating user')
264
+
265
+ const user = await prisma.user.create({ data })
266
+
267
+ log.info({ userId: user.id }, 'User created')
268
+ return user
269
+ }
270
+ ```
271
+
272
+ ```typescript
273
+ // routes/users.ts
274
+ import { Hono } from 'hono'
275
+ import { zValidator } from '@hono/zod-validator'
276
+ import { createUser } from '@/services/user'
277
+ import { createUserSchema } from '@/validators/user'
278
+
279
+ const users = new Hono()
280
+
281
+ users.post('/', zValidator('json', createUserSchema), async (c) => {
282
+ const log = c.get('log')
283
+ const data = c.req.valid('json')
284
+
285
+ const user = await createUser(data, log)
286
+ return c.json({ user }, 201)
287
+ })
288
+
289
+ export { users }
290
+ ```
291
+
292
+ ---
293
+
294
+ ## 고급 설정
295
+
296
+ ### pino-pretty 전체 옵션
297
+
298
+ ```typescript
299
+ // lib/logger.ts
300
+ import pino from 'pino'
301
+
302
+ export const logger = pino({
303
+ level: process.env.LOG_LEVEL || 'info',
304
+ transport:
305
+ process.env.NODE_ENV === 'development'
306
+ ? {
307
+ target: 'pino-pretty',
308
+ options: {
309
+ colorize: true,
310
+ translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',
311
+ ignore: 'pid,hostname',
312
+ singleLine: false,
313
+ levelFirst: true,
314
+ messageFormat: '{levelLabel} - {msg}',
315
+ customColors: 'info:blue,warn:yellow,error:red,fatal:bgRed',
316
+ errorProps: 'stack,code,cause',
317
+ },
318
+ }
319
+ : undefined,
320
+ })
321
+ ```
322
+
323
+ ### TypeScript 타입 강제
324
+
325
+ ```typescript
326
+ // types/pino.d.ts
327
+ declare module 'pino' {
328
+ interface LogFnFields {
329
+ userId?: string
330
+ requestId?: string
331
+ action?: string
332
+ }
333
+ }
334
+ ```
335
+
336
+ ---
337
+
338
+ ## 글로벌 에러 핸들러와 통합
339
+
340
+ ```typescript
341
+ // index.ts
342
+ import { Hono } from 'hono'
343
+ import { HTTPException } from 'hono/http-exception'
344
+ import { logger } from '@/lib/logger'
345
+
346
+ const app = new Hono()
347
+
348
+ app.onError((err, c) => {
349
+ const log = c.get('log') ?? logger
350
+
351
+ if (err instanceof HTTPException) {
352
+ log.warn({ status: err.status, message: err.message }, 'HTTP Exception')
353
+ return c.json({ error: err.message }, err.status)
354
+ }
355
+
356
+ log.error({ err }, 'Unhandled error')
357
+ return c.json({ error: 'Internal Server Error' }, 500)
358
+ })
359
+ ```
360
+
361
+ ---
362
+
363
+ ## 프로덕션 설정
364
+
365
+ ### 환경 변수
366
+
367
+ ```bash
368
+ # .env
369
+ LOG_LEVEL=info # production
370
+ # LOG_LEVEL=debug # staging
371
+ ```
372
+
373
+ ### 멀티 스트림 (파일 + stdout)
374
+
375
+ ```typescript
376
+ import pino from 'pino'
377
+
378
+ const streams = [
379
+ { level: 'info', stream: process.stdout },
380
+ { level: 'error', stream: pino.destination('./logs/error.log') },
381
+ ]
382
+
383
+ export const logger = pino(
384
+ { level: 'debug' },
385
+ pino.multistream(streams)
386
+ )
387
+ ```
388
+
389
+ ---
390
+
391
+ ## Cloudflare Workers 주의사항
392
+
393
+ Cloudflare Workers에서는 `pino-pretty` transport를 사용할 수 없습니다. 대신 JSON 출력을 사용하세요:
394
+
395
+ ```typescript
396
+ // lib/logger.ts (Cloudflare Workers)
397
+ import pino from 'pino'
398
+
399
+ export const logger = pino({
400
+ level: 'info',
401
+ // transport 옵션 제거 (Workers에서는 지원 안 됨)
402
+ })
403
+ ```
404
+
405
+ 로컬 개발 시 CLI에서 pino-pretty 사용:
406
+
407
+ ```bash
408
+ wrangler dev | npx pino-pretty
409
+ ```
410
+
411
+ ---
412
+
413
+ ## ❌ 하지 말아야 할 것
414
+
415
+ ```typescript
416
+ // ❌ 민감한 정보 로깅 금지
417
+ log.info({ password: user.password }, 'User logged in')
418
+
419
+ // ❌ 문자열 연결 사용 금지
420
+ log.info('User ' + userId + ' created at ' + new Date())
421
+
422
+ // ❌ console.log 사용 금지 (pino 사용하세요)
423
+ console.log('Processing request') // ❌
424
+ log.info('Processing request') // ✅
425
+
426
+ // ❌ 로그 레벨 무시 금지
427
+ log.debug('중요한 에러 발생!') // ❌ error 레벨 사용해야 함
428
+ log.error('중요한 에러 발생!') // ✅
429
+ ```
430
+
431
+ ---
432
+
433
+ ## 관련 문서
434
+
435
+ - [미들웨어](../hono/middleware.md)
436
+ - [에러 처리](../hono/error-handling.md)
437
+ - [아키텍처](../../architecture/architecture.md)