@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,503 @@
1
+ # Prisma - Cloudflare D1
2
+
3
+ > **상위 문서**: [Prisma](./index.md)
4
+
5
+ ---
6
+
7
+ ## ⚠️ 주의사항
8
+
9
+ Cloudflare D1은 **SQLite 기반 서버리스 데이터베이스**입니다. 일반 Prisma 마이그레이션과 **다른 워크플로우**를 사용합니다.
10
+
11
+ ```
12
+ ⚠️ D1은 트랜잭션을 지원하지 않음 (ACID 보장 X)
13
+ ⚠️ prisma migrate dev 사용 불가 - wrangler CLI 사용
14
+ ⚠️ Prisma ORM D1 지원은 Preview 상태
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 🚀 Quick Reference
20
+
21
+ ```typescript
22
+ // Hono + D1 Adapter 설정
23
+ import { Hono } from 'hono'
24
+ import { PrismaClient } from './generated/prisma'
25
+ import { PrismaD1 } from '@prisma/adapter-d1'
26
+
27
+ type Bindings = {
28
+ DB: D1Database
29
+ }
30
+
31
+ const app = new Hono<{ Bindings: Bindings }>()
32
+
33
+ app.get('/users', async (c) => {
34
+ const adapter = new PrismaD1(c.env.DB)
35
+ const prisma = new PrismaClient({ adapter })
36
+
37
+ const users = await prisma.user.findMany()
38
+ return c.json(users)
39
+ })
40
+
41
+ export default app
42
+ ```
43
+
44
+ ### schema.prisma (D1용)
45
+
46
+ ```prisma
47
+ generator client {
48
+ provider = "prisma-client"
49
+ output = "../src/generated/prisma"
50
+ runtime = "cloudflare" // D1 필수!
51
+ }
52
+
53
+ datasource db {
54
+ provider = "sqlite" // D1은 SQLite 기반
55
+ }
56
+
57
+ model User {
58
+ id Int @id @default(autoincrement())
59
+ email String @unique
60
+ name String?
61
+ }
62
+ ```
63
+
64
+ ---
65
+
66
+ ## 설치
67
+
68
+ ```bash
69
+ # 필수 패키지
70
+ npm install hono @prisma/client @prisma/adapter-d1
71
+ npm install -D prisma wrangler
72
+
73
+ # Prisma 초기화
74
+ npx prisma init --datasource-provider sqlite
75
+ ```
76
+
77
+ ---
78
+
79
+ ## D1 데이터베이스 생성
80
+
81
+ ```bash
82
+ # Cloudflare D1 데이터베이스 생성
83
+ npx wrangler d1 create my-database
84
+
85
+ # 출력 예시:
86
+ # ✅ Successfully created DB 'my-database'
87
+ # database_id = "xxxx-xxxx-xxxx-xxxx"
88
+ ```
89
+
90
+ ---
91
+
92
+ ## wrangler.jsonc 설정
93
+
94
+ ```jsonc
95
+ {
96
+ "$schema": "node_modules/wrangler/config-schema.json",
97
+ "name": "hono-d1-app",
98
+ "main": "src/index.ts",
99
+ "compatibility_date": "2025-01-01",
100
+ "d1_databases": [
101
+ {
102
+ "binding": "DB",
103
+ "database_name": "my-database",
104
+ "database_id": "YOUR_DATABASE_ID"
105
+ }
106
+ ]
107
+ }
108
+ ```
109
+
110
+ ---
111
+
112
+ ## Schema 설정
113
+
114
+ ### schema.prisma
115
+
116
+ ```prisma
117
+ generator client {
118
+ provider = "prisma-client"
119
+ output = "../src/generated/prisma"
120
+ runtime = "cloudflare"
121
+ }
122
+
123
+ datasource db {
124
+ provider = "sqlite"
125
+ }
126
+
127
+ model User {
128
+ id Int @id @default(autoincrement())
129
+ email String @unique
130
+ name String?
131
+ posts Post[]
132
+ }
133
+
134
+ model Post {
135
+ id Int @id @default(autoincrement())
136
+ title String
137
+ content String?
138
+ published Boolean @default(false)
139
+ author User @relation(fields: [authorId], references: [id])
140
+ authorId Int
141
+ }
142
+ ```
143
+
144
+ ---
145
+
146
+ ## 마이그레이션 워크플로우
147
+
148
+ D1은 일반 Prisma 마이그레이션(`prisma migrate dev`)을 사용하지 않습니다.
149
+
150
+ ### 1단계: 마이그레이션 디렉토리 생성
151
+
152
+ ```bash
153
+ mkdir -p prisma/migrations
154
+ ```
155
+
156
+ ### 2단계: 마이그레이션 파일 생성 (wrangler)
157
+
158
+ ```bash
159
+ npx wrangler d1 migrations create my-database create_user_table
160
+ ```
161
+
162
+ ### 3단계: SQL 생성 (prisma migrate diff)
163
+
164
+ ```bash
165
+ # 초기 마이그레이션 (빈 스키마에서)
166
+ npx prisma migrate diff \
167
+ --from-empty \
168
+ --to-schema-datamodel prisma/schema.prisma \
169
+ --script \
170
+ --output prisma/migrations/0001_create_user_table.sql
171
+
172
+ # 후속 마이그레이션 (로컬 D1에서)
173
+ npx prisma migrate diff \
174
+ --from-local-d1 \
175
+ --to-schema-datamodel prisma/schema.prisma \
176
+ --script \
177
+ --output prisma/migrations/0002_add_post_table.sql
178
+ ```
179
+
180
+ ### 4단계: 마이그레이션 적용
181
+
182
+ ```bash
183
+ # 로컬 데이터베이스에 적용
184
+ npx wrangler d1 migrations apply my-database --local
185
+
186
+ # 원격(프로덕션) 데이터베이스에 적용
187
+ npx wrangler d1 migrations apply my-database --remote
188
+ ```
189
+
190
+ ### 생성된 SQL 예시
191
+
192
+ ```sql
193
+ -- 0001_create_user_table.sql
194
+ -- CreateTable
195
+ CREATE TABLE "User" (
196
+ "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
197
+ "email" TEXT NOT NULL,
198
+ "name" TEXT
199
+ );
200
+
201
+ -- CreateIndex
202
+ CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Hono + Prisma D1 통합
208
+
209
+ ### 기본 설정
210
+
211
+ ```typescript
212
+ // src/index.ts
213
+ import { Hono } from 'hono'
214
+ import { PrismaClient } from './generated/prisma'
215
+ import { PrismaD1 } from '@prisma/adapter-d1'
216
+
217
+ type Bindings = {
218
+ DB: D1Database
219
+ }
220
+
221
+ const app = new Hono<{ Bindings: Bindings }>()
222
+
223
+ // Prisma 미들웨어
224
+ app.use('*', async (c, next) => {
225
+ const adapter = new PrismaD1(c.env.DB)
226
+ c.set('prisma', new PrismaClient({ adapter }))
227
+ await next()
228
+ })
229
+
230
+ export default app
231
+ ```
232
+
233
+ ### CRUD API 구현
234
+
235
+ ```typescript
236
+ import { Hono } from 'hono'
237
+ import { zValidator } from '@hono/zod-validator'
238
+ import { z } from 'zod'
239
+ import { HTTPException } from 'hono/http-exception'
240
+ import { PrismaClient } from './generated/prisma'
241
+ import { PrismaD1 } from '@prisma/adapter-d1'
242
+
243
+ type Bindings = {
244
+ DB: D1Database
245
+ }
246
+
247
+ type Variables = {
248
+ prisma: PrismaClient
249
+ }
250
+
251
+ const app = new Hono<{ Bindings: Bindings; Variables: Variables }>()
252
+
253
+ // Prisma 미들웨어
254
+ app.use('*', async (c, next) => {
255
+ const adapter = new PrismaD1(c.env.DB)
256
+ c.set('prisma', new PrismaClient({ adapter }))
257
+ await next()
258
+ })
259
+
260
+ // 스키마 정의
261
+ const createUserSchema = z.object({
262
+ email: z.string().email(),
263
+ name: z.string().min(1).optional(),
264
+ })
265
+
266
+ const updateUserSchema = z.object({
267
+ name: z.string().min(1).optional(),
268
+ })
269
+
270
+ // GET /users - 전체 사용자 조회
271
+ app.get('/users', async (c) => {
272
+ const prisma = c.get('prisma')
273
+ const users = await prisma.user.findMany({
274
+ include: { posts: true },
275
+ })
276
+ return c.json(users)
277
+ })
278
+
279
+ // GET /users/:id - 단일 사용자 조회
280
+ app.get('/users/:id', async (c) => {
281
+ const prisma = c.get('prisma')
282
+ const id = parseInt(c.req.param('id'))
283
+
284
+ const user = await prisma.user.findUnique({
285
+ where: { id },
286
+ include: { posts: true },
287
+ })
288
+
289
+ if (!user) {
290
+ throw new HTTPException(404, { message: 'User not found' })
291
+ }
292
+
293
+ return c.json(user)
294
+ })
295
+
296
+ // POST /users - 사용자 생성
297
+ app.post('/users', zValidator('json', createUserSchema), async (c) => {
298
+ const prisma = c.get('prisma')
299
+ const data = c.req.valid('json')
300
+
301
+ // 중복 체크
302
+ const existing = await prisma.user.findUnique({
303
+ where: { email: data.email },
304
+ })
305
+
306
+ if (existing) {
307
+ throw new HTTPException(409, { message: 'Email already exists' })
308
+ }
309
+
310
+ const user = await prisma.user.create({ data })
311
+ return c.json(user, 201)
312
+ })
313
+
314
+ // PATCH /users/:id - 사용자 수정
315
+ app.patch('/users/:id', zValidator('json', updateUserSchema), async (c) => {
316
+ const prisma = c.get('prisma')
317
+ const id = parseInt(c.req.param('id'))
318
+ const data = c.req.valid('json')
319
+
320
+ const user = await prisma.user.update({
321
+ where: { id },
322
+ data,
323
+ })
324
+
325
+ return c.json(user)
326
+ })
327
+
328
+ // DELETE /users/:id - 사용자 삭제
329
+ app.delete('/users/:id', async (c) => {
330
+ const prisma = c.get('prisma')
331
+ const id = parseInt(c.req.param('id'))
332
+
333
+ await prisma.user.delete({ where: { id } })
334
+ return c.json({ message: 'User deleted' })
335
+ })
336
+
337
+ export default app
338
+ ```
339
+
340
+ ---
341
+
342
+ ## 로컬 개발
343
+
344
+ ### 로컬 D1로 개발
345
+
346
+ ```bash
347
+ # 로컬 Worker 실행 (D1 포함)
348
+ npx wrangler dev
349
+
350
+ # 로컬 D1에 데이터 삽입
351
+ npx wrangler d1 execute my-database --local \
352
+ --command "INSERT INTO User (email, name) VALUES ('test@example.com', 'Test User');"
353
+
354
+ # 로컬 D1 조회
355
+ npx wrangler d1 execute my-database --local \
356
+ --command "SELECT * FROM User;"
357
+ ```
358
+
359
+ ---
360
+
361
+ ## 배포
362
+
363
+ ```bash
364
+ # Prisma Client 생성
365
+ npx prisma generate
366
+
367
+ # 원격 D1에 마이그레이션 적용
368
+ npx wrangler d1 migrations apply my-database --remote
369
+
370
+ # Worker 배포
371
+ npx wrangler deploy
372
+ ```
373
+
374
+ ---
375
+
376
+ ## ⚠️ 제한사항
377
+
378
+ ### 트랜잭션 미지원
379
+
380
+ ```typescript
381
+ // ❌ 트랜잭션이 무시됨 - ACID 보장 안됨
382
+ const prisma = c.get('prisma')
383
+
384
+ await prisma.$transaction([
385
+ prisma.user.create({ data: { email: 'user1@example.com' } }),
386
+ prisma.post.create({ data: { title: 'Post', authorId: 1 } }),
387
+ ])
388
+
389
+ // ❌ Interactive 트랜잭션도 미지원
390
+ await prisma.$transaction(async (tx) => {
391
+ // 각 쿼리가 독립적으로 실행됨
392
+ })
393
+ ```
394
+
395
+ ### D1 vs 일반 SQLite 차이점
396
+
397
+ | 항목 | 일반 SQLite | Cloudflare D1 |
398
+ |------|-------------|---------------|
399
+ | 마이그레이션 | `prisma migrate dev` | `wrangler d1 migrations` |
400
+ | 트랜잭션 | ✅ 지원 | ❌ 미지원 |
401
+ | 데이터베이스 위치 | 로컬 파일 | Cloudflare Edge |
402
+ | 접속 방식 | 직접 연결 | HTTP (어댑터) |
403
+ | 환경 | 로컬 `.wrangler/state` | 원격 Cloudflare |
404
+
405
+ ---
406
+
407
+ ## RPC 클라이언트와 함께 사용
408
+
409
+ ```typescript
410
+ // src/index.ts
411
+ import { Hono } from 'hono'
412
+ import { hc } from 'hono/client'
413
+ import { PrismaClient } from './generated/prisma'
414
+ import { PrismaD1 } from '@prisma/adapter-d1'
415
+
416
+ type Bindings = {
417
+ DB: D1Database
418
+ }
419
+
420
+ const app = new Hono<{ Bindings: Bindings }>()
421
+ .get('/users', async (c) => {
422
+ const adapter = new PrismaD1(c.env.DB)
423
+ const prisma = new PrismaClient({ adapter })
424
+
425
+ const users = await prisma.user.findMany()
426
+ return c.json(users)
427
+ })
428
+ .post('/users', async (c) => {
429
+ const adapter = new PrismaD1(c.env.DB)
430
+ const prisma = new PrismaClient({ adapter })
431
+
432
+ const body = await c.req.json()
433
+ const user = await prisma.user.create({ data: body })
434
+ return c.json(user, 201)
435
+ })
436
+
437
+ export type AppType = typeof app
438
+ export default app
439
+ ```
440
+
441
+ ---
442
+
443
+ ## prisma.config.ts (선택사항)
444
+
445
+ Prisma CLI에서 D1에 직접 접근이 필요한 경우:
446
+
447
+ ```typescript
448
+ // prisma.config.ts
449
+ import path from 'node:path'
450
+ import type { PrismaConfig } from 'prisma'
451
+ import { PrismaD1 } from '@prisma/adapter-d1'
452
+
453
+ export default {
454
+ experimental: {
455
+ adapter: true,
456
+ },
457
+ engine: 'js',
458
+ schema: path.join('prisma', 'schema.prisma'),
459
+ async adapter() {
460
+ return new PrismaD1({
461
+ CLOUDFLARE_D1_TOKEN: process.env.CLOUDFLARE_D1_TOKEN,
462
+ CLOUDFLARE_ACCOUNT_ID: process.env.CLOUDFLARE_ACCOUNT_ID,
463
+ CLOUDFLARE_DATABASE_ID: process.env.CLOUDFLARE_DATABASE_ID,
464
+ })
465
+ },
466
+ } satisfies PrismaConfig
467
+ ```
468
+
469
+ ---
470
+
471
+ ## 마이그레이션 명령어 요약
472
+
473
+ ```bash
474
+ # D1 데이터베이스 생성
475
+ npx wrangler d1 create my-database
476
+
477
+ # 마이그레이션 파일 생성
478
+ npx wrangler d1 migrations create my-database migration_name
479
+
480
+ # SQL 생성 (초기)
481
+ npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script
482
+
483
+ # SQL 생성 (후속)
484
+ npx prisma migrate diff --from-local-d1 --to-schema-datamodel prisma/schema.prisma --script
485
+
486
+ # 로컬 적용
487
+ npx wrangler d1 migrations apply my-database --local
488
+
489
+ # 원격 적용
490
+ npx wrangler d1 migrations apply my-database --remote
491
+
492
+ # Prisma Client 생성
493
+ npx prisma generate
494
+ ```
495
+
496
+ ---
497
+
498
+ ## 참고 자료
499
+
500
+ - [Prisma D1 공식 문서](https://www.prisma.io/docs/orm/overview/databases/cloudflare-d1)
501
+ - [Cloudflare D1 문서](https://developers.cloudflare.com/d1/)
502
+ - [Prisma D1 가이드](https://www.prisma.io/guides/cloudflare-d1)
503
+ - [Hono Cloudflare Workers](https://hono.dev/docs/getting-started/cloudflare-workers)