@choblue/claude-code-toolkit 1.0.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.
- package/.claude/.gitkeep +0 -0
- package/.claude/CLAUDE.md +100 -0
- package/.claude/agents/code-reviewer.md +87 -0
- package/.claude/agents/code-writer/backend.md +95 -0
- package/.claude/agents/code-writer/common.md +79 -0
- package/.claude/agents/code-writer/frontend.md +91 -0
- package/.claude/agents/explore.md +54 -0
- package/.claude/agents/git-manager.md +102 -0
- package/.claude/agents/tdd/backend.md +207 -0
- package/.claude/agents/tdd/common.md +137 -0
- package/.claude/agents/tdd/frontend.md +250 -0
- package/.claude/hooks/quality-gate.sh +17 -0
- package/.claude/settings.json +15 -0
- package/.claude/skills/Coding/SKILL.md +108 -0
- package/.claude/skills/Coding/backend.md +97 -0
- package/.claude/skills/Coding/frontend.md +11 -0
- package/.claude/skills/Git/SKILL.md +93 -0
- package/.claude/skills/NextJS/SKILL.md +424 -0
- package/.claude/skills/React/SKILL.md +261 -0
- package/.claude/skills/ReactHookForm/SKILL.md +317 -0
- package/.claude/skills/TDD/SKILL.md +161 -0
- package/.claude/skills/TDD/backend.md +356 -0
- package/.claude/skills/TDD/frontend.md +392 -0
- package/.claude/skills/TailwindCSS/SKILL.md +368 -0
- package/.claude/skills/TanStackQuery/SKILL.md +242 -0
- package/.claude/skills/TypeORM/SKILL.md +621 -0
- package/.claude/skills/TypeScript/SKILL.md +528 -0
- package/.claude/skills/Zustand/SKILL.md +285 -0
- package/README.md +157 -0
- package/bin/cli.js +18 -0
- package/install.sh +255 -0
- package/package.json +27 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Coding Skill - 공통 원칙
|
|
2
|
+
|
|
3
|
+
이 문서는 모든 코드 작성 시 적용되는 공통 원칙을 정의한다.
|
|
4
|
+
FE/BE별 상세 규칙은 각각의 파일을 참고한다.
|
|
5
|
+
- `frontend.md` - React 프론트엔드 규칙
|
|
6
|
+
- `backend.md` - NestJS 백엔드 규칙
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. 설계 원칙
|
|
11
|
+
|
|
12
|
+
### SRP (Single Responsibility Principle)
|
|
13
|
+
- 함수는 하나의 작업만 수행한다
|
|
14
|
+
- 클래스/모듈은 하나의 책임만 갖는다
|
|
15
|
+
- "이 함수가 하는 일"을 한 문장으로 설명할 수 없으면 분리한다
|
|
16
|
+
|
|
17
|
+
### 결합도(Coupling)와 응집도(Cohesion)
|
|
18
|
+
- **낮은 결합도**: 모듈 간 의존성을 최소화한다
|
|
19
|
+
- 인터페이스/추상화를 통해 의존한다
|
|
20
|
+
- 구현 세부사항에 직접 의존하지 않는다
|
|
21
|
+
- **높은 응집도**: 관련 있는 로직을 같은 모듈에 모은다
|
|
22
|
+
- 하나의 모듈 안에서 데이터와 동작이 밀접하게 관련된다
|
|
23
|
+
|
|
24
|
+
### DRY (Don't Repeat Yourself)
|
|
25
|
+
- 동일한 로직이 3번 이상 반복되면 추출한다
|
|
26
|
+
- 단, 2번까지는 중복을 허용한다 (섣부른 추상화 방지)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. 네이밍 컨벤션
|
|
31
|
+
|
|
32
|
+
### 일반 규칙
|
|
33
|
+
- 의도를 드러내는 이름을 사용한다
|
|
34
|
+
- 축약어를 피한다 (`btn` → `button`, `msg` → `message`)
|
|
35
|
+
- 단, 관례적 축약은 허용한다 (`id`, `url`, `api`, `dto`)
|
|
36
|
+
|
|
37
|
+
### 변수/함수
|
|
38
|
+
```
|
|
39
|
+
// Bad
|
|
40
|
+
const d = new Date();
|
|
41
|
+
const list = getItems();
|
|
42
|
+
function process(data) {}
|
|
43
|
+
|
|
44
|
+
// Good
|
|
45
|
+
const createdAt = new Date();
|
|
46
|
+
const activeUsers = getActiveUsers();
|
|
47
|
+
function validateUserInput(input) {}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Boolean
|
|
51
|
+
- `is`, `has`, `can`, `should` 접두사를 사용한다
|
|
52
|
+
```
|
|
53
|
+
isActive, hasPermission, canEdit, shouldRender
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 함수
|
|
57
|
+
- 동사로 시작한다
|
|
58
|
+
- 반환값이 예측 가능한 이름을 사용한다
|
|
59
|
+
```
|
|
60
|
+
getUserById() // User 반환
|
|
61
|
+
calculateTotal() // number 반환
|
|
62
|
+
isValid() // boolean 반환
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 3. 에러 핸들링
|
|
68
|
+
|
|
69
|
+
### 원칙
|
|
70
|
+
- 시스템 경계(외부 API, 사용자 입력, 파일 I/O)에서 에러를 처리한다
|
|
71
|
+
- 내부 로직에서 불필요한 try-catch를 남발하지 않는다
|
|
72
|
+
- 에러 메시지는 디버깅에 도움되는 정보를 포함한다
|
|
73
|
+
|
|
74
|
+
### 패턴
|
|
75
|
+
```typescript
|
|
76
|
+
// Bad - 에러를 삼킴
|
|
77
|
+
try {
|
|
78
|
+
await saveUser(user);
|
|
79
|
+
} catch (e) {
|
|
80
|
+
// do nothing
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Bad - 원본 에러 정보 손실
|
|
84
|
+
try {
|
|
85
|
+
await saveUser(user);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
throw new Error('저장 실패');
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Good - 원본 에러 보존
|
|
91
|
+
try {
|
|
92
|
+
await saveUser(user);
|
|
93
|
+
} catch (e) {
|
|
94
|
+
throw new Error(`사용자 저장 실패: ${user.id}`, { cause: e });
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 4. 코드 품질 체크리스트
|
|
101
|
+
|
|
102
|
+
코드 작성/리뷰 시 다음을 확인한다:
|
|
103
|
+
- [ ] 함수/클래스가 SRP를 지키는가?
|
|
104
|
+
- [ ] 네이밍이 의도를 드러내는가?
|
|
105
|
+
- [ ] 시스템 경계에서 에러 핸들링이 되어 있는가?
|
|
106
|
+
- [ ] 불필요한 복잡도가 없는가?
|
|
107
|
+
- [ ] `any` 타입을 사용하지 않았는가?
|
|
108
|
+
- [ ] 기존 프로젝트 패턴과 일관성이 있는가?
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Coding Skill - Backend (NestJS)
|
|
2
|
+
|
|
3
|
+
NestJS 백엔드 코드에 적용되는 규칙이다.
|
|
4
|
+
공통 원칙은 `SKILL.md`를 함께 참고한다.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 레이어별 책임
|
|
9
|
+
|
|
10
|
+
### Controller
|
|
11
|
+
- HTTP 요청/응답 변환
|
|
12
|
+
- DTO 유효성 검증 (데코레이터를 통해)
|
|
13
|
+
- 비즈니스 로직 없음
|
|
14
|
+
- 적절한 HTTP 데코레이터 사용 (`@Get`, `@Post`, `@Param`, `@Body` 등)
|
|
15
|
+
|
|
16
|
+
### Service
|
|
17
|
+
- 비즈니스 로직 처리
|
|
18
|
+
- 트랜잭션 관리
|
|
19
|
+
- 다른 Service 조합
|
|
20
|
+
- 순환 참조 금지
|
|
21
|
+
|
|
22
|
+
### Repository
|
|
23
|
+
- 데이터베이스 CRUD
|
|
24
|
+
- 쿼리 작성
|
|
25
|
+
- 데이터 매핑
|
|
26
|
+
|
|
27
|
+
### Guard / Interceptor / Pipe
|
|
28
|
+
- 횡단 관심사 (인증, 로깅, 변환)
|
|
29
|
+
- 재사용 가능하게 설계
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. DTO 작성
|
|
34
|
+
|
|
35
|
+
- `class-validator` 데코레이터로 유효성 검증을 선언한다
|
|
36
|
+
- `class-transformer`를 활용하여 변환한다
|
|
37
|
+
- Partial, Pick, Omit 등 mapped type을 활용한다
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
export class CreateUserDto {
|
|
41
|
+
@IsString()
|
|
42
|
+
@IsNotEmpty()
|
|
43
|
+
name: string;
|
|
44
|
+
|
|
45
|
+
@IsEmail()
|
|
46
|
+
email: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export class UpdateUserDto extends PartialType(CreateUserDto) {}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 3. 에러 핸들링 (NestJS)
|
|
55
|
+
|
|
56
|
+
- NestJS 내장 `HttpException`을 사용한다
|
|
57
|
+
- 커스텀 예외는 `HttpException`을 상속한다
|
|
58
|
+
- 글로벌 Exception Filter를 활용한다
|
|
59
|
+
- Service에서 HttpException을 직접 던지지 않는다 (비즈니스 예외를 별도 정의)
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Bad - Service에서 HTTP 의존
|
|
63
|
+
throw new NotFoundException('사용자를 찾을 수 없습니다');
|
|
64
|
+
|
|
65
|
+
// Good - 비즈니스 예외 정의 후 Controller/Filter에서 변환
|
|
66
|
+
throw new UserNotFoundException(userId);
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 4. 의존성 주입 (DI)
|
|
72
|
+
|
|
73
|
+
- `new`로 직접 생성하지 않는다 - DI를 통해 주입받는다
|
|
74
|
+
- 환경 변수는 `ConfigService`를 통해 접근한다
|
|
75
|
+
- 인터페이스 기반 주입을 권장한다
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 5. 네이밍 컨벤션 (BE)
|
|
80
|
+
|
|
81
|
+
| 대상 | 규칙 | 예시 |
|
|
82
|
+
|------|------|------|
|
|
83
|
+
| 파일 | `kebab-case` | `create-user.dto.ts` |
|
|
84
|
+
| 클래스 | `PascalCase` + 역할 접미사 | `UserService`, `CreateUserDto` |
|
|
85
|
+
| 메서드 | `camelCase` + 동사 | `findById`, `createUser` |
|
|
86
|
+
| 테스트 | `*.spec.ts` | `user.service.spec.ts` |
|
|
87
|
+
| 모듈 디렉토리 | `kebab-case` | `user-profile/` |
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 6. 금지 사항
|
|
92
|
+
|
|
93
|
+
- Controller에 비즈니스 로직 작성 금지
|
|
94
|
+
- Repository 외 레이어에서 직접 쿼리 실행 금지
|
|
95
|
+
- `any` 타입 사용 금지
|
|
96
|
+
- 환경 변수 직접 접근 (`process.env`) 금지 → `ConfigService` 사용
|
|
97
|
+
- 순환 의존 금지 (Module 간, Service 간)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Coding Skill - Frontend
|
|
2
|
+
|
|
3
|
+
> **이 파일은 더 이상 사용되지 않는다.**
|
|
4
|
+
> 프론트엔드 규칙은 기술별 스킬 파일로 분리되었다.
|
|
5
|
+
|
|
6
|
+
- `../React/SKILL.md` - React 컴포넌트, 훅, 상태 관리
|
|
7
|
+
- `../NextJS/SKILL.md` - Next.js App Router, SSR, Server Actions
|
|
8
|
+
- `../TailwindCSS/SKILL.md` - Tailwind CSS 유틸리티 패턴
|
|
9
|
+
- `../TanStackQuery/SKILL.md` - 서버 상태 관리 (React Query)
|
|
10
|
+
- `../Zustand/SKILL.md` - 클라이언트 전역 상태 관리
|
|
11
|
+
- `../ReactHookForm/SKILL.md` - 폼 관리 + Zod 검증
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Git Skill - Git 규칙
|
|
2
|
+
|
|
3
|
+
커밋, PR, 브랜치 관련 규칙을 정의한다.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 커밋 메시지
|
|
8
|
+
|
|
9
|
+
### 형식
|
|
10
|
+
```
|
|
11
|
+
<PREFIX>: <설명>
|
|
12
|
+
|
|
13
|
+
<본문 (선택)>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### PREFIX
|
|
17
|
+
| PREFIX | 용도 | 예시 |
|
|
18
|
+
|--------|------|------|
|
|
19
|
+
| `FEAT` | 새로운 기능 | `FEAT: 사용자 인증 기능 추가` |
|
|
20
|
+
| `FIX` | 버그 수정 | `FIX: 로그인 리다이렉트 무한 루프 수정` |
|
|
21
|
+
| `REFACTOR` | 리팩토링 (기능 변경 없음) | `REFACTOR: OrderService 쿼리 최적화` |
|
|
22
|
+
| `CHORE` | 빌드, 설정, 의존성 | `CHORE: ESLint 설정 업데이트` |
|
|
23
|
+
| `DOCS` | 문서 변경 | `DOCS: API 문서 업데이트` |
|
|
24
|
+
| `TEST` | 테스트 추가/수정 | `TEST: UserService 단위 테스트 추가` |
|
|
25
|
+
| `STYLE` | 포매팅 (코드 변경 없음) | `STYLE: import 정렬` |
|
|
26
|
+
|
|
27
|
+
### 작성 원칙
|
|
28
|
+
- 설명은 한국어로, 명령형으로 작성한다
|
|
29
|
+
- 본문은 "왜" 변경했는지를 설명한다
|
|
30
|
+
- 하나의 커밋은 하나의 논리적 변경만 포함한다
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. 브랜치 전략
|
|
35
|
+
|
|
36
|
+
### 형식
|
|
37
|
+
```
|
|
38
|
+
<type>/<description>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 타입
|
|
42
|
+
| 타입 | 용도 |
|
|
43
|
+
|------|------|
|
|
44
|
+
| `feat/` | 기능 개발 |
|
|
45
|
+
| `fix/` | 버그 수정 |
|
|
46
|
+
| `refactor/` | 리팩토링 |
|
|
47
|
+
| `chore/` | 설정/환경 |
|
|
48
|
+
|
|
49
|
+
### 예시
|
|
50
|
+
```
|
|
51
|
+
feat/user-authentication
|
|
52
|
+
fix/login-redirect-loop
|
|
53
|
+
refactor/order-service-cleanup
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 3. PR 템플릿
|
|
59
|
+
|
|
60
|
+
### 제목
|
|
61
|
+
- 70자 이내
|
|
62
|
+
- PREFIX 포함 (e.g., "FEAT: 사용자 인증 기능 추가")
|
|
63
|
+
|
|
64
|
+
### 본문
|
|
65
|
+
```markdown
|
|
66
|
+
## Summary
|
|
67
|
+
- 변경 내용을 1-3개 bullet point로 요약
|
|
68
|
+
|
|
69
|
+
## Changes
|
|
70
|
+
- 주요 변경 사항 상세 설명
|
|
71
|
+
|
|
72
|
+
## Test Plan
|
|
73
|
+
- [ ] 테스트 항목 1
|
|
74
|
+
- [ ] 테스트 항목 2
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 4. 스테이징 규칙
|
|
80
|
+
|
|
81
|
+
- **`git add -A` 또는 `git add .`는 절대 사용하지 않는다**
|
|
82
|
+
- 변경된 파일을 하나씩 확인하고 관련 파일만 스테이징한다
|
|
83
|
+
- `.env`, credentials, 대용량 바이너리는 스테이징하지 않는다
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 5. 금지 사항
|
|
88
|
+
|
|
89
|
+
- `git push --force` (명시적 요청 없이)
|
|
90
|
+
- `git reset --hard` (명시적 요청 없이)
|
|
91
|
+
- `main`/`master` 브랜치에 직접 push
|
|
92
|
+
- 커밋 시 `--no-verify` 사용
|
|
93
|
+
- 빈 커밋 생성
|