@kood/claude-code 0.1.2 → 0.1.3
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.js +12 -3
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/deployment/cloudflare.md +537 -190
- package/templates/hono/docs/deployment/docker.md +517 -0
- package/templates/hono/docs/deployment/index.md +181 -213
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +572 -0
- package/templates/hono/docs/git/git.md +285 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -0
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/git/git.md +307 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/deployment/cloudflare.md +234 -51
- package/templates/tanstack-start/docs/deployment/index.md +322 -32
- package/templates/tanstack-start/docs/deployment/nitro.md +201 -20
- package/templates/tanstack-start/docs/deployment/railway.md +305 -153
- package/templates/tanstack-start/docs/deployment/vercel.md +353 -78
- package/templates/tanstack-start/docs/git/{index.md → git.md} +81 -7
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -1
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# CLAUDE.md - Claude Code Instructions
|
|
2
|
+
|
|
3
|
+
> NPX CLI 도구 프로젝트 작업 지침
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚨 STOP - 작업 전 필수 확인
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ 이 프로젝트에서 작업하기 전에 이 문서를 끝까지 읽으세요. │
|
|
12
|
+
│ 특히 ⛔ NEVER DO 섹션의 규칙은 절대 위반하지 마세요. │
|
|
13
|
+
│ │
|
|
14
|
+
│ 📖 작업 유형별 상세 문서: docs/ 폴더 참조 │
|
|
15
|
+
└─────────────────────────────────────────────────────────────┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## ⛔ NEVER DO (절대 금지 - 예외 없음)
|
|
21
|
+
|
|
22
|
+
### Git 커밋 금지 사항
|
|
23
|
+
```
|
|
24
|
+
❌ "Generated with Claude Code" 포함 금지
|
|
25
|
+
❌ "🤖" 또는 AI 관련 이모지 포함 금지
|
|
26
|
+
❌ "Co-Authored-By:" 헤더 포함 금지
|
|
27
|
+
❌ AI/봇이 작성했다는 어떤 표시도 금지
|
|
28
|
+
❌ 커밋 메시지 여러 줄 작성 금지
|
|
29
|
+
❌ 커밋 메시지에 이모지 사용 금지
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### CLI 구현 금지 사항
|
|
33
|
+
```
|
|
34
|
+
❌ process.exit() 없이 에러 상황 종료 금지
|
|
35
|
+
❌ console.log 직접 사용 금지 (logger 사용)
|
|
36
|
+
❌ 동기 파일 작업 (fs.readFileSync 등) 금지
|
|
37
|
+
❌ hardcoded 경로 사용 금지 (path.join 사용)
|
|
38
|
+
❌ 사용자 입력 검증 없이 처리 금지
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 코드 검색 금지 사항
|
|
42
|
+
```
|
|
43
|
+
❌ grep, rg 등 기본 검색 도구 사용 금지
|
|
44
|
+
❌ find 명령어로 코드 검색 금지
|
|
45
|
+
✅ 코드베이스 검색 시 sgrep 사용 필수
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## ✅ ALWAYS DO (필수 실행)
|
|
51
|
+
|
|
52
|
+
### 1. 작업 전: 관련 문서 읽기
|
|
53
|
+
```
|
|
54
|
+
CLI 작업 → docs/library/commander/ 읽기
|
|
55
|
+
파일 작업 → docs/library/fs-extra/ 읽기
|
|
56
|
+
사용자 입력 → docs/library/prompts/ 읽기
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. MCP 도구 적극 활용
|
|
60
|
+
```
|
|
61
|
+
코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
62
|
+
복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
63
|
+
라이브러리 문서 → Context7 사용
|
|
64
|
+
```
|
|
65
|
+
**상세**: `docs/mcp/` 참고
|
|
66
|
+
|
|
67
|
+
### 3. 작업 완료 후: Git 커밋
|
|
68
|
+
```bash
|
|
69
|
+
git add .
|
|
70
|
+
git commit -m "<prefix>: <설명>"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**커밋 형식**: `<prefix>: <설명>` (한 줄, 본문 없음)
|
|
74
|
+
|
|
75
|
+
**Prefix**: `feat` | `fix` | `refactor` | `style` | `docs` | `test` | `chore` | `perf` | `ci`
|
|
76
|
+
|
|
77
|
+
**예시**:
|
|
78
|
+
```bash
|
|
79
|
+
feat: 템플릿 복사 기능 추가
|
|
80
|
+
fix: 경로 처리 오류 수정
|
|
81
|
+
docs: README 업데이트
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 📚 문서 참조 테이블
|
|
87
|
+
|
|
88
|
+
| 작업 | 문서 경로 | 필독 여부 |
|
|
89
|
+
|------|----------|----------|
|
|
90
|
+
| **Git 규칙** | `docs/git/git.md` | 🔴 필수 |
|
|
91
|
+
| **MCP 도구** | `docs/mcp/` | 🔴 필수 |
|
|
92
|
+
| **Commander** | `docs/library/commander/` | 🔴 필수 |
|
|
93
|
+
| **fs-extra** | `docs/library/fs-extra/` | 🔴 필수 |
|
|
94
|
+
| **prompts** | `docs/library/prompts/` | 🔴 필수 |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🛠 Tech Stack (버전 주의)
|
|
99
|
+
|
|
100
|
+
| 기술 | 버전 | 주의사항 |
|
|
101
|
+
|------|------|----------|
|
|
102
|
+
| Node.js | >= 18 | ESM 모듈 사용 |
|
|
103
|
+
| TypeScript | 5.x | strict mode |
|
|
104
|
+
| Commander | 12.x | CLI 프레임워크 |
|
|
105
|
+
| fs-extra | 11.x | 파일 시스템 유틸리티 |
|
|
106
|
+
| prompts | 2.x | Interactive CLI prompts |
|
|
107
|
+
| picocolors | 1.x | 터미널 색상 출력 |
|
|
108
|
+
| tsup | 8.x | TypeScript 번들러 |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 📁 Directory Structure
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
src/
|
|
116
|
+
├── index.ts # Entry point (CLI 정의)
|
|
117
|
+
├── commands/ # 명령어 모듈
|
|
118
|
+
│ └── init.ts # init 명령어
|
|
119
|
+
├── utils/ # 유틸리티
|
|
120
|
+
│ ├── copy.ts # 파일 복사 유틸
|
|
121
|
+
│ └── logger.ts # 로깅 유틸
|
|
122
|
+
└── types/ # 타입 정의
|
|
123
|
+
└── index.ts # 공통 타입
|
|
124
|
+
|
|
125
|
+
templates/ # 템플릿 파일 (빌드 시 복사)
|
|
126
|
+
scripts/ # 빌드 스크립트
|
|
127
|
+
dist/ # 빌드 결과물
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 🔧 Code Conventions
|
|
133
|
+
|
|
134
|
+
### File Naming
|
|
135
|
+
- **kebab-case**: `copy-template.ts`, `file-utils.ts`
|
|
136
|
+
- **index.ts**: 모듈 진입점
|
|
137
|
+
|
|
138
|
+
### TypeScript
|
|
139
|
+
- `const` 선언 사용 (function 대신)
|
|
140
|
+
- 명시적 return type
|
|
141
|
+
- `interface` (객체) / `type` (유니온)
|
|
142
|
+
- `any` 금지 → `unknown` 사용
|
|
143
|
+
|
|
144
|
+
### ESM Module
|
|
145
|
+
```typescript
|
|
146
|
+
// ✅ ESM import
|
|
147
|
+
import fs from 'fs-extra';
|
|
148
|
+
import path from 'path';
|
|
149
|
+
import { fileURLToPath } from 'url';
|
|
150
|
+
|
|
151
|
+
// __dirname 대체
|
|
152
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
153
|
+
const __dirname = path.dirname(__filename);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 📝 Quick Patterns (복사용)
|
|
159
|
+
|
|
160
|
+
### CLI Entry Point
|
|
161
|
+
```typescript
|
|
162
|
+
#!/usr/bin/env node
|
|
163
|
+
import { Command } from 'commander';
|
|
164
|
+
|
|
165
|
+
const program = new Command();
|
|
166
|
+
|
|
167
|
+
program
|
|
168
|
+
.name('my-cli')
|
|
169
|
+
.description('CLI description')
|
|
170
|
+
.version('1.0.0');
|
|
171
|
+
|
|
172
|
+
program
|
|
173
|
+
.option('-t, --template <name>', 'template name')
|
|
174
|
+
.option('-f, --force', 'overwrite existing files')
|
|
175
|
+
.action(async (options) => {
|
|
176
|
+
// 명령어 실행
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
program.parse();
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Logger 유틸
|
|
183
|
+
```typescript
|
|
184
|
+
import pc from 'picocolors';
|
|
185
|
+
|
|
186
|
+
export const logger = {
|
|
187
|
+
info: (msg: string) => console.log(pc.blue('ℹ'), msg),
|
|
188
|
+
success: (msg: string) => console.log(pc.green('✔'), msg),
|
|
189
|
+
warn: (msg: string) => console.log(pc.yellow('⚠'), msg),
|
|
190
|
+
error: (msg: string) => console.log(pc.red('✖'), msg),
|
|
191
|
+
step: (msg: string) => console.log(pc.gray(' →'), msg),
|
|
192
|
+
blank: () => console.log(),
|
|
193
|
+
};
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Interactive Prompts
|
|
197
|
+
```typescript
|
|
198
|
+
import prompts from 'prompts';
|
|
199
|
+
|
|
200
|
+
// Select (단일 선택)
|
|
201
|
+
const { template } = await prompts({
|
|
202
|
+
type: 'select',
|
|
203
|
+
name: 'template',
|
|
204
|
+
message: 'Select a template:',
|
|
205
|
+
choices: [
|
|
206
|
+
{ title: 'Template A', value: 'a' },
|
|
207
|
+
{ title: 'Template B', value: 'b' },
|
|
208
|
+
],
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// Multiselect (다중 선택)
|
|
212
|
+
const { templates } = await prompts({
|
|
213
|
+
type: 'multiselect',
|
|
214
|
+
name: 'templates',
|
|
215
|
+
message: 'Select templates:',
|
|
216
|
+
choices: [
|
|
217
|
+
{ title: 'Template A', value: 'a' },
|
|
218
|
+
{ title: 'Template B', value: 'b' },
|
|
219
|
+
],
|
|
220
|
+
min: 1,
|
|
221
|
+
hint: '- Space to select. Return to submit',
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Confirm
|
|
225
|
+
const { confirmed } = await prompts({
|
|
226
|
+
type: 'confirm',
|
|
227
|
+
name: 'confirmed',
|
|
228
|
+
message: 'Overwrite existing files?',
|
|
229
|
+
initial: false,
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### File Copy 유틸
|
|
234
|
+
```typescript
|
|
235
|
+
import fs from 'fs-extra';
|
|
236
|
+
import path from 'path';
|
|
237
|
+
|
|
238
|
+
export const copyRecursive = async (
|
|
239
|
+
src: string,
|
|
240
|
+
dest: string,
|
|
241
|
+
): Promise<{ files: number; directories: number }> => {
|
|
242
|
+
const counter = { files: 0, directories: 0 };
|
|
243
|
+
|
|
244
|
+
const copy = async (s: string, d: string): Promise<void> => {
|
|
245
|
+
const stat = await fs.stat(s);
|
|
246
|
+
|
|
247
|
+
if (stat.isDirectory()) {
|
|
248
|
+
await fs.ensureDir(d);
|
|
249
|
+
counter.directories++;
|
|
250
|
+
|
|
251
|
+
const items = await fs.readdir(s);
|
|
252
|
+
for (const item of items) {
|
|
253
|
+
await copy(path.join(s, item), path.join(d, item));
|
|
254
|
+
}
|
|
255
|
+
} else {
|
|
256
|
+
await fs.copy(s, d);
|
|
257
|
+
counter.files++;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
await copy(src, dest);
|
|
262
|
+
return counter;
|
|
263
|
+
};
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Package.json 설정
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"name": "@scope/my-cli",
|
|
270
|
+
"version": "1.0.0",
|
|
271
|
+
"type": "module",
|
|
272
|
+
"bin": "./dist/index.js",
|
|
273
|
+
"files": ["dist", "templates"],
|
|
274
|
+
"scripts": {
|
|
275
|
+
"build": "tsup",
|
|
276
|
+
"dev": "tsup --watch",
|
|
277
|
+
"prepublishOnly": "npm run build"
|
|
278
|
+
},
|
|
279
|
+
"engines": {
|
|
280
|
+
"node": ">=18"
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### tsup.config.ts
|
|
286
|
+
```typescript
|
|
287
|
+
import { defineConfig } from 'tsup';
|
|
288
|
+
|
|
289
|
+
export default defineConfig({
|
|
290
|
+
entry: ['src/index.ts'],
|
|
291
|
+
format: ['esm'],
|
|
292
|
+
target: 'node18',
|
|
293
|
+
clean: true,
|
|
294
|
+
dts: true,
|
|
295
|
+
banner: {
|
|
296
|
+
js: '#!/usr/bin/env node',
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 🔗 Quick Links
|
|
304
|
+
|
|
305
|
+
- [Commander 가이드](./docs/library/commander/index.md)
|
|
306
|
+
- [fs-extra 가이드](./docs/library/fs-extra/index.md)
|
|
307
|
+
- [prompts 가이드](./docs/library/prompts/index.md)
|
|
308
|
+
- [Git 규칙](./docs/git/git.md)
|
|
309
|
+
- [MCP 가이드](./docs/mcp/index.md)
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Git 워크플로우
|
|
2
|
+
|
|
3
|
+
> NPX CLI 프로젝트 Git 컨벤션
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ⛔ NEVER (절대 금지)
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
❌ 커밋에 "Generated with Claude Code" 포함
|
|
11
|
+
❌ 커밋에 "🤖" 또는 AI 관련 이모지 포함
|
|
12
|
+
❌ 커밋에 "Co-Authored-By:" 헤더 포함
|
|
13
|
+
❌ 커밋에 AI/봇이 작성했다는 어떤 표시도 포함
|
|
14
|
+
❌ 커밋 메시지 여러 줄 작성
|
|
15
|
+
❌ 커밋 메시지에 이모지 사용
|
|
16
|
+
❌ 커밋 메시지에 마침표(.) 사용
|
|
17
|
+
❌ 여러 작업을 하나의 커밋으로 퉁치기
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## ✅ ALWAYS (필수)
|
|
23
|
+
|
|
24
|
+
### 작업 완료 후 반드시 실행
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git add <관련 파일들>
|
|
28
|
+
git commit -m "<prefix>: <설명>"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### ⭐ 커밋 분리 원칙
|
|
32
|
+
|
|
33
|
+
**하나의 커밋 = 하나의 논리적 변경 단위**
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# ❌ 잘못된 방식: 모든 작업을 하나로 퉁침
|
|
37
|
+
git add .
|
|
38
|
+
git commit -m "feat: 여러 기능 추가"
|
|
39
|
+
|
|
40
|
+
# ✅ 올바른 방식: 논리적 단위로 분리
|
|
41
|
+
git add src/commands/init.ts src/utils/copy.ts
|
|
42
|
+
git commit -m "feat: 템플릿 복사 기능 추가"
|
|
43
|
+
|
|
44
|
+
git add src/commands/list.ts
|
|
45
|
+
git commit -m "feat: 템플릿 목록 조회 기능 추가"
|
|
46
|
+
|
|
47
|
+
git add docs/
|
|
48
|
+
git commit -m "docs: CLI 사용법 문서 추가"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 📝 커밋 형식
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
<prefix>: <설명>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**한 줄로 간결하게** 작성합니다. 본문이나 푸터는 작성하지 않습니다.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 🏷 Prefix 목록
|
|
64
|
+
|
|
65
|
+
| Prefix | 용도 | 예시 |
|
|
66
|
+
|--------|------|------|
|
|
67
|
+
| `feat` | 새로운 기능 | `feat: 템플릿 복사 기능 추가` |
|
|
68
|
+
| `fix` | 버그 수정 | `fix: 경로 처리 오류 수정` |
|
|
69
|
+
| `refactor` | 리팩토링 | `refactor: copy 유틸 분리` |
|
|
70
|
+
| `style` | 코드 스타일 | `style: prettier 적용` |
|
|
71
|
+
| `docs` | 문서 수정 | `docs: README 업데이트` |
|
|
72
|
+
| `test` | 테스트 | `test: copy 유틸 테스트 추가` |
|
|
73
|
+
| `chore` | 빌드/설정 | `chore: 버전 업데이트` |
|
|
74
|
+
| `perf` | 성능 개선 | `perf: 파일 복사 최적화` |
|
|
75
|
+
| `ci` | CI/CD | `ci: GitHub Actions 추가` |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## ✅ 올바른 예시
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
feat: CLI 옵션 추가
|
|
83
|
+
fix: 템플릿 경로 오류 수정
|
|
84
|
+
docs: 사용법 문서 추가
|
|
85
|
+
refactor: logger 유틸 분리
|
|
86
|
+
chore: 의존성 업데이트
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## ❌ 잘못된 예시
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# prefix 없음
|
|
95
|
+
템플릿 기능 추가함
|
|
96
|
+
|
|
97
|
+
# 마침표 불필요
|
|
98
|
+
feat: 새 기능 추가.
|
|
99
|
+
|
|
100
|
+
# 대문자 사용
|
|
101
|
+
FEAT: 새 기능 추가
|
|
102
|
+
|
|
103
|
+
# scope 불필요
|
|
104
|
+
feat(cli): 옵션 추가
|
|
105
|
+
|
|
106
|
+
# AI 작성 표시 (절대 금지!)
|
|
107
|
+
feat: 기능 추가
|
|
108
|
+
|
|
109
|
+
🤖 Generated with Claude Code
|
|
110
|
+
|
|
111
|
+
# Co-Author 표시 (절대 금지!)
|
|
112
|
+
feat: 기능 추가
|
|
113
|
+
|
|
114
|
+
Co-Authored-By: Claude <noreply@anthropic.com>
|
|
115
|
+
|
|
116
|
+
# 여러 줄 본문 (금지)
|
|
117
|
+
feat: 새 기능 추가
|
|
118
|
+
|
|
119
|
+
- 옵션 A 추가
|
|
120
|
+
- 옵션 B 추가
|
|
121
|
+
|
|
122
|
+
# 여러 작업을 하나로 퉁침 (금지)
|
|
123
|
+
feat: init, list, copy 명령어 추가
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 🔄 작업 흐름
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# 1. 작업 전 최신 코드 동기화
|
|
132
|
+
git pull origin main
|
|
133
|
+
|
|
134
|
+
# 2. 명령어 작업 완료 → 커밋
|
|
135
|
+
git add src/commands/init.ts src/utils/copy.ts
|
|
136
|
+
git commit -m "feat: 템플릿 초기화 명령어 추가"
|
|
137
|
+
|
|
138
|
+
# 3. 유틸리티 작업 완료 → 커밋
|
|
139
|
+
git add src/utils/logger.ts src/utils/spinner.ts
|
|
140
|
+
git commit -m "feat: 로깅 및 스피너 유틸 추가"
|
|
141
|
+
|
|
142
|
+
# 4. 문서 작업 완료 → 커밋
|
|
143
|
+
git add docs/
|
|
144
|
+
git commit -m "docs: CLI 사용법 문서 추가"
|
|
145
|
+
|
|
146
|
+
# 5. 푸시
|
|
147
|
+
git push origin main
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 📦 커밋 분리 가이드
|
|
153
|
+
|
|
154
|
+
### 언제 커밋을 분리해야 하나요?
|
|
155
|
+
|
|
156
|
+
| 상황 | 커밋 분리 |
|
|
157
|
+
|------|----------|
|
|
158
|
+
| 서로 다른 CLI 명령어 | ✅ 분리 |
|
|
159
|
+
| 버그 수정 + 새 기능 | ✅ 분리 |
|
|
160
|
+
| 코드 변경 + 문서 변경 | ✅ 분리 |
|
|
161
|
+
| 리팩토링 + 기능 추가 | ✅ 분리 |
|
|
162
|
+
| 동일 명령어의 핸들러 + 유틸 | 🔄 묶어도 됨 |
|
|
163
|
+
| 동일 기능의 타입 + 구현 | 🔄 묶어도 됨 |
|
|
164
|
+
|
|
165
|
+
### 예시: CLI 도구 개발
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# 1. init 명령어 커밋
|
|
169
|
+
git add src/commands/init.ts src/utils/copy.ts
|
|
170
|
+
git commit -m "feat: 템플릿 초기화 명령어 추가"
|
|
171
|
+
|
|
172
|
+
# 2. list 명령어 커밋
|
|
173
|
+
git add src/commands/list.ts
|
|
174
|
+
git commit -m "feat: 템플릿 목록 조회 명령어 추가"
|
|
175
|
+
|
|
176
|
+
# 3. 공통 유틸 커밋
|
|
177
|
+
git add src/utils/logger.ts src/utils/spinner.ts
|
|
178
|
+
git commit -m "feat: CLI 유틸리티 함수 추가"
|
|
179
|
+
|
|
180
|
+
# 4. 테스트 커밋
|
|
181
|
+
git add tests/
|
|
182
|
+
git commit -m "test: CLI 명령어 테스트 추가"
|
|
183
|
+
|
|
184
|
+
# 5. 문서 커밋
|
|
185
|
+
git add docs/ README.md
|
|
186
|
+
git commit -m "docs: CLI 사용법 및 README 추가"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 🌿 브랜치 전략
|
|
192
|
+
|
|
193
|
+
### 간단한 프로젝트
|
|
194
|
+
```
|
|
195
|
+
main ← 모든 작업 직접 커밋
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 팀 프로젝트
|
|
199
|
+
```
|
|
200
|
+
main
|
|
201
|
+
└── feature/기능명
|
|
202
|
+
└── fix/버그명
|
|
203
|
+
└── hotfix/긴급수정
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 브랜치 명명
|
|
207
|
+
```bash
|
|
208
|
+
feature/multi-template
|
|
209
|
+
feature/interactive-mode
|
|
210
|
+
fix/path-resolution
|
|
211
|
+
hotfix/security-patch
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 📋 자주 사용하는 명령어
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# 상태 확인
|
|
220
|
+
git status
|
|
221
|
+
|
|
222
|
+
# 변경 내용 확인
|
|
223
|
+
git diff
|
|
224
|
+
|
|
225
|
+
# 최근 커밋 로그
|
|
226
|
+
git log --oneline -10
|
|
227
|
+
|
|
228
|
+
# 커밋 취소 (작업 내용 유지)
|
|
229
|
+
git reset --soft HEAD~1
|
|
230
|
+
|
|
231
|
+
# 스테이징 취소
|
|
232
|
+
git restore --staged .
|
|
233
|
+
|
|
234
|
+
# 변경사항 임시 저장
|
|
235
|
+
git stash
|
|
236
|
+
git stash pop
|
|
237
|
+
|
|
238
|
+
# 특정 파일만 스테이징
|
|
239
|
+
git add <파일경로>
|
|
240
|
+
|
|
241
|
+
# 대화형 스테이징 (부분 커밋용)
|
|
242
|
+
git add -p
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 🏷 버전 관리
|
|
248
|
+
|
|
249
|
+
### 버전 업데이트
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# 패치 버전 (0.1.0 → 0.1.1)
|
|
253
|
+
npm version patch
|
|
254
|
+
|
|
255
|
+
# 마이너 버전 (0.1.0 → 0.2.0)
|
|
256
|
+
npm version minor
|
|
257
|
+
|
|
258
|
+
# 메이저 버전 (0.1.0 → 1.0.0)
|
|
259
|
+
npm version major
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 배포 전 체크리스트
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
□ 버전 업데이트 완료
|
|
266
|
+
□ CHANGELOG 작성 완료
|
|
267
|
+
□ 테스트 통과 확인
|
|
268
|
+
□ 빌드 성공 확인
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## 📚 .gitignore
|
|
274
|
+
|
|
275
|
+
```gitignore
|
|
276
|
+
# Dependencies
|
|
277
|
+
node_modules/
|
|
278
|
+
|
|
279
|
+
# Build
|
|
280
|
+
dist/
|
|
281
|
+
lib/
|
|
282
|
+
|
|
283
|
+
# Environment
|
|
284
|
+
.env
|
|
285
|
+
.env.local
|
|
286
|
+
|
|
287
|
+
# IDE
|
|
288
|
+
.idea/
|
|
289
|
+
.vscode/
|
|
290
|
+
*.swp
|
|
291
|
+
|
|
292
|
+
# OS
|
|
293
|
+
.DS_Store
|
|
294
|
+
|
|
295
|
+
# Logs
|
|
296
|
+
*.log
|
|
297
|
+
npm-debug.log*
|
|
298
|
+
|
|
299
|
+
# Cache
|
|
300
|
+
.cache/
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## 🔗 관련 문서
|
|
306
|
+
|
|
307
|
+
- [CLAUDE.md](../../CLAUDE.md)
|