@jjlabsio/claude-crew 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/.claude-plugin/marketplace.json +32 -0
- package/.claude-plugin/plugin.json +29 -0
- package/LICENSE +21 -0
- package/README.md +63 -0
- package/agents/code-reviewer.md +54 -0
- package/agents/dev.md +53 -0
- package/agents/explorer.md +21 -0
- package/agents/plan-evaluator.md +67 -0
- package/agents/planner.md +73 -0
- package/agents/pm.md +54 -0
- package/agents/qa.md +63 -0
- package/agents/researcher.md +22 -0
- package/agents/techlead.md +67 -0
- package/hooks/hooks.json +17 -0
- package/hud/index.mjs +375 -0
- package/package.json +35 -0
- package/scripts/setup-hud.mjs +89 -0
- package/skills/crew/SKILL.md +187 -0
- package/skills/crew-dev/SKILL.md +405 -0
- package/skills/crew-plan/SKILL.md +396 -0
- package/skills/crew-setup/SKILL.md +29 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crew-dev
|
|
3
|
+
description: contract.md를 입력으로 받아 Dev + CodeReviewer + QA 파이프라인으로 구현을 완료한다
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 역할
|
|
7
|
+
|
|
8
|
+
오케스트레이터로부터 task-id를 받아 `contract.md` 기반으로 구현을 완료하고 PR을 생성한다.
|
|
9
|
+
`contract.md`가 ACTIVE 상태여야 시작할 수 있다.
|
|
10
|
+
|
|
11
|
+
에이전트 간 소통은 파일을 통해서만 이루어진다. 각 에이전트는 자신의 역할에 필요한 파일만 본다.
|
|
12
|
+
|
|
13
|
+
**v1 대비 변경**: Critic(DevAuditor) 제거. 오케스트레이터가 CodeReviewer + QA 결과로 직접 판정한다.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 절대 금지
|
|
18
|
+
|
|
19
|
+
- 오케스트레이터가 코드를 직접 작성하지 않는다.
|
|
20
|
+
- CodeReviewer 또는 QA가 FAIL을 냈을 때 합리화하여 통과시키지 않는다.
|
|
21
|
+
- brief.md를 어떤 에이전트에게도 전달하지 않는다.
|
|
22
|
+
- contract.md를 CodeReviewer에게 전달하지 않는다 (가드레일만 인라인 주입).
|
|
23
|
+
- plan.md를 CodeReviewer에게 전달하지 않는다.
|
|
24
|
+
- Dev가 자체 검증을 통과하지 못한 상태에서 검증 단계로 넘기지 않는다.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 파일 구조
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
.crew/plans/{task-id}/
|
|
32
|
+
# crew-plan 산출물 (입력, 이미 존재)
|
|
33
|
+
brief.md # 유저 요청 원문
|
|
34
|
+
spec.md # PM 출력 (유저 가치 유형만)
|
|
35
|
+
analysis.md # TechLead 출력
|
|
36
|
+
plan.md # Planner 출력
|
|
37
|
+
contract.md # 스프린트 계약
|
|
38
|
+
|
|
39
|
+
# crew-dev 산출물 (신규 생성)
|
|
40
|
+
dev-log.md # Dev: 구현 진행 로그
|
|
41
|
+
review-report.md # CodeReviewer: 코드 리뷰 결과 (최신)
|
|
42
|
+
qa-report.md # QA: 실행 검증 결과 (최신)
|
|
43
|
+
review-report-{n}.md # FAIL 시 아카이브
|
|
44
|
+
qa-report-{n}.md # FAIL 시 아카이브
|
|
45
|
+
.dev_loop_count # 개발 루프 카운터
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 에이전트 정보 차단 정책
|
|
51
|
+
|
|
52
|
+
| 에이전트 | 볼 수 있는 것 | 차단 | 차단 근거 |
|
|
53
|
+
|----------|-------------|------|----------|
|
|
54
|
+
| **Dev** | plan.md, contract.md | brief.md, spec.md, analysis.md | 의도 추측 방지, plan+contract에 필요 정보 포함 |
|
|
55
|
+
| **CodeReviewer** | git diff, 가드레일(인라인) | contract.md, plan.md, brief.md, spec.md, dev-log.md | 수용 기준 체리피킹 방지 |
|
|
56
|
+
| **QA** | plan.md | contract.md, brief.md, spec.md | 검증 편향 방지 |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 실행 순서
|
|
61
|
+
|
|
62
|
+
### Phase 1 — 환경 준비 (오케스트레이터 직접)
|
|
63
|
+
|
|
64
|
+
**1a. contract.md 유효성 검사**
|
|
65
|
+
|
|
66
|
+
`.crew/plans/{task-id}/contract.md`를 읽는다.
|
|
67
|
+
- 파일이 존재하는가?
|
|
68
|
+
- `## 상태` 섹션이 `ACTIVE`인가?
|
|
69
|
+
- `## 수용 기준` 섹션이 비어 있지 않은가?
|
|
70
|
+
- `## 검증 시나리오` 섹션이 존재하는가?
|
|
71
|
+
|
|
72
|
+
하나라도 실패하면 즉시 에스컬레이션:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
contract.md 유효성 검사에 실패했습니다.
|
|
76
|
+
실패 사유: {구체적 사유}
|
|
77
|
+
[1] crew-plan을 먼저 실행하여 contract.md를 생성
|
|
78
|
+
[2] contract.md를 직접 수정
|
|
79
|
+
[3] 이 태스크를 보류
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**1b. 워크트리 생성**
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
git fetch origin main
|
|
86
|
+
git worktree add ../{project}-worktree-feat-{task-id} -b feat/{task-id} origin/main
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
워크트리 디렉토리로 이동한다. 이후 모든 작업은 워크트리에서 수행한다.
|
|
90
|
+
환경 파일(`.env*` 등)이 있으면 복사한다.
|
|
91
|
+
|
|
92
|
+
**1c. 상태 갱신**
|
|
93
|
+
|
|
94
|
+
contract.md의 `## 상태` 섹션을 갱신한다:
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
## 상태
|
|
98
|
+
IN_PROGRESS — Dev 에이전트가 구현 중이다.
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### Phase 2 — 구현 (Dev 에이전트)
|
|
104
|
+
|
|
105
|
+
**모델**: opus
|
|
106
|
+
|
|
107
|
+
**첫 번째 실행 시 에이전트 프롬프트**:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
당신은 Dev 에이전트다. plan.md를 기반으로 코드를 구현한다.
|
|
111
|
+
|
|
112
|
+
## 입력
|
|
113
|
+
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
114
|
+
.crew/plans/{task-id}/contract.md 를 읽어라 (수용 기준 = 완료 기준).
|
|
115
|
+
brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
116
|
+
|
|
117
|
+
## 작업 순서
|
|
118
|
+
1. plan.md의 유저 스토리와 태스크 목록을 확인한다.
|
|
119
|
+
2. 코드베이스를 탐색한다 (Glob, Grep, Read로 관련 파일 파악).
|
|
120
|
+
3. 유저 스토리 단위로 순차 구현한다.
|
|
121
|
+
4. 각 유저 스토리 완료 후 dev-log.md에 진행상황을 기록한다.
|
|
122
|
+
5. 모든 구현 완료 후 자체 검증을 실행한다:
|
|
123
|
+
- 빌드 성공 확인
|
|
124
|
+
- 린트 통과 확인
|
|
125
|
+
- 타입 체크 통과 확인
|
|
126
|
+
- 기존 테스트 스위트 통과 확인
|
|
127
|
+
6. 자체 검증이 모두 통과하면 완료를 선언한다.
|
|
128
|
+
자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
129
|
+
|
|
130
|
+
## 출력
|
|
131
|
+
.crew/plans/{task-id}/dev-log.md 를 작성하라.
|
|
132
|
+
|
|
133
|
+
## 규칙
|
|
134
|
+
- plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
|
|
135
|
+
- 자체 검증 4개(빌드/린트/타입/테스트) 모두 PASS 해야 완료를 선언할 수 있다.
|
|
136
|
+
- 기존 코드베이스의 컨벤션을 따른다.
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**retry 시 에이전트 프롬프트**:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
이번은 이전 구현이 검증에서 FAIL을 받은 후 수정하는 것이다.
|
|
143
|
+
|
|
144
|
+
## 입력
|
|
145
|
+
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
146
|
+
.crew/plans/{task-id}/contract.md 를 읽어라.
|
|
147
|
+
.crew/plans/{task-id}/review-report-{n}.md 를 읽어라. (CodeReviewer 피드백)
|
|
148
|
+
.crew/plans/{task-id}/qa-report-{n}.md 를 읽어라. (QA 피드백)
|
|
149
|
+
brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
150
|
+
|
|
151
|
+
## 필수 선행 작업
|
|
152
|
+
피드백 파일을 먼저 읽어라. 어떤 항목이 FAIL인지 확인하고 해당 부분을 수정하라.
|
|
153
|
+
|
|
154
|
+
## 작업 순서
|
|
155
|
+
1. 피드백에서 FAIL 항목을 모두 파악한다.
|
|
156
|
+
2. 각 FAIL 항목에 대해 수정을 수행한다.
|
|
157
|
+
3. dev-log.md를 갱신한다 (최상단에 "수정 이력 (retry {n})" 섹션 추가).
|
|
158
|
+
4. 자체 검증 4개를 모두 다시 실행한다.
|
|
159
|
+
|
|
160
|
+
## 규칙
|
|
161
|
+
- 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
|
|
162
|
+
- 자체 검증 4개 모두 PASS 해야 완료를 선언할 수 있다.
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Phase 2 실패 조건**: Dev 에이전트가 자체 검증을 통과하지 못한 채 완료를 선언하면 에스컬레이션.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### Phase 3 — 병렬 검증 (CodeReviewer + QA)
|
|
170
|
+
|
|
171
|
+
CodeReviewer와 QA를 **동시에** Agent tool 2개로 호출한다.
|
|
172
|
+
|
|
173
|
+
#### Phase 3a — CodeReviewer
|
|
174
|
+
|
|
175
|
+
**모델**: opus
|
|
176
|
+
|
|
177
|
+
오케스트레이터가 해야 할 사전 작업:
|
|
178
|
+
1. `git diff main...HEAD` 출력을 캡처한다.
|
|
179
|
+
2. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
180
|
+
3. 둘 다 CodeReviewer 프롬프트에 인라인으로 주입한다.
|
|
181
|
+
|
|
182
|
+
에이전트 프롬프트:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
|
|
186
|
+
|
|
187
|
+
## 입력
|
|
188
|
+
아래 diff를 검토하라. 이것이 검토 대상의 전부다.
|
|
189
|
+
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
190
|
+
코드만 보고 판단한다.
|
|
191
|
+
|
|
192
|
+
### diff
|
|
193
|
+
{git diff main...HEAD 출력}
|
|
194
|
+
|
|
195
|
+
### 가드레일 (contract.md에서 추출)
|
|
196
|
+
#### Must
|
|
197
|
+
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
198
|
+
#### Must NOT
|
|
199
|
+
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
200
|
+
|
|
201
|
+
위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
|
|
202
|
+
|
|
203
|
+
## 검토 항목
|
|
204
|
+
1. 가드레일 위반 (위반 시 critical)
|
|
205
|
+
2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
|
|
206
|
+
3. 보안 취약점
|
|
207
|
+
4. 불필요한 복잡도
|
|
208
|
+
5. 잠재적 버그
|
|
209
|
+
6. 에러 처리 적절성
|
|
210
|
+
|
|
211
|
+
## 출력
|
|
212
|
+
.crew/plans/{task-id}/review-report.md 를 작성하라.
|
|
213
|
+
|
|
214
|
+
## 판정 규칙
|
|
215
|
+
- 가드레일 위반 → critical
|
|
216
|
+
- critical 또는 major가 1개 이상 → FAIL
|
|
217
|
+
- minor만 있거나 지적 없음 → PASS
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Phase 3b — QA
|
|
221
|
+
|
|
222
|
+
**모델**: sonnet
|
|
223
|
+
|
|
224
|
+
에이전트 프롬프트:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
당신은 QA 에이전트다. 구현이 실제로 동작하는지 검증한다.
|
|
228
|
+
|
|
229
|
+
## 입력
|
|
230
|
+
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
231
|
+
plan.md의 유저 스토리와 테스트 시나리오를 확인하라.
|
|
232
|
+
contract.md, brief.md, spec.md는 읽지 않는다.
|
|
233
|
+
|
|
234
|
+
## 검증 항목 (순서대로 실행)
|
|
235
|
+
1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
|
|
236
|
+
2. 린트 검증
|
|
237
|
+
3. 타입 체크 검증
|
|
238
|
+
4. 테스트 스위트 검증
|
|
239
|
+
5. E2E / 통합 검증 — plan.md의 테스트 시나리오 기반
|
|
240
|
+
|
|
241
|
+
## 출력
|
|
242
|
+
.crew/plans/{task-id}/qa-report.md 를 작성하라.
|
|
243
|
+
|
|
244
|
+
## 판정 규칙
|
|
245
|
+
- 항목 1-5 중 하나라도 FAIL → 전체 FAIL
|
|
246
|
+
- 모든 항목 PASS → 전체 PASS
|
|
247
|
+
|
|
248
|
+
## 규칙
|
|
249
|
+
- 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
|
|
250
|
+
- 실행 출력을 반드시 캡처하여 기록한다.
|
|
251
|
+
- 코드를 수정하지 않는다. 검증만 한다.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Phase 3 병렬 실행 방법**:
|
|
255
|
+
|
|
256
|
+
오케스트레이터는 한 번의 메시지에서 두 개의 Agent tool 호출을 동시에 수행한다:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
Agent(name="code-reviewer", model="opus", prompt="...")
|
|
260
|
+
Agent(name="qa", model="sonnet", prompt="...")
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
### Phase 4 — 오케스트레이터 직접 판정
|
|
266
|
+
|
|
267
|
+
**Critic(DevAuditor)을 사용하지 않는다.** 오케스트레이터가 CodeReviewer + QA 결과로 직접 판정한다.
|
|
268
|
+
|
|
269
|
+
판정 규칙:
|
|
270
|
+
- CodeReviewer PASS + QA PASS → **PASS** → Phase 5로
|
|
271
|
+
- 하나라도 FAIL → **FAIL** → Step 6으로
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### Phase 5 — 완료 (오케스트레이터 직접)
|
|
276
|
+
|
|
277
|
+
**5a. 커밋 + PR**
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
git add -A
|
|
281
|
+
git commit -m "feat({task-id}): {contract.md 목표 1줄 요약}"
|
|
282
|
+
git push -u origin feat/{task-id}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
PR을 생성한다 (머지하지 않는다).
|
|
286
|
+
|
|
287
|
+
**5b. 상태 갱신**
|
|
288
|
+
|
|
289
|
+
contract.md의 `## 상태` 섹션을 갱신한다:
|
|
290
|
+
|
|
291
|
+
```markdown
|
|
292
|
+
## 상태
|
|
293
|
+
COMPLETED — 모든 수용 기준이 검증을 통과했다.
|
|
294
|
+
PR: {PR URL}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**5c. .dev_loop_count 정리**
|
|
298
|
+
|
|
299
|
+
`.dev_loop_count` 파일이 존재하면 삭제한다.
|
|
300
|
+
|
|
301
|
+
**5d. 완료 반환**
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
상태: COMPLETE
|
|
305
|
+
task-id: {task-id}
|
|
306
|
+
PR: {PR URL}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
### Step 6 — FAIL 처리 (검증 루프)
|
|
312
|
+
|
|
313
|
+
Phase 4에서 FAIL이면:
|
|
314
|
+
|
|
315
|
+
**6a. 루프 카운터 읽기**
|
|
316
|
+
|
|
317
|
+
`.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
|
|
318
|
+
- 파일이 없으면 카운터 = 0
|
|
319
|
+
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
320
|
+
|
|
321
|
+
**6b. 에스컬레이션 판단**
|
|
322
|
+
|
|
323
|
+
두 가지 에스컬레이션 조건:
|
|
324
|
+
|
|
325
|
+
**조건 1 — 루프 상한 초과**:
|
|
326
|
+
|
|
327
|
+
카운터 값 >= 4이면 즉시 에스컬레이션:
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
검증 루프가 5회 반복 후에도 통과하지 못했습니다.
|
|
331
|
+
최종 FAIL 사유를 첨부합니다.
|
|
332
|
+
[1] 수용 기준을 좁혀서 재시도
|
|
333
|
+
[2] contract.md를 수정
|
|
334
|
+
[3] 이 태스크를 보류
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
에스컬레이션 시:
|
|
338
|
+
- `.dev_loop_count` 파일을 삭제한다.
|
|
339
|
+
- contract.md 상태를 `BLOCKED`으로 갱신한다.
|
|
340
|
+
|
|
341
|
+
**조건 2 — 같은 기준 3회 연속 실패**:
|
|
342
|
+
|
|
343
|
+
review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
|
|
344
|
+
이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
|
|
345
|
+
|
|
346
|
+
```
|
|
347
|
+
{항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
|
|
348
|
+
[1] contract.md를 수정 (기준 자체의 문제)
|
|
349
|
+
[2] plan.md를 수정 (구현 전략의 문제)
|
|
350
|
+
[3] 이 태스크를 보류
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**6c. 피드백 아카이브**
|
|
354
|
+
|
|
355
|
+
`n = 카운터 + 1`
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
review-report.md → review-report-{n}.md
|
|
359
|
+
qa-report.md → qa-report-{n}.md
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**6d. 루프 카운터 증가 저장**
|
|
363
|
+
|
|
364
|
+
`카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
|
|
365
|
+
|
|
366
|
+
**6e. Phase 2로 돌아감 (retry)**
|
|
367
|
+
|
|
368
|
+
Phase 2(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
|
|
369
|
+
Dev 수정 완료 후 Phase 3(CodeReviewer + QA)을 **둘 다** 재실행한다.
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## 루프 카운터 (.dev_loop_count) 생명주기
|
|
374
|
+
|
|
375
|
+
| 이벤트 | 동작 |
|
|
376
|
+
|--------|------|
|
|
377
|
+
| 첫 번째 진입 | 파일 없음 (카운터 = 0) |
|
|
378
|
+
| n번째 FAIL 처리 후 | 파일 갱신, 내용: `n` |
|
|
379
|
+
| PASS (Phase 5) | 파일 삭제 |
|
|
380
|
+
| 에스컬레이션 | 파일 삭제 |
|
|
381
|
+
|
|
382
|
+
검증 사이클은 최대 5회 (초기 1회 + retry 최대 4회).
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 오케스트레이터 반환 스키마
|
|
387
|
+
|
|
388
|
+
**COMPLETE**:
|
|
389
|
+
```json
|
|
390
|
+
{
|
|
391
|
+
"status": "COMPLETE",
|
|
392
|
+
"task_id": "{task-id}",
|
|
393
|
+
"pr_url": "{PR URL}"
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**ESCALATE**:
|
|
398
|
+
```json
|
|
399
|
+
{
|
|
400
|
+
"status": "ESCALATE",
|
|
401
|
+
"phase": "invalid-contract" | "dev-fail" | "verify-fail" | "criterion-stuck" | "loop-overflow",
|
|
402
|
+
"reason": "자유형 텍스트",
|
|
403
|
+
"loop_count": 0
|
|
404
|
+
}
|
|
405
|
+
```
|