@jjlabsio/claude-crew 0.1.8 → 0.1.10
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/hud/index.mjs +3 -2
- package/package.json +1 -1
- package/skills/crew-dev/SKILL.md +31 -19
- package/skills/crew-plan/SKILL.md +79 -2
- package/skills/crew/SKILL.md +0 -189
|
@@ -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.10",
|
|
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.10"
|
|
32
32
|
}
|
package/hud/index.mjs
CHANGED
|
@@ -281,13 +281,14 @@ function renderAgentsMultiLine(agents, maxLines = 5) {
|
|
|
281
281
|
const isLast = index === displayCount - 1 && sorted.length <= maxLines;
|
|
282
282
|
const prefix = isLast ? '\u2514\u2500' : '\u251c\u2500';
|
|
283
283
|
|
|
284
|
-
const
|
|
284
|
+
const rawType = a.type.includes(':') ? a.type.split(':').pop() : a.type;
|
|
285
|
+
const name = rawType.padEnd(7);
|
|
285
286
|
const model = shortModelName(a.model).padEnd(8);
|
|
286
287
|
const duration = formatAgentDuration(a.startTime).padStart(4);
|
|
287
288
|
const desc = a.description.length > 40 ? a.description.slice(0, 37) + '...' : a.description;
|
|
288
289
|
|
|
289
290
|
detailLines.push(
|
|
290
|
-
`${dim(prefix)} ${cyan(name)}${model}${dim(duration)} ${desc}`
|
|
291
|
+
`${dim(prefix)} ${cyan(name)} ${model}${dim(duration)} ${desc}`
|
|
291
292
|
);
|
|
292
293
|
});
|
|
293
294
|
|
package/package.json
CHANGED
package/skills/crew-dev/SKILL.md
CHANGED
|
@@ -21,6 +21,7 @@ description: contract.md를 입력으로 받아 Dev + CodeReviewer + QA 파이
|
|
|
21
21
|
- brief.md를 어떤 에이전트에게도 전달하지 않는다.
|
|
22
22
|
- contract.md를 CodeReviewer에게 전달하지 않는다 (가드레일만 인라인 주입).
|
|
23
23
|
- plan.md를 CodeReviewer에게 전달하지 않는다.
|
|
24
|
+
- git commit 시 `--no-verify`를 생략하지 않는다 (호스트 프로젝트의 pre-commit hook 중복 실행 방지).
|
|
24
25
|
- Dev가 자체 검증을 통과하지 못한 상태에서 검증 단계로 넘기지 않는다.
|
|
25
26
|
|
|
26
27
|
---
|
|
@@ -52,7 +53,7 @@ description: contract.md를 입력으로 받아 Dev + CodeReviewer + QA 파이
|
|
|
52
53
|
| 에이전트 | subagent_type | 볼 수 있는 것 | 차단 | 차단 근거 |
|
|
53
54
|
|----------|--------------|-------------|------|----------|
|
|
54
55
|
| **Dev** | dev | plan.md, contract.md | brief.md, spec.md, analysis.md | 의도 추측 방지, plan+contract에 필요 정보 포함 |
|
|
55
|
-
| **CodeReviewer** | code-reviewer | git diff, 가드레일(인라인) | contract.md, plan.md, brief.md, spec.md, dev-log.md | 수용 기준 체리피킹 방지 |
|
|
56
|
+
| **CodeReviewer** | code-reviewer | git diff(직접 실행), 가드레일(인라인) | contract.md, plan.md, brief.md, spec.md, dev-log.md | 수용 기준 체리피킹 방지 (.crew/는 .gitignore 대상이므로 diff에 노출되지 않음) |
|
|
56
57
|
| **QA** | qa | plan.md | contract.md, brief.md, spec.md | 검증 편향 방지 |
|
|
57
58
|
|
|
58
59
|
**중요**: 모든 에이전트 호출 시 반드시 `subagent_type` 파라미터를 지정해야 한다. HUD에서 에이전트 타입을 식별하는 데 사용된다.
|
|
@@ -120,15 +121,23 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
120
121
|
|
|
121
122
|
## 작업 순서
|
|
122
123
|
1. plan.md의 유저 스토리와 태스크 목록을 확인한다.
|
|
123
|
-
2.
|
|
124
|
-
3.
|
|
125
|
-
4.
|
|
126
|
-
|
|
124
|
+
2. plan.md의 `## 테스트 전략` 섹션을 확인한다.
|
|
125
|
+
3. 코드베이스를 탐색한다 (Glob, Grep, Read로 관련 파일 파악).
|
|
126
|
+
4. 유저 스토리 단위로 순차 구현한다.
|
|
127
|
+
- **TDD인 경우**: 각 태스크에서 반드시 RED→GREEN→REFACTOR 순서를 따른다.
|
|
128
|
+
1. RED: 실패하는 테스트를 먼저 작성하고 실행하여 FAIL을 확인한다.
|
|
129
|
+
2. GREEN: 테스트를 통과하는 최소한의 코드를 작성한다.
|
|
130
|
+
3. REFACTOR: 코드 품질을 개선한다 (필요시).
|
|
131
|
+
- **Tests-after인 경우**: 구현을 먼저 완료한 후, plan.md에 명시된 테스트 태스크를 수행한다.
|
|
132
|
+
- **None인 경우**: 현재와 동일하게 구현한다.
|
|
133
|
+
5. 각 유저 스토리 완료 후 dev-log.md에 진행상황을 기록한다.
|
|
134
|
+
6. 모든 구현 완료 후 자체 검증을 실행한다:
|
|
127
135
|
- 빌드 성공 확인
|
|
128
136
|
- 린트 통과 확인
|
|
129
137
|
- 타입 체크 통과 확인
|
|
130
138
|
- 기존 테스트 스위트 통과 확인
|
|
131
|
-
|
|
139
|
+
- lint-staged 검증: `npx lint-staged --dry-run` 실행 (설정이 있는 경우에만)
|
|
140
|
+
7. 자체 검증이 모두 통과하면 완료를 선언한다.
|
|
132
141
|
자체 검증이 실패하면 직접 수정하여 통과시킨다.
|
|
133
142
|
|
|
134
143
|
## 출력
|
|
@@ -136,8 +145,9 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
136
145
|
|
|
137
146
|
## 규칙
|
|
138
147
|
- plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
|
|
139
|
-
- 자체 검증
|
|
148
|
+
- 자체 검증 5개(빌드/린트/타입/테스트/lint-staged) 모두 PASS 해야 완료를 선언할 수 있다.
|
|
140
149
|
- 기존 코드베이스의 컨벤션을 따른다.
|
|
150
|
+
- TDD 전략인 경우, 테스트를 먼저 작성하지 않고 프로덕션 코드를 작성하지 않는다.
|
|
141
151
|
```
|
|
142
152
|
|
|
143
153
|
**retry 시 에이전트 프롬프트**:
|
|
@@ -159,11 +169,11 @@ brief.md, spec.md, analysis.md는 읽지 않는다.
|
|
|
159
169
|
1. 피드백에서 FAIL 항목을 모두 파악한다.
|
|
160
170
|
2. 각 FAIL 항목에 대해 수정을 수행한다.
|
|
161
171
|
3. dev-log.md를 갱신한다 (최상단에 "수정 이력 (retry {n})" 섹션 추가).
|
|
162
|
-
4. 자체 검증
|
|
172
|
+
4. 자체 검증 5개를 모두 다시 실행한다.
|
|
163
173
|
|
|
164
174
|
## 규칙
|
|
165
175
|
- 피드백에서 지적하지 않은 부분을 추가로 변경하지 않는다.
|
|
166
|
-
- 자체 검증
|
|
176
|
+
- 자체 검증 5개 모두 PASS 해야 완료를 선언할 수 있다.
|
|
167
177
|
```
|
|
168
178
|
|
|
169
179
|
**Phase 2 실패 조건**: Dev 에이전트가 자체 검증을 통과하지 못한 채 완료를 선언하면 에스컬레이션.
|
|
@@ -181,9 +191,8 @@ CodeReviewer와 QA를 **동시에** Agent tool 2개로 호출한다.
|
|
|
181
191
|
에이전트 호출 시 반드시 `subagent_type: "code-reviewer"`를 지정한다.
|
|
182
192
|
|
|
183
193
|
오케스트레이터가 해야 할 사전 작업:
|
|
184
|
-
1.
|
|
185
|
-
2.
|
|
186
|
-
3. 둘 다 CodeReviewer 프롬프트에 인라인으로 주입한다.
|
|
194
|
+
1. contract.md에서 가드레일 섹션(Must/Must NOT)만 추출한다.
|
|
195
|
+
2. 가드레일을 CodeReviewer 프롬프트에 인라인으로 주입한다.
|
|
187
196
|
|
|
188
197
|
에이전트 프롬프트:
|
|
189
198
|
|
|
@@ -191,13 +200,10 @@ CodeReviewer와 QA를 **동시에** Agent tool 2개로 호출한다.
|
|
|
191
200
|
당신은 CodeReviewer 에이전트다. 코드 변경 사항의 품질을 판단한다.
|
|
192
201
|
|
|
193
202
|
## 입력
|
|
194
|
-
|
|
203
|
+
`git diff main...HEAD`를 직접 실행하여 변경 사항을 확인하라.
|
|
195
204
|
contract.md, plan.md, brief.md, spec.md, dev-log.md는 읽지 않는다.
|
|
196
205
|
코드만 보고 판단한다.
|
|
197
206
|
|
|
198
|
-
### diff
|
|
199
|
-
{git diff main...HEAD 출력}
|
|
200
|
-
|
|
201
207
|
### 가드레일 (contract.md에서 추출)
|
|
202
208
|
#### Must
|
|
203
209
|
- {오케스트레이터가 contract.md에서 복사한 내용}
|
|
@@ -244,13 +250,17 @@ contract.md, brief.md, spec.md는 읽지 않는다.
|
|
|
244
250
|
2. 린트 검증
|
|
245
251
|
3. 타입 체크 검증
|
|
246
252
|
4. 테스트 스위트 검증
|
|
247
|
-
5.
|
|
253
|
+
5. 테스트 전략 준수 검증 (TDD 또는 Tests-after인 경우)
|
|
254
|
+
- plan.md에 명시된 테스트 파일이 실제로 존재하는가?
|
|
255
|
+
- 해당 테스트가 실행되고 통과하는가?
|
|
256
|
+
- None인 경우 이 항목을 PASS로 처리한다.
|
|
257
|
+
6. E2E / 통합 검증 — plan.md의 테스트 시나리오 기반
|
|
248
258
|
|
|
249
259
|
## 출력
|
|
250
260
|
.crew/plans/{task-id}/qa-report.md 를 작성하라.
|
|
251
261
|
|
|
252
262
|
## 판정 규칙
|
|
253
|
-
- 항목 1-
|
|
263
|
+
- 항목 1-6 중 하나라도 FAIL → 전체 FAIL
|
|
254
264
|
- 모든 항목 PASS → 전체 PASS
|
|
255
265
|
|
|
256
266
|
## 규칙
|
|
@@ -286,10 +296,12 @@ Agent(name="qa", subagent_type="qa", model="sonnet", prompt="...")
|
|
|
286
296
|
|
|
287
297
|
```bash
|
|
288
298
|
git add -A
|
|
289
|
-
git commit -m "feat({task-id}): {contract.md 목표 1줄 요약}"
|
|
299
|
+
git commit --no-verify -m "feat({task-id}): {contract.md 목표 1줄 요약}"
|
|
290
300
|
git push -u origin feat/{task-id}
|
|
291
301
|
```
|
|
292
302
|
|
|
303
|
+
> `--no-verify`: crew-dev가 이미 빌드/린트/타입/테스트 + lint-staged 검증을 완료했으므로 호스트 프로젝트의 pre-commit hook을 중복 실행하지 않는다.
|
|
304
|
+
|
|
293
305
|
PR을 생성한다 (머지하지 않는다).
|
|
294
306
|
|
|
295
307
|
**5b. 상태 갱신**
|
|
@@ -115,13 +115,18 @@ PM 에이전트가 요구사항 정의에 실패했습니다.
|
|
|
115
115
|
## 서브에이전트 호출
|
|
116
116
|
- Explorer (Haiku): 코드베이스 탐색. 항상 호출. 병렬 2-3개로 호출하라.
|
|
117
117
|
Agent(description="코드베이스 탐색", model="haiku", prompt="...")
|
|
118
|
+
**필수 탐색 항목**: 테스트 인프라도 반드시 탐색한다. Explorer 중 1개는 다음을 확인:
|
|
119
|
+
- 테스트 프레임워크 설정 파일 (jest.config.*, vitest.config.*, pytest.ini 등)
|
|
120
|
+
- 대표적인 테스트 파일 2-3개의 패턴
|
|
121
|
+
- 커버리지 설정 여부
|
|
122
|
+
- 테스트 실행 스크립트 (package.json scripts 등)
|
|
118
123
|
- Researcher (Sonnet): 외부 리서치. 필요시만 호출.
|
|
119
124
|
Agent(description="외부 리서치", model="sonnet", prompt="...")
|
|
120
125
|
|
|
121
126
|
## 출력
|
|
122
127
|
.crew/plans/{task-id}/analysis.md 를 작성하라.
|
|
123
128
|
|
|
124
|
-
analysis.md 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 외부 리서치(해당 시).
|
|
129
|
+
analysis.md 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 리서치(해당 시).
|
|
125
130
|
|
|
126
131
|
## 규칙
|
|
127
132
|
- 요구사항에 빈틈이 있으면 AskUserQuestion으로 유저에게 직접 질문하라.
|
|
@@ -132,6 +137,48 @@ analysis.md 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련
|
|
|
132
137
|
|
|
133
138
|
---
|
|
134
139
|
|
|
140
|
+
### Step 3.5 — 테스트 전략 결정 (오케스트레이터 직접)
|
|
141
|
+
|
|
142
|
+
TechLead의 analysis.md에서 테스트 인프라 섹션을 확인한 후, 오케스트레이터가 유저에게 테스트 전략을 질문한다.
|
|
143
|
+
|
|
144
|
+
**테스트 인프라가 있는 경우**:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
테스트 인프라가 감지되었습니다: {프레임워크명}
|
|
148
|
+
테스트 전략을 선택하세요:
|
|
149
|
+
[1] TDD — 각 태스크를 RED(실패 테스트) → GREEN(최소 구현) → REFACTOR로 구성
|
|
150
|
+
[2] Tests-after — 구현 태스크 완료 후 테스트 태스크 추가
|
|
151
|
+
[3] None — 자동화 테스트 없음 (QA 에이전트 검증만)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**테스트 인프라가 없는 경우**:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
테스트 인프라가 감지되지 않았습니다.
|
|
158
|
+
테스트 전략을 선택하세요:
|
|
159
|
+
[1] TDD — 테스트 인프라 셋업 후 RED → GREEN → REFACTOR로 구현
|
|
160
|
+
[2] Tests-after — 테스트 인프라 셋업 후 구현 완료 뒤 테스트 추가
|
|
161
|
+
[3] None — 자동화 테스트 없음 (QA 에이전트 검증만)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
[1] 또는 [2] 선택 시 인프라가 없으면 추가 질문:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
테스트 프레임워크를 선택하세요:
|
|
168
|
+
[1] vitest [2] jest [3] bun test [4] pytest [5] 기타 (직접 입력)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**결과 기록**: 선택된 테스트 전략을 analysis.md 하단에 추가한다:
|
|
172
|
+
|
|
173
|
+
```markdown
|
|
174
|
+
## 테스트 전략
|
|
175
|
+
- 결정: {TDD | Tests-after | None}
|
|
176
|
+
- 프레임워크: {기존 감지된 프레임워크 또는 유저 선택}
|
|
177
|
+
- 인프라 셋업 필요: {YES | NO}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
135
182
|
### Step 4 — Planner 에이전트 실행
|
|
136
183
|
|
|
137
184
|
**모델**: opus
|
|
@@ -153,6 +200,27 @@ brief.md는 읽지 않는다.
|
|
|
153
200
|
|
|
154
201
|
plan.md 필수 구조: 유저 스토리(US-N) 단위. 각 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨).
|
|
155
202
|
|
|
203
|
+
## 테스트 전략
|
|
204
|
+
analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라 태스크 구조를 달리한다.
|
|
205
|
+
|
|
206
|
+
### TDD인 경우
|
|
207
|
+
- 인프라 셋업이 필요하면 첫 번째 태스크로 "테스트 인프라 셋업"을 추가한다.
|
|
208
|
+
- 각 유저 스토리의 구현 태스크를 다음 순서로 구성한다:
|
|
209
|
+
1. RED — 실패하는 테스트 작성 (테스트 파일 경로 명시)
|
|
210
|
+
2. GREEN — 테스트를 통과하는 최소한의 코드 작성
|
|
211
|
+
3. REFACTOR — 코드 품질 개선 (필요시)
|
|
212
|
+
- 각 태스크의 수용 기준에 포함: `테스트 파일: {경로}`, `테스트 실행 결과: PASS`
|
|
213
|
+
|
|
214
|
+
### Tests-after인 경우
|
|
215
|
+
- 인프라 셋업이 필요하면 첫 번째 태스크로 "테스트 인프라 셋업"을 추가한다.
|
|
216
|
+
- 구현 태스크를 먼저 나열한 후, 별도의 테스트 작성 태스크를 추가한다.
|
|
217
|
+
- 테스트 태스크의 수용 기준에 포함: `테스트 파일: {경로}`, `테스트 실행 결과: PASS`
|
|
218
|
+
|
|
219
|
+
### None인 경우
|
|
220
|
+
- 현재와 동일. 자동화 테스트 태스크 없이 검증 시나리오만 포함한다.
|
|
221
|
+
|
|
222
|
+
plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명시한다.
|
|
223
|
+
|
|
156
224
|
## 규칙
|
|
157
225
|
- 코드를 작성하지 않는다.
|
|
158
226
|
- analysis.md의 아키텍처 방향과 가드레일을 따른다.
|
|
@@ -211,9 +279,13 @@ plan.md 최상단에 "이전 피드백 반영" 섹션을 추가한다.
|
|
|
211
279
|
[ ] E2. 요구사항 정합성 — 수용 기준이 전부 태스크로 커버되는가?
|
|
212
280
|
[ ] E3. 코드 참조 사실 여부 — 언급한 파일/모듈이 존재하는가? (Explorer 서브에이전트 호출)
|
|
213
281
|
[ ] E4. 실행 가능성 — 구현자가 바로 시작할 수 있는 수준인가?
|
|
282
|
+
[ ] E5. 테스트 전략 정합성 — analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가?
|
|
283
|
+
- TDD: 각 구현 태스크가 RED→GREEN→REFACTOR 순서로 구성되어 있는가? 테스트 파일 경로가 명시되어 있는가?
|
|
284
|
+
- Tests-after: 구현 태스크 뒤에 테스트 작성 태스크가 있는가? 테스트 파일 경로가 명시되어 있는가?
|
|
285
|
+
- None: 이 항목을 YES로 처리한다.
|
|
214
286
|
|
|
215
287
|
## 판정 규칙
|
|
216
|
-
-
|
|
288
|
+
- 5개 항목 모두 YES → PASS
|
|
217
289
|
- 하나라도 NO → FAIL
|
|
218
290
|
- "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
|
|
219
291
|
|
|
@@ -261,6 +333,11 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
|
|
|
261
333
|
### Must NOT
|
|
262
334
|
- {analysis.md에서 추출}
|
|
263
335
|
|
|
336
|
+
## 테스트 전략
|
|
337
|
+
- 결정: {TDD | Tests-after | None}
|
|
338
|
+
- 프레임워크: {프레임워크명}
|
|
339
|
+
- 인프라 셋업 필요: {YES | NO}
|
|
340
|
+
|
|
264
341
|
## 검증 시나리오
|
|
265
342
|
{plan.md의 검증 시나리오 섹션을 그대로 복사}
|
|
266
343
|
|
package/skills/crew/SKILL.md
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crew
|
|
3
|
-
description: crew-plan과 crew-dev를 연결하는 오케스트레이터 — 유저 요청을 받아 PR 생성까지
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 역할
|
|
7
|
-
|
|
8
|
-
유저 요청을 받아 crew-plan(계획)과 crew-dev(구현)를 순차 실행하여 PR을 생성한다.
|
|
9
|
-
코드를 작성하지 않는다. 에이전트에게 위임한다.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 절대 금지
|
|
14
|
-
|
|
15
|
-
- 코드를 직접 작성, 수정, 검토하지 않는다.
|
|
16
|
-
- 기획, 계획, 검증을 직접 수행하지 않는다. 해당 에이전트에게 위임한다.
|
|
17
|
-
- 에이전트가 FAIL을 냈을 때 합리화하여 통과시키지 않는다.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 실행 순서
|
|
22
|
-
|
|
23
|
-
### Step 1 — 초기 셋업
|
|
24
|
-
|
|
25
|
-
`.crew/` 폴더가 없으면 생성한다.
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
mkdir -p .crew/plans
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Step 2 — 의도 분류
|
|
32
|
-
|
|
33
|
-
유저 요청을 2가지로 분류한다:
|
|
34
|
-
|
|
35
|
-
| 유형 | 기준 | PM 관여 | 예시 |
|
|
36
|
-
|------|------|---------|------|
|
|
37
|
-
| **유저 가치** | 유저가 변화를 인지함 | O | 기능 추가, UI 변경, 플로우 수정 |
|
|
38
|
-
| **엔지니어링** | 유저가 변화를 인지하지 못함 | X | 리팩토링, 마이그레이션, 버그 수정, 인프라, 성능, 테스트 |
|
|
39
|
-
|
|
40
|
-
분류 기준: **"이 작업의 결과를 유저(사용자)가 인지하는가?"**
|
|
41
|
-
|
|
42
|
-
애매하면 유저에게 물어본다.
|
|
43
|
-
|
|
44
|
-
### Step 3 — task-id 생성
|
|
45
|
-
|
|
46
|
-
task-id를 생성한다. 형식: `{간결한-영문-슬러그}` (예: `add-search-filter`, `fix-auth-timeout`)
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
mkdir -p .crew/plans/{task-id}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Step 4 — crew-plan 실행
|
|
53
|
-
|
|
54
|
-
crew-plan 파이프라인을 실행한다.
|
|
55
|
-
|
|
56
|
-
오케스트레이터가 crew-plan에 전달할 정보:
|
|
57
|
-
- task-id
|
|
58
|
-
- 의도 유형 (유저 가치 / 엔지니어링)
|
|
59
|
-
- 유저 요청 원문 (brief.md 작성용)
|
|
60
|
-
|
|
61
|
-
crew-plan의 반환을 확인한다:
|
|
62
|
-
- **COMPLETE** → contract.md 경로를 확인하고 Step 5로 진행
|
|
63
|
-
- **ESCALATE** → 유저에게 에스컬레이션 내용을 전달하고, 유저 응답에 따라 재시도 또는 보류
|
|
64
|
-
|
|
65
|
-
### Step 5 — crew-dev 실행
|
|
66
|
-
|
|
67
|
-
crew-dev 파이프라인을 실행한다.
|
|
68
|
-
|
|
69
|
-
오케스트레이터가 crew-dev에 전달할 정보:
|
|
70
|
-
- task-id
|
|
71
|
-
|
|
72
|
-
crew-dev의 반환을 확인한다:
|
|
73
|
-
- **COMPLETE** → PR URL을 유저에게 전달
|
|
74
|
-
- **ESCALATE** → 유저에게 에스컬레이션 내용을 전달하고, 유저 응답에 따라 재시도 또는 보류
|
|
75
|
-
|
|
76
|
-
### Step 6 — 완료 보고
|
|
77
|
-
|
|
78
|
-
유저에게 최종 결과를 보고한다:
|
|
79
|
-
- task-id
|
|
80
|
-
- PR URL
|
|
81
|
-
- 주요 변경 사항 요약
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## 에스컬레이션 처리
|
|
86
|
-
|
|
87
|
-
에스컬레이션은 유저에게 선택지를 제시하고 응답을 기다린다.
|
|
88
|
-
유저 응답에 따라:
|
|
89
|
-
|
|
90
|
-
- **재시도**: 해당 파이프라인의 실패 지점부터 재실행
|
|
91
|
-
- **수정**: 유저가 직접 파일을 수정한 후 재실행
|
|
92
|
-
- **보류**: 상태를 BLOCKED으로 갱신하고 종료
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## 산출물 파일 구조
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
.crew/plans/{task-id}/
|
|
100
|
-
# crew-plan 산출물
|
|
101
|
-
brief.md # 오케스트레이터: 유저 원본 요청
|
|
102
|
-
spec.md # PM: 수용 기준, 스코프 (유저 가치 유형만)
|
|
103
|
-
analysis.md # TechLead: 사전 분석 결과
|
|
104
|
-
plan.md # Planner: 구현 계획
|
|
105
|
-
review.md # PlanEvaluator: 검증 결과 (최신)
|
|
106
|
-
plan-{n}.md # 실패한 계획 아카이브
|
|
107
|
-
review-{n}.md # 실패한 리뷰 아카이브
|
|
108
|
-
contract.md # 최종 계약 (PASS 시만 생성)
|
|
109
|
-
.loop_count # 계획 루프 카운터
|
|
110
|
-
|
|
111
|
-
# crew-dev 산출물
|
|
112
|
-
dev-log.md # Dev: 구현 진행 로그
|
|
113
|
-
review-report.md # CodeReviewer: 코드 리뷰 결과 (최신)
|
|
114
|
-
qa-report.md # QA: 실행 검증 결과 (최신)
|
|
115
|
-
review-report-{n}.md # FAIL 시 아카이브
|
|
116
|
-
qa-report-{n}.md # FAIL 시 아카이브
|
|
117
|
-
.dev_loop_count # 개발 루프 카운터
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## contract.md 구조
|
|
123
|
-
|
|
124
|
-
PlanEvaluator PASS 후 crew-plan이 생성한다.
|
|
125
|
-
|
|
126
|
-
```markdown
|
|
127
|
-
# 스프린트 계약: {task-id}
|
|
128
|
-
|
|
129
|
-
생성일: {date}
|
|
130
|
-
유형: {유저 가치 | 엔지니어링}
|
|
131
|
-
|
|
132
|
-
## 목표
|
|
133
|
-
{한 문장}
|
|
134
|
-
|
|
135
|
-
## 수용 기준
|
|
136
|
-
- [ ] {testable 기준 1}
|
|
137
|
-
- [ ] {testable 기준 2}
|
|
138
|
-
|
|
139
|
-
## 가드레일
|
|
140
|
-
### Must
|
|
141
|
-
- {TechLead가 정의한 필수 사항}
|
|
142
|
-
|
|
143
|
-
### Must NOT
|
|
144
|
-
- {TechLead가 정의한 금지 사항}
|
|
145
|
-
|
|
146
|
-
## 검증 시나리오
|
|
147
|
-
|
|
148
|
-
### {시나리오 1 제목}
|
|
149
|
-
- 조건: {사전 상태}
|
|
150
|
-
- 행위: {실행할 것}
|
|
151
|
-
- 기대 결과: {검증할 것}
|
|
152
|
-
|
|
153
|
-
## 참조 문서
|
|
154
|
-
- 사전 분석: .crew/plans/{task-id}/analysis.md
|
|
155
|
-
- 구현 계획: .crew/plans/{task-id}/plan.md
|
|
156
|
-
|
|
157
|
-
## 검증 이력
|
|
158
|
-
PlanEvaluator PASS — review.md 참조
|
|
159
|
-
|
|
160
|
-
## 상태
|
|
161
|
-
ACTIVE
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
## 에이전트 라인업
|
|
167
|
-
|
|
168
|
-
### crew-plan
|
|
169
|
-
| 에이전트 | subagent_type | 모델 | 역할 |
|
|
170
|
-
|----------|--------------|------|------|
|
|
171
|
-
| PM | pm | Opus | 유저 인터뷰, spec.md 작성 (유저 가치만) |
|
|
172
|
-
| TechLead | techlead | Opus | 사전 분석, 아키텍처 방향, 가드레일 |
|
|
173
|
-
| Planner | planner | Opus | 계획 문서 작성 |
|
|
174
|
-
| PlanEvaluator | plan-evaluator | Sonnet | E1-E4 하드 임계값 검증 |
|
|
175
|
-
|
|
176
|
-
### crew-dev
|
|
177
|
-
| 에이전트 | subagent_type | 모델 | 역할 |
|
|
178
|
-
|----------|--------------|------|------|
|
|
179
|
-
| Dev | dev | Opus | 코드 구현 + 자체 검증 |
|
|
180
|
-
| CodeReviewer | code-reviewer | Opus | 코드 품질 + 가드레일 위반 판정 |
|
|
181
|
-
| QA | qa | Sonnet | 실행 검증 (빌드/테스트/E2E) |
|
|
182
|
-
|
|
183
|
-
### 공유 서브에이전트
|
|
184
|
-
| 에이전트 | subagent_type | 모델 | 역할 |
|
|
185
|
-
|----------|--------------|------|------|
|
|
186
|
-
| Explorer | explorer | Haiku | 코드베이스 탐색 (병렬, Read-only) |
|
|
187
|
-
| Researcher | researcher | Sonnet | 외부 정보 조사 (필요시만, Read-only) |
|
|
188
|
-
|
|
189
|
-
**중요**: 모든 에이전트 호출 시 반드시 `subagent_type` 파라미터를 지정해야 한다. HUD에서 에이전트 타입을 식별하는 데 사용된다.
|