@jjlabsio/claude-crew 0.1.32 → 0.1.34
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 +8 -7
- package/README.md +22 -0
- package/agents/code-reviewer.md +7 -0
- package/agents/dev.md +7 -0
- package/agents/explorer.md +7 -0
- package/agents/plan-evaluator.md +7 -0
- package/agents/planner.md +7 -0
- package/agents/pm.md +7 -0
- package/agents/qa.md +8 -1
- package/agents/researcher.md +7 -0
- package/agents/techlead.md +7 -0
- package/data/agent-contracts.json +350 -0
- package/data/agent-instructions/code-reviewer.md +47 -0
- package/data/agent-instructions/dev.md +48 -0
- package/data/agent-instructions/explorer.md +14 -0
- package/data/agent-instructions/plan-evaluator.md +68 -0
- package/data/agent-instructions/planner.md +73 -0
- package/data/agent-instructions/pm.md +47 -0
- package/data/agent-instructions/qa.md +65 -0
- package/data/agent-instructions/researcher.md +15 -0
- package/data/agent-instructions/techlead.md +66 -0
- package/package.json +8 -3
- package/scripts/crew-agent-runner.mjs +323 -0
- package/scripts/lib/build.mjs +213 -0
- package/scripts/lib/cli.mjs +30 -0
- package/scripts/lib/config.mjs +33 -0
- package/scripts/lib/contracts.mjs +146 -0
- package/scripts/lib/dispatch.mjs +241 -0
- package/scripts/lib/installHooks.mjs +136 -0
- package/scripts/lib/pluginRoot.mjs +10 -0
- package/scripts/lib/render.mjs +110 -0
- package/scripts/lib/renderFollowup.mjs +51 -0
- package/scripts/lib/resolve.mjs +72 -0
- package/scripts/lib/validate.mjs +100 -0
- package/skills/crew-agent-runner/SKILL.md +115 -0
- package/skills/crew-dev/SKILL.md +162 -780
- package/skills/crew-interview/SKILL.md +135 -44
- package/skills/crew-plan/SKILL.md +217 -414
- package/skills/crew-setup/SKILL.md +32 -19
package/skills/crew-dev/SKILL.md
CHANGED
|
@@ -8,82 +8,20 @@ description: contract.md를 입력으로 받아 Dev + CodeReviewer + QA 파이
|
|
|
8
8
|
오케스트레이터로부터 task-id를 받아 `contract.md` 기반으로 구현을 완료하고 PR을 생성한다.
|
|
9
9
|
`contract.md`가 ACTIVE 상태여야 시작할 수 있다.
|
|
10
10
|
|
|
11
|
-
에이전트 간 소통은
|
|
11
|
+
에이전트 간 소통은 파일 산출물과 중앙 `crew-agent-runner` 스킬의 dispatch 계약을 통해서만 이루어진다.
|
|
12
|
+
이 문서는 역할, 입력, 기대 산출물, 검증 기준, 실패 처리만 정의한다. provider 선택, 런타임 호출, 후속 요청 처리, 사용자 질문 처리는 중앙 runner 계약을 따른다.
|
|
12
13
|
|
|
13
14
|
**v1 대비 변경**: Critic(DevAuditor) 제거. 오케스트레이터가 CodeReviewer + QA 결과로 직접 판정한다.
|
|
14
15
|
|
|
15
16
|
---
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## 공통 실행 원칙
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
각 에이전트 단계는 중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
|
|
21
|
+
오케스트레이터는 Phase 1에서 provider 설정을 해석하고, 이후 모든 역할 실행은 runner의 정규화된 AgentResult 응답 처리 규칙을 따른다.
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
오케스트레이터는 Phase 1에서 config 파일과 `data/provider-catalog.json`을 읽어 각 에이전트의 provider 설정을 결정한다.
|
|
24
|
-
|
|
25
|
-
**config 해석 우선순위 (cascading):**
|
|
26
|
-
1. `{projectRoot}/.crew/config.json`의 `providers.{role}` — 프로젝트 오버라이드 (최우선)
|
|
27
|
-
2. `~/.claude/crew/config.json`의 `providers.{role}` — 유저 레벨 기본값
|
|
28
|
-
3. `data/provider-catalog.json`의 `agent_defaults.{role}` — 하드코딩 폴백
|
|
29
|
-
|
|
30
|
-
**해석된 설정 예시:**
|
|
31
|
-
```json
|
|
32
|
-
{ "provider": "codex", "model": "gpt-5.5", "reasoning": "high" }
|
|
33
|
-
{ "provider": "claude", "model": "opus" }
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### 디스패치 규칙
|
|
37
|
-
|
|
38
|
-
**claude provider:**
|
|
39
|
-
```
|
|
40
|
-
Agent(subagent_type="{role}", model="{model}", description="...", prompt="...")
|
|
41
|
-
```
|
|
42
|
-
기존과 동일. `model` 파라미터를 설정값으로 전달한다.
|
|
43
|
-
|
|
44
|
-
**codex provider:**
|
|
45
|
-
```
|
|
46
|
-
Bash("node \"${CLAUDE_PLUGIN_ROOT}/scripts/crew-codex-companion.mjs\" task --json {writeFlag} --expect-crew-result --model {model} --effort {reasoning} --prompt-file {promptFile}")
|
|
47
|
-
```
|
|
48
|
-
- 프롬프트는 임시 파일에 저장하고 `--prompt-file`로 전달한다.
|
|
49
|
-
- `writeFlag`는 `data/provider-catalog.json`의 `agent_runtime.{role}.codex_sandbox`가 `workspace-write`일 때만 `--write`로 설정한다. 기본값은 read-only이며 `dev`만 workspace-write다.
|
|
50
|
-
- Codex는 CWD 기준으로 작업하므로 워크트리 안에서 실행한다.
|
|
51
|
-
- Codex app-server thread id와 stdout에서 결과를 캡처한다.
|
|
52
|
-
- 같은 Codex 작업을 이어갈 때는 `--resume-last`를 사용한다.
|
|
53
|
-
|
|
54
|
-
**codex provider 제약:**
|
|
55
|
-
- Codex는 Claude Code의 Read/Edit/Glob 도구가 아닌 자체 도구를 사용한다.
|
|
56
|
-
- Codex 에이전트는 `.crew/` 접근 정책을 우회하면 안 된다. 필요한 `.crew/` 내용은 오케스트레이터가 프롬프트에 인라인으로 주입한다.
|
|
57
|
-
- Codex dev-log.md 작성: Codex stdout을 오케스트레이터가 파싱하여 dev-log.md를 생성한다.
|
|
58
|
-
|
|
59
|
-
### AgentResult 공통 프로토콜
|
|
60
|
-
|
|
61
|
-
Codex provider를 사용하는 모든 에이전트는 마지막에 아래 블록을 반드시 출력한다. 오케스트레이터는 `--expect-crew-result` payload의 `crewAgentResult`를 파싱하여 상태별 후속 액션을 수행한다.
|
|
62
|
-
|
|
63
|
-
```json
|
|
64
|
-
<crew-agent-result>
|
|
65
|
-
{
|
|
66
|
-
"status": "complete",
|
|
67
|
-
"artifact": "에이전트 최종 결과 또는 산출물",
|
|
68
|
-
"questions": [],
|
|
69
|
-
"requests": [],
|
|
70
|
-
"summary": "짧은 요약",
|
|
71
|
-
"error": null
|
|
72
|
-
}
|
|
73
|
-
</crew-agent-result>
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
허용 상태:
|
|
77
|
-
- `complete`: `artifact`를 저장하거나 다음 단계로 전달한다.
|
|
78
|
-
- `blocked_on_user`: `questions`를 `AskUserQuestion`으로 질문한 뒤 같은 에이전트를 `--resume-last`로 이어간다.
|
|
79
|
-
- `needs_agent`: `requests`의 `role`/`prompt`를 `runAgent`로 실행한 뒤 결과를 같은 에이전트에 주입한다.
|
|
80
|
-
- `needs_tool`: 오케스트레이터가 허용된 Claude Code 도구를 실행한 뒤 결과를 같은 에이전트에 주입한다.
|
|
81
|
-
- `failed`: crash/retry/fallback/escalation 정책을 적용한다.
|
|
82
|
-
|
|
83
|
-
루프 상한:
|
|
84
|
-
- 한 에이전트 실행당 AgentResult 후속 루프는 최대 5회.
|
|
85
|
-
- 유저 질문은 한 에이전트 실행당 최대 3회.
|
|
86
|
-
- `needs_agent` 요청은 한 에이전트 실행당 최대 5개.
|
|
23
|
+
에이전트가 사용자 입력이 필요하다고 반환하면 오케스트레이터가 사용자에게 질문한다.
|
|
24
|
+
에이전트가 추가 역할 실행이나 허용 도구 실행을 요청하면 오케스트레이터가 runner 정책에 따라 처리하고 같은 역할 실행에 후속 입력으로 주입한다.
|
|
87
25
|
|
|
88
26
|
---
|
|
89
27
|
|
|
@@ -91,742 +29,186 @@ Codex provider를 사용하는 모든 에이전트는 마지막에 아래 블록
|
|
|
91
29
|
|
|
92
30
|
- 오케스트레이터가 코드를 직접 작성하지 않는다.
|
|
93
31
|
- CodeReviewer 또는 QA가 FAIL을 냈을 때 합리화하여 통과시키지 않는다.
|
|
94
|
-
- brief.md
|
|
95
|
-
- contract.md
|
|
96
|
-
- plan.md
|
|
97
|
-
- git commit 시 `--no-verify`를 생략하지
|
|
32
|
+
- `brief.md`를 어떤 에이전트에게도 전달하지 않는다.
|
|
33
|
+
- `contract.md`를 CodeReviewer에게 전달하지 않는다. 가드레일만 인라인 주입한다.
|
|
34
|
+
- `plan.md`를 CodeReviewer에게 전달하지 않는다.
|
|
35
|
+
- git commit 시 `--no-verify`를 생략하지 않는다. 호스트 프로젝트의 pre-commit hook 중복 실행을 방지하기 위함이다.
|
|
98
36
|
- Dev가 자체 검증을 통과하지 못한 상태에서 검증 단계로 넘기지 않는다.
|
|
37
|
+
- 에이전트가 허용된 산출물 범위를 넘어 `.crew/` 메타 파일을 탐색하거나 읽게 하지 않는다.
|
|
99
38
|
|
|
100
39
|
---
|
|
101
40
|
|
|
102
41
|
## 파일 구조
|
|
103
42
|
|
|
104
|
-
```
|
|
43
|
+
```text
|
|
105
44
|
.crew/plans/{task-id}/
|
|
106
|
-
# crew-plan 산출물 (입력, 이미 존재)
|
|
107
45
|
brief.md # crew-interview: 유저 원본 요청
|
|
108
46
|
spec.md # crew-interview: 인터뷰 완료 후 결정화된 스펙
|
|
109
47
|
analysis.md # TechLead 출력
|
|
110
48
|
plan.md # Planner 출력
|
|
111
49
|
contract.md # 스프린트 계약
|
|
112
50
|
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
qa-report.md # QA: US 단위 검증 결과 (최신)
|
|
51
|
+
dev-log.md # Dev: 구현 진행 로그, US별 섹션 누적
|
|
52
|
+
review-report.md # CodeReviewer: US 단위 리뷰 결과, 최신
|
|
53
|
+
qa-report.md # QA: US 단위 검증 결과, 최신
|
|
117
54
|
review-report-{n}.md # US 단위 FAIL 시 아카이브
|
|
118
55
|
qa-report-{n}.md # US 단위 FAIL 시 아카이브
|
|
119
56
|
final-review-report.md # CodeReviewer: 최종 전체 리뷰 결과
|
|
120
57
|
final-qa-report.md # QA: 최종 전체 검증 결과
|
|
121
|
-
.dev_loop_count # US별 개발 루프
|
|
122
|
-
.dev_crash_count # US별 구현 crash
|
|
123
|
-
.dev_crash_provider # crash 발생 시 현재 사용 중인 provider
|
|
58
|
+
.dev_loop_count # US별 개발 루프 카운터, US PASS 시 리셋
|
|
59
|
+
.dev_crash_count # US별 구현 crash 카운터, US PASS 시 리셋
|
|
60
|
+
.dev_crash_provider # crash 발생 시 현재 사용 중인 provider 기록
|
|
124
61
|
```
|
|
125
62
|
|
|
126
63
|
---
|
|
127
64
|
|
|
128
65
|
## 에이전트 정보 차단 정책
|
|
129
66
|
|
|
130
|
-
| 에이전트 |
|
|
131
|
-
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
136
|
-
**중요**: 모든 에이전트 호출 시 반드시 `subagent_type` 파라미터를 지정해야 한다. `subagent_type`이 없으면 PreToolUse hook이 호출을 차단한다. `model` 파라미터는 생략 가능 — hook이 에이전트 정의에서 자동 주입한다.
|
|
67
|
+
| 에이전트 | 역할 | 볼 수 있는 것 | 차단 | 차단 근거 |
|
|
68
|
+
|----------|------|---------------|------|----------|
|
|
69
|
+
| Dev | 구현 | `plan.md`, `contract.md`, retry 피드백 산출물 | `brief.md`, `spec.md`, `analysis.md` | 의도 추측 방지, plan+contract에 필요 정보 포함 |
|
|
70
|
+
| CodeReviewer | 코드 리뷰 | 코드 변경분, contract 가드레일 인라인 요약 | `contract.md`, `plan.md`, `brief.md`, `spec.md`, `dev-log.md`, `.crew/` 메타 변경분 | 수용 기준 체리피킹 방지 |
|
|
71
|
+
| QA | 검증 | `plan.md`, 코드베이스, 실행 결과 | `contract.md`, `brief.md`, `spec.md` | 검증 편향 방지 |
|
|
137
72
|
|
|
138
73
|
---
|
|
139
74
|
|
|
140
75
|
## 실행 순서
|
|
141
76
|
|
|
142
|
-
### Phase 1 — 환경 준비
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
contract.md
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
- 빌드 성공 확인
|
|
281
|
-
- 린트 통과 확인
|
|
282
|
-
- 타입 체크 통과 확인
|
|
283
|
-
- 기존 테스트 스위트 통과 확인
|
|
284
|
-
- lint-staged 검증: `npx lint-staged --dry-run` 실행 (설정이 있는 경우에만)
|
|
285
|
-
7. 자체 검증이 모두 통과하면 완료를 선언한다.
|
|
286
|
-
자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
287
|
-
|
|
288
|
-
## 출력
|
|
289
|
-
.crew/plans/{task-id}/dev-log.md 에 US-{k} 섹션을 추가하라.
|
|
290
|
-
|
|
291
|
-
## 규칙
|
|
292
|
-
- US-{k}의 태스크만 구현한다 (다른 US 금지).
|
|
293
|
-
- 자체 검증 5개(빌드/린트/타입/테스트/lint-staged) 모두 PASS 해야 완료를 선언할 수 있다.
|
|
294
|
-
- 기존 코드베이스의 컨벤션을 따른다.
|
|
295
|
-
- TDD 전략인 경우, 테스트를 먼저 작성하지 않고 프로덕션 코드를 작성하지 않는다.
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
**retry 시 에이전트 프롬프트**:
|
|
299
|
-
|
|
300
|
-
```
|
|
301
|
-
이전 US-{k} 구현이 검증에서 FAIL을 받았다. 수정한다.
|
|
302
|
-
|
|
303
|
-
## 입력
|
|
304
|
-
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
305
|
-
.crew/plans/{task-id}/contract.md 를 읽어라.
|
|
306
|
-
.crew/plans/{task-id}/review-report-{n}.md 를 읽어라. (CodeReviewer 피드백)
|
|
307
|
-
.crew/plans/{task-id}/qa-report-{n}.md 를 읽어라. (QA 피드백)
|
|
308
|
-
brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
309
|
-
|
|
310
|
-
## 작업 범위
|
|
311
|
-
US-{k}에 해당하는 피드백만 수정한다. 다른 US의 코드를 변경하지 않는다.
|
|
312
|
-
|
|
313
|
-
## 작업 순서
|
|
314
|
-
1. 피드백에서 FAIL 항목을 모두 파악한다.
|
|
315
|
-
2. 각 FAIL 항목에 대해 수정을 수행한다.
|
|
316
|
-
3. dev-log.md를 갱신한다 (US-{k} 섹션 최상단에 "수정 이력 (retry {n})" 추가).
|
|
317
|
-
4. 자체 검증 5개를 모두 다시 실행한다 (빌드/린트/타입/테스트/lint-staged).
|
|
318
|
-
|
|
319
|
-
## 규칙
|
|
320
|
-
- 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
|
|
321
|
-
- 자체 검증 5개 모두 PASS 해야 완료를 선언할 수 있다.
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
**codex provider인 경우:**
|
|
325
|
-
|
|
326
|
-
오케스트레이터가 plan.md에서 US-{k} 섹션과 contract.md의 수용 기준을 추출하여 프롬프트에 인라인으로 주입한다.
|
|
327
|
-
|
|
328
|
-
```bash
|
|
329
|
-
node "${CLAUDE_PLUGIN_ROOT}/scripts/crew-codex-companion.mjs" task --json --write --expect-crew-result --model {model} --effort "{reasoning}" --prompt-file "{promptFile}"
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
`{promptFile}` 내용:
|
|
333
|
-
|
|
334
|
-
```markdown
|
|
335
|
-
당신은 Dev 에이전트다. 아래 유저 스토리 US-{k}만 구현한다.
|
|
336
|
-
|
|
337
|
-
## US-{k} (plan.md에서 추출)
|
|
338
|
-
{오케스트레이터가 US-{k} 섹션만 인라인 삽입}
|
|
339
|
-
|
|
340
|
-
## 테스트 전략
|
|
341
|
-
{오케스트레이터가 테스트 전략 섹션 인라인 삽입}
|
|
342
|
-
|
|
343
|
-
## contract.md (수용 기준)
|
|
344
|
-
{오케스트레이터가 수용 기준 섹션 인라인 삽입}
|
|
345
|
-
|
|
346
|
-
## 작업 순서
|
|
347
|
-
1. 코드베이스를 탐색하여 관련 파일을 파악한다.
|
|
348
|
-
2. US-{k}의 태스크만 구현한다.
|
|
349
|
-
3. 자체 검증을 실행한다 (빌드/린트/타입/테스트).
|
|
350
|
-
4. 자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
351
|
-
|
|
352
|
-
## 규칙
|
|
353
|
-
- US-{k}의 태스크만 구현한다 (다른 US 금지).
|
|
354
|
-
- 자체 검증 모두 PASS 해야 완료를 선언할 수 있다.
|
|
355
|
-
- 기존 코드베이스의 컨벤션을 따른다.
|
|
356
|
-
|
|
357
|
-
## 완료 시 출력
|
|
358
|
-
구현 요약을 출력하고, 마지막에 `<crew-agent-result>` 블록을 포함하라:
|
|
359
|
-
|
|
360
|
-
<crew-agent-result>
|
|
361
|
-
{
|
|
362
|
-
"status": "complete",
|
|
363
|
-
"artifact": "변경한 파일 목록, US-{k} 구현 요약, 자체 검증 결과",
|
|
364
|
-
"questions": [],
|
|
365
|
-
"requests": [],
|
|
366
|
-
"summary": "US-{k} 구현 완료",
|
|
367
|
-
"error": null
|
|
368
|
-
}
|
|
369
|
-
</crew-agent-result>
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
Codex stdout을 캡처하여 dev-log.md의 US-{k} 섹션으로 추가한다.
|
|
373
|
-
|
|
374
|
-
**retry 시 (codex provider)**: 프롬프트에 review-report-{n}.md와 qa-report-{n}.md 내용을 인라인 삽입한다.
|
|
375
|
-
|
|
376
|
-
##### Step 1a — Dev 에이전트 crash 감지 및 복구
|
|
377
|
-
|
|
378
|
-
Dev 에이전트(claude 또는 codex)가 정상 완료하지 못한 경우를 처리한다.
|
|
379
|
-
|
|
380
|
-
**crash 판정 기준:**
|
|
381
|
-
|
|
382
|
-
| Provider | crash 신호 |
|
|
383
|
-
|----------|-----------|
|
|
384
|
-
| codex | Bash exit code != 0, timeout |
|
|
385
|
-
| claude | Agent 결과에 자체 검증 결과(PASS/FAIL) 미선언, 비정상 종료 |
|
|
386
|
-
|
|
387
|
-
**crash가 아닌 경우** (정상 완료): Step 2로 진행한다.
|
|
388
|
-
|
|
389
|
-
**crash인 경우**:
|
|
390
|
-
|
|
391
|
-
**1a-1. 부분 변경 롤백**
|
|
392
|
-
|
|
393
|
-
```bash
|
|
394
|
-
git reset --hard HEAD
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
마지막 체크포인트 커밋(이전 US의 커밋 또는 워크트리 초기 상태)으로 복귀한다. 부분 구현을 이어받지 않는다 — 컨텍스트 손실로 인한 코드 불일치 리스크를 제거하기 위함이다.
|
|
398
|
-
|
|
399
|
-
**1a-2. crash 카운터 읽기**
|
|
400
|
-
|
|
401
|
-
`.crew/plans/{task-id}/.dev_crash_count` 파일을 읽는다.
|
|
402
|
-
- 파일이 없으면 카운터 = 0
|
|
403
|
-
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
404
|
-
|
|
405
|
-
`.crew/plans/{task-id}/.dev_crash_provider` 파일을 읽는다.
|
|
406
|
-
- 파일이 없으면 현재 provider 설정값
|
|
407
|
-
|
|
408
|
-
**1a-3. 재시도 또는 provider 전환 판단**
|
|
409
|
-
|
|
410
|
-
```
|
|
411
|
-
crash 카운터 < 2 → 같은 provider로 재시도 (Step 1로)
|
|
412
|
-
crash 카운터 >= 2 AND 현재 provider가 codex → claude로 전환, 카운터 리셋 (Step 1로)
|
|
413
|
-
crash 카운터 >= 2 AND 현재 provider가 claude → 유저 에스컬레이션
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
**provider 전환 시:**
|
|
417
|
-
- `.dev_crash_count`를 0으로 리셋한다.
|
|
418
|
-
- `.dev_crash_provider`를 전환된 provider로 갱신한다.
|
|
419
|
-
- 이후 Step 1에서 전환된 provider로 디스패치한다.
|
|
420
|
-
|
|
421
|
-
**에스컬레이션 메시지:**
|
|
422
|
-
|
|
423
|
-
```
|
|
424
|
-
US-{k} 구현이 반복 실패합니다.
|
|
425
|
-
- 원래 provider: {원래 provider} (2회 crash)
|
|
426
|
-
- 전환 provider: {전환 provider} (2회 crash)
|
|
427
|
-
[1] plan.md에서 US-{k}를 더 작게 분할
|
|
428
|
-
[2] 수동으로 구현
|
|
429
|
-
[3] 이 태스크를 보류
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
에스컬레이션 시:
|
|
433
|
-
- `.dev_crash_count`, `.dev_crash_provider` 파일을 삭제한다.
|
|
434
|
-
- contract.md 상태를 `BLOCKED — US-{k} 구현 crash`로 갱신한다.
|
|
435
|
-
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
436
|
-
|
|
437
|
-
**1a-4. crash 카운터 증가 저장**
|
|
438
|
-
|
|
439
|
-
`카운터 + 1`을 `.dev_crash_count` 파일에 저장한다.
|
|
440
|
-
현재 provider를 `.dev_crash_provider` 파일에 저장한다.
|
|
441
|
-
|
|
442
|
-
Step 1로 돌아간다.
|
|
443
|
-
|
|
444
|
-
##### Step 2 — US-k 검증 (CodeReviewer + QA 병렬)
|
|
445
|
-
|
|
446
|
-
CodeReviewer와 QA를 **동시에** 호출한다. US-k의 변경분만 검증한다.
|
|
447
|
-
|
|
448
|
-
**CodeReviewer (US-k)**
|
|
449
|
-
|
|
450
|
-
오케스트레이터 사전 작업:
|
|
451
|
-
1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
452
|
-
2. 가드레일을 프롬프트에 인라인 주입한다.
|
|
453
|
-
|
|
454
|
-
에이전트 프롬프트:
|
|
455
|
-
|
|
456
|
-
```
|
|
457
|
-
당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
|
|
458
|
-
|
|
459
|
-
## 입력
|
|
460
|
-
`git diff HEAD -- ':!.crew/'`를 직접 실행하여 마지막 커밋 이후의 **코드 산출물 변경 사항만** 확인하라. (`.crew/` 디렉토리는 crew-dev 파이프라인의 메타 파일로, 본 리뷰 범위가 아니다.)
|
|
461
|
-
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
462
|
-
코드만 보고 판단한다.
|
|
463
|
-
|
|
464
|
-
### 가드레일 (contract.md에서 추출)
|
|
465
|
-
#### Must
|
|
466
|
-
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
467
|
-
#### Must NOT
|
|
468
|
-
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
469
|
-
|
|
470
|
-
위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
|
|
471
|
-
|
|
472
|
-
## 검토 항목
|
|
473
|
-
1. 가드레일 위반 (위반 시 critical)
|
|
474
|
-
2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
|
|
475
|
-
3. 보안 취약점
|
|
476
|
-
4. 불필요한 복잡도
|
|
477
|
-
5. 잠재적 버그
|
|
478
|
-
6. 에러 처리 적절성
|
|
479
|
-
|
|
480
|
-
## 출력
|
|
481
|
-
아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
482
|
-
|
|
483
|
-
## 판정 규칙
|
|
484
|
-
- 가드레일 위반 → critical
|
|
485
|
-
- critical 또는 major가 1개 이상 → FAIL
|
|
486
|
-
- minor만 있거나 지적 없음 → PASS
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
**QA (US-k)**
|
|
490
|
-
|
|
491
|
-
에이전트 프롬프트:
|
|
492
|
-
|
|
493
|
-
```
|
|
494
|
-
당신은 QA 에이전트다. US-{k}의 구현이 실제로 동작하는지 검증한다.
|
|
495
|
-
|
|
496
|
-
## 입력
|
|
497
|
-
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
498
|
-
plan.md의 US-{k} 테스트 시나리오를 확인하라.
|
|
499
|
-
contract.md, brief.md, spec.md는 읽지 않는다.
|
|
500
|
-
|
|
501
|
-
## 검증 항목 (순서대로 실행)
|
|
502
|
-
1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
|
|
503
|
-
2. 린트 검증
|
|
504
|
-
3. 타입 체크 검증
|
|
505
|
-
4. 테스트 스위트 검증 (전체 테스트 실행 — 기존 테스트 회귀 방지)
|
|
506
|
-
5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
|
|
507
|
-
- plan.md의 US-{k}에 명시된 테스트 파일이 실제로 존재하는가?
|
|
508
|
-
- 해당 테스트가 실행되고 통과하는가?
|
|
509
|
-
- None인 경우 이 항목을 PASS로 처리한다.
|
|
510
|
-
6. US-{k} 시나리오 검증 — plan.md의 US-{k} 테스트 시나리오 기반
|
|
511
|
-
|
|
512
|
-
## 출력
|
|
513
|
-
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
514
|
-
|
|
515
|
-
## 판정 규칙
|
|
516
|
-
- 항목 1-6 중 하나라도 FAIL → 전체 FAIL
|
|
517
|
-
- 모든 항목 PASS → 전체 PASS
|
|
518
|
-
|
|
519
|
-
## 규칙
|
|
520
|
-
- 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
|
|
521
|
-
- 실행 출력을 반드시 캡처하여 기록한다.
|
|
522
|
-
- 코드를 수정하지 않는다. 검증만 한다.
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
**병렬 실행 방법**: Phase 3과 동일 (provider 조합에 따라 Agent/Bash 병렬 호출).
|
|
526
|
-
|
|
527
|
-
Codex provider인 CodeReviewer/QA는 read-only로 실행한다. `--write`를 붙이지 않는다.
|
|
528
|
-
|
|
529
|
-
```bash
|
|
530
|
-
node "${CLAUDE_PLUGIN_ROOT}/scripts/crew-codex-companion.mjs" task --json --expect-crew-result --model {model} --effort "{reasoning}" --prompt-file "{promptFile}"
|
|
531
|
-
```
|
|
532
|
-
|
|
533
|
-
CodeReviewer/QA Codex 프롬프트도 마지막에 `<crew-agent-result>` 블록을 포함해야 한다. 검토/검증 결과는 `artifact`에 넣고, 판정이 불가능하면 `failed` 또는 `needs_tool`을 반환한다.
|
|
534
|
-
|
|
535
|
-
**결과 저장 (오케스트레이터 직접)**:
|
|
536
|
-
- CodeReviewer 결과 → `.crew/plans/{task-id}/review-report.md`
|
|
537
|
-
- QA 결과 → `.crew/plans/{task-id}/qa-report.md`
|
|
538
|
-
|
|
539
|
-
##### Step 3 — US-k 판정
|
|
540
|
-
|
|
541
|
-
오케스트레이터가 직접 판정한다:
|
|
542
|
-
- CodeReviewer PASS + QA PASS → **US-k PASS** → Step 4로
|
|
543
|
-
- 하나라도 FAIL → **US-k FAIL** → Step 5로
|
|
544
|
-
|
|
545
|
-
##### Step 4 — US-k 체크포인트 커밋
|
|
546
|
-
|
|
547
|
-
US-k가 PASS하면 즉시 커밋하여 체크포인트를 만든다:
|
|
548
|
-
|
|
549
|
-
```bash
|
|
550
|
-
git add -A
|
|
551
|
-
git commit --no-verify -m "feat({task-id}): US-{k} {US 제목}"
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
> `--no-verify`: 검증 단계에서 이미 빌드/린트/타입/테스트를 통과했으므로 pre-commit hook을 중복 실행하지 않는다.
|
|
555
|
-
|
|
556
|
-
`.dev_loop_count` 파일이 존재하면 삭제한다 (US-k 루프 카운터 리셋).
|
|
557
|
-
`.dev_crash_count`, `.dev_crash_provider` 파일이 존재하면 삭제한다 (crash 카운터 리셋).
|
|
558
|
-
|
|
559
|
-
**다음 US 진행**: k를 증가시키고 Step 1로 돌아간다.
|
|
560
|
-
**모든 US 완료**: Phase 3으로 진행한다.
|
|
561
|
-
|
|
562
|
-
##### Step 5 — US-k FAIL 처리
|
|
563
|
-
|
|
564
|
-
**5a. 루프 카운터 읽기**
|
|
565
|
-
|
|
566
|
-
`.crew/plans/{task-id}/.dev_loop_count` 파일을 읽는다.
|
|
567
|
-
- 파일이 없으면 카운터 = 0
|
|
568
|
-
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
569
|
-
|
|
570
|
-
**5b. 에스컬레이션 판단**
|
|
571
|
-
|
|
572
|
-
두 가지 에스컬레이션 조건:
|
|
573
|
-
|
|
574
|
-
**조건 1 — 루프 상한 초과**:
|
|
575
|
-
|
|
576
|
-
카운터 값 >= 4이면 즉시 에스컬레이션:
|
|
577
|
-
|
|
578
|
-
```
|
|
579
|
-
US-{k}이 5회 반복 후에도 검증을 통과하지 못했습니다.
|
|
580
|
-
최종 FAIL 사유를 첨부합니다.
|
|
581
|
-
[1] US-{k}의 범위를 좁혀서 재시도
|
|
582
|
-
[2] plan.md를 수정
|
|
583
|
-
[3] 이 태스크를 보류
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
에스컬레이션 시:
|
|
587
|
-
- `.dev_loop_count` 파일을 삭제한다.
|
|
588
|
-
- contract.md 상태를 `BLOCKED — US-{k}에서 중단`으로 갱신한다.
|
|
589
|
-
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
590
|
-
|
|
591
|
-
**조건 2 — 같은 기준 3회 연속 실패**:
|
|
592
|
-
|
|
593
|
-
review-report.md와 qa-report.md에서 FAIL 항목을 확인한다.
|
|
594
|
-
이전 아카이브와 비교하여 같은 항목이 3회 연속 FAIL이면 즉시 에스컬레이션:
|
|
595
|
-
|
|
596
|
-
```
|
|
597
|
-
US-{k}의 {항목}이 3회 연속 FAIL입니다. 구조적 문제로 판단합니다.
|
|
598
|
-
[1] plan.md를 수정 (구현 전략의 문제)
|
|
599
|
-
[2] contract.md를 수정 (기준 자체의 문제)
|
|
600
|
-
[3] 이 태스크를 보류
|
|
601
|
-
```
|
|
602
|
-
|
|
603
|
-
에스컬레이션 시 `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
604
|
-
|
|
605
|
-
**5c. 피드백 아카이브**
|
|
606
|
-
|
|
607
|
-
`n = 카운터 + 1`
|
|
608
|
-
|
|
609
|
-
```
|
|
610
|
-
review-report.md → review-report-{n}.md
|
|
611
|
-
qa-report.md → qa-report-{n}.md
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
**5d. 루프 카운터 증가 저장**
|
|
615
|
-
|
|
616
|
-
`카운터 + 1`을 `.dev_loop_count` 파일에 저장한다.
|
|
617
|
-
|
|
618
|
-
**5e. Step 1로 돌아감 (US-k retry)**
|
|
619
|
-
|
|
620
|
-
Step 1(Dev)로 돌아간다. Dev retry 프롬프트에 아카이브된 피드백 파일을 주입한다.
|
|
621
|
-
Dev 수정 완료 후 Step 2(CodeReviewer + QA)를 재실행한다.
|
|
622
|
-
|
|
623
|
-
---
|
|
624
|
-
|
|
625
|
-
### Phase 3 — 최종 전체 검증 (CodeReviewer + QA)
|
|
626
|
-
|
|
627
|
-
모든 US가 개별 검증을 통과한 후, 전체 변경 사항에 대해 통합 검증을 수행한다.
|
|
628
|
-
US 간 상호작용에서 발생할 수 있는 문제를 잡기 위한 단계다.
|
|
629
|
-
|
|
630
|
-
CodeReviewer와 QA를 **동시에** 호출한다.
|
|
631
|
-
|
|
632
|
-
#### Phase 3a — CodeReviewer (전체)
|
|
633
|
-
|
|
634
|
-
오케스트레이터 사전 작업:
|
|
635
|
-
1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
636
|
-
2. 가드레일을 프롬프트에 인라인 주입한다.
|
|
637
|
-
|
|
638
|
-
에이전트 프롬프트:
|
|
639
|
-
|
|
640
|
-
```
|
|
641
|
-
당신은 CodeReviewer 에이전트다. 전체 코드 변경 사항의 품질을 판단한다.
|
|
642
|
-
|
|
643
|
-
## 입력
|
|
644
|
-
`git diff main...HEAD -- ':!.crew/'`를 직접 실행하여 전체 **코드 산출물 변경 사항만** 확인하라. (`.crew/` 디렉토리는 crew-dev 파이프라인의 메타 파일로, 본 리뷰 범위가 아니다.)
|
|
645
|
-
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
646
|
-
코드만 보고 판단한다.
|
|
647
|
-
|
|
648
|
-
### 가드레일 (contract.md에서 추출)
|
|
649
|
-
#### Must
|
|
650
|
-
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
651
|
-
#### Must NOT
|
|
652
|
-
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
653
|
-
|
|
654
|
-
위 가드레일을 위반하는 변경이 있으면 critical로 지적하라.
|
|
655
|
-
|
|
656
|
-
## 검토 항목
|
|
657
|
-
1. 가드레일 위반 (위반 시 critical)
|
|
658
|
-
2. 코드베이스 컨벤션 준수 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
|
|
659
|
-
3. 보안 취약점
|
|
660
|
-
4. 불필요한 복잡도
|
|
661
|
-
5. 잠재적 버그
|
|
662
|
-
6. 에러 처리 적절성
|
|
663
|
-
7. **모듈 간 정합성** — 변경된 파일들 사이의 인터페이스, 타입, import가 일관적인가
|
|
664
|
-
|
|
665
|
-
## 출력
|
|
666
|
-
아래 형식으로 리뷰 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
667
|
-
|
|
668
|
-
## 판정 규칙
|
|
669
|
-
- 가드레일 위반 → critical
|
|
670
|
-
- critical 또는 major가 1개 이상 → FAIL
|
|
671
|
-
- minor만 있거나 지적 없음 → PASS
|
|
672
|
-
```
|
|
673
|
-
|
|
674
|
-
#### Phase 3b — QA (전체)
|
|
675
|
-
|
|
676
|
-
에이전트 프롬프트:
|
|
677
|
-
|
|
678
|
-
```
|
|
679
|
-
당신은 QA 에이전트다. 전체 구현이 실제로 동작하는지 최종 검증한다.
|
|
680
|
-
|
|
681
|
-
## 입력
|
|
682
|
-
.crew/plans/{task-id}/plan.md 를 읽어라.
|
|
683
|
-
plan.md의 모든 유저 스토리, 테스트 시나리오, 검증 시나리오를 확인하라.
|
|
684
|
-
contract.md, brief.md, spec.md는 읽지 않는다.
|
|
685
|
-
|
|
686
|
-
## 검증 항목 (순서대로 실행)
|
|
687
|
-
1. 빌드 검증 — FAIL이면 이후 항목 실행 없이 즉시 FAIL
|
|
688
|
-
2. 린트 검증
|
|
689
|
-
3. 타입 체크 검증
|
|
690
|
-
4. 테스트 스위트 검증 (전체 테스트)
|
|
691
|
-
5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
|
|
692
|
-
- plan.md에 명시된 모든 테스트 파일이 실제로 존재하는가?
|
|
693
|
-
- 해당 테스트가 실행되고 통과하는가?
|
|
694
|
-
- None인 경우 이 항목을 PASS로 처리한다.
|
|
695
|
-
6. 전체 E2E / 통합 검증 — plan.md의 모든 테스트 시나리오 기반
|
|
696
|
-
7. 실행 검증 — plan.md의 `## 실행 검증` 절차를 직접 실행한다.
|
|
697
|
-
- 자동화 테스트와 별개로, 구현된 기능을 사용자 관점에서 직접 실행한다.
|
|
698
|
-
- 백엔드: 실제 API 호출, 스크립트 실행 등
|
|
699
|
-
- UI: 개발 서버에서 브라우저 조작
|
|
700
|
-
- 각 항목의 기대 결과와 실제 결과를 비교하여 판정한다.
|
|
701
|
-
- 실행 검증 섹션이 plan.md에 없으면 즉시 FAIL.
|
|
702
|
-
|
|
703
|
-
## 출력
|
|
704
|
-
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
705
|
-
|
|
706
|
-
## 판정 규칙
|
|
707
|
-
- 항목 1-7 중 하나라도 FAIL → 전체 FAIL
|
|
708
|
-
- 모든 항목 PASS → 전체 PASS
|
|
709
|
-
|
|
710
|
-
## 규칙
|
|
711
|
-
- 모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
|
|
712
|
-
- 실행 출력을 반드시 캡처하여 기록한다.
|
|
713
|
-
- 코드를 수정하지 않는다. 검증만 한다.
|
|
714
|
-
```
|
|
715
|
-
|
|
716
|
-
**Phase 3 결과 저장 (오케스트레이터 직접)**:
|
|
717
|
-
|
|
718
|
-
CodeReviewer와 QA 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
|
|
719
|
-
오케스트레이터가 각 에이전트의 반환 텍스트를 파일로 저장한다:
|
|
720
|
-
- CodeReviewer 결과 → `.crew/plans/{task-id}/final-review-report.md`
|
|
721
|
-
- QA 결과 → `.crew/plans/{task-id}/final-qa-report.md`
|
|
722
|
-
|
|
723
|
-
**Phase 3 병렬 실행 방법**:
|
|
724
|
-
|
|
725
|
-
오케스트레이터는 CodeReviewer와 QA를 **동시에** 호출한다. provider 조합에 따라:
|
|
726
|
-
|
|
727
|
-
- 둘 다 claude → Agent tool 2개를 한 번에 호출
|
|
728
|
-
- 둘 다 codex → read-only Bash tool 2개를 한 번에 호출 (`--write` 금지)
|
|
729
|
-
- 혼합 → Agent + Bash를 한 번에 호출
|
|
730
|
-
|
|
731
|
-
---
|
|
732
|
-
|
|
733
|
-
### Phase 4 — 최종 판정 + 완료
|
|
734
|
-
|
|
735
|
-
**4a. 오케스트레이터 직접 판정**
|
|
736
|
-
|
|
737
|
-
판정 규칙:
|
|
738
|
-
- CodeReviewer PASS + QA PASS → **PASS** → 4b로
|
|
739
|
-
- 하나라도 FAIL → **FAIL** → 에스컬레이션
|
|
740
|
-
|
|
741
|
-
최종 전체 검증 FAIL 시 자동 retry하지 않는다. US 간 상호작용 문제는 어떤 US를 수정해야 하는지 자동 판단이 어렵기 때문이다.
|
|
742
|
-
|
|
743
|
-
```
|
|
744
|
-
최종 전체 검증에서 FAIL이 발생했습니다.
|
|
745
|
-
개별 US는 모두 통과했으나 통합 단계에서 문제가 발견되었습니다.
|
|
746
|
-
final-review-report.md, final-qa-report.md를 확인하세요.
|
|
747
|
-
[1] 문제 원인을 특정하여 해당 US를 수동 수정 후 재실행
|
|
748
|
-
[2] plan.md를 수정하여 US 간 의존성을 재설계
|
|
749
|
-
[3] 이 태스크를 보류
|
|
750
|
-
```
|
|
751
|
-
|
|
752
|
-
에스컬레이션 시:
|
|
753
|
-
- contract.md 상태를 `BLOCKED — 최종 전체 검증 FAIL`로 갱신한다.
|
|
754
|
-
- `ExitWorktree(action="keep")`으로 원본 프로젝트 디렉토리로 복귀한다.
|
|
755
|
-
|
|
756
|
-
**4b. PR 생성**
|
|
757
|
-
|
|
758
|
-
```bash
|
|
759
|
-
git push -u origin feat/{task-id}
|
|
760
|
-
```
|
|
761
|
-
|
|
762
|
-
> US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 불필요하다.
|
|
763
|
-
|
|
764
|
-
PR을 생성한다 (머지하지 않는다).
|
|
765
|
-
|
|
766
|
-
**4c. 상태 갱신**
|
|
767
|
-
|
|
768
|
-
contract.md의 `## 수용 기준` 섹션에서 모든 `- [ ]`를 `- [x]`로 변경한다.
|
|
769
|
-
|
|
770
|
-
contract.md의 `## 상태` 섹션을 갱신한다:
|
|
771
|
-
|
|
772
|
-
```markdown
|
|
773
|
-
## 상태
|
|
774
|
-
COMPLETED — 모든 수용 기준이 검증을 통과했다.
|
|
775
|
-
PR: {PR URL}
|
|
776
|
-
```
|
|
777
|
-
|
|
778
|
-
**4d. 정리**
|
|
779
|
-
|
|
780
|
-
`.dev_loop_count` 파일이 존재하면 삭제한다.
|
|
781
|
-
|
|
782
|
-
**4e. 워크트리 종료**
|
|
783
|
-
|
|
784
|
-
```
|
|
785
|
-
ExitWorktree(action="remove")
|
|
786
|
-
```
|
|
787
|
-
|
|
788
|
-
PR push가 완료되었으므로 로컬 워크트리를 제거하고 원본 프로젝트 디렉토리로 복귀한다.
|
|
789
|
-
|
|
790
|
-
**4f. 완료 반환**
|
|
791
|
-
|
|
792
|
-
```
|
|
793
|
-
상태: COMPLETE
|
|
794
|
-
task-id: {task-id}
|
|
795
|
-
PR: {PR URL}
|
|
796
|
-
```
|
|
797
|
-
|
|
798
|
-
---
|
|
799
|
-
|
|
800
|
-
## 루프 카운터 (.dev_loop_count) 생명주기
|
|
801
|
-
|
|
802
|
-
| 이벤트 | 동작 |
|
|
803
|
-
|--------|------|
|
|
804
|
-
| US-k 첫 진입 | 파일 없음 (카운터 = 0) |
|
|
805
|
-
| US-k n번째 FAIL 후 | 파일 갱신, 내용: `n` |
|
|
806
|
-
| US-k PASS (Step 4) | 파일 삭제 |
|
|
807
|
-
| 에스컬레이션 | 파일 삭제 |
|
|
808
|
-
|
|
809
|
-
각 US당 최대 5회 검증 사이클 (초기 1회 + retry 최대 4회).
|
|
810
|
-
|
|
811
|
-
---
|
|
812
|
-
|
|
813
|
-
## 오케스트레이터 반환 스키마
|
|
814
|
-
|
|
815
|
-
**COMPLETE**:
|
|
816
|
-
```json
|
|
817
|
-
{
|
|
818
|
-
"status": "COMPLETE",
|
|
819
|
-
"task_id": "{task-id}",
|
|
820
|
-
"pr_url": "{PR URL}"
|
|
821
|
-
}
|
|
822
|
-
```
|
|
823
|
-
|
|
824
|
-
**ESCALATE**:
|
|
825
|
-
```json
|
|
826
|
-
{
|
|
827
|
-
"status": "ESCALATE",
|
|
828
|
-
"phase": "invalid-contract" | "dev-fail" | "verify-fail" | "criterion-stuck" | "loop-overflow",
|
|
829
|
-
"reason": "자유형 텍스트",
|
|
830
|
-
"loop_count": 0
|
|
831
|
-
}
|
|
832
|
-
```
|
|
77
|
+
### Phase 1 — 환경 준비
|
|
78
|
+
|
|
79
|
+
중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
|
|
80
|
+
|
|
81
|
+
role: orchestrator
|
|
82
|
+
|
|
83
|
+
inputs:
|
|
84
|
+
- task-id
|
|
85
|
+
- `data/provider-catalog.json`
|
|
86
|
+
- 유저 레벨 및 프로젝트 레벨 provider 설정
|
|
87
|
+
- `contract.md`
|
|
88
|
+
- 현재 작업 디렉토리와 git 상태
|
|
89
|
+
|
|
90
|
+
output:
|
|
91
|
+
- 해석된 역할별 provider/model/runtime 정책
|
|
92
|
+
- 유효성이 확인된 ACTIVE `contract.md`
|
|
93
|
+
- 신규 또는 기존 워크트리 선택 결과
|
|
94
|
+
- `contract.md` 상태 갱신
|
|
95
|
+
|
|
96
|
+
role instructions:
|
|
97
|
+
- **Phase 1a — provider 설정 해석**: 오케스트레이터는 provider 설정을 해석한다. 프로젝트 설정, 유저 설정, catalog 기본값 순으로 역할별 실행 정책을 결정하고 Phase 2, Phase 3에서 사용할 런타임 제약을 기록한다.
|
|
98
|
+
- **Phase 1b — contract.md 검증**: `contract.md` 산출물을 읽는다. 파일 존재, `## 상태`의 ACTIVE 여부, `## 수용 기준`의 비어 있지 않음, `## 검증 시나리오` 존재를 확인한다.
|
|
99
|
+
- **Phase 1c — 워크트리 결정**: `contract.md`의 `## 워크트리` 섹션을 우선 적용한다. 없으면 현재 디렉토리가 해당 task-id의 워크트리인지 확인한다. 신규 워크트리는 기준 브랜치에서 준비하고, 기존 워크트리는 reset 없이 이어간다.
|
|
100
|
+
- **Phase 1d — 상태 갱신**: `contract.md`의 `## 상태` 섹션을 `IN_PROGRESS`로 갱신한다.
|
|
101
|
+
|
|
102
|
+
success gate:
|
|
103
|
+
- provider 정책이 역할별로 해석되었다.
|
|
104
|
+
- `contract.md`가 ACTIVE이며 필수 섹션을 가진다.
|
|
105
|
+
- 이후 모든 작업이 수행될 워크트리가 결정되었다.
|
|
106
|
+
- 상태가 `IN_PROGRESS`로 갱신되었다.
|
|
107
|
+
|
|
108
|
+
failure handling:
|
|
109
|
+
- `contract.md` 검증 실패 시 구체적 사유와 함께 사용자에게 선택지를 제시한다.
|
|
110
|
+
- 워크트리 준비 실패 시 상태를 BLOCKED로 갱신하고 작업을 중단한다.
|
|
111
|
+
- provider 해석 중 특정 provider를 사용할 수 없으면 runner 정책에 따라 fallback 또는 escalation을 적용한다.
|
|
112
|
+
|
|
113
|
+
### Phase 2 — US 단위 증분 루프
|
|
114
|
+
|
|
115
|
+
중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
|
|
116
|
+
|
|
117
|
+
role: orchestrator, Dev, CodeReviewer, QA
|
|
118
|
+
|
|
119
|
+
inputs:
|
|
120
|
+
- `plan.md`
|
|
121
|
+
- `contract.md`의 수용 기준과 가드레일
|
|
122
|
+
- 현재 US의 구현 범위
|
|
123
|
+
- retry 시 `review-report-{n}.md`, `qa-report-{n}.md` 피드백 산출물
|
|
124
|
+
- git diff와 실행 가능한 검증 명령
|
|
125
|
+
|
|
126
|
+
output:
|
|
127
|
+
- US별 구현 변경분
|
|
128
|
+
- `dev-log.md`의 US별 진행 기록
|
|
129
|
+
- `review-report.md`, `qa-report.md`
|
|
130
|
+
- FAIL 시 아카이브된 feedback 산출물
|
|
131
|
+
- PASS 시 US 단위 체크포인트 commit
|
|
132
|
+
|
|
133
|
+
role instructions:
|
|
134
|
+
- **Phase 2a — US 목록 파싱**: 오케스트레이터는 `plan.md`에서 `US-{N}` 목록을 순서대로 파싱한다. 현재 US 인덱스를 관리하며 한 번에 하나의 US만 진행한다.
|
|
135
|
+
- **Phase 2b Step 1 — Dev 실행**: Dev는 현재 US 하나만 구현한다. `plan.md` 산출물에서 해당 US와 테스트 전략을 확인하고, `contract.md` 산출물에서 수용 기준을 확인한다. TDD 전략이면 RED, GREEN, REFACTOR 순서를 지키고, tests-after 전략이면 구현 후 명시된 테스트를 작성한다. 완료 전 빌드, 린트, 타입 체크, 테스트, 적용 가능한 lint-staged 검증을 수행한다. `dev-log.md`에는 해당 US 섹션만 추가하거나 retry 이력을 갱신한다.
|
|
136
|
+
- **Phase 2b Step 1a — crash 감지 + retry**: Dev 실행이 비정상 종료되거나 자체 검증 결과가 불명확하면 crash로 판정한다. 오케스트레이터는 부분 변경을 마지막 체크포인트로 되돌리고 crash 카운터를 갱신한다. 동일 provider 재시도, provider fallback, 사용자 escalation은 runner 정책과 phase 카운터 규칙을 함께 적용한다.
|
|
137
|
+
- **Phase 2b Step 2 — CodeReviewer + QA 병렬 검증**: CodeReviewer와 QA는 동시에 실행한다. CodeReviewer는 `.crew/` 메타 변경을 제외한 코드 변경분과 인라인 가드레일만 보고 품질을 판정한다. QA는 `plan.md` 산출물에서 현재 US의 테스트 시나리오를 확인하고 빌드, 린트, 타입 체크, 전체 테스트, 테스트 전략 준수, US 시나리오 검증을 직접 실행한다. 두 역할은 파일을 직접 작성하지 않고 결과 텍스트를 반환하며, 오케스트레이터가 각 보고서 산출물로 저장한다.
|
|
138
|
+
- **Phase 2b Step 3 — 판정**: 오케스트레이터는 CodeReviewer PASS와 QA PASS가 모두 충족될 때만 US PASS로 판정한다. 하나라도 FAIL이면 US FAIL로 판정한다.
|
|
139
|
+
- **Phase 2b Step 4 — 체크포인트 commit**: US PASS 즉시 전체 변경을 stage하고 `--no-verify` 옵션으로 `feat({task-id}): US-{k} {US 제목}` 커밋을 만든다. US 루프 카운터와 crash 카운터 산출물이 있으면 삭제한다.
|
|
140
|
+
- **Phase 2b Step 5 — FAIL 처리**: 오케스트레이터는 루프 카운터를 읽고, 상한 초과 또는 같은 기준 3회 연속 실패를 확인한다. 계속 진행 가능하면 최신 review/qa 보고서를 번호가 붙은 산출물로 아카이브하고 카운터를 증가시킨 뒤 Dev retry로 돌아간다. Dev retry에는 해당 US의 피드백만 전달한다.
|
|
141
|
+
|
|
142
|
+
success gate:
|
|
143
|
+
- 현재 US의 Dev 자체 검증이 모두 PASS다.
|
|
144
|
+
- CodeReviewer와 QA가 모두 PASS를 반환했다.
|
|
145
|
+
- PASS한 US가 체크포인트 commit으로 보존되었다.
|
|
146
|
+
- 모든 US가 순차적으로 PASS하면 Phase 3으로 이동한다.
|
|
147
|
+
|
|
148
|
+
failure handling:
|
|
149
|
+
- crash 반복 시 provider fallback 또는 사용자 escalation을 적용하고, 필요하면 상태를 `BLOCKED — US-{k} 구현 crash`로 갱신한다.
|
|
150
|
+
- 검증 FAIL 반복 시 피드백 보존 루프를 유지한다.
|
|
151
|
+
- 루프 상한 초과 또는 같은 항목 3회 연속 FAIL이면 상태를 `BLOCKED — US-{k}에서 중단`으로 갱신하고 사용자에게 선택지를 제시한다.
|
|
152
|
+
|
|
153
|
+
### Phase 3 — 최종 통합 검증
|
|
154
|
+
|
|
155
|
+
중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
|
|
156
|
+
|
|
157
|
+
role: orchestrator, CodeReviewer, QA
|
|
158
|
+
|
|
159
|
+
inputs:
|
|
160
|
+
- 모든 US 체크포인트 이후의 전체 코드 변경분
|
|
161
|
+
- `contract.md`의 가드레일 인라인 요약
|
|
162
|
+
- `plan.md`의 모든 US, 테스트 시나리오, 검증 시나리오, 실행 검증 절차
|
|
163
|
+
|
|
164
|
+
output:
|
|
165
|
+
- `final-review-report.md`
|
|
166
|
+
- `final-qa-report.md`
|
|
167
|
+
- 최종 PASS 또는 FAIL 판정 입력
|
|
168
|
+
|
|
169
|
+
role instructions:
|
|
170
|
+
- CodeReviewer와 QA를 동시에 실행한다.
|
|
171
|
+
- CodeReviewer는 전체 코드 변경분을 대상으로 가드레일 위반, 컨벤션, 보안, 복잡도, 잠재 버그, 에러 처리, 모듈 간 정합성을 검토한다. `contract.md`, `plan.md`, `brief.md`, `spec.md`, `dev-log.md` 산출물은 읽지 않는다.
|
|
172
|
+
- QA는 전체 구현에 대해 빌드, 린트, 타입 체크, 전체 테스트, 테스트 전략 준수, 전체 E2E 또는 통합 검증, `plan.md`의 실행 검증 절차를 직접 실행한다. 실행 검증 절차가 없으면 FAIL로 판정한다.
|
|
173
|
+
- 두 역할은 파일을 직접 작성하지 않고 결과 텍스트를 반환한다. 오케스트레이터가 최종 보고서 산출물로 저장한다.
|
|
174
|
+
|
|
175
|
+
success gate:
|
|
176
|
+
- 최종 CodeReviewer 결과가 PASS다.
|
|
177
|
+
- 최종 QA 결과가 PASS다.
|
|
178
|
+
- 최종 보고서 산출물이 모두 저장되었다.
|
|
179
|
+
|
|
180
|
+
failure handling:
|
|
181
|
+
- 최종 전체 검증 FAIL 시 자동 retry하지 않는다.
|
|
182
|
+
- 상태를 `BLOCKED — 최종 전체 검증 FAIL`로 갱신한다.
|
|
183
|
+
- 개별 US는 통과했지만 통합 단계에서 실패했음을 사용자에게 알리고, 원인 특정 후 수동 수정, plan 재설계, 보류 중 하나를 선택하게 한다.
|
|
184
|
+
|
|
185
|
+
### Phase 4 — PR + 완료
|
|
186
|
+
|
|
187
|
+
중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
|
|
188
|
+
|
|
189
|
+
role: orchestrator
|
|
190
|
+
|
|
191
|
+
inputs:
|
|
192
|
+
- Phase 3 최종 보고서
|
|
193
|
+
- 현재 브랜치와 git 상태
|
|
194
|
+
- task-id와 PR 제목/본문에 필요한 요약
|
|
195
|
+
|
|
196
|
+
output:
|
|
197
|
+
- 원격 브랜치 push 결과
|
|
198
|
+
- 생성된 PR 링크
|
|
199
|
+
- `contract.md` 완료 상태
|
|
200
|
+
|
|
201
|
+
role instructions:
|
|
202
|
+
- **4a. 최종 판정**: CodeReviewer PASS와 QA PASS가 모두 충족될 때만 완료 처리한다. 하나라도 FAIL이면 Phase 3 failure handling을 적용한다.
|
|
203
|
+
- **4b. PR 생성**: US 단위 커밋은 Phase 2에서 이미 완료되었으므로 추가 커밋은 만들지 않는다. 현재 브랜치를 push하고 PR을 생성한다.
|
|
204
|
+
- PR 본문에는 구현 요약, 완료한 US 목록, 검증 결과, 최종 보고서 위치를 포함한다.
|
|
205
|
+
- PR 생성 후 `contract.md` 상태를 `DONE`으로 갱신한다.
|
|
206
|
+
|
|
207
|
+
success gate:
|
|
208
|
+
- 원격 브랜치가 push되었다.
|
|
209
|
+
- PR이 생성되었다.
|
|
210
|
+
- `contract.md` 상태가 완료로 갱신되었다.
|
|
211
|
+
|
|
212
|
+
failure handling:
|
|
213
|
+
- push 또는 PR 생성 실패 시 상태를 BLOCKED로 갱신하지 않는다. 코드 구현은 완료된 상태이므로 실패 원인과 재시도 명령을 사용자에게 제시한다.
|
|
214
|
+
- 최종 판정이 FAIL이면 PR을 생성하지 않는다.
|