@kood/claude-code 0.2.5 → 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 +497 -214
  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
@@ -0,0 +1,374 @@
1
+ # t3-env - Type-Safe Environment Variables
2
+
3
+ > Zod 기반 타입 안전 환경 변수 관리
4
+
5
+ <context>
6
+
7
+ **용도:** 서버 환경 변수 검증, 런타임 타입 안전성
8
+
9
+ **특징:**
10
+ - Zod 스키마로 검증 + 타입 추론
11
+ - Transform & Default 값 지원
12
+ - 런타임 검증
13
+ - 프레임워크 무관
14
+
15
+ </context>
16
+
17
+ ---
18
+
19
+ <forbidden>
20
+
21
+ | 분류 | 금지 |
22
+ |------|------|
23
+ | **직접 접근** | `process.env` 직접 사용 (env 객체 필수) |
24
+ | **타입** | any 타입으로 env 변수 접근 |
25
+ | **검증 우회** | 스키마 정의 없이 환경 변수 사용 |
26
+
27
+ </forbidden>
28
+
29
+ ---
30
+
31
+ <required>
32
+
33
+ | 분류 | 필수 |
34
+ |------|------|
35
+ | **설치** | `@t3-oss/env-core zod` |
36
+ | **구조** | `src/env.ts` 파일 생성 |
37
+ | **Import** | `import { env } from '@/env'` |
38
+
39
+ </required>
40
+
41
+ ---
42
+
43
+ <setup>
44
+
45
+ ## Installation
46
+
47
+ ```bash
48
+ npm install @t3-oss/env-core zod
49
+ ```
50
+
51
+ ## Basic Setup
52
+
53
+ `src/env.ts`:
54
+
55
+ ```typescript
56
+ import { createEnv } from '@t3-oss/env-core'
57
+ import { z } from 'zod'
58
+
59
+ export const env = createEnv({
60
+ server: {
61
+ // Database
62
+ DATABASE_URL: z.url(),
63
+
64
+ // API Keys
65
+ OPENAI_API_KEY: z.string().min(1),
66
+
67
+ // App Config
68
+ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
69
+ PORT: z.coerce.number().positive().default(3000),
70
+ },
71
+
72
+ runtimeEnv: process.env,
73
+ emptyStringAsUndefined: true,
74
+ })
75
+ ```
76
+
77
+ </setup>
78
+
79
+ ---
80
+
81
+ <patterns>
82
+
83
+ ## Common Patterns
84
+
85
+ ### Hono App
86
+
87
+ ```typescript
88
+ // src/index.ts
89
+ import { Hono } from 'hono'
90
+ import { env } from '@/env'
91
+
92
+ const app = new Hono()
93
+
94
+ app.get('/health', (c) => {
95
+ return c.json({
96
+ status: 'ok',
97
+ env: env.NODE_ENV,
98
+ // ^? "development" | "production" | "test"
99
+ })
100
+ })
101
+
102
+ export default {
103
+ port: env.PORT,
104
+ // ^? number
105
+ fetch: app.fetch,
106
+ }
107
+ ```
108
+
109
+ ### Database Connection
110
+
111
+ ```typescript
112
+ import { PrismaClient } from '@prisma/client'
113
+ import { env } from '@/env'
114
+
115
+ export const prisma = new PrismaClient({
116
+ datasourceUrl: env.DATABASE_URL,
117
+ // ^? string (타입 안전)
118
+ })
119
+ ```
120
+
121
+ ### API Routes
122
+
123
+ ```typescript
124
+ import { Hono } from 'hono'
125
+ import { env } from '@/env'
126
+
127
+ const api = new Hono()
128
+
129
+ api.post('/ai/generate', async (c) => {
130
+ const response = await fetch('https://api.openai.com/v1/chat/completions', {
131
+ headers: {
132
+ Authorization: `Bearer ${env.OPENAI_API_KEY}`,
133
+ // ^? string
134
+ },
135
+ })
136
+ return c.json(await response.json())
137
+ })
138
+ ```
139
+
140
+ ### Environment-Specific Defaults
141
+
142
+ ```typescript
143
+ server: {
144
+ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
145
+ LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
146
+ ENABLE_CORS: z.coerce.boolean().default(true),
147
+ }
148
+ ```
149
+
150
+ ### Transform Values
151
+
152
+ ```typescript
153
+ server: {
154
+ PORT: z.string().transform((val) => parseInt(val, 10)).pipe(z.number().positive()),
155
+ MAX_CONNECTIONS: z.coerce.number().default(10),
156
+ RATE_LIMIT: z.coerce.number().max(1000),
157
+ }
158
+ ```
159
+
160
+ </patterns>
161
+
162
+ ---
163
+
164
+ <examples>
165
+
166
+ ## Real-World Examples
167
+
168
+ ### Database + Auth
169
+
170
+ ```typescript
171
+ // src/env.ts
172
+ export const env = createEnv({
173
+ server: {
174
+ DATABASE_URL: z.url(),
175
+ DIRECT_URL: z.url().optional(), // Prisma connection pooling
176
+
177
+ JWT_SECRET: z.string().min(32),
178
+ JWT_EXPIRES_IN: z.string().default('7d'),
179
+
180
+ BCRYPT_ROUNDS: z.coerce.number().min(10).default(12),
181
+ },
182
+ runtimeEnv: process.env,
183
+ emptyStringAsUndefined: true,
184
+ })
185
+ ```
186
+
187
+ ### API Integration
188
+
189
+ ```typescript
190
+ // src/env.ts
191
+ export const env = createEnv({
192
+ server: {
193
+ OPENAI_API_KEY: z.string().min(1),
194
+ STRIPE_SECRET_KEY: z.string().min(1),
195
+ STRIPE_WEBHOOK_SECRET: z.string().min(1),
196
+
197
+ RESEND_API_KEY: z.string().min(1),
198
+ FROM_EMAIL: z.email().default('noreply@example.com'),
199
+ },
200
+ runtimeEnv: process.env,
201
+ emptyStringAsUndefined: true,
202
+ })
203
+ ```
204
+
205
+ ### Multi-Environment
206
+
207
+ ```typescript
208
+ // src/env.ts
209
+ export const env = createEnv({
210
+ server: {
211
+ NODE_ENV: z.enum(['development', 'production', 'test']),
212
+ PORT: z.coerce.number().positive().default(3000),
213
+
214
+ DATABASE_URL: z.url(),
215
+ REDIS_URL: z.url().optional(), // Production only
216
+
217
+ CORS_ORIGIN: z.string().url().default('http://localhost:5173'),
218
+ ENABLE_LOGGING: z.coerce.boolean().default(true),
219
+ },
220
+ runtimeEnv: process.env,
221
+ emptyStringAsUndefined: true,
222
+ })
223
+ ```
224
+
225
+ ### Cloudflare Workers
226
+
227
+ ```typescript
228
+ // src/env.ts
229
+ import { createEnv } from '@t3-oss/env-core'
230
+ import { z } from 'zod'
231
+
232
+ export const createWorkerEnv = (bindings: Record<string, unknown>) =>
233
+ createEnv({
234
+ server: {
235
+ DATABASE_URL: z.url(),
236
+ KV_NAMESPACE: z.unknown(), // Cloudflare KV
237
+ R2_BUCKET: z.unknown(), // Cloudflare R2
238
+
239
+ API_KEY: z.string().min(1),
240
+ },
241
+ runtimeEnv: bindings,
242
+ emptyStringAsUndefined: true,
243
+ })
244
+
245
+ // Usage
246
+ export default {
247
+ fetch(request: Request, env: Env) {
248
+ const workerEnv = createWorkerEnv(env)
249
+ // workerEnv.DATABASE_URL is type-safe
250
+ },
251
+ }
252
+ ```
253
+
254
+ </examples>
255
+
256
+ ---
257
+
258
+ <validation>
259
+
260
+ ## Validation Patterns
261
+
262
+ ### Email
263
+
264
+ ```typescript
265
+ server: {
266
+ ADMIN_EMAIL: z.email(),
267
+ SUPPORT_EMAIL: z.email().default('support@example.com'),
268
+ }
269
+ ```
270
+
271
+ ### URL
272
+
273
+ ```typescript
274
+ server: {
275
+ API_URL: z.url(),
276
+ WEBHOOK_URL: z.url().optional(),
277
+ }
278
+ ```
279
+
280
+ ### Enum
281
+
282
+ ```typescript
283
+ server: {
284
+ LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']),
285
+ DATABASE_PROVIDER: z.enum(['postgresql', 'mysql', 'sqlite']),
286
+ }
287
+ ```
288
+
289
+ ### Number
290
+
291
+ ```typescript
292
+ server: {
293
+ PORT: z.coerce.number().positive().default(3000),
294
+ MAX_UPLOAD_SIZE: z.coerce.number().max(10485760), // 10MB
295
+ RATE_LIMIT_WINDOW: z.coerce.number().min(60).default(900), // 15min
296
+ }
297
+ ```
298
+
299
+ ### Boolean
300
+
301
+ ```typescript
302
+ server: {
303
+ ENABLE_CACHE: z.coerce.boolean().default(true),
304
+ DEBUG_MODE: z.coerce.boolean().default(false),
305
+ }
306
+ ```
307
+
308
+ ### Custom Validation
309
+
310
+ ```typescript
311
+ server: {
312
+ API_VERSION: z.string().regex(/^v\d+$/), // v1, v2, etc.
313
+ ALLOWED_ORIGINS: z.string().transform((val) => val.split(',')),
314
+ }
315
+ ```
316
+
317
+ </validation>
318
+
319
+ ---
320
+
321
+ <middleware>
322
+
323
+ ## Hono Middleware Integration
324
+
325
+ ### Environment Validation Middleware
326
+
327
+ ```typescript
328
+ import { createMiddleware } from 'hono/factory'
329
+ import { env } from '@/env'
330
+
331
+ export const envMiddleware = createMiddleware(async (c, next) => {
332
+ // env 객체가 초기화되었는지 확인
333
+ if (!env.DATABASE_URL) {
334
+ return c.json({ error: 'Server misconfigured' }, 500)
335
+ }
336
+ await next()
337
+ })
338
+
339
+ // Usage
340
+ app.use('*', envMiddleware)
341
+ ```
342
+
343
+ ### CORS with Environment
344
+
345
+ ```typescript
346
+ import { cors } from 'hono/cors'
347
+ import { env } from '@/env'
348
+
349
+ app.use(
350
+ '*',
351
+ cors({
352
+ origin: env.CORS_ORIGIN,
353
+ // ^? string
354
+ })
355
+ )
356
+ ```
357
+
358
+ </middleware>
359
+
360
+ ---
361
+
362
+ <tips>
363
+
364
+ ## Tips
365
+
366
+ | 상황 | 방법 |
367
+ |------|------|
368
+ | **Cloudflare** | `createWorkerEnv(env)` 패턴 사용 |
369
+ | **Monorepo** | 각 패키지마다 별도 `env.ts` |
370
+ | **Testing** | `.env.test` + `NODE_ENV=test` |
371
+ | **Docker** | `docker run -e DATABASE_URL=...` |
372
+ | **CI/CD** | GitHub Secrets → Environment Variables |
373
+
374
+ </tips>
@@ -1,97 +1,197 @@
1
- # CLAUDE.md - NPX CLI 프로젝트
1
+ # CLAUDE.md - NPX CLI
2
2
 
3
- > Node.js CLI 도구 개발 지침
3
+ > Node.js CLI 도구 개발
4
4
 
5
- ## Instructions
5
+ <context>
6
6
 
7
+ **Purpose:** Node.js CLI 도구 개발을 위한 작업 지침
8
+
9
+ **Scope:** npx 배포 가능한 CLI 패키지 구현
10
+
11
+ **Key Features:**
12
+ - Commander.js 명령어 체계
13
+ - 대화형 프롬프트 (prompts)
14
+ - 파일 시스템 작업 (fs-extra)
15
+ - TypeScript + ESM
16
+ - 색상 출력 (picocolors)
17
+
18
+ </context>
19
+
20
+ ---
21
+
22
+ <instructions>
23
+ @../../commands/git.md
7
24
  @docs/library/commander/index.md
8
25
  @docs/library/fs-extra/index.md
9
26
  @docs/library/prompts/index.md
27
+ @docs/references/patterns.md
28
+ </instructions>
10
29
 
11
30
  ---
12
31
 
13
- ## 금지 사항
14
-
15
- ### Git 커밋
16
- - `Generated with Claude Code` 포함 금지
17
- - AI 관련 이모지/표시 금지
18
- - `Co-Authored-By:` 헤더 금지
19
- - 여러 줄 커밋 메시지 금지
32
+ <forbidden>
20
33
 
21
- ### CLI 구현
22
- - `process.exit()` 없이 에러 종료 금지
23
- - `console.log` 직접 사용 금지 (logger 사용)
24
- - 동기 파일 작업 (`fs.readFileSync` ) 금지
25
- - hardcoded 경로 금지 (`path.join` 사용)
26
- - 사용자 입력 미검증 처리 금지
34
+ | 분류 | 금지 행동 |
35
+ |------|----------|
36
+ | **Git 커밋** | AI 표시 (`Generated with Claude Code`, `🤖`, `Co-Authored-By:`), 여러 메시지, 이모지 |
37
+ | **콘솔 출력** | `console.log` 직접 사용 (logger 함수 사용) |
38
+ | **파일 작업** | 동기 API (`fs.readFileSync` 등), 하드코딩된 경로 (path.join 사용) |
39
+ | **에러 처리** | `process.exit()` 누락, try-catch 없는 async 작업 |
40
+ | **코드 검색** | Bash의 grep/rg/find 명령어 (ast-grep 또는 전용 도구 사용) |
27
41
 
28
- ### 코드 검색
29
- - `grep`, `rg` 사용 금지 → `ast-grep` 필수
42
+ </forbidden>
30
43
 
31
44
  ---
32
45
 
33
- ## 필수 사항
46
+ <required>
34
47
 
35
- ### 작업
36
- | 작업 | 참조 문서 |
48
+ | 작업 | 필수 행동 |
37
49
  |------|----------|
38
- | CLI 작업 | `docs/library/commander/` |
39
- | 파일 작업 | `docs/library/fs-extra/` |
40
- | 사용자 입력 | `docs/library/prompts/` |
50
+ | **작업 시작 전** | 관련 docs 읽기 (Commander → commander, 파일 → fs-extra) |
51
+ | **콘솔 출력** | logger 함수 사용 (info/success/error/warn) |
52
+ | **파일 작업** | async API (`fs-extra`), `path.join`으로 경로 조합 |
53
+ | **에러 처리** | try-catch + `process.exit(1)`, 사용자에게 명확한 에러 메시지 |
54
+ | **코드 검색** | ast-grep 사용 (함수/클래스/패턴 검색) |
55
+ | **코드 작성** | UTF-8 인코딩, 코드 묶음별 한글 주석, const 함수 선언 |
56
+ | **복잡한 작업** | Sequential Thinking MCP (5+ 단계 작업) |
41
57
 
42
- ### 커밋 형식
43
- ```
44
- <prefix>: <설명>
58
+ </required>
59
+
60
+ ---
61
+
62
+ <tech_stack>
63
+
64
+ | 기술 | 버전 |
65
+ |------|------|
66
+ | Node.js | >= 18 (ESM) |
67
+ | TypeScript | 5.x (strict) |
68
+ | Commander | 12.x |
69
+ | fs-extra | 11.x |
70
+ | prompts | 2.x |
71
+ | picocolors | 1.x |
72
+ | tsup | 8.x |
73
+
74
+ </tech_stack>
75
+
76
+ ---
77
+
78
+ <structure>
45
79
  ```
80
+ src/
81
+ ├── index.ts # CLI 진입점
82
+ ├── commands/ # 명령어 모듈
83
+ ├── utils/ # logger, copy
84
+ └── types/ # 타입
46
85
 
47
- | Prefix | 용도 |
48
- |--------|------|
49
- | feat | 새 기능 |
50
- | fix | 버그 수정 |
51
- | refactor | 리팩토링 |
52
- | docs | 문서 수정 |
53
- | chore | 빌드/설정 |
86
+ templates/ # 빌드 복사
87
+ dist/ # 빌드 결과물
88
+ ```
89
+ </structure>
54
90
 
55
91
  ---
56
92
 
57
- ## Tech Stack
93
+ <conventions>
94
+
95
+ **파일명:** kebab-case
96
+ **TypeScript:** const 선언, 명시적 return type, interface(객체)/type(유니온), any→unknown
97
+ **Import 순서:** 외부 → 내부 → type
58
98
 
59
- | 기술 | 버전 | 비고 |
60
- |------|------|------|
61
- | Node.js | >= 18 | ESM 모듈 |
62
- | TypeScript | 5.x | strict mode |
63
- | Commander | 12.x | CLI 프레임워크 |
64
- | fs-extra | 11.x | 파일 시스템 |
65
- | prompts | 2.x | Interactive prompts |
66
- | picocolors | 1.x | 터미널 색상 |
67
- | tsup | 8.x | 번들러 |
99
+ </conventions>
68
100
 
69
101
  ---
70
102
 
71
- ## Directory Structure
103
+ <quick_patterns>
104
+
105
+ ```typescript
106
+ // CLI 진입점 (index.ts)
107
+ #!/usr/bin/env node
108
+ import { Command } from 'commander'
109
+ import { logger } from './utils/logger.js'
110
+
111
+ const program = new Command()
112
+ .name('my-cli')
113
+ .version('1.0.0')
114
+ .description('CLI tool description')
115
+
116
+ program
117
+ .command('init')
118
+ .description('Initialize project')
119
+ .option('-f, --force', 'Force overwrite')
120
+ .action(async (options) => {
121
+ try {
122
+ await initCommand(options)
123
+ } catch (error) {
124
+ logger.error(`Failed: ${error.message}`)
125
+ process.exit(1)
126
+ }
127
+ })
128
+
129
+ program.parse()
130
+ ```
131
+
132
+ ```typescript
133
+ // Logger (utils/logger.ts)
134
+ import pc from 'picocolors'
72
135
 
136
+ export const logger = {
137
+ info: (msg: string) => console.log(pc.blue('ℹ'), msg),
138
+ success: (msg: string) => console.log(pc.green('✔'), msg),
139
+ error: (msg: string) => console.log(pc.red('✖'), msg),
140
+ warn: (msg: string) => console.log(pc.yellow('⚠'), msg),
141
+ }
73
142
  ```
74
- src/
75
- ├── index.ts # CLI 진입점
76
- ├── commands/ # 명령어 모듈
77
- │ └── init.ts
78
- ├── utils/ # 유틸리티
79
- │ ├── copy.ts
80
- │ └── logger.ts
81
- └── types/ # 타입 정의
82
-
83
- templates/ # 템플릿 (빌드 시 복사)
84
- scripts/ # 빌드 스크립트
85
- dist/ # 빌드 결과물
143
+
144
+ ```typescript
145
+ // 파일 복사 (utils/copy.ts)
146
+ import path from 'node:path'
147
+ import { copy, pathExists } from 'fs-extra'
148
+
149
+ export const copyTemplate = async (
150
+ templatePath: string,
151
+ targetPath: string,
152
+ force: boolean = false
153
+ ): Promise<void> => {
154
+ const exists = await pathExists(targetPath)
155
+
156
+ if (exists && !force) {
157
+ throw new Error(`${targetPath} already exists`)
158
+ }
159
+
160
+ await copy(templatePath, targetPath, { overwrite: force })
161
+ }
86
162
  ```
87
163
 
88
- ---
164
+ ```typescript
165
+ // 대화형 프롬프트
166
+ import prompts from 'prompts'
167
+
168
+ const response = await prompts([
169
+ {
170
+ type: 'select',
171
+ name: 'template',
172
+ message: 'Select template',
173
+ choices: [
174
+ { title: 'React', value: 'react' },
175
+ { title: 'Vue', value: 'vue' },
176
+ ],
177
+ },
178
+ {
179
+ type: 'confirm',
180
+ name: 'install',
181
+ message: 'Install dependencies?',
182
+ initial: true,
183
+ },
184
+ ])
185
+ ```
89
186
 
90
- ## 참조
187
+ </quick_patterns>
91
188
 
92
- | 문서 | 경로 |
93
- |------|------|
94
- | Commander 가이드 | [docs/library/commander/](docs/library/commander/index.md) |
95
- | fs-extra 가이드 | [docs/library/fs-extra/](docs/library/fs-extra/index.md) |
96
- | prompts 가이드 | [docs/library/prompts/](docs/library/prompts/index.md) |
97
- | 코드 패턴 | [docs/references/patterns.md](docs/references/patterns.md) |
189
+ ---
190
+
191
+ <docs_structure>
192
+ ```
193
+ docs/
194
+ ├── library/ # commander, fs-extra, prompts
195
+ └── references/ # CLI 패턴, 베스트 프랙티스
196
+ ```
197
+ </docs_structure>