@jjlabsio/claude-crew 0.1.25 → 0.1.26
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 +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/agents/dev.md +4 -2
- package/agents/plan-evaluator.md +7 -3
- package/agents/planner.md +7 -0
- package/agents/qa.md +12 -3
- package/agents/techlead.md +7 -1
- package/package.json +1 -1
- package/skills/crew-dev/SKILL.md +296 -191
- package/skills/crew-plan/SKILL.md +46 -4
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"name": "claude-crew",
|
|
12
12
|
"source": "./",
|
|
13
13
|
"description": "오케스트레이터 + PM, 플래너, 개발, QA, 마케팅 에이전트 팀으로 단일 제품의 개발과 마케팅을 통합 관리",
|
|
14
|
-
"version": "0.1.
|
|
14
|
+
"version": "0.1.26",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "Jaejin Song",
|
|
17
17
|
"email": "wowlxx28@gmail.com"
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"category": "workflow"
|
|
29
29
|
}
|
|
30
30
|
],
|
|
31
|
-
"version": "0.1.
|
|
31
|
+
"version": "0.1.26"
|
|
32
32
|
}
|
package/agents/dev.md
CHANGED
|
@@ -7,7 +7,7 @@ tools: [Read, Write, Edit, Glob, Grep, Bash]
|
|
|
7
7
|
|
|
8
8
|
# Dev 에이전트
|
|
9
9
|
|
|
10
|
-
plan.md의 유저 스토리를 순차 구현하고, 자체 검증(
|
|
10
|
+
plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/타입/테스트/실행 검증) 5개를 모두 통과해야 완료를 선언한다.
|
|
11
11
|
|
|
12
12
|
## 입력
|
|
13
13
|
|
|
@@ -39,6 +39,7 @@ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/
|
|
|
39
39
|
- 린트: PASS/FAIL + 명령어 + 출력
|
|
40
40
|
- 타입: PASS/FAIL + 명령어 + 출력
|
|
41
41
|
- 테스트: PASS/FAIL + 명령어 + 출력 (통과/실패 수)
|
|
42
|
+
- 실행 검증: PASS/FAIL + 실행 절차 + 실제 결과
|
|
42
43
|
|
|
43
44
|
## 변경 파일 목록
|
|
44
45
|
- {파일 경로 + 변경 요약}
|
|
@@ -47,7 +48,8 @@ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/
|
|
|
47
48
|
## 규칙
|
|
48
49
|
|
|
49
50
|
- plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
|
|
50
|
-
- 자체 검증
|
|
51
|
+
- 자체 검증 5개(빌드/린트/타입/테스트/실행 검증) 모두 PASS해야 완료를 선언할 수 있다.
|
|
52
|
+
- 실행 검증: plan.md의 `## 실행 검증` 절차를 직접 실행하여 기능이 실제로 동작하는지 확인한다. 테스트 파일 실행이 아니라 기능 자체를 사용자 관점에서 실행하는 것이다.
|
|
51
53
|
- 자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
52
54
|
- 기존 코드베이스의 컨벤션을 따른다.
|
|
53
55
|
- retry 시 피드백 파일을 먼저 읽고, FAIL 항목만 수정한다. 지적하지 않은 부분을 추가로 변경하지 않는다.
|
package/agents/plan-evaluator.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: plan-evaluator
|
|
3
3
|
model: sonnet
|
|
4
|
-
description: 계획 검증 — E1-
|
|
4
|
+
description: 계획 검증 — E1-E8 하드 임계값 판정. Sonnet 사용 (Opus 합리화 방지)
|
|
5
5
|
tools: [Read, Agent]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -25,7 +25,7 @@ tools: [Read, Agent]
|
|
|
25
25
|
|
|
26
26
|
## 검증 항목
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
8개 항목, 모두 YES/NO 판정:
|
|
29
29
|
|
|
30
30
|
| # | 항목 | 확인 방법 |
|
|
31
31
|
|---|------|----------|
|
|
@@ -35,6 +35,8 @@ tools: [Read, Agent]
|
|
|
35
35
|
| E4 | **실행 가능성** — 구현자가 바로 시작할 수 있는 수준인가 | 판단 (직접) |
|
|
36
36
|
| E5 | **테스트 전략 정합성** — analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가 | 문서 대 문서 비교 (직접) |
|
|
37
37
|
| E6 | **비즈니스 가정 0개** — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가 | 문서 대 문서 비교 (직접) |
|
|
38
|
+
| E7 | **실행 검증 포함** — plan.md에 유닛 테스트와 별개로 기능을 직접 실행하는 검증 절차가 있는가 | 문서 확인 (직접) |
|
|
39
|
+
| E8 | **외부 인터페이스 가정 검증** — 여러 외부 대상을 동일 인터페이스로 처리 시, 각 대상별 검증 상태가 명시되고 미검증 대상에 스파이크 태스크가 있는가 | 문서 확인 (직접) |
|
|
38
40
|
|
|
39
41
|
## review.md 출력 형식
|
|
40
42
|
|
|
@@ -52,6 +54,8 @@ tools: [Read, Agent]
|
|
|
52
54
|
| E4 | 실행 가능성 | YES/NO | {근거} |
|
|
53
55
|
| E5 | 테스트 전략 정합성 | YES/NO | {근거} |
|
|
54
56
|
| E6 | 비즈니스 가정 0개 | YES/NO | {근거} |
|
|
57
|
+
| E7 | 실행 검증 포함 | YES/NO | {근거} |
|
|
58
|
+
| E8 | 외부 인터페이스 가정 검증 | YES/NO | {근거} |
|
|
55
59
|
|
|
56
60
|
## FAIL 상세 (NO 항목만)
|
|
57
61
|
### {항목}: {사유}
|
|
@@ -65,7 +69,7 @@ tools: [Read, Agent]
|
|
|
65
69
|
|
|
66
70
|
## 판정 규칙
|
|
67
71
|
|
|
68
|
-
-
|
|
72
|
+
- 8개 항목 모두 YES → PASS
|
|
69
73
|
- 하나라도 NO → FAIL
|
|
70
74
|
- E3 코드 참조 확인은 Explorer 서브에이전트를 호출한다.
|
|
71
75
|
- "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
|
package/agents/planner.md
CHANGED
|
@@ -49,6 +49,12 @@ tools: [Read, Write, Agent]
|
|
|
49
49
|
## 위험 요소
|
|
50
50
|
{위험 요소 목록 또는 "없음"}
|
|
51
51
|
|
|
52
|
+
## 외부 인터페이스 가정 (해당 시)
|
|
53
|
+
| 대상 | 가정하는 인터페이스 | 근거 | 검증 상태 |
|
|
54
|
+
|------|------------------|------|----------|
|
|
55
|
+
| {대상 1} | {인터페이스 설명} | 공식 문서 확인 | 검증됨 |
|
|
56
|
+
| {대상 2} | {대상 1과 동일} | 문서 없음 | 미검증 |
|
|
57
|
+
|
|
52
58
|
## 검증 시나리오 (contract.md용)
|
|
53
59
|
{QA가 독립적으로 검증 가능한 시나리오 — 조건/행위/기대 결과}
|
|
54
60
|
|
|
@@ -69,5 +75,6 @@ tools: [Read, Write, Agent]
|
|
|
69
75
|
- "나중에 결정"은 허용하지 않는다. 모르면 위험 요소에 기록한다.
|
|
70
76
|
- 테스트 시나리오는 유저 스토리당 최소 2개 (정상 경로 + 에러 경로).
|
|
71
77
|
- 검증 시나리오 섹션은 contract.md에 그대로 포함된다. QA가 이것만 보고 검증할 수 있어야 한다.
|
|
78
|
+
- analysis.md에 "미검증" 외부 인터페이스가 있으면, 해당 대상에 대한 스파이크 태스크를 구현 태스크 앞에 배치한다.
|
|
72
79
|
- retry 시 review-{n}.md를 먼저 읽고, "이전 피드백 반영" 섹션을 반드시 포함한다.
|
|
73
80
|
- 필요시 Explorer 서브에이전트를 호출하여 코드베이스를 확인할 수 있다.
|
package/agents/qa.md
CHANGED
|
@@ -27,7 +27,9 @@ tools: [Read, Glob, Grep, Bash]
|
|
|
27
27
|
2. **린트 검증** — 린트 명령어 실행.
|
|
28
28
|
3. **타입 체크 검증** — 타입 체크 명령어 실행.
|
|
29
29
|
4. **테스트 스위트 검증** — 전체 테스트 실행. 회귀 + 새 테스트.
|
|
30
|
-
5.
|
|
30
|
+
5. **테스트 전략 준수 검증** (TDD 또는 Tests-after인 경우) — plan.md에 명시된 테스트 파일 존재 및 통과 확인. None이면 PASS.
|
|
31
|
+
6. **E2E / 통합 검증** — plan.md의 테스트 시나리오 기반.
|
|
32
|
+
7. **실행 검증** — plan.md의 `## 실행 검증` 절차를 직접 실행. 자동화 테스트와 별개로 구현된 기능을 사용자 관점에서 실행하여 동작을 확인. 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
|
|
31
33
|
|
|
32
34
|
## qa-report.md 출력 형식
|
|
33
35
|
|
|
@@ -43,17 +45,24 @@ tools: [Read, Glob, Grep, Bash]
|
|
|
43
45
|
| 2 | 린트 | PASS/FAIL | `{cmd}` | {output} |
|
|
44
46
|
| 3 | 타입 | PASS/FAIL | `{cmd}` | {output} |
|
|
45
47
|
| 4 | 테스트 | PASS/FAIL | `{cmd}` | {output} |
|
|
46
|
-
| 5 |
|
|
48
|
+
| 5 | 테스트 전략 준수 | PASS/FAIL | `{cmd}` | {output} |
|
|
49
|
+
| 6 | E2E | PASS/FAIL | `{cmd}` | {시나리오별 결과} |
|
|
50
|
+
| 7 | 실행 검증 | PASS/FAIL | `{cmd/절차}` | {실행 결과} |
|
|
47
51
|
|
|
48
52
|
## E2E 시나리오 상세
|
|
49
53
|
| # | 시나리오 (plan.md 참조) | 결과 | 증거 |
|
|
50
54
|
|---|----------------------|------|------|
|
|
51
55
|
| 1 | {시나리오 설명} | PASS/FAIL | {실행 출력} |
|
|
56
|
+
|
|
57
|
+
## 실행 검증 상세
|
|
58
|
+
| # | 검증 항목 (plan.md 실행 검증 참조) | 실행 방법 | 기대 결과 | 실제 결과 | 판정 |
|
|
59
|
+
|---|----------------------------------|----------|----------|----------|------|
|
|
60
|
+
| 1 | {검증 설명} | {명령어/절차} | {기대} | {실제} | PASS/FAIL |
|
|
52
61
|
```
|
|
53
62
|
|
|
54
63
|
## 판정 규칙
|
|
55
64
|
|
|
56
|
-
- 항목 1-
|
|
65
|
+
- 항목 1-7 중 하나라도 FAIL → 전체 FAIL
|
|
57
66
|
- 모든 항목 PASS → 전체 PASS
|
|
58
67
|
|
|
59
68
|
## 규칙
|
package/agents/techlead.md
CHANGED
|
@@ -25,7 +25,7 @@ tools: [AskUserQuestion, Read, Agent]
|
|
|
25
25
|
## 서브에이전트 호출
|
|
26
26
|
|
|
27
27
|
- **Explorer** (Haiku): 항상 호출. 병렬 2-3개. 코드베이스 탐색.
|
|
28
|
-
- **Researcher** (Sonnet): 필요시만 호출. 외부 문서/라이브러리 리서치.
|
|
28
|
+
- **Researcher** (Sonnet): 필요시만 호출. 외부 문서/라이브러리 리서치. 외부 API/서비스가 관련된 경우, 각 대상별로 개별 조사하여 문서가 확인되지 않는 대상은 "미검증 인터페이스"로 명시한다.
|
|
29
29
|
|
|
30
30
|
## analysis.md 필수 구조
|
|
31
31
|
|
|
@@ -55,6 +55,12 @@ tools: [AskUserQuestion, Read, Agent]
|
|
|
55
55
|
### Must NOT
|
|
56
56
|
- {절대 하면 안 되는 것}
|
|
57
57
|
|
|
58
|
+
## 외부 인터페이스 검증 (해당 시)
|
|
59
|
+
| 대상 | 인터페이스 | 문서 근거 | 검증 상태 |
|
|
60
|
+
|------|----------|----------|----------|
|
|
61
|
+
| {대상 1} | {확인된 인터페이스} | {문서 URL/출처} | 검증됨 |
|
|
62
|
+
| {대상 2} | {대상 1과 동일 가정} | 문서 없음 | 미검증 |
|
|
63
|
+
|
|
58
64
|
## 외부 리서치 (해당 시)
|
|
59
65
|
- {라이브러리/API 관련 발견 사항}
|
|
60
66
|
```
|
package/package.json
CHANGED
package/skills/crew-dev/SKILL.md
CHANGED
|
@@ -80,12 +80,14 @@ Bash("codex exec --model {model} -c model_reasoning_effort=\"{reasoning}\" --dan
|
|
|
80
80
|
contract.md # 스프린트 계약
|
|
81
81
|
|
|
82
82
|
# crew-dev 산출물 (신규 생성)
|
|
83
|
-
dev-log.md
|
|
84
|
-
review-report.md
|
|
85
|
-
qa-report.md
|
|
86
|
-
review-report-{n}.md
|
|
87
|
-
qa-report-{n}.md
|
|
88
|
-
.
|
|
83
|
+
dev-log.md # Dev: 구현 진행 로그 (US별 섹션 누적)
|
|
84
|
+
review-report.md # CodeReviewer: US 단위 리뷰 결과 (최신)
|
|
85
|
+
qa-report.md # QA: US 단위 검증 결과 (최신)
|
|
86
|
+
review-report-{n}.md # US 단위 FAIL 시 아카이브
|
|
87
|
+
qa-report-{n}.md # US 단위 FAIL 시 아카이브
|
|
88
|
+
final-review-report.md # CodeReviewer: 최종 전체 리뷰 결과
|
|
89
|
+
final-qa-report.md # QA: 최종 전체 검증 결과
|
|
90
|
+
.dev_loop_count # US별 개발 루프 카운터 (US PASS 시 리셋)
|
|
89
91
|
```
|
|
90
92
|
|
|
91
93
|
---
|
|
@@ -134,9 +136,20 @@ contract.md 유효성 검사에 실패했습니다.
|
|
|
134
136
|
[3] 이 태스크를 보류
|
|
135
137
|
```
|
|
136
138
|
|
|
137
|
-
**1c. 워크트리
|
|
139
|
+
**1c. 워크트리 결정**
|
|
138
140
|
|
|
139
|
-
|
|
141
|
+
기존 워크트리를 이어쓸지, 새로 만들지 판단한다.
|
|
142
|
+
|
|
143
|
+
**판단 순서** (위가 우선):
|
|
144
|
+
|
|
145
|
+
1. contract.md에 `## 워크트리` 섹션이 있으면 그 값을 따른다:
|
|
146
|
+
- `mode: continue` + `branch: {브랜치명}` → 경로 B (이어가기)
|
|
147
|
+
- `mode: new` 또는 섹션 없음 → 경로 A (신규)
|
|
148
|
+
2. `## 워크트리` 섹션이 없으면, 현재 호출 위치를 확인한다:
|
|
149
|
+
- 현재 디렉토리가 `.claude/worktrees/` 하위이고 해당 워크트리의 task-id가 일치하면 → 경로 B
|
|
150
|
+
- 그 외 → 경로 A
|
|
151
|
+
|
|
152
|
+
**경로 A — 신규 워크트리**
|
|
140
153
|
|
|
141
154
|
```
|
|
142
155
|
EnterWorktree(name="feat/{task-id}")
|
|
@@ -149,9 +162,23 @@ git fetch origin main
|
|
|
149
162
|
git reset --hard origin/main
|
|
150
163
|
```
|
|
151
164
|
|
|
152
|
-
이후 모든 작업은 워크트리에서 수행한다.
|
|
153
165
|
환경 파일(`.env*` 등)이 원본 프로젝트에 있으면 복사한다.
|
|
154
166
|
|
|
167
|
+
**경로 B — 기존 워크트리 이어가기**
|
|
168
|
+
|
|
169
|
+
- `EnterWorktree` 호출하지 않는다 (이미 진입 상태이거나, contract.md 지정 브랜치의 워크트리가 존재).
|
|
170
|
+
- `git reset --hard` 하지 않는다 — 기존 커밋을 보존한다.
|
|
171
|
+
- 현재 상태만 확인한다:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
git log --oneline -5
|
|
175
|
+
git diff --stat
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- "기존 워크트리에서 작업을 이어갑니다" 로그를 출력한다.
|
|
179
|
+
|
|
180
|
+
이후 모든 작업은 워크트리에서 수행한다.
|
|
181
|
+
|
|
155
182
|
**1d. 상태 갱신**
|
|
156
183
|
|
|
157
184
|
contract.md의 `## 상태` 섹션을 갱신한다:
|
|
@@ -163,41 +190,60 @@ IN_PROGRESS — Dev 에이전트가 구현 중이다.
|
|
|
163
190
|
|
|
164
191
|
---
|
|
165
192
|
|
|
166
|
-
### Phase 2 —
|
|
193
|
+
### Phase 2 — US 단위 증분 개발 루프
|
|
167
194
|
|
|
168
|
-
|
|
195
|
+
plan.md의 유저 스토리(US)를 하나씩 순차적으로 구현하고, 각 US마다 검증을 통과해야 다음 US로 진행한다.
|
|
169
196
|
|
|
170
|
-
####
|
|
197
|
+
#### 2a. US 목록 파싱 (오케스트레이터 직접)
|
|
171
198
|
|
|
172
|
-
|
|
199
|
+
plan.md에서 `### US-{N}: {제목}` 패턴을 파싱하여 순서 목록을 만든다.
|
|
173
200
|
|
|
174
201
|
```
|
|
175
|
-
|
|
202
|
+
US 목록: [US-1, US-2, ..., US-N]
|
|
203
|
+
현재 US 인덱스: k = 1
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### 2b. US-k 구현 → 검증 → 커밋 루프
|
|
207
|
+
|
|
208
|
+
각 US-k에 대해 아래 순서를 반복한다.
|
|
209
|
+
|
|
210
|
+
##### Step 1 — Dev 에이전트 호출 (US-k만 구현)
|
|
211
|
+
|
|
212
|
+
Phase 1a에서 해석된 dev 설정에 따라 디스패치한다.
|
|
213
|
+
|
|
214
|
+
**claude provider 호출:**
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
Agent(subagent_type="dev", model="{설정된 모델}", description="Dev: {task-id} US-{k}", prompt="...")
|
|
176
218
|
```
|
|
177
219
|
|
|
178
220
|
**첫 번째 실행 시 에이전트 프롬프트**:
|
|
179
221
|
|
|
180
222
|
```
|
|
181
|
-
당신은 Dev 에이전트다. plan.md
|
|
223
|
+
당신은 Dev 에이전트다. plan.md의 유저 스토리 US-{k}만 구현한다.
|
|
182
224
|
|
|
183
225
|
## 입력
|
|
184
226
|
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
185
227
|
.crew/plans/{task-id}/contract.md 를 읽어라 (수용 기준 = 완료 기준).
|
|
186
228
|
brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
187
229
|
|
|
230
|
+
## 작업 범위
|
|
231
|
+
plan.md의 유저 스토리 중 **US-{k}: {제목}** 의 구현 태스크만 수행한다.
|
|
232
|
+
다른 US의 태스크는 절대 수행하지 않는다.
|
|
233
|
+
|
|
188
234
|
## 작업 순서
|
|
189
|
-
1. plan.md의
|
|
235
|
+
1. plan.md에서 US-{k}의 구현 태스크와 테스트 시나리오를 확인한다.
|
|
190
236
|
2. plan.md의 `## 테스트 전략` 섹션을 확인한다.
|
|
191
237
|
3. 코드베이스를 탐색한다 (Glob, Grep, Read로 관련 파일 파악).
|
|
192
|
-
4.
|
|
238
|
+
4. US-{k}의 태스크를 구현한다.
|
|
193
239
|
- **TDD인 경우**: 각 태스크에서 반드시 RED→GREEN→REFACTOR 순서를 따른다.
|
|
194
240
|
1. RED: 실패하는 테스트를 먼저 작성하고 실행하여 FAIL을 확인한다.
|
|
195
241
|
2. GREEN: 테스트를 통과하는 최소한의 코드를 작성한다.
|
|
196
242
|
3. REFACTOR: 코드 품질을 개선한다 (필요시).
|
|
197
243
|
- **Tests-after인 경우**: 구현을 먼저 완료한 후, plan.md에 명시된 테스트 태스크를 수행한다.
|
|
198
|
-
- **None인 경우**:
|
|
199
|
-
5.
|
|
200
|
-
6.
|
|
244
|
+
- **None인 경우**: 구현만 수행한다.
|
|
245
|
+
5. dev-log.md에 US-{k} 진행상황을 기록한다 (기존 내용 뒤에 추가).
|
|
246
|
+
6. 자체 검증을 실행한다:
|
|
201
247
|
- 빌드 성공 확인
|
|
202
248
|
- 린트 통과 확인
|
|
203
249
|
- 타입 체크 통과 확인
|
|
@@ -207,10 +253,10 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
207
253
|
자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
208
254
|
|
|
209
255
|
## 출력
|
|
210
|
-
.crew/plans/{task-id}/dev-log.md
|
|
256
|
+
.crew/plans/{task-id}/dev-log.md 에 US-{k} 섹션을 추가하라.
|
|
211
257
|
|
|
212
258
|
## 규칙
|
|
213
|
-
-
|
|
259
|
+
- US-{k}의 태스크만 구현한다 (다른 US 금지).
|
|
214
260
|
- 자체 검증 5개(빌드/린트/타입/테스트/lint-staged) 모두 PASS 해야 완료를 선언할 수 있다.
|
|
215
261
|
- 기존 코드베이스의 컨벤션을 따른다.
|
|
216
262
|
- TDD 전략인 경우, 테스트를 먼저 작성하지 않고 프로덕션 코드를 작성하지 않는다.
|
|
@@ -219,7 +265,7 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
219
265
|
**retry 시 에이전트 프롬프트**:
|
|
220
266
|
|
|
221
267
|
```
|
|
222
|
-
|
|
268
|
+
이전 US-{k} 구현이 검증에서 FAIL을 받았다. 수정한다.
|
|
223
269
|
|
|
224
270
|
## 입력
|
|
225
271
|
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
@@ -228,123 +274,253 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
228
274
|
.crew/plans/{task-id}/qa-report-{n}.md 를 읽어라. (QA 피드백)
|
|
229
275
|
brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
230
276
|
|
|
231
|
-
##
|
|
232
|
-
|
|
277
|
+
## 작업 범위
|
|
278
|
+
US-{k}에 해당하는 피드백만 수정한다. 다른 US의 코드를 변경하지 않는다.
|
|
233
279
|
|
|
234
280
|
## 작업 순서
|
|
235
281
|
1. 피드백에서 FAIL 항목을 모두 파악한다.
|
|
236
282
|
2. 각 FAIL 항목에 대해 수정을 수행한다.
|
|
237
|
-
3. dev-log.md를 갱신한다 (최상단에 "수정 이력 (retry {n})"
|
|
238
|
-
4. 자체 검증 5개를 모두 다시
|
|
283
|
+
3. dev-log.md를 갱신한다 (US-{k} 섹션 최상단에 "수정 이력 (retry {n})" 추가).
|
|
284
|
+
4. 자체 검증 5개를 모두 다시 실행한다 (빌드/린트/타입/테스트/lint-staged).
|
|
239
285
|
|
|
240
286
|
## 규칙
|
|
241
287
|
- 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
|
|
242
288
|
- 자체 검증 5개 모두 PASS 해야 완료를 선언할 수 있다.
|
|
243
289
|
```
|
|
244
290
|
|
|
245
|
-
|
|
291
|
+
**codex provider인 경우:**
|
|
246
292
|
|
|
247
|
-
오케스트레이터가
|
|
248
|
-
|
|
249
|
-
1. plan.md와 contract.md의 내용을 읽어 프롬프트에 인라인으로 주입한다.
|
|
250
|
-
2. Codex를 실행한다:
|
|
293
|
+
오케스트레이터가 plan.md에서 US-{k} 섹션과 contract.md의 수용 기준을 추출하여 프롬프트에 인라인으로 주입한다.
|
|
251
294
|
|
|
252
295
|
```bash
|
|
253
296
|
codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "$(cat <<'PROMPT'
|
|
254
|
-
당신은 Dev 에이전트다. 아래
|
|
297
|
+
당신은 Dev 에이전트다. 아래 유저 스토리 US-{k}만 구현한다.
|
|
298
|
+
|
|
299
|
+
## US-{k} (plan.md에서 추출)
|
|
300
|
+
{오케스트레이터가 US-{k} 섹션만 인라인 삽입}
|
|
255
301
|
|
|
256
|
-
##
|
|
257
|
-
{오케스트레이터가
|
|
302
|
+
## 테스트 전략
|
|
303
|
+
{오케스트레이터가 테스트 전략 섹션 인라인 삽입}
|
|
258
304
|
|
|
259
305
|
## contract.md (수용 기준)
|
|
260
|
-
{오케스트레이터가
|
|
306
|
+
{오케스트레이터가 수용 기준 섹션 인라인 삽입}
|
|
261
307
|
|
|
262
308
|
## 작업 순서
|
|
263
309
|
1. 코드베이스를 탐색하여 관련 파일을 파악한다.
|
|
264
|
-
2.
|
|
265
|
-
3.
|
|
266
|
-
- 빌드 성공 확인
|
|
267
|
-
- 린트 통과 확인
|
|
268
|
-
- 타입 체크 통과 확인
|
|
269
|
-
- 기존 테스트 스위트 통과 확인
|
|
310
|
+
2. US-{k}의 태스크만 구현한다.
|
|
311
|
+
3. 자체 검증을 실행한다 (빌드/린트/타입/테스트).
|
|
270
312
|
4. 자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
271
313
|
|
|
272
314
|
## 규칙
|
|
273
|
-
-
|
|
315
|
+
- US-{k}의 태스크만 구현한다 (다른 US 금지).
|
|
274
316
|
- 자체 검증 모두 PASS 해야 완료를 선언할 수 있다.
|
|
275
317
|
- 기존 코드베이스의 컨벤션을 따른다.
|
|
276
318
|
|
|
277
319
|
## 완료 시 출력
|
|
278
|
-
구현 요약을
|
|
320
|
+
구현 요약을 출력하라:
|
|
279
321
|
- 변경한 파일 목록
|
|
280
|
-
-
|
|
322
|
+
- US-{k} 구현 내용 1줄 요약
|
|
281
323
|
- 자체 검증 결과 (각 항목별 PASS/FAIL + 명령어 + 출력)
|
|
282
324
|
PROMPT
|
|
283
325
|
)"
|
|
284
326
|
```
|
|
285
327
|
|
|
286
|
-
|
|
328
|
+
Codex stdout을 캡처하여 dev-log.md의 US-{k} 섹션으로 추가한다.
|
|
287
329
|
|
|
288
|
-
**retry 시 (codex provider)**:
|
|
330
|
+
**retry 시 (codex provider)**: 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
|
|
289
331
|
|
|
290
|
-
|
|
332
|
+
##### Step 2 — US-k 검증 (CodeReviewer + QA 병렬)
|
|
291
333
|
|
|
292
|
-
|
|
334
|
+
CodeReviewer와 QA를 **동시에** 호출한다. US-k의 변경분만 검증한다.
|
|
293
335
|
|
|
294
|
-
|
|
336
|
+
**CodeReviewer (US-k)**
|
|
295
337
|
|
|
296
|
-
|
|
338
|
+
오케스트레이터 사전 작업:
|
|
339
|
+
1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
340
|
+
2. 가드레일을 프롬프트에 인라인 주입한다.
|
|
297
341
|
|
|
298
|
-
|
|
342
|
+
에이전트 프롬프트:
|
|
299
343
|
|
|
300
|
-
|
|
344
|
+
```
|
|
345
|
+
당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
|
|
301
346
|
|
|
302
|
-
|
|
347
|
+
## 입력
|
|
348
|
+
`git diff HEAD`를 직접 실행하여 마지막 커밋 이후 변경 사항을 확인하라.
|
|
349
|
+
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
350
|
+
코드만 보고 판단한다.
|
|
303
351
|
|
|
304
|
-
|
|
352
|
+
### 가드레일 (contract.md에서 추출)
|
|
353
|
+
#### Must
|
|
354
|
+
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
355
|
+
#### Must NOT
|
|
356
|
+
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
357
|
+
|
|
358
|
+
위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
|
|
359
|
+
|
|
360
|
+
## 검토 항목
|
|
361
|
+
1. 가드레일 위반 (위반 시 critical)
|
|
362
|
+
2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
|
|
363
|
+
3. 보안 취약점
|
|
364
|
+
4. 불필요한 복잡도
|
|
365
|
+
5. 잠재적 버그
|
|
366
|
+
6. 에러 처리 적절성
|
|
367
|
+
|
|
368
|
+
## 출력
|
|
369
|
+
아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
370
|
+
|
|
371
|
+
## 판정 규칙
|
|
372
|
+
- 가드레일 위반 → critical
|
|
373
|
+
- critical 또는 major가 1개 이상 → FAIL
|
|
374
|
+
- minor만 있거나 지적 없음 → PASS
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**QA (US-k)**
|
|
378
|
+
|
|
379
|
+
에이전트 프롬프트:
|
|
305
380
|
|
|
306
381
|
```
|
|
307
|
-
|
|
382
|
+
당신은 QA 에이전트다. US-{k}의 구현이 실제로 동작하는지 검증한다.
|
|
383
|
+
|
|
384
|
+
## 입력
|
|
385
|
+
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
386
|
+
plan.md의 US-{k} 테스트 시나리오를 확인하라.
|
|
387
|
+
contract.md, brief.md, spec.md는 읽지 않는다.
|
|
388
|
+
|
|
389
|
+
## 검증 항목 (순서대로 실행)
|
|
390
|
+
1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
|
|
391
|
+
2. 린트 검증
|
|
392
|
+
3. 타입 체크 검증
|
|
393
|
+
4. 테스트 스위트 검증 (전체 테스트 실행 — 기존 테스트 회귀 방지)
|
|
394
|
+
5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
|
|
395
|
+
- plan.md의 US-{k}에 명시된 테스트 파일이 실제로 존재하는가?
|
|
396
|
+
- 해당 테스트가 실행되고 통과하는가?
|
|
397
|
+
- None인 경우 이 항목을 PASS로 처리한다.
|
|
398
|
+
6. US-{k} 시나리오 검증 — plan.md의 US-{k} 테스트 시나리오 기반
|
|
399
|
+
|
|
400
|
+
## 출력
|
|
401
|
+
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
402
|
+
|
|
403
|
+
## 판정 규칙
|
|
404
|
+
- 항목 1-6 중 하나라도 FAIL → 전체 FAIL
|
|
405
|
+
- 모든 항목 PASS → 전체 PASS
|
|
406
|
+
|
|
407
|
+
## 규칙
|
|
408
|
+
- 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
|
|
409
|
+
- 실행 출력을 반드시 캡처하여 기록한다.
|
|
410
|
+
- 코드를 수정하지 않는다. 검증만 한다.
|
|
308
411
|
```
|
|
309
412
|
|
|
310
|
-
|
|
413
|
+
**병렬 실행 방법**: Phase 3과 동일 (provider 조합에 따라 Agent/Bash 병렬 호출).
|
|
414
|
+
|
|
415
|
+
**결과 저장 (오케스트레이터 직접)**:
|
|
416
|
+
- CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
|
|
417
|
+
- QA 결과 → `.crew/plans/{task-id}/qa-report.md`
|
|
418
|
+
|
|
419
|
+
##### Step 3 — US-k 판정
|
|
420
|
+
|
|
421
|
+
오케스트레이터가 직접 판정한다:
|
|
422
|
+
- CodeReviewer PASS + QA PASS → **US-k PASS** → Step 4로
|
|
423
|
+
- 하나라도 FAIL → **US-k FAIL** → Step 5로
|
|
424
|
+
|
|
425
|
+
##### Step 4 — US-k 체크포인트 커밋
|
|
311
426
|
|
|
312
|
-
|
|
427
|
+
US-k가 PASS하면 즉시 커밋하여 체크포인트를 만든다:
|
|
313
428
|
|
|
314
429
|
```bash
|
|
315
|
-
|
|
316
|
-
|
|
430
|
+
git add -A
|
|
431
|
+
git commit --no-verify -m "feat({task-id}): US-{k} {US 제목}"
|
|
432
|
+
```
|
|
317
433
|
|
|
318
|
-
|
|
319
|
-
{오케스트레이터가 git diff 결과를 인라인 삽입}
|
|
434
|
+
> `--no-verify`: 검증 단계에서 이미 빌드/린트/타입/테스트를 통과했으므로 pre-commit hook을 중복 실행하지 않는다.
|
|
320
435
|
|
|
321
|
-
|
|
322
|
-
### Must
|
|
323
|
-
{contract.md에서 추출한 Must 항목}
|
|
324
|
-
### Must NOT
|
|
325
|
-
{contract.md에서 추출한 Must NOT 항목}
|
|
436
|
+
`.dev_loop_count` 파일이 존재하면 삭제한다 (US-k 루프 카운터 리셋).
|
|
326
437
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
438
|
+
**다음 US 진행**: k를 증가시키고 Step 1로 돌아간다.
|
|
439
|
+
**모든 US 완료**: Phase 3으로 진행한다.
|
|
440
|
+
|
|
441
|
+
##### Step 5 — US-k FAIL 처리
|
|
442
|
+
|
|
443
|
+
**5a. 루프 카운터 읽기**
|
|
444
|
+
|
|
445
|
+
`.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
|
|
446
|
+
- 파일이 없으면 카운터 = 0
|
|
447
|
+
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
448
|
+
|
|
449
|
+
**5b. 에스컬레이션 판단**
|
|
450
|
+
|
|
451
|
+
두 가지 에스컬레이션 조건:
|
|
452
|
+
|
|
453
|
+
**조건 1 — 루프 상한 초과**:
|
|
454
|
+
|
|
455
|
+
카운터 값 >= 4이면 즉시 에스컬레이션:
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
US-{k}이 5회 반복 후에도 검증을 통과하지 못했습니다.
|
|
459
|
+
최종 FAIL 사유를 첨부합니다.
|
|
460
|
+
[1] US-{k}의 범위를 좁혀서 재시도
|
|
461
|
+
[2] plan.md를 수정
|
|
462
|
+
[3] 이 태스크를 보류
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
에스컬레이션 시:
|
|
466
|
+
- `.dev_loop_count` 파일을 삭제한다.
|
|
467
|
+
- contract.md 상태를 `BLOCKED — US-{k}에서 중단`으로 갱신한다.
|
|
468
|
+
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
469
|
+
|
|
470
|
+
**조건 2 — 같은 기준 3회 연속 실패**:
|
|
471
|
+
|
|
472
|
+
review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
|
|
473
|
+
이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
|
|
474
|
+
|
|
475
|
+
```
|
|
476
|
+
US-{k}의 {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
|
|
477
|
+
[1] plan.md를 수정 (구현 전략의 문제)
|
|
478
|
+
[2] contract.md를 수정 (기준 자체의 문제)
|
|
479
|
+
[3] 이 태스크를 보류
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
483
|
+
|
|
484
|
+
**5c. 피드백 아카이브**
|
|
485
|
+
|
|
486
|
+
`n = 카운터 + 1`
|
|
487
|
+
|
|
488
|
+
```
|
|
489
|
+
review-report.md → review-report-{n}.md
|
|
490
|
+
qa-report.md → qa-report-{n}.md
|
|
331
491
|
```
|
|
332
492
|
|
|
333
|
-
|
|
493
|
+
**5d. 루프 카운터 증가 저장**
|
|
334
494
|
|
|
335
|
-
|
|
495
|
+
`카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
|
|
496
|
+
|
|
497
|
+
**5e. Step 1로 돌아감 (US-k retry)**
|
|
498
|
+
|
|
499
|
+
Step 1(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
|
|
500
|
+
Dev 수정 완료 후 Step 2(CodeReviewer + QA)를 재실행한다.
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
### Phase 3 — 최종 전체 검증 (CodeReviewer + QA)
|
|
505
|
+
|
|
506
|
+
모든 US가 개별 검증을 통과한 후, 전체 변경 사항에 대해 통합 검증을 수행한다.
|
|
507
|
+
US 간 상호작용에서 발생할 수 있는 문제를 잡기 위한 단계다.
|
|
336
508
|
|
|
337
|
-
|
|
509
|
+
CodeReviewer와 QA를 **동시에** 호출한다.
|
|
510
|
+
|
|
511
|
+
#### Phase 3a — CodeReviewer (전체)
|
|
512
|
+
|
|
513
|
+
오케스트레이터 사전 작업:
|
|
338
514
|
1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
339
|
-
2. 가드레일을
|
|
515
|
+
2. 가드레일을 프롬프트에 인라인 주입한다.
|
|
340
516
|
|
|
341
517
|
에이전트 프롬프트:
|
|
342
518
|
|
|
343
519
|
```
|
|
344
|
-
당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
|
|
520
|
+
당신은 CodeReviewer 에이전트다. 전체 코드 변경 사항의 품질을 판단한다.
|
|
345
521
|
|
|
346
522
|
## 입력
|
|
347
|
-
`git diff main...HEAD`를 직접 실행하여 변경 사항을 확인하라.
|
|
523
|
+
`git diff main...HEAD`를 직접 실행하여 전체 변경 사항을 확인하라.
|
|
348
524
|
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
349
525
|
코드만 보고 판단한다.
|
|
350
526
|
|
|
@@ -363,6 +539,7 @@ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
|
363
539
|
4. 불필요한 복잡도
|
|
364
540
|
5. 잠재적 버그
|
|
365
541
|
6. 에러 처리 적절성
|
|
542
|
+
7. **모듈 간 정합성** — 변경된 파일들 사이의 인터페이스, 타입, import가 일관적인가
|
|
366
543
|
|
|
367
544
|
## 출력
|
|
368
545
|
아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
@@ -373,50 +550,40 @@ contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
|
373
550
|
- minor만 있거나 지적 없음 → PASS
|
|
374
551
|
```
|
|
375
552
|
|
|
376
|
-
#### Phase 3b — QA
|
|
377
|
-
|
|
378
|
-
Phase 1a에서 해석된 qa 설정에 따라 디스패치한다.
|
|
379
|
-
|
|
380
|
-
**claude provider 호출:**
|
|
381
|
-
|
|
382
|
-
```
|
|
383
|
-
Agent(subagent_type="qa", model="{설정된 모델}", description="QA: {task-id} 검증", prompt="...")
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
**codex provider 호출:**
|
|
387
|
-
|
|
388
|
-
오케스트레이터가 plan.md 내용을 읽어 프롬프트에 인라인 삽입하여 Codex를 실행한다. Codex stdout을 캡처하여 qa-report.md 내용으로 사용한다.
|
|
389
|
-
|
|
390
|
-
```bash
|
|
391
|
-
codex exec --model {model} -c model_reasoning_effort="{reasoning}" --dangerously-bypass-approvals-and-sandbox "{QA 프롬프트 + plan.md 인라인}"
|
|
392
|
-
```
|
|
553
|
+
#### Phase 3b — QA (전체)
|
|
393
554
|
|
|
394
555
|
에이전트 프롬프트:
|
|
395
556
|
|
|
396
557
|
```
|
|
397
|
-
당신은 QA 에이전트다. 구현이 실제로 동작하는지 검증한다.
|
|
558
|
+
당신은 QA 에이전트다. 전체 구현이 실제로 동작하는지 최종 검증한다.
|
|
398
559
|
|
|
399
560
|
## 입력
|
|
400
561
|
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
401
|
-
plan.md의 유저
|
|
562
|
+
plan.md의 모든 유저 스토리, 테스트 시나리오, 검증 시나리오를 확인하라.
|
|
402
563
|
contract.md, brief.md, spec.md는 읽지 않는다.
|
|
403
564
|
|
|
404
565
|
## 검증 항목 (순서대로 실행)
|
|
405
566
|
1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
|
|
406
567
|
2. 린트 검증
|
|
407
568
|
3. 타입 체크 검증
|
|
408
|
-
4. 테스트 스위트 검증
|
|
569
|
+
4. 테스트 스위트 검증 (전체 테스트)
|
|
409
570
|
5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
|
|
410
|
-
- plan.md에 명시된 테스트 파일이 실제로 존재하는가?
|
|
571
|
+
- plan.md에 명시된 모든 테스트 파일이 실제로 존재하는가?
|
|
411
572
|
- 해당 테스트가 실행되고 통과하는가?
|
|
412
573
|
- None인 경우 이 항목을 PASS로 처리한다.
|
|
413
|
-
6. E2E / 통합 검증 — plan.md의 테스트 시나리오 기반
|
|
574
|
+
6. 전체 E2E / 통합 검증 — plan.md의 모든 테스트 시나리오 기반
|
|
575
|
+
7. 실행 검증 — plan.md의 `## 실행 검증` 절차를 직접 실행한다.
|
|
576
|
+
- 자동화 테스트와 별개로, 구현된 기능을 사용자 관점에서 직접 실행한다.
|
|
577
|
+
- 백엔드: 실제 API 호출, 스크립트 실행 등
|
|
578
|
+
- UI: 개발 서버에서 브라우저 조작
|
|
579
|
+
- 각 항목의 기대 결과와 실제 결과를 비교하여 판정한다.
|
|
580
|
+
- 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
|
|
414
581
|
|
|
415
582
|
## 출력
|
|
416
583
|
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
417
584
|
|
|
418
585
|
## 판정 규칙
|
|
419
|
-
- 항목 1-
|
|
586
|
+
- 항목 1-7 중 하나라도 FAIL → 전체 FAIL
|
|
420
587
|
- 모든 항목 PASS → 전체 PASS
|
|
421
588
|
|
|
422
589
|
## 규칙
|
|
@@ -429,8 +596,8 @@ contract.md, brief.md, spec.md는 읽지 않는다.
|
|
|
429
596
|
|
|
430
597
|
CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
|
|
431
598
|
오케스트레이터가 각 에이전트의 반환 텍스트를 파일로 저장한다:
|
|
432
|
-
- CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
|
|
433
|
-
- QA 결과 → `.crew/plans/{task-id}/qa-report.md`
|
|
599
|
+
- CodeReviewer 결과 → `.crew/plans/{task-id}/final-review-report.md`
|
|
600
|
+
- QA 결과 → `.crew/plans/{task-id}/final-qa-report.md`
|
|
434
601
|
|
|
435
602
|
**Phase 3 병렬 실행 방법**:
|
|
436
603
|
|
|
@@ -440,39 +607,42 @@ CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하
|
|
|
440
607
|
- 둘 다 codex → Bash tool 2개를 한 번에 호출
|
|
441
608
|
- 혼합 → Agent + Bash를 한 번에 호출
|
|
442
609
|
|
|
443
|
-
```
|
|
444
|
-
# 예: code-reviewer=claude, qa=codex
|
|
445
|
-
Agent(subagent_type="code-reviewer", model="opus", description="CodeReviewer: {task-id}", prompt="...")
|
|
446
|
-
Bash("codex exec --model gpt-5.4 ... '{QA 프롬프트}'")
|
|
447
|
-
```
|
|
448
|
-
|
|
449
610
|
---
|
|
450
611
|
|
|
451
|
-
### Phase 4 —
|
|
612
|
+
### Phase 4 — 최종 판정 + 완료
|
|
452
613
|
|
|
453
|
-
**
|
|
614
|
+
**4a. 오케스트레이터 직접 판정**
|
|
454
615
|
|
|
455
616
|
판정 규칙:
|
|
456
|
-
- CodeReviewer PASS + QA PASS → **PASS** →
|
|
457
|
-
- 하나라도 FAIL → **FAIL** →
|
|
617
|
+
- CodeReviewer PASS + QA PASS → **PASS** → 4b로
|
|
618
|
+
- 하나라도 FAIL → **FAIL** → 에스컬레이션
|
|
458
619
|
|
|
459
|
-
|
|
620
|
+
최종 전체 검증 FAIL 시 자동 retry하지 않는다. US 간 상호작용 문제는 어떤 US를 수정해야 하는지 자동 판단이 어렵기 때문이다.
|
|
460
621
|
|
|
461
|
-
|
|
622
|
+
```
|
|
623
|
+
최종 전체 검증에서 FAIL이 발생했습니다.
|
|
624
|
+
개별 US는 모두 통과했으나 통합 단계에서 문제가 발견되었습니다.
|
|
625
|
+
final-review-report.md, final-qa-report.md를 확인하세요.
|
|
626
|
+
[1] 문제 원인을 특정하여 해당 US를 수동 수정 후 재실행
|
|
627
|
+
[2] plan.md를 수정하여 US 간 의존성을 재설계
|
|
628
|
+
[3] 이 태스크를 보류
|
|
629
|
+
```
|
|
462
630
|
|
|
463
|
-
|
|
631
|
+
에스컬레이션 시:
|
|
632
|
+
- contract.md 상태를 `BLOCKED — 최종 전체 검증 FAIL`로 갱신한다.
|
|
633
|
+
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
634
|
+
|
|
635
|
+
**4b. PR 생성**
|
|
464
636
|
|
|
465
637
|
```bash
|
|
466
|
-
git add -A
|
|
467
|
-
git commit --no-verify -m "feat({task-id}): {contract.md 목표 1줄 요약}"
|
|
468
638
|
git push -u origin feat/{task-id}
|
|
469
639
|
```
|
|
470
640
|
|
|
471
|
-
>
|
|
641
|
+
> US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 불필요하다.
|
|
472
642
|
|
|
473
643
|
PR을 생성한다 (머지하지 않는다).
|
|
474
644
|
|
|
475
|
-
**
|
|
645
|
+
**4c. 상태 갱신**
|
|
476
646
|
|
|
477
647
|
contract.md의 `## 수용 기준` 섹션에서 모든 `- [ ]`를 `- [x]`로 변경한다.
|
|
478
648
|
|
|
@@ -484,11 +654,11 @@ COMPLETED — 모든 수용 기준이 검증을 통과했다.
|
|
|
484
654
|
PR: {PR URL}
|
|
485
655
|
```
|
|
486
656
|
|
|
487
|
-
**
|
|
657
|
+
**4d. 정리**
|
|
488
658
|
|
|
489
659
|
`.dev_loop_count` 파일이 존재하면 삭제한다.
|
|
490
660
|
|
|
491
|
-
**
|
|
661
|
+
**4e. 워크트리 종료**
|
|
492
662
|
|
|
493
663
|
```
|
|
494
664
|
ExitWorktree(action="remove")
|
|
@@ -496,7 +666,7 @@ ExitWorktree(action="remove")
|
|
|
496
666
|
|
|
497
667
|
PR push가 완료되었으므로 로컬 워크트리를 제거하고 원본 프로젝트 디렉토리로 복귀한다.
|
|
498
668
|
|
|
499
|
-
**
|
|
669
|
+
**4f. 완료 반환**
|
|
500
670
|
|
|
501
671
|
```
|
|
502
672
|
상태: COMPLETE
|
|
@@ -506,81 +676,16 @@ PR: {PR URL}
|
|
|
506
676
|
|
|
507
677
|
---
|
|
508
678
|
|
|
509
|
-
### Step 6 — FAIL 처리 (검증 루프)
|
|
510
|
-
|
|
511
|
-
Phase 4에서 FAIL이면:
|
|
512
|
-
|
|
513
|
-
**6a. 루프 카운터 읽기**
|
|
514
|
-
|
|
515
|
-
`.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
|
|
516
|
-
- 파일이 없으면 카운터 = 0
|
|
517
|
-
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
518
|
-
|
|
519
|
-
**6b. 에스컬레이션 판단**
|
|
520
|
-
|
|
521
|
-
두 가지 에스컬레이션 조건:
|
|
522
|
-
|
|
523
|
-
**조건 1 — 루프 상한 초과**:
|
|
524
|
-
|
|
525
|
-
카운터 값 >= 4이면 즉시 에스컬레이션:
|
|
526
|
-
|
|
527
|
-
```
|
|
528
|
-
검증 루프가 5회 반복 후에도 통과하지 못했습니다.
|
|
529
|
-
최종 FAIL 사유를 첨부합니다.
|
|
530
|
-
[1] 수용 기준을 좁혀서 재시도
|
|
531
|
-
[2] contract.md를 수정
|
|
532
|
-
[3] 이 태스크를 보류
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
에스컬레이션 시:
|
|
536
|
-
- `.dev_loop_count` 파일을 삭제한다.
|
|
537
|
-
- contract.md 상태를 `BLOCKED`으로 갱신한다.
|
|
538
|
-
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
539
|
-
|
|
540
|
-
**조건 2 — 같은 기준 3회 연속 실패**:
|
|
541
|
-
|
|
542
|
-
review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
|
|
543
|
-
이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
|
|
544
|
-
|
|
545
|
-
```
|
|
546
|
-
{항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
|
|
547
|
-
[1] contract.md를 수정 (기준 자체의 문제)
|
|
548
|
-
[2] plan.md를 수정 (구현 전략의 문제)
|
|
549
|
-
[3] 이 태스크를 보류
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
553
|
-
|
|
554
|
-
**6c. 피드백 아카이브**
|
|
555
|
-
|
|
556
|
-
`n = 카운터 + 1`
|
|
557
|
-
|
|
558
|
-
```
|
|
559
|
-
review-report.md → review-report-{n}.md
|
|
560
|
-
qa-report.md → qa-report-{n}.md
|
|
561
|
-
```
|
|
562
|
-
|
|
563
|
-
**6d. 루프 카운터 증가 저장**
|
|
564
|
-
|
|
565
|
-
`카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
|
|
566
|
-
|
|
567
|
-
**6e. Phase 2로 돌아감 (retry)**
|
|
568
|
-
|
|
569
|
-
Phase 2(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
|
|
570
|
-
Dev 수정 완료 후 Phase 3(CodeReviewer + QA)을 **둘 다** 재실행한다.
|
|
571
|
-
|
|
572
|
-
---
|
|
573
|
-
|
|
574
679
|
## 루프 카운터 (.dev_loop_count) 생명주기
|
|
575
680
|
|
|
576
681
|
| 이벤트 | 동작 |
|
|
577
682
|
|--------|------|
|
|
578
|
-
| 첫
|
|
579
|
-
| n번째 FAIL
|
|
580
|
-
| PASS (
|
|
683
|
+
| US-k 첫 진입 | 파일 없음 (카운터 = 0) |
|
|
684
|
+
| US-k n번째 FAIL 후 | 파일 갱신, 내용: `n` |
|
|
685
|
+
| US-k PASS (Step 4) | 파일 삭제 |
|
|
581
686
|
| 에스컬레이션 | 파일 삭제 |
|
|
582
687
|
|
|
583
|
-
|
|
688
|
+
각 US당 최대 5회 검증 사이클 (초기 1회 + retry 최대 4회).
|
|
584
689
|
|
|
585
690
|
---
|
|
586
691
|
|
|
@@ -87,11 +87,12 @@ WHAT(무엇을 만드는가)은 이미 정의되어 있으므로, HOW(어떻게
|
|
|
87
87
|
- 테스트 실행 스크립트 (package.json scripts 등)
|
|
88
88
|
- Researcher (Sonnet): 외부 리서치. 필요시만 호출.
|
|
89
89
|
Agent(subagent_type="researcher", description="외부 리서치: {리서치 대상}", prompt="...")
|
|
90
|
+
**외부 API/서비스가 관련된 경우**: spec.md에 언급된 각 외부 대상(엔드포인트, 서비스, 플랫폼)에 대해 **개별적으로** 문서/인터페이스를 조사하라. 하나의 대상에 대한 문서를 다른 대상에 일반화하지 않는다. 문서가 확인되지 않는 대상은 "미검증 인터페이스"로 명시한다.
|
|
90
91
|
|
|
91
92
|
## 출력
|
|
92
93
|
아래 필수 섹션을 포함한 분석 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
93
94
|
|
|
94
|
-
필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 리서치(해당 시).
|
|
95
|
+
필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 인터페이스 검증(해당 시), 외부 리서치(해당 시).
|
|
95
96
|
|
|
96
97
|
## 규칙
|
|
97
98
|
- 요구사항에 빈틈이 있으면 AskUserQuestion으로 유저에게 직접 질문하라.
|
|
@@ -172,7 +173,7 @@ brief.md는 읽지 않는다.
|
|
|
172
173
|
## 출력
|
|
173
174
|
.crew/plans/{task-id}/plan.md 를 작성하라.
|
|
174
175
|
|
|
175
|
-
plan.md 필수 구조: 유저 스토리(US-N) 단위. 각 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨).
|
|
176
|
+
plan.md 필수 구조: 유저 스토리(US-N) 단위. 각 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨). 실행 검증 섹션(필수 — contract.md에 그대로 포함됨).
|
|
176
177
|
|
|
177
178
|
## 테스트 전략
|
|
178
179
|
analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라 태스크 구조를 달리한다.
|
|
@@ -195,6 +196,29 @@ analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라
|
|
|
195
196
|
|
|
196
197
|
plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명시한다.
|
|
197
198
|
|
|
199
|
+
### 외부 인터페이스 가정 (외부 API/서비스가 관련된 경우 필수)
|
|
200
|
+
analysis.md에 `## 외부 인터페이스 검증` 섹션이 있으면, plan.md에 `## 외부 인터페이스 가정` 섹션을 반드시 작성한다.
|
|
201
|
+
각 외부 대상에 대해 가정하는 인터페이스와 검증 상태를 명시한다:
|
|
202
|
+
|
|
203
|
+
| 대상 | 가정하는 인터페이스 | 근거 | 검증 상태 |
|
|
204
|
+
|------|------------------|------|----------|
|
|
205
|
+
| {대상 1} | {인터페이스 설명} | 공식 문서 확인 | 검증됨 |
|
|
206
|
+
| {대상 2} | {대상 1과 동일} | 문서 없음, 유추 | 미검증 |
|
|
207
|
+
|
|
208
|
+
**"미검증" 대상이 있으면**: 해당 대상에 대한 **스파이크 태스크**를 구현 태스크 앞에 배치한다.
|
|
209
|
+
스파이크 태스크는 실제 API를 호출하여 인터페이스를 확인하고, 검증된 대상과의 차이점을 기록한다.
|
|
210
|
+
차이가 발견되면 이후 구현 태스크의 접근 방식을 스파이크 결과에 따라 분기하도록 계획한다.
|
|
211
|
+
|
|
212
|
+
### 실행 검증 (필수, 테스트 전략과 무관하게 항상 포함)
|
|
213
|
+
유닛 테스트/자동화 테스트와 별개로, 구현된 기능을 실제로 실행하여 동작을 확인하는 절차를 `## 실행 검증` 섹션에 반드시 작성한다.
|
|
214
|
+
- 백엔드/API: 실제 API 호출 명령어(curl/httpie), 스크립트 실행, DB 쿼리 등
|
|
215
|
+
- UI/프론트엔드: 개발 서버 실행 후 브라우저에서 직접 조작하는 절차
|
|
216
|
+
- CLI/라이브러리: 실제 사용 예시 실행
|
|
217
|
+
"테스트 파일 실행"은 실행 검증이 아니다. 실제 기능을 사용자 관점에서 동작시키는 것이 실행 검증이다.
|
|
218
|
+
각 실행 검증 항목은 다음 형식으로 작성한다:
|
|
219
|
+
- 실행 방법: {구체적 명령어 또는 절차}
|
|
220
|
+
- 기대 결과: {확인할 출력 또는 동작}
|
|
221
|
+
|
|
198
222
|
## 규칙
|
|
199
223
|
- 코드를 작성하지 않는다.
|
|
200
224
|
- analysis.md의 아키텍처 방향과 가드레일을 따른다.
|
|
@@ -263,9 +287,17 @@ Agent(subagent_type="plan-evaluator", description="PlanEvaluator: {task-id} 계
|
|
|
263
287
|
- Tests-after: 구현 태스크 뒤에 테스트 작성 태스크가 있는가? 테스트 파일 경로가 명시되어 있는가?
|
|
264
288
|
- None: 이 항목을 YES로 처리한다.
|
|
265
289
|
[ ] E6. 비즈니스 가정 0개 — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가? plan에 "~로 가정", "~로 판단" 등 spec에 근거 없는 비즈니스 결정이 있으면 NO.
|
|
290
|
+
[ ] E7. 실행 검증 포함 — plan.md에 `## 실행 검증` 섹션이 있고, 유닛 테스트와 별개로 구현된 기능을 실제로 실행하여 동작을 확인하는 절차가 구체적으로 명시되어 있는가?
|
|
291
|
+
- 각 항목에 실행 방법(명령어/절차)과 기대 결과가 있는가?
|
|
292
|
+
- "테스트 파일 실행"만으로 구성되어 있으면 NO.
|
|
293
|
+
- 백엔드라면 실제 API 호출/스크립트 실행, UI라면 브라우저 조작 절차가 있어야 YES.
|
|
294
|
+
[ ] E8. 외부 인터페이스 가정 검증 — plan.md에서 여러 외부 서비스/엔드포인트를 동일한 인터페이스로 처리하는 태스크가 있는가? 있다면:
|
|
295
|
+
- `## 외부 인터페이스 가정` 섹션에 각 대상별 검증 상태가 명시되어 있는가?
|
|
296
|
+
- "미검증" 대상에 대해 스파이크 태스크가 구현 태스크 앞에 배치되어 있는가?
|
|
297
|
+
- 외부 API가 관련되지 않은 경우 이 항목을 YES로 처리한다.
|
|
266
298
|
|
|
267
299
|
## 판정 규칙
|
|
268
|
-
-
|
|
300
|
+
- 8개 항목 모두 YES → PASS
|
|
269
301
|
- 하나라도 NO → FAIL
|
|
270
302
|
- "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
|
|
271
303
|
|
|
@@ -279,7 +311,7 @@ Agent(subagent_type="explorer", description="코드 참조 확인: {파일 목
|
|
|
279
311
|
|
|
280
312
|
## 출력
|
|
281
313
|
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
282
|
-
형식: 판정(PASS/FAIL), 항목별 결과(E1-
|
|
314
|
+
형식: 판정(PASS/FAIL), 항목별 결과(E1-E8 YES/NO + 근거), FAIL 상세(NO 항목의 문제+수정 방향), 근본 원인 분류(FAIL 시).
|
|
283
315
|
```
|
|
284
316
|
|
|
285
317
|
**Step 4 결과 저장 (오케스트레이터 직접)**:
|
|
@@ -339,6 +371,13 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
|
|
|
339
371
|
- 행위: {실행할 것}
|
|
340
372
|
- 기대 결과: {검증할 것}
|
|
341
373
|
|
|
374
|
+
## 실행 검증
|
|
375
|
+
{plan.md의 실행 검증 섹션을 그대로 복사}
|
|
376
|
+
|
|
377
|
+
### {검증 1 제목}
|
|
378
|
+
- 실행 방법: {구체적 명령어 또는 절차}
|
|
379
|
+
- 기대 결과: {확인할 출력 또는 동작}
|
|
380
|
+
|
|
342
381
|
## 참조 문서
|
|
343
382
|
- 요구사항: .crew/plans/{task-id}/spec.md
|
|
344
383
|
- 사전 분석: .crew/plans/{task-id}/analysis.md
|
|
@@ -347,6 +386,9 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
|
|
|
347
386
|
## 검증 이력
|
|
348
387
|
PlanEvaluator PASS — review.md 참조
|
|
349
388
|
|
|
389
|
+
## 워크트리
|
|
390
|
+
mode: new
|
|
391
|
+
|
|
350
392
|
## 상태
|
|
351
393
|
ACTIVE
|
|
352
394
|
```
|