jun-claude-code 0.0.12 → 0.0.13
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/README.md +30 -12
- package/dist/cli.js +22 -0
- package/dist/init-context.js +25 -3
- package/dist/validate.d.ts +4 -0
- package/dist/validate.js +105 -0
- package/package.json +1 -1
- package/templates/global/CLAUDE.md +50 -21
- package/templates/global/agents/architect.md +23 -11
- package/templates/global/agents/code-reviewer.md +17 -7
- package/templates/global/agents/code-writer.md +27 -15
- package/templates/global/agents/context-collector.md +11 -3
- package/templates/global/agents/context-manager.md +20 -8
- package/templates/global/agents/designer.md +32 -20
- package/templates/global/agents/director.md +43 -31
- package/templates/global/agents/explore.md +12 -4
- package/templates/global/agents/git-manager.md +39 -22
- package/templates/global/agents/impact-analyzer.md +17 -7
- package/templates/global/agents/qa-tester.md +22 -8
- package/templates/global/agents/simple-code-writer.md +12 -4
- package/templates/global/agents/task-planner.md +18 -10
- package/templates/global/hooks/skill-forced.sh +49 -39
- package/templates/global/hooks/workflow-enforced.sh +49 -31
- package/templates/global/skills/Backend/SKILL.md +38 -9
- package/templates/global/skills/Coding/SKILL.md +69 -29
- package/templates/global/skills/Director/SKILL.md +9 -5
- package/templates/global/skills/Documentation/SKILL.md +68 -1
- package/templates/global/skills/Git/SKILL.md +8 -4
- package/templates/global/skills/Git/git.md +60 -28
- package/templates/global/skills/Git/pr-apply.md +18 -6
- package/templates/global/skills/Git/pr-review.md +4 -0
- package/templates/global/skills/PromptStructuring/SKILL.md +67 -0
- package/templates/global/skills/PromptStructuring/positive-phrasing.md +206 -0
- package/templates/global/skills/PromptStructuring/xml-tags.md +330 -0
- package/templates/global/skills/React/SKILL.md +28 -8
- package/templates/global/skills/React/react-hook-form.md +20 -12
- package/templates/global/skills/React/tailwind-styled.md +29 -7
- package/templates/global/skills/React/tanstack-router.md +21 -9
- package/templates/project/agents/project-task-manager.md +19 -7
- package/templates/{global → project}/skills/ContextGeneration/SKILL.md +20 -12
- package/templates/project/workflows/context-gen.yml +30 -7
- /package/templates/{global → project}/agents/context-generator.md +0 -0
|
@@ -7,6 +7,8 @@ estimated_tokens: ~400
|
|
|
7
7
|
|
|
8
8
|
# 백엔드 개발 원칙
|
|
9
9
|
|
|
10
|
+
<rules>
|
|
11
|
+
|
|
10
12
|
## 레이어 간 객체 변환 규칙
|
|
11
13
|
|
|
12
14
|
> **객체 변환은 필요한 시점에 해당 레이어에서 수행한다.**
|
|
@@ -15,12 +17,16 @@ estimated_tokens: ~400
|
|
|
15
17
|
|
|
16
18
|
| 레이어 | 입력 | 출력 | 변환 책임 |
|
|
17
19
|
|--------|------|------|----------|
|
|
18
|
-
| **Controller** | Request DTO | Response DTO/Schema | Entity
|
|
19
|
-
| **Service** | DTO (그대로 사용) | Entity 또는 일반 객체 | DTO
|
|
20
|
+
| **Controller** | Request DTO | Response DTO/Schema | Entity -> Response 변환 |
|
|
21
|
+
| **Service** | DTO (그대로 사용) | Entity 또는 일반 객체 | DTO -> Entity 변환 (필요시) |
|
|
20
22
|
| **Repository** | Entity | Entity | 없음 |
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
</rules>
|
|
25
|
+
|
|
26
|
+
### Controller -> Service 호출
|
|
23
27
|
|
|
28
|
+
<examples>
|
|
29
|
+
<example type="bad">
|
|
24
30
|
```typescript
|
|
25
31
|
// ❌ Controller에서 미리 Entity로 변환
|
|
26
32
|
@Post()
|
|
@@ -30,13 +36,18 @@ async create(@Body() dto: CreateUserDto) {
|
|
|
30
36
|
entity.email = dto.email;
|
|
31
37
|
return this.userService.create(entity); // Entity 전달
|
|
32
38
|
}
|
|
33
|
-
|
|
39
|
+
```
|
|
40
|
+
</example>
|
|
41
|
+
<example type="good">
|
|
42
|
+
```typescript
|
|
34
43
|
// ✅ DTO 그대로 전달
|
|
35
44
|
@Post()
|
|
36
45
|
async create(@Body() dto: CreateUserDto) {
|
|
37
46
|
return this.userService.create(dto); // DTO 전달
|
|
38
47
|
}
|
|
39
48
|
```
|
|
49
|
+
</example>
|
|
50
|
+
</examples>
|
|
40
51
|
|
|
41
52
|
### Service 내부 처리
|
|
42
53
|
|
|
@@ -55,7 +66,7 @@ async create(dto: CreateUserDto) {
|
|
|
55
66
|
}
|
|
56
67
|
```
|
|
57
68
|
|
|
58
|
-
### Service
|
|
69
|
+
### Service -> Controller 반환
|
|
59
70
|
|
|
60
71
|
```typescript
|
|
61
72
|
// ✅ Service: Entity 또는 일반 객체 반환
|
|
@@ -79,9 +90,11 @@ async findOne(@Param('id') id: number) {
|
|
|
79
90
|
|
|
80
91
|
---
|
|
81
92
|
|
|
93
|
+
<rules>
|
|
94
|
+
|
|
82
95
|
## TypeORM 사용 규칙
|
|
83
96
|
|
|
84
|
-
> **find 메서드를 기본으로 사용하고, QueryBuilder는
|
|
97
|
+
> **find 메서드를 기본으로 사용하고, QueryBuilder는 필요한 경우에만 사용한다.**
|
|
85
98
|
|
|
86
99
|
### find 메서드 우선 사용
|
|
87
100
|
|
|
@@ -115,6 +128,10 @@ const users = await this.userRepository.find({
|
|
|
115
128
|
| **복잡한 서브쿼리** | 중첩 쿼리 |
|
|
116
129
|
| **복잡한 JOIN 조건** | ON 절 커스텀 |
|
|
117
130
|
|
|
131
|
+
</rules>
|
|
132
|
+
|
|
133
|
+
<examples>
|
|
134
|
+
<example type="good">
|
|
118
135
|
```typescript
|
|
119
136
|
// ✅ QueryBuilder 허용: groupBy + getRawMany
|
|
120
137
|
const stats = await this.orderRepository
|
|
@@ -124,24 +141,36 @@ const stats = await this.orderRepository
|
|
|
124
141
|
.addSelect('SUM(order.amount)', 'total')
|
|
125
142
|
.groupBy('order.status')
|
|
126
143
|
.getRawMany();
|
|
127
|
-
|
|
144
|
+
```
|
|
145
|
+
</example>
|
|
146
|
+
<example type="bad">
|
|
147
|
+
```typescript
|
|
128
148
|
// ❌ 불필요한 QueryBuilder 사용
|
|
129
149
|
const user = await this.userRepository
|
|
130
150
|
.createQueryBuilder('user')
|
|
131
151
|
.where('user.id = :id', { id })
|
|
132
152
|
.getOne();
|
|
133
|
-
|
|
153
|
+
```
|
|
154
|
+
</example>
|
|
155
|
+
<example type="good">
|
|
156
|
+
```typescript
|
|
134
157
|
// ✅ find로 대체
|
|
135
158
|
const user = await this.userRepository.findOneBy({ id });
|
|
136
159
|
```
|
|
160
|
+
</example>
|
|
161
|
+
</examples>
|
|
137
162
|
|
|
138
163
|
---
|
|
139
164
|
|
|
165
|
+
<checklist>
|
|
166
|
+
|
|
140
167
|
## 체크리스트
|
|
141
168
|
|
|
142
|
-
- [ ] Controller에서
|
|
169
|
+
- [ ] Controller에서 DTO를 그대로 Service에 전달하는가? (Entity 변환은 Service에서)
|
|
143
170
|
- [ ] Service에서 Entity가 필요한 시점에 변환하는가?
|
|
144
171
|
- [ ] Service의 return은 Entity 또는 일반 객체인가?
|
|
145
172
|
- [ ] Controller에서 Response DTO/Schema로 변환하는가?
|
|
146
173
|
- [ ] TypeORM find 메서드를 우선 사용하는가?
|
|
147
174
|
- [ ] QueryBuilder는 groupBy, getRawMany 등 필요한 경우에만 사용하는가?
|
|
175
|
+
|
|
176
|
+
</checklist>
|
|
@@ -7,29 +7,31 @@ estimated_tokens: ~500
|
|
|
7
7
|
|
|
8
8
|
# 공통 코딩 원칙
|
|
9
9
|
|
|
10
|
+
<rules>
|
|
11
|
+
|
|
10
12
|
## 단일 책임 원칙 (SRP)
|
|
11
13
|
|
|
12
14
|
> **하나의 모듈/컴포넌트는 하나의 책임만 가진다.**
|
|
13
15
|
|
|
14
16
|
### 백엔드 레이어별 책임
|
|
15
17
|
|
|
16
|
-
| 레이어 | 책임 |
|
|
17
|
-
|
|
18
|
-
| **Entity** | 데이터 구조 정의 |
|
|
19
|
-
| **Repository** | 데이터 접근 |
|
|
20
|
-
| **Service** | 비즈니스 로직 |
|
|
21
|
-
| **Controller** | 요청 라우팅 |
|
|
22
|
-
| **DTO/Schema** | 데이터 전송 구조 |
|
|
18
|
+
| 레이어 | 책임 | 전담 영역 |
|
|
19
|
+
|--------|------|----------|
|
|
20
|
+
| **Entity** | 데이터 구조 정의 | 구조 정의에 집중 |
|
|
21
|
+
| **Repository** | 데이터 접근 | 데이터 접근에 집중 |
|
|
22
|
+
| **Service** | 비즈니스 로직 | 비즈니스 로직에 집중 |
|
|
23
|
+
| **Controller** | 요청 라우팅 | 요청/응답 처리에 집중 |
|
|
24
|
+
| **DTO/Schema** | 데이터 전송 구조 | 데이터 전송에 집중 |
|
|
23
25
|
|
|
24
26
|
### 프론트엔드 컴포넌트별 책임
|
|
25
27
|
|
|
26
|
-
| 유형 | 책임 |
|
|
27
|
-
|
|
28
|
-
| **Page** | 레이아웃, 데이터 fetch |
|
|
29
|
-
| **Container** | 상태 관리, API 호출 |
|
|
30
|
-
| **Presentational** | UI 렌더링 |
|
|
31
|
-
| **Hook** | 특정 로직 캡슐화 |
|
|
32
|
-
| **Store** | 전역 상태 |
|
|
28
|
+
| 유형 | 책임 | 전담 영역 |
|
|
29
|
+
|------|------|----------|
|
|
30
|
+
| **Page** | 레이아웃, 데이터 fetch | 레이아웃과 fetch에 집중 |
|
|
31
|
+
| **Container** | 상태 관리, API 호출 | 상태/API에 집중 |
|
|
32
|
+
| **Presentational** | UI 렌더링 | UI 렌더링에 집중 (props로 데이터 수신) |
|
|
33
|
+
| **Hook** | 특정 로직 캡슐화 | 단일 로직에 집중 |
|
|
34
|
+
| **Store** | 전역 상태 | 상태 관리에 집중 |
|
|
33
35
|
|
|
34
36
|
---
|
|
35
37
|
|
|
@@ -41,31 +43,45 @@ estimated_tokens: ~500
|
|
|
41
43
|
|
|
42
44
|
| 규칙 | 설명 |
|
|
43
45
|
|------|------|
|
|
44
|
-
|
|
|
45
|
-
| **상위
|
|
46
|
-
|
|
|
46
|
+
| **단방향 의존 유지** | A → B 단방향으로 유지 (순환 구조 대신) |
|
|
47
|
+
| **상위 모듈은 독립적으로 유지** | shared는 도메인 모듈과 독립 유지 |
|
|
48
|
+
| **인터페이스에 의존** | 구체 클래스 대신 추상화에 의존 |
|
|
47
49
|
| **공개 API 통해 접근** | index.ts를 통한 export만 사용 |
|
|
48
50
|
|
|
49
51
|
### 백엔드
|
|
50
52
|
|
|
53
|
+
<examples>
|
|
54
|
+
<example type="good">
|
|
51
55
|
```typescript
|
|
52
56
|
// 토큰 기반 주입 / 인터페이스 의존
|
|
53
57
|
@Inject(PRODUCT_REPOSITORY)
|
|
54
58
|
private readonly repository: IProductRepository
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
```
|
|
60
|
+
</example>
|
|
61
|
+
<example type="bad">
|
|
62
|
+
```typescript
|
|
63
|
+
// ❌ 구체 클래스 직접 의존
|
|
57
64
|
private readonly repository: ProductRepository
|
|
58
65
|
```
|
|
66
|
+
</example>
|
|
67
|
+
</examples>
|
|
59
68
|
|
|
60
69
|
### 프론트엔드
|
|
61
70
|
|
|
71
|
+
<examples>
|
|
72
|
+
<example type="good">
|
|
62
73
|
```typescript
|
|
63
74
|
// props로 의존성 전달
|
|
64
75
|
function ProductCard({ product, onAction }: Props) { ... }
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
```
|
|
77
|
+
</example>
|
|
78
|
+
<example type="bad">
|
|
79
|
+
```typescript
|
|
80
|
+
// ❌ Presentational에서 전역 상태 직접 접근
|
|
67
81
|
const action = useStore(s => s.action);
|
|
68
82
|
```
|
|
83
|
+
</example>
|
|
84
|
+
</examples>
|
|
69
85
|
|
|
70
86
|
---
|
|
71
87
|
|
|
@@ -99,7 +115,7 @@ src/
|
|
|
99
115
|
│ │ ├── product.dto.ts
|
|
100
116
|
│ │ └── product.module.ts
|
|
101
117
|
│ └── order/
|
|
102
|
-
└── shared/ # 공통 (
|
|
118
|
+
└── shared/ # 공통 (도메인 모듈과 독립 유지)
|
|
103
119
|
```
|
|
104
120
|
|
|
105
121
|
```
|
|
@@ -109,20 +125,26 @@ src/
|
|
|
109
125
|
│ │ ├── ProductCard.tsx
|
|
110
126
|
│ │ ├── ProductList.tsx
|
|
111
127
|
│ │ └── index.ts
|
|
112
|
-
│ └── common/ # 공통 (
|
|
128
|
+
│ └── common/ # 공통 (도메인과 독립 유지)
|
|
113
129
|
├── hooks/ # 도메인별 hook
|
|
114
130
|
├── store/ # 전역 상태
|
|
115
131
|
└── shared/ # 유틸리티
|
|
116
132
|
```
|
|
117
133
|
|
|
134
|
+
</rules>
|
|
135
|
+
|
|
118
136
|
---
|
|
119
137
|
|
|
138
|
+
<rules>
|
|
139
|
+
|
|
120
140
|
## 가독성 규칙
|
|
121
141
|
|
|
122
142
|
### try-catch vs then-catch
|
|
123
143
|
|
|
124
144
|
> **Promise 처리 시 `then-catch` 패턴을 사용한다.**
|
|
125
145
|
|
|
146
|
+
<examples>
|
|
147
|
+
<example type="bad">
|
|
126
148
|
```typescript
|
|
127
149
|
// ❌ try-catch (가독성 저하)
|
|
128
150
|
async function fetchUser(id: string) {
|
|
@@ -133,7 +155,10 @@ async function fetchUser(id: string) {
|
|
|
133
155
|
throw new NotFoundException('User not found');
|
|
134
156
|
}
|
|
135
157
|
}
|
|
136
|
-
|
|
158
|
+
```
|
|
159
|
+
</example>
|
|
160
|
+
<example type="good">
|
|
161
|
+
```typescript
|
|
137
162
|
// ✅ then-catch (가독성 향상)
|
|
138
163
|
function fetchUser(id: string) {
|
|
139
164
|
return userService.findById(id)
|
|
@@ -143,17 +168,24 @@ function fetchUser(id: string) {
|
|
|
143
168
|
});
|
|
144
169
|
}
|
|
145
170
|
```
|
|
171
|
+
</example>
|
|
172
|
+
</examples>
|
|
146
173
|
|
|
147
174
|
### 삼항연산자 규칙
|
|
148
175
|
|
|
149
|
-
> **삼항연산자에서 인자가 2개 이상인
|
|
176
|
+
> **삼항연산자에서 인자가 2개 이상인 함수 호출은 변수로 분리한다.**
|
|
150
177
|
|
|
178
|
+
<examples>
|
|
179
|
+
<example type="bad">
|
|
151
180
|
```typescript
|
|
152
181
|
// ❌ 삼항연산자 내 복잡한 함수 호출
|
|
153
182
|
const result = isAdmin
|
|
154
183
|
? processAdminData(data, options, config)
|
|
155
184
|
: processUserData(data, options);
|
|
156
|
-
|
|
185
|
+
```
|
|
186
|
+
</example>
|
|
187
|
+
<example type="good">
|
|
188
|
+
```typescript
|
|
157
189
|
// ✅ 변수로 분리 후 사용
|
|
158
190
|
const processor = isAdmin ? processAdminData : processUserData;
|
|
159
191
|
const result = processor(data, options, config);
|
|
@@ -166,19 +198,27 @@ if (isAdmin) {
|
|
|
166
198
|
result = processUserData(data, options);
|
|
167
199
|
}
|
|
168
200
|
```
|
|
201
|
+
</example>
|
|
202
|
+
</examples>
|
|
169
203
|
|
|
170
204
|
**삼항연산자 허용 케이스:**
|
|
171
205
|
- 단순 값 선택: `const name = isKorean ? '홍길동' : 'John';`
|
|
172
206
|
- 인자 없는/1개 함수: `const value = isValid ? getValue() : getDefault();`
|
|
173
207
|
|
|
208
|
+
</rules>
|
|
209
|
+
|
|
174
210
|
---
|
|
175
211
|
|
|
212
|
+
<checklist>
|
|
213
|
+
|
|
176
214
|
## 코드 작성 시 체크리스트
|
|
177
215
|
|
|
178
216
|
- [ ] 이 파일의 책임은 하나인가?
|
|
179
|
-
- [ ] 다른 모듈에
|
|
217
|
+
- [ ] 다른 모듈에 불필요한 의존이 있는가? (있다면 제거)
|
|
180
218
|
- [ ] 관련 파일들이 같은 폴더에 있는가?
|
|
181
|
-
- [ ]
|
|
219
|
+
- [ ] 단방향 의존이 유지되는가?
|
|
182
220
|
- [ ] 공개 API(index.ts)를 통해 접근하는가?
|
|
183
221
|
- [ ] Promise 처리에 then-catch 패턴을 사용했는가?
|
|
184
|
-
- [ ] 삼항연산자에서 복잡한 함수 호출을
|
|
222
|
+
- [ ] 삼항연산자에서 복잡한 함수 호출을 변수로 분리했는가?
|
|
223
|
+
|
|
224
|
+
</checklist>
|
|
@@ -74,14 +74,16 @@ keywords: [관련 키워드]
|
|
|
74
74
|
|
|
75
75
|
| 축 | 검증 질문 | 예시 |
|
|
76
76
|
|----|----------|------|
|
|
77
|
-
| **기능 범위** | 기존 기능과 겹치거나
|
|
78
|
-
| **비즈니스 규칙** | 기존 규칙과 충돌하는 조건이
|
|
77
|
+
| **기능 범위** | 기존 기능과 겹치거나 모순되는 부분이 있는가? | 결제 기능이 이미 존재하는데 별도 결제 모듈 추가 |
|
|
78
|
+
| **비즈니스 규칙** | 기존 규칙과 충돌하는 조건이 있는가? | "주문 최소 금액 1만원" vs "0원 주문 허용" |
|
|
79
79
|
| **데이터 모델** | 기존 모델 구조와 호환되는가? | 필수 필드 제거, 타입 변경 |
|
|
80
80
|
| **UX 플로우** | 기존 사용자 플로우와 일관되는가? | 로그인 후 리다이렉트 경로 변경 |
|
|
81
|
-
| **기술 제약** | 아키텍처/기술 스택 제약을
|
|
81
|
+
| **기술 제약** | 아키텍처/기술 스택 제약을 준수하는가? | REST API에 GraphQL 엔드포인트 혼용 |
|
|
82
82
|
|
|
83
83
|
---
|
|
84
84
|
|
|
85
|
+
<checklist>
|
|
86
|
+
|
|
85
87
|
## 충돌 탐지 체크리스트
|
|
86
88
|
|
|
87
89
|
스펙 변경 시 아래 4가지 유형의 충돌을 확인합니다.
|
|
@@ -92,16 +94,18 @@ keywords: [관련 키워드]
|
|
|
92
94
|
|
|
93
95
|
### 2. 의존성 파괴
|
|
94
96
|
- 변경이 다른 기능의 전제 조건을 깨뜨리는 경우
|
|
95
|
-
- 예: 사용자 테이블 구조 변경
|
|
97
|
+
- 예: 사용자 테이블 구조 변경 -> 인증 모듈 파괴
|
|
96
98
|
|
|
97
99
|
### 3. 암묵적 충돌
|
|
98
100
|
- 명시되지 않았지만 전제가 변경되어 발생하는 충돌
|
|
99
|
-
- 예: 응답 포맷 변경
|
|
101
|
+
- 예: 응답 포맷 변경 -> 프론트엔드 파싱 실패
|
|
100
102
|
|
|
101
103
|
### 4. 데이터 불일치
|
|
102
104
|
- 같은 데이터를 다른 문서에서 다르게 정의
|
|
103
105
|
- 예: A 문서에서 "status: string", B 문서에서 "status: enum"
|
|
104
106
|
|
|
107
|
+
</checklist>
|
|
108
|
+
|
|
105
109
|
---
|
|
106
110
|
|
|
107
111
|
## 심각도 분류
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: Documentation
|
|
3
3
|
description: .claude 폴더 내 문서 생성/수정 시 사용. frontmatter 형식, Context/Skill/Agent 템플릿, 파일 분리 기준 제공.
|
|
4
4
|
keywords: [문서, 작성, CLAUDE.md, context, skill, agent, frontmatter, 템플릿]
|
|
5
|
-
estimated_tokens: ~
|
|
5
|
+
estimated_tokens: ~1200
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# .claude 문서 작성 스킬
|
|
@@ -119,10 +119,19 @@ estimated_tokens: ~300
|
|
|
119
119
|
|
|
120
120
|
(필요시 코드 블록, 상세 설명)
|
|
121
121
|
|
|
122
|
+
## 제약 사항
|
|
123
|
+
|
|
124
|
+
<constraints>
|
|
125
|
+
- 제약 1
|
|
126
|
+
- 제약 2
|
|
127
|
+
</constraints>
|
|
128
|
+
|
|
122
129
|
## 관련 파일
|
|
123
130
|
|
|
131
|
+
<reference>
|
|
124
132
|
- `path/to/related.md` - 설명
|
|
125
133
|
- `src/module/` - 관련 소스 코드
|
|
134
|
+
</reference>
|
|
126
135
|
```
|
|
127
136
|
|
|
128
137
|
### Skill 템플릿
|
|
@@ -139,25 +148,33 @@ estimated_tokens: ~400
|
|
|
139
148
|
|
|
140
149
|
## 핵심 역할
|
|
141
150
|
|
|
151
|
+
<instructions>
|
|
142
152
|
- 역할 1
|
|
143
153
|
- 역할 2
|
|
154
|
+
</instructions>
|
|
144
155
|
|
|
145
156
|
## 필수 준수 사항
|
|
146
157
|
|
|
158
|
+
<rules>
|
|
147
159
|
| 규칙 | 올바른 예 | 잘못된 예 |
|
|
148
160
|
|------|----------|----------|
|
|
149
161
|
| ... | ... | ... |
|
|
162
|
+
</rules>
|
|
150
163
|
|
|
151
164
|
## 코드 예제
|
|
152
165
|
|
|
166
|
+
<examples>
|
|
153
167
|
\`\`\`typescript
|
|
154
168
|
// 올바른 패턴
|
|
155
169
|
\`\`\`
|
|
170
|
+
</examples>
|
|
156
171
|
|
|
157
172
|
## 체크리스트
|
|
158
173
|
|
|
174
|
+
<checklist>
|
|
159
175
|
- [ ] 확인 항목 1
|
|
160
176
|
- [ ] 확인 항목 2
|
|
177
|
+
</checklist>
|
|
161
178
|
|
|
162
179
|
## 관련 문서
|
|
163
180
|
|
|
@@ -179,16 +196,19 @@ color: blue
|
|
|
179
196
|
|
|
180
197
|
# Agent 이름
|
|
181
198
|
|
|
199
|
+
<role>
|
|
182
200
|
## 역할
|
|
183
201
|
|
|
184
202
|
1. 첫 번째 역할
|
|
185
203
|
2. 두 번째 역할
|
|
204
|
+
</role>
|
|
186
205
|
|
|
187
206
|
## 언제 사용하는가
|
|
188
207
|
|
|
189
208
|
- 사용 시점 1
|
|
190
209
|
- 사용 시점 2
|
|
191
210
|
|
|
211
|
+
<instructions>
|
|
192
212
|
## 프로세스
|
|
193
213
|
|
|
194
214
|
### Step 1: 준비
|
|
@@ -196,7 +216,16 @@ color: blue
|
|
|
196
216
|
|
|
197
217
|
### Step 2: 실행
|
|
198
218
|
...
|
|
219
|
+
</instructions>
|
|
220
|
+
|
|
221
|
+
<constraints>
|
|
222
|
+
## 제약 사항
|
|
199
223
|
|
|
224
|
+
- 이 Agent는 A만 전담한다
|
|
225
|
+
- B 작업은 other-agent에 위임한다
|
|
226
|
+
</constraints>
|
|
227
|
+
|
|
228
|
+
<output_format>
|
|
200
229
|
## 출력 형식
|
|
201
230
|
|
|
202
231
|
\`\`\`markdown
|
|
@@ -205,6 +234,7 @@ color: blue
|
|
|
205
234
|
## 요약
|
|
206
235
|
...
|
|
207
236
|
\`\`\`
|
|
237
|
+
</output_format>
|
|
208
238
|
```
|
|
209
239
|
|
|
210
240
|
## 인덱스 파일 작성법
|
|
@@ -272,6 +302,43 @@ keywords:
|
|
|
272
302
|
- frontmatter 누락
|
|
273
303
|
- 모호한 keywords
|
|
274
304
|
|
|
305
|
+
## 프롬프트 구조화 (XML 태그)
|
|
306
|
+
|
|
307
|
+
문서에 XML 태그를 사용하면 Claude가 지시/규칙/제약을 정확히 구분하여 준수율이 높아집니다.
|
|
308
|
+
|
|
309
|
+
### 파일 유형별 권장 XML 태그
|
|
310
|
+
|
|
311
|
+
| 파일 유형 | 필수 태그 | 선택 태그 |
|
|
312
|
+
|----------|----------|----------|
|
|
313
|
+
| Agent | `<role>`, `<instructions>`, `<constraints>`, `<output_format>` | `<rules>`, `<examples>`, `<reference>` |
|
|
314
|
+
| Skill | `<instructions>`, `<rules>`, `<checklist>` | `<examples>`, `<constraints>`, `<reference>` |
|
|
315
|
+
| CLAUDE.md | `<workflow>`, `<delegation_rules>`, `<constraints>` | `<rules>`, `<reference>` |
|
|
316
|
+
| Hook | `<phase name="...">`, `<checklist>` | `<delegation_rules>`, `<rules>` |
|
|
317
|
+
|
|
318
|
+
### 긍정 표현 원칙
|
|
319
|
+
|
|
320
|
+
프롬프트는 부정 표현 대신 긍정 표현으로 작성합니다.
|
|
321
|
+
|
|
322
|
+
| 부정 표현 (비권장) | 긍정 표현 (권장) |
|
|
323
|
+
|-------------------|-----------------|
|
|
324
|
+
| "직접 수정하지 마라" | "모든 수정은 code-writer가 전담한다" |
|
|
325
|
+
| "Git 명령어 실행 금지" | "Git 작업은 git-manager에 위임한다" |
|
|
326
|
+
| "3개 이상 파일 수정 금지" | "파일 수정은 2개 이하만 직접 수행한다" |
|
|
327
|
+
|
|
328
|
+
- 제약은 "~만 한다", "~전용", "~전담" 형태로 표현
|
|
329
|
+
- 대안 행동을 구체적으로 명시 (무엇을 대신 해야 하는지)
|
|
330
|
+
|
|
331
|
+
### XML 태그 사용 규칙
|
|
332
|
+
|
|
333
|
+
1. **섹션 경계를 명확히**: 태그는 논리적 블록 단위로 감싼다
|
|
334
|
+
2. **중첩 최소화**: 2단계 이상 중첩은 지양한다
|
|
335
|
+
3. **태그 이름 통일**: 위 테이블의 태그명을 일관되게 사용한다
|
|
336
|
+
4. **Markdown과 병행**: 태그 안에서 Markdown 서식을 그대로 사용한다
|
|
337
|
+
|
|
338
|
+
> 상세 가이드: `.claude/skills/PromptStructuring/`
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
275
342
|
## 체크리스트
|
|
276
343
|
|
|
277
344
|
### 새 파일 작성 시
|
|
@@ -14,6 +14,8 @@ estimated_tokens: ~100
|
|
|
14
14
|
- PR/MR 코드 리뷰
|
|
15
15
|
- 리뷰 피드백 반영
|
|
16
16
|
|
|
17
|
+
<reference>
|
|
18
|
+
|
|
17
19
|
## 관련 문서
|
|
18
20
|
|
|
19
21
|
| 주제 | 위치 | 설명 |
|
|
@@ -22,6 +24,8 @@ estimated_tokens: ~100
|
|
|
22
24
|
| PR 리뷰 | `pr-review.md` | 체크리스트 기반 코드 리뷰 워크플로우 |
|
|
23
25
|
| PR 피드백 적용 | `pr-apply.md` | 리뷰 피드백 분류 및 반영 방법 |
|
|
24
26
|
|
|
27
|
+
</reference>
|
|
28
|
+
|
|
25
29
|
## 빠른 참조
|
|
26
30
|
|
|
27
31
|
### Commit PREFIX
|
|
@@ -45,10 +49,10 @@ estimated_tokens: ~100
|
|
|
45
49
|
|
|
46
50
|
| 섹션 | 설명 |
|
|
47
51
|
|------|------|
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
52
|
+
| Summary | 핵심 변경 1-2문장 요약 |
|
|
53
|
+
| 주요 변경사항 | 파일별 변경 내용 |
|
|
54
|
+
| 사이드 이펙트 | 다른 영역 영향 분석 |
|
|
55
|
+
| 변경 흐름 | mermaid 다이어그램 (선택) |
|
|
52
56
|
|
|
53
57
|
### PR 워크플로우
|
|
54
58
|
|