@jjlabsio/claude-crew 0.1.18 → 0.1.20
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 -2
- package/README.md +30 -10
- package/agents/plan-evaluator.md +12 -8
- package/package.json +1 -1
- package/scripts/setup-hud.mjs +8 -3
- package/skills/crew-dev/SKILL.md +2 -2
- package/skills/crew-interview/SKILL.md +339 -0
- package/skills/crew-plan/SKILL.md +64 -97
|
@@ -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.20",
|
|
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.20"
|
|
32
32
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-crew",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jaejin Song",
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"solo-developer"
|
|
18
18
|
],
|
|
19
19
|
"agents": [
|
|
20
|
-
"./agents/pm.md",
|
|
21
20
|
"./agents/planner.md",
|
|
22
21
|
"./agents/dev.md",
|
|
23
22
|
"./agents/qa.md",
|
package/README.md
CHANGED
|
@@ -2,7 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
1인 SaaS 개발자를 위한 Claude Code 멀티 에이전트 오케스트레이션 플러그인.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 파이프라인
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
crew-interview → crew-plan → crew-dev
|
|
9
|
+
WHAT HOW DO
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
| 단계 | 역할 | 산출물 |
|
|
13
|
+
|------|------|--------|
|
|
14
|
+
| **crew-interview** | 무엇을 만드는가 — 요구사항 인터뷰, 제품 설계 | spec.md |
|
|
15
|
+
| **crew-plan** | 어떻게 만드는가 — 기술 분석, 태스크 분해 | contract.md |
|
|
16
|
+
| **crew-dev** | 만든다 — 구현, 코드 리뷰, QA | 동작하는 코드 + PR |
|
|
6
17
|
|
|
7
18
|
## 설치
|
|
8
19
|
|
|
@@ -39,20 +50,29 @@ HUD statusline이 설정되어 세션 중 레포, 브랜치, 모델, 컨텍스
|
|
|
39
50
|
|
|
40
51
|
## 에이전트 팀
|
|
41
52
|
|
|
42
|
-
| 에이전트 | 역할 |
|
|
43
|
-
|
|
44
|
-
| **오케스트레이터** | 유저와 대화, 위임 판단,
|
|
45
|
-
| **
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
| **
|
|
49
|
-
|
|
|
53
|
+
| 에이전트 | 역할 | 소속 스킬 |
|
|
54
|
+
|---------|------|----------|
|
|
55
|
+
| **오케스트레이터** | 유저와 대화, 위임 판단, 파이프라인 진행 | 전체 |
|
|
56
|
+
| **Explorer** | 코드베이스 탐색 (read-only) | interview, plan |
|
|
57
|
+
| **Researcher** | 외부 리서치 (WebSearch) | interview, plan |
|
|
58
|
+
| **TechLead** | 기술 분석, 아키텍처 방향 판단 | plan |
|
|
59
|
+
| **Planner** | 태스크 분해, 구현 계획 | plan |
|
|
60
|
+
| **PlanEvaluator** | 계획 검증 (하드 임계값) | plan |
|
|
61
|
+
| **Dev** | 코드 구현 | dev |
|
|
62
|
+
| **CodeReviewer** | 코드 리뷰 | dev |
|
|
63
|
+
| **QA** | 실행 검증 | dev |
|
|
50
64
|
|
|
51
65
|
## 상태 파일
|
|
52
66
|
|
|
53
67
|
프로젝트 로컬 `.crew/` 디렉토리에 마크다운 파일로 상태를 관리합니다. 플러그인 업데이트 시에도 학습 내용과 상태는 보존됩니다.
|
|
54
68
|
|
|
55
|
-
## 설계
|
|
69
|
+
## 설계 철학
|
|
70
|
+
|
|
71
|
+
**역할별 관점은 유지하되, 정보는 제한하지 않는다.**
|
|
72
|
+
|
|
73
|
+
각 에이전트는 특정 관점(기획/기술/구현)에서 사고하지만, 활용할 수 있는 정보(코드 포함)는 제한하지 않는다. 실제 회사의 역할 분리를 모방하는 것이 아니라, 빠뜨리는 관점이 없도록 구조화된 사고를 강제하는 것이 목적이다.
|
|
74
|
+
|
|
75
|
+
### 기타 원칙
|
|
56
76
|
|
|
57
77
|
- [Anthropic 하네스 설계 아티클](https://www.anthropic.com/engineering/harness-design)을 최우선 레퍼런스로 따름
|
|
58
78
|
- 가능한 단순하게 시작하고 필요할 때만 복잡성을 높임
|
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-E6 하드 임계값 판정. Sonnet 사용 (Opus 합리화 방지)
|
|
5
5
|
tools: [Read, Agent]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@ tools: [Read, Agent]
|
|
|
11
11
|
|
|
12
12
|
## 입력
|
|
13
13
|
|
|
14
|
-
- `spec.md`
|
|
14
|
+
- `spec.md`
|
|
15
15
|
- `analysis.md`
|
|
16
16
|
- `plan.md`
|
|
17
17
|
|
|
18
18
|
## 접근 금지
|
|
19
19
|
|
|
20
|
-
- `brief.md` —
|
|
20
|
+
- `brief.md` — 읽지 않는다.
|
|
21
21
|
|
|
22
22
|
## 출력
|
|
23
23
|
|
|
@@ -25,14 +25,16 @@ tools: [Read, Agent]
|
|
|
25
25
|
|
|
26
26
|
## 검증 항목
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
6개 항목, 모두 YES/NO 판정:
|
|
29
29
|
|
|
30
30
|
| # | 항목 | 확인 방법 |
|
|
31
31
|
|---|------|----------|
|
|
32
32
|
| E1 | **검증 시나리오 완성도** — 모든 태스크에 검증 방법이 명시되어 있는가 | 문서 확인 (직접) |
|
|
33
|
-
| E2 |
|
|
33
|
+
| E2 | **spec 전체 커버리지** — spec.md의 수용 기준, 유저 플로우, UI 구조, 비즈니스 규칙이 전부 태스크로 커버되는가 | 문서 대 문서 비교 (직접) |
|
|
34
34
|
| E3 | **코드 참조 사실 여부** — 언급한 파일/모듈이 존재하는가 | Explorer 호출 |
|
|
35
35
|
| E4 | **실행 가능성** — 구현자가 바로 시작할 수 있는 수준인가 | 판단 (직접) |
|
|
36
|
+
| E5 | **테스트 전략 정합성** — analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가 | 문서 대 문서 비교 (직접) |
|
|
37
|
+
| E6 | **비즈니스 가정 0개** — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가 | 문서 대 문서 비교 (직접) |
|
|
36
38
|
|
|
37
39
|
## review.md 출력 형식
|
|
38
40
|
|
|
@@ -45,9 +47,11 @@ tools: [Read, Agent]
|
|
|
45
47
|
| # | 항목 | 판정 | 근거 |
|
|
46
48
|
|---|------|------|------|
|
|
47
49
|
| E1 | 검증 시나리오 완성도 | YES/NO | {근거} |
|
|
48
|
-
| E2 |
|
|
50
|
+
| E2 | spec 전체 커버리지 | YES/NO | {근거} |
|
|
49
51
|
| E3 | 코드 참조 사실 여부 | YES/NO | {근거} |
|
|
50
52
|
| E4 | 실행 가능성 | YES/NO | {근거} |
|
|
53
|
+
| E5 | 테스트 전략 정합성 | YES/NO | {근거} |
|
|
54
|
+
| E6 | 비즈니스 가정 0개 | YES/NO | {근거} |
|
|
51
55
|
|
|
52
56
|
## FAIL 상세 (NO 항목만)
|
|
53
57
|
### {항목}: {사유}
|
|
@@ -56,12 +60,12 @@ tools: [Read, Agent]
|
|
|
56
60
|
|
|
57
61
|
## FAIL 근본 원인 분류 (FAIL 시 필수)
|
|
58
62
|
- [ ] plan 결함 — 계획 구성/표현 문제 → Planner 재시도 가능
|
|
59
|
-
- [ ] spec 결함 —
|
|
63
|
+
- [ ] spec 결함 — spec.md 자체가 문제 → 즉시 에스컬레이션 필요
|
|
60
64
|
```
|
|
61
65
|
|
|
62
66
|
## 판정 규칙
|
|
63
67
|
|
|
64
|
-
-
|
|
68
|
+
- 6개 항목 모두 YES → PASS
|
|
65
69
|
- 하나라도 NO → FAIL
|
|
66
70
|
- E3 코드 참조 확인은 Explorer 서브에이전트를 호출한다.
|
|
67
71
|
- "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
|
package/package.json
CHANGED
package/scripts/setup-hud.mjs
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import { execSync } from 'node:child_process';
|
|
11
11
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
12
|
-
import { join } from 'node:path';
|
|
12
|
+
import { join, dirname } from 'node:path';
|
|
13
13
|
import { homedir } from 'node:os';
|
|
14
14
|
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
@@ -50,8 +50,13 @@ async function main() {
|
|
|
50
50
|
try { cwd = JSON.parse(raw).cwd || cwd; } catch { /* ignore */ }
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
//
|
|
54
|
-
|
|
53
|
+
// In worktrees, --show-toplevel returns the worktree path, not the main repo.
|
|
54
|
+
// Use --git-common-dir to resolve back to the main repo path.
|
|
55
|
+
const topLevel = gitExec('git rev-parse --show-toplevel', cwd) || cwd;
|
|
56
|
+
const commonDir = gitExec('git rev-parse --git-common-dir', cwd);
|
|
57
|
+
const projectRoot = (commonDir && commonDir !== '.git' && !commonDir.startsWith('.'))
|
|
58
|
+
? dirname(commonDir) // worktree: commonDir is /path/to/main-repo/.git
|
|
59
|
+
: topLevel;
|
|
55
60
|
|
|
56
61
|
const hudCommand = `node "${pluginRoot}/hud/index.mjs"`;
|
|
57
62
|
const localSettingsPath = join(projectRoot, '.claude', 'settings.local.json');
|
package/skills/crew-dev/SKILL.md
CHANGED
|
@@ -31,8 +31,8 @@ description: contract.md를 입력으로 받아 Dev + CodeReviewer + QA 파이
|
|
|
31
31
|
```
|
|
32
32
|
.crew/plans/{task-id}/
|
|
33
33
|
# crew-plan 산출물 (입력, 이미 존재)
|
|
34
|
-
brief.md # 유저 요청
|
|
35
|
-
spec.md #
|
|
34
|
+
brief.md # crew-interview: 유저 원본 요청
|
|
35
|
+
spec.md # crew-interview: 인터뷰 완료 후 결정화된 스펙
|
|
36
36
|
analysis.md # TechLead 출력
|
|
37
37
|
plan.md # Planner 출력
|
|
38
38
|
contract.md # 스프린트 계약
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crew-interview
|
|
3
|
+
description: 유저 요구사항을 인터뷰하여 개발 가능한 수준의 spec.md를 생성한다
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## 역할
|
|
7
|
+
|
|
8
|
+
유저의 raw 요청을 받아 체계적 인터뷰를 통해 **WHAT(무엇을 만드는가)**을 완전히 정의한다.
|
|
9
|
+
"코드만 작성하면 되는 수준"의 spec.md를 생성하는 것이 목표다.
|
|
10
|
+
|
|
11
|
+
에이전트 간 소통은 파일을 통해서만 이루어진다.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 절대 금지
|
|
16
|
+
|
|
17
|
+
- 코드를 작성하지 않는다.
|
|
18
|
+
- 기술 분석/아키텍처 결정을 하지 않는다 (HOW는 crew-plan의 TechLead 영역).
|
|
19
|
+
- 체크리스트가 전부 YES가 되기 전에 spec.md를 작성하지 않는다.
|
|
20
|
+
- 유저 승인 없이 crew-plan으로 전환하지 않는다.
|
|
21
|
+
- 추측으로 비즈니스 결정을 채우지 않는다.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 파일 구조
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
.crew/plans/{task-id}/
|
|
29
|
+
brief.md # 오케스트레이터: 유저 원본 요청
|
|
30
|
+
spec.md # 오케스트레이터: 인터뷰 완료 후 결정화된 스펙
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 실행 순서
|
|
36
|
+
|
|
37
|
+
### Phase 1 — 초기화 (자동)
|
|
38
|
+
|
|
39
|
+
**1a. task-id 생성 + brief.md 작성**
|
|
40
|
+
|
|
41
|
+
유저 요청 원문을 `.crew/plans/{task-id}/brief.md`에 저장한다.
|
|
42
|
+
task-id는 요청 내용에서 키워드를 추출하여 kebab-case로 생성한다.
|
|
43
|
+
|
|
44
|
+
**1b. Explorer 호출 (병렬)**
|
|
45
|
+
|
|
46
|
+
Explorer 서브에이전트를 병렬로 호출하여 프로젝트 구조를 파악한다.
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
Agent(subagent_type="explorer", description="프로젝트 구조 탐색", prompt="...")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
탐색 목적:
|
|
53
|
+
- 프로젝트 기술 스택, 주요 모듈 구조
|
|
54
|
+
- 유저 요청과 관련된 기존 코드/기능 유무
|
|
55
|
+
- 기존 패턴 (라우팅, 컴포넌트 구조, DB 모델 등)
|
|
56
|
+
|
|
57
|
+
탐색 결과는 오케스트레이터가 내부적으로 보유한다. 파일로 저장하지 않는다.
|
|
58
|
+
|
|
59
|
+
**1c. 체크리스트 첫 평가**
|
|
60
|
+
|
|
61
|
+
유저 요청 + Explorer 결과를 기반으로 체크리스트 5개 항목을 첫 평가한다.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
□ 개발자가 판단해야 할 비즈니스 결정이 없는가?
|
|
65
|
+
□ 유저 플로우(정상 + 예외)가 정의되었는가?
|
|
66
|
+
□ 스코프 경계(IN/OUT)가 명시되었는가?
|
|
67
|
+
□ UI 구조와 주요 문구/콘텐츠가 정의되었는가?
|
|
68
|
+
□ 완료 기준이 검증 가능한 형태로 있는가?
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
각 항목을 YES / NO / 해당없음 으로 판정한다.
|
|
72
|
+
- YES: 유저 요청에서 이미 명확히 정의됨
|
|
73
|
+
- NO: 정보 부족. 질문 필요
|
|
74
|
+
- 해당없음: 이 작업에 적용되지 않음 (예: DB 마이그레이션에 UI 구조)
|
|
75
|
+
|
|
76
|
+
**전부 YES 또는 해당없음이면**: Phase 2를 건너뛰고 Phase 3으로 직행한다.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### Phase 2 — 인터뷰 루프
|
|
81
|
+
|
|
82
|
+
매 턴 아래 사이클을 반복한다:
|
|
83
|
+
|
|
84
|
+
**2a. 체크리스트 평가**
|
|
85
|
+
|
|
86
|
+
현재까지 수집된 정보를 기반으로 5개 항목을 재평가한다.
|
|
87
|
+
|
|
88
|
+
**2b. 질문 대상 선택 (동적)**
|
|
89
|
+
|
|
90
|
+
NO 항목 중 **가장 선행되어야 할 것**을 선택한다.
|
|
91
|
+
|
|
92
|
+
판단 기준: "다른 항목의 답이 이 항목에 의존하는 정도". 예를 들어:
|
|
93
|
+
- 스코프가 안 잡혀 있으면 → 스코프부터 (나머지 질문이 스코프에 의존)
|
|
94
|
+
- 스코프가 잡혔는데 유저 플로우가 없으면 → 유저 플로우 (UI/콘텐츠가 플로우에 의존)
|
|
95
|
+
- 비즈니스 규칙이 독립적이면 → 비즈니스 규칙
|
|
96
|
+
|
|
97
|
+
**2c. 질문 생성**
|
|
98
|
+
|
|
99
|
+
규칙:
|
|
100
|
+
- **한 번에 질문 하나**. 여러 질문을 한꺼번에 던지지 않는다.
|
|
101
|
+
- **객관식 우선**. 선택지를 2-3개 먼저 제시하고, 열린 질문은 보조로 사용한다.
|
|
102
|
+
- **코드 탐색 결과 반영**. Explorer가 발견한 기존 코드/패턴을 질문에 활용한다.
|
|
103
|
+
예: "현재 코드에 JWT 인증이 있는데, 새 기능도 이 방식을 따를까요?"
|
|
104
|
+
- **핵심 비즈니스 결정에는 2-3개 접근법을 제시**한다. 트레이드오프를 포함한다.
|
|
105
|
+
예: "가격 정책은? A) 월간만 — 단순 B) 월간+연간 — 수익 극대화 C) 무료+유료 — 유저 확보 우선"
|
|
106
|
+
|
|
107
|
+
질문 형식:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
[{현재 라운드}/{최대 20}] {타겟 항목}
|
|
111
|
+
|
|
112
|
+
{질문}
|
|
113
|
+
|
|
114
|
+
{선택지가 있는 경우}
|
|
115
|
+
[1] {선택지 1} — {트레이드오프}
|
|
116
|
+
[2] {선택지 2} — {트레이드오프}
|
|
117
|
+
[3] {선택지 3} — {트레이드오프}
|
|
118
|
+
[4] 직접 입력
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**2d. Explorer 심화 탐색 (필요 시, 병렬)**
|
|
122
|
+
|
|
123
|
+
유저 답변에서 언급된 구체적 영역의 코드를 추가 탐색해야 하면 Explorer를 병렬 호출한다.
|
|
124
|
+
예: 유저가 "기존 결제 로직에 추가"라고 답하면 결제 관련 코드를 탐색.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Agent(subagent_type="explorer", description="결제 관련 코드 탐색", prompt="...")
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**2e. 유저 답변 수신 + 큰 기획 갭 감지**
|
|
131
|
+
|
|
132
|
+
유저 답변을 받은 후, 답변에서 연쇄적 하위 결정이 발생하는지 판단한다.
|
|
133
|
+
|
|
134
|
+
큰 기획 갭의 징후:
|
|
135
|
+
- 하나의 답변에서 3개 이상의 후속 결정이 연쇄적으로 필요
|
|
136
|
+
- 답변 자체가 "아직 결정 안 됨", "모르겠다"이고, 그 범위가 독립된 시스템 설계 수준
|
|
137
|
+
|
|
138
|
+
큰 기획 갭 발견 시:
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
이 부분은 인터뷰로 해결할 범위를 넘어서는 별도 기획이 필요합니다.
|
|
142
|
+
|
|
143
|
+
## 부족한 기획 영역
|
|
144
|
+
{무엇이 부족한지 구체적 설명}
|
|
145
|
+
|
|
146
|
+
## 기획 시 결정해야 할 항목
|
|
147
|
+
- {항목 1}
|
|
148
|
+
- {항목 2}
|
|
149
|
+
- ...
|
|
150
|
+
|
|
151
|
+
## 기획 프롬프트
|
|
152
|
+
다음 프롬프트로 별도 세션에서 기획을 진행하세요:
|
|
153
|
+
|
|
154
|
+
\```
|
|
155
|
+
{해당 기획을 진행할 수 있는 구체적 프롬프트}
|
|
156
|
+
\```
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
인터뷰를 중단하고 종료한다.
|
|
160
|
+
|
|
161
|
+
**2f. 체크리스트 재평가**
|
|
162
|
+
|
|
163
|
+
답변을 반영하여 체크리스트를 재평가한다.
|
|
164
|
+
- 전부 YES 또는 해당없음 → Phase 3으로
|
|
165
|
+
- NO 남음 → 2a로 돌아감
|
|
166
|
+
|
|
167
|
+
**2g. 라운드 제한**
|
|
168
|
+
|
|
169
|
+
| 라운드 | 동작 |
|
|
170
|
+
|--------|------|
|
|
171
|
+
| 3+ | 조기 종료 가능. 유저에게 "현재 상태로 진행하시겠습니까?" 옵션 제공 (NO 항목이 남아있다는 경고 포함) |
|
|
172
|
+
| 10 | 소프트 경고: "10라운드에 도달했습니다. 계속하시겠습니까, 현재 상태로 진행하시겠습니까?" |
|
|
173
|
+
| 20 | 하드캡: "최대 라운드에 도달했습니다. 현재 상태로 spec을 작성합니다." (NO 항목은 경고와 함께 기록) |
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
### Phase 3 — Simplifier
|
|
178
|
+
|
|
179
|
+
체크리스트 전부 YES (또는 조기 종료/하드캡) 후 실행한다.
|
|
180
|
+
|
|
181
|
+
**3a. 스코프 정리**
|
|
182
|
+
|
|
183
|
+
지금까지 확정된 전체 스코프를 정리하여 유저에게 보여준다.
|
|
184
|
+
|
|
185
|
+
**3b. Simplifier 점검**
|
|
186
|
+
|
|
187
|
+
각 스코프 항목에 대해 "v1에 꼭 필요한가?"를 판단한다.
|
|
188
|
+
|
|
189
|
+
빼도 되는 항목이 있으면 유저에게 제안한다:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
## v1 스코프 점검
|
|
193
|
+
|
|
194
|
+
현재 스코프에서 v1에 꼭 필요하지 않을 수 있는 항목:
|
|
195
|
+
|
|
196
|
+
- {항목 1} — 이유: {왜 v2로 미룰 수 있는지}
|
|
197
|
+
- {항목 2} — 이유: {왜 v2로 미룰 수 있는지}
|
|
198
|
+
|
|
199
|
+
[1] 제안대로 v2로 미루기
|
|
200
|
+
[2] 일부만 v2로 미루기 (어떤 것?)
|
|
201
|
+
[3] 전부 유지
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
유저 결정을 반영하여 스코프를 확정한다.
|
|
205
|
+
|
|
206
|
+
빼도 되는 항목이 없으면 이 단계를 건너뛴다.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### Phase 4 — spec 결정화 + 유저 승인
|
|
211
|
+
|
|
212
|
+
**4a. spec.md 작성**
|
|
213
|
+
|
|
214
|
+
인터뷰 결과를 `.crew/plans/{task-id}/spec.md`에 구조화하여 작성한다.
|
|
215
|
+
|
|
216
|
+
spec.md 구조 — **해당 섹션만 포함**한다. 해당 없는 섹션은 생략한다:
|
|
217
|
+
|
|
218
|
+
```markdown
|
|
219
|
+
# 요구사항: {task-id}
|
|
220
|
+
|
|
221
|
+
## 목표
|
|
222
|
+
한 문장으로: 이 기능이 해결하는 문제.
|
|
223
|
+
|
|
224
|
+
## 스코프 경계
|
|
225
|
+
- In: 반드시 구현되어야 하는 것
|
|
226
|
+
- Out: 이번에 구현하지 않는 것 (명시적으로 제외)
|
|
227
|
+
|
|
228
|
+
## 유저 플로우
|
|
229
|
+
### 정상 플로우
|
|
230
|
+
1. {단계 1}
|
|
231
|
+
2. {단계 2}
|
|
232
|
+
...
|
|
233
|
+
|
|
234
|
+
### 예외 플로우
|
|
235
|
+
- {예외 상황 1}: {처리 방식}
|
|
236
|
+
- {예외 상황 2}: {처리 방식}
|
|
237
|
+
|
|
238
|
+
## UI 구조 및 주요 콘텐츠
|
|
239
|
+
### {화면/컴포넌트 1}
|
|
240
|
+
- 구조: {레이아웃 설명}
|
|
241
|
+
- 주요 문구:
|
|
242
|
+
- {요소}: "{텍스트}"
|
|
243
|
+
- {요소}: "{텍스트}"
|
|
244
|
+
|
|
245
|
+
### {화면/컴포넌트 2}
|
|
246
|
+
...
|
|
247
|
+
|
|
248
|
+
## 비즈니스 규칙
|
|
249
|
+
- {규칙 1}: {상세}
|
|
250
|
+
- {규칙 2}: {상세}
|
|
251
|
+
|
|
252
|
+
## 수용 기준
|
|
253
|
+
- [ ] {테스트 가능한 구체적 행동 1}
|
|
254
|
+
- [ ] {테스트 가능한 구체적 행동 2}
|
|
255
|
+
- [ ] ...
|
|
256
|
+
|
|
257
|
+
## 전제 조건
|
|
258
|
+
이 태스크가 시작되기 전에 완료되어야 하는 것.
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
규칙:
|
|
262
|
+
- 수용 기준은 최소 3개, 최대 7개. 모호한 표현("잘 작동한다", "빠르다") 금지.
|
|
263
|
+
- 스코프가 "하루 작업"을 초과하면 분리를 권고한다.
|
|
264
|
+
- 조기 종료/하드캡으로 진행한 경우, NO였던 항목을 spec.md 최하단에 경고로 기록한다:
|
|
265
|
+
```markdown
|
|
266
|
+
## ⚠ 미해소 항목
|
|
267
|
+
- {항목}: {무엇이 부족한지}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**4b. 유저에게 spec 제시**
|
|
271
|
+
|
|
272
|
+
작성된 spec.md 전체를 유저에게 보여주고 판단을 요청한다:
|
|
273
|
+
|
|
274
|
+
```
|
|
275
|
+
spec.md를 작성했습니다. 검토해주세요.
|
|
276
|
+
|
|
277
|
+
[1] 승인 — 이대로 확정
|
|
278
|
+
[2] 수정 요청 — 특정 부분을 변경
|
|
279
|
+
[3] 거부 — 인터뷰를 다시 진행
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**4c. 유저 판단 처리**
|
|
283
|
+
|
|
284
|
+
- **[1] 승인**:
|
|
285
|
+
```
|
|
286
|
+
spec.md가 확정되었습니다.
|
|
287
|
+
|
|
288
|
+
[1] crew-plan으로 넘어가기
|
|
289
|
+
[2] 여기서 종료 (spec.md만 남김)
|
|
290
|
+
```
|
|
291
|
+
- [1] 선택 시: `Skill("claude-crew:crew-plan")` 호출. task-id를 인수로 전달.
|
|
292
|
+
- [2] 선택 시: 종료.
|
|
293
|
+
|
|
294
|
+
- **[2] 수정 요청**: 유저의 수정 사항을 반영하여 spec.md를 갱신한 후 4b로 돌아간다.
|
|
295
|
+
|
|
296
|
+
- **[3] 거부**: Phase 2로 돌아간다. 체크리스트를 재평가하고 인터뷰를 재개한다.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 에이전트 호출 규칙
|
|
301
|
+
|
|
302
|
+
| 에이전트 | subagent_type | 모델 | 용도 | 호출 시점 |
|
|
303
|
+
|----------|--------------|------|------|----------|
|
|
304
|
+
| Explorer | explorer | haiku | 코드베이스 탐색 (read-only) | Phase 1b (필수), Phase 2d (필요 시) |
|
|
305
|
+
| Researcher | researcher | sonnet | 외부 조사 (WebSearch) | Phase 2 중 필요 시 |
|
|
306
|
+
|
|
307
|
+
**중요**: 모든 에이전트 호출 시 반드시 `subagent_type` 파라미터를 지정해야 한다. `subagent_type`이 없으면 PreToolUse hook이 호출을 차단한다. `model` 파라미터는 생략 가능 — hook이 에이전트 정의에서 자동 주입한다.
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## 오케스트레이터 반환 스키마
|
|
312
|
+
|
|
313
|
+
**COMPLETE**:
|
|
314
|
+
```json
|
|
315
|
+
{
|
|
316
|
+
"status": "COMPLETE",
|
|
317
|
+
"task_id": "{task-id}",
|
|
318
|
+
"spec_path": ".crew/plans/{task-id}/spec.md"
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**ESCALATE (큰 기획 갭)**:
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"status": "ESCALATE",
|
|
326
|
+
"phase": "interview-gap",
|
|
327
|
+
"reason": "별도 기획 필요: {영역}",
|
|
328
|
+
"planning_prompt": "{기획 프롬프트}"
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
**ABORTED (유저 종료)**:
|
|
333
|
+
```json
|
|
334
|
+
{
|
|
335
|
+
"status": "ABORTED",
|
|
336
|
+
"task_id": "{task-id}",
|
|
337
|
+
"reason": "유저가 종료를 선택"
|
|
338
|
+
}
|
|
339
|
+
```
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: crew-plan
|
|
3
|
-
description:
|
|
3
|
+
description: TechLead + Planner + PlanEvaluator 계획 파이프라인 — contract.md를 생성한다
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
## 역할
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
crew-interview가 생성한 spec.md를 입력으로 받아 **HOW(어떻게 만드는가)**를 결정하고 `contract.md`를 생성한다.
|
|
9
9
|
`contract.md`가 생성되어야 crew-dev가 시작할 수 있다.
|
|
10
10
|
|
|
11
11
|
에이전트 간 소통은 파일을 통해서만 이루어진다. 에이전트의 추론 과정은 다른 에이전트에게 전달되지 않는다.
|
|
@@ -16,7 +16,7 @@ description: PM + TechLead + Planner + PlanEvaluator 계획 파이프라인 —
|
|
|
16
16
|
|
|
17
17
|
- 코드를 작성하지 않는다.
|
|
18
18
|
- PlanEvaluator가 FAIL을 냈을 때 합리화하여 통과시키지 않는다.
|
|
19
|
-
- brief.md를 Planner, PlanEvaluator에게 전달하지
|
|
19
|
+
- brief.md를 Planner, PlanEvaluator에게 전달하지 않는다.
|
|
20
20
|
- 오케스트레이터가 요구사항을 판단하거나 보완하지 않는다.
|
|
21
21
|
|
|
22
22
|
---
|
|
@@ -25,8 +25,8 @@ description: PM + TechLead + Planner + PlanEvaluator 계획 파이프라인 —
|
|
|
25
25
|
|
|
26
26
|
```
|
|
27
27
|
.crew/plans/{task-id}/
|
|
28
|
-
brief.md #
|
|
29
|
-
spec.md #
|
|
28
|
+
brief.md # crew-interview: 유저 원본 요청
|
|
29
|
+
spec.md # crew-interview: 인터뷰 완료 후 결정화된 스펙
|
|
30
30
|
analysis.md # TechLead: 사전 분석 결과
|
|
31
31
|
plan.md # Planner: 구현 계획 (항상 최신)
|
|
32
32
|
review.md # PlanEvaluator: 검증 결과 (항상 최신)
|
|
@@ -40,70 +40,25 @@ description: PM + TechLead + Planner + PlanEvaluator 계획 파이프라인 —
|
|
|
40
40
|
|
|
41
41
|
## 실행 순서
|
|
42
42
|
|
|
43
|
-
### Step 1 —
|
|
43
|
+
### Step 1 — spec.md 유효성 검사 (오케스트레이터 직접)
|
|
44
44
|
|
|
45
|
-
`.crew/plans/{task-id}/
|
|
45
|
+
`.crew/plans/{task-id}/spec.md`를 확인한다.
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
- 요구사항 판단/보완/해석 금지. 원문 그대로.
|
|
49
|
-
|
|
50
|
-
**게이트**: brief.md 작성 완료 후 파일이 존재하고 비어 있지 않음을 확인한다.
|
|
47
|
+
**게이트**: spec.md가 존재하고 비어 있지 않음을 확인한다.
|
|
51
48
|
실패 시 즉시 에스컬레이션:
|
|
52
49
|
|
|
53
50
|
```
|
|
54
|
-
|
|
55
|
-
[1]
|
|
56
|
-
[2]
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
### Step 2 — PM 에이전트 실행 (유저 가치 유형만)
|
|
62
|
-
|
|
63
|
-
**모델**: opus
|
|
64
|
-
**건너뛰기 조건**: 엔지니어링 유형이면 이 단계를 건너뛴다.
|
|
65
|
-
|
|
66
|
-
호출:
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
Agent(subagent_type="pm", description="PM: {task-id} 요구사항 정의", prompt="...")
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
에이전트 프롬프트:
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
당신은 PM 에이전트다. 유저와 직접 대화하여 요구사항을 확정한다.
|
|
76
|
-
|
|
77
|
-
## 입력
|
|
78
|
-
.crew/plans/{task-id}/brief.md 를 읽어라.
|
|
79
|
-
|
|
80
|
-
## 출력
|
|
81
|
-
.crew/plans/{task-id}/spec.md 를 작성하라.
|
|
82
|
-
|
|
83
|
-
spec.md 필수 섹션: 목표, 스코프 경계(In/Out), 수용 기준(3-7개, 테스트 가능한 구체적 행동), 전제 조건, 미결사항.
|
|
84
|
-
|
|
85
|
-
## 규칙
|
|
86
|
-
- 정보가 부족하면 AskUserQuestion으로 유저에게 직접 질문하라.
|
|
87
|
-
- 추측으로 빈칸을 채우지 않는다.
|
|
88
|
-
- 수용 기준에 모호한 표현("잘 작동한다", "빠르다") 금지.
|
|
89
|
-
- 스코프가 "하루 작업"을 초과하면 분리를 권고하라.
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**실패 조건**: spec.md가 없거나 수용 기준이 비어 있으면 즉시 에스컬레이션.
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
PM 에이전트가 요구사항 정의에 실패했습니다.
|
|
96
|
-
[1] brief.md를 보완하여 재시도
|
|
97
|
-
[2] spec.md를 직접 작성
|
|
51
|
+
spec.md가 없거나 비어 있습니다. crew-interview를 먼저 실행해야 합니다.
|
|
52
|
+
[1] crew-interview를 실행하여 spec.md를 생성
|
|
53
|
+
[2] spec.md를 직접 작성하여 재시도
|
|
98
54
|
[3] 이 태스크를 보류
|
|
99
55
|
```
|
|
100
56
|
|
|
101
57
|
---
|
|
102
58
|
|
|
103
|
-
### Step
|
|
59
|
+
### Step 2 — TechLead 에이전트 실행
|
|
104
60
|
|
|
105
61
|
**모델**: opus
|
|
106
|
-
**실행 조건**: 항상 (양쪽 유형 모두)
|
|
107
62
|
|
|
108
63
|
호출:
|
|
109
64
|
|
|
@@ -117,8 +72,10 @@ Agent(subagent_type="techlead", description="TechLead: {task-id} 사전 분석",
|
|
|
117
72
|
당신은 TechLead 에이전트다. 사전 분석을 수행하고 아키텍처 방향을 판단한다.
|
|
118
73
|
|
|
119
74
|
## 입력
|
|
120
|
-
|
|
121
|
-
|
|
75
|
+
.crew/plans/{task-id}/spec.md 를 읽어라.
|
|
76
|
+
|
|
77
|
+
spec.md에는 목표, 스코프 경계, 유저 플로우, UI 구조, 비즈니스 규칙, 수용 기준이 포함되어 있다.
|
|
78
|
+
WHAT(무엇을 만드는가)은 이미 정의되어 있으므로, HOW(어떻게 만드는가)에 집중하라.
|
|
122
79
|
|
|
123
80
|
## 서브에이전트 호출
|
|
124
81
|
- Explorer (Haiku): 코드베이스 탐색. 항상 호출. 병렬 2-3개로 호출하라.
|
|
@@ -141,7 +98,7 @@ Agent(subagent_type="techlead", description="TechLead: {task-id} 사전 분석",
|
|
|
141
98
|
- 탐색(양)은 서브에이전트에게, 판단(질)은 직접.
|
|
142
99
|
```
|
|
143
100
|
|
|
144
|
-
**Step
|
|
101
|
+
**Step 2 결과 저장 (오케스트레이터 직접)**:
|
|
145
102
|
|
|
146
103
|
TechLead 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
|
|
147
104
|
오케스트레이터가 TechLead의 반환 텍스트를 `.crew/plans/{task-id}/analysis.md`로 저장한다.
|
|
@@ -150,7 +107,7 @@ TechLead 에이전트는 read-only이므로 파일을 직접 작성하지 않는
|
|
|
150
107
|
|
|
151
108
|
---
|
|
152
109
|
|
|
153
|
-
### Step
|
|
110
|
+
### Step 2.5 — 테스트 전략 결정 (오케스트레이터 직접)
|
|
154
111
|
|
|
155
112
|
TechLead의 analysis.md에서 테스트 인프라 섹션을 확인한 후, 오케스트레이터가 유저에게 테스트 전략을 질문한다.
|
|
156
113
|
|
|
@@ -192,7 +149,7 @@ TechLead의 analysis.md에서 테스트 인프라 섹션을 확인한 후, 오
|
|
|
192
149
|
|
|
193
150
|
---
|
|
194
151
|
|
|
195
|
-
### Step
|
|
152
|
+
### Step 3 — Planner 에이전트 실행
|
|
196
153
|
|
|
197
154
|
**모델**: opus
|
|
198
155
|
|
|
@@ -208,8 +165,8 @@ Agent(subagent_type="planner", description="Planner: {task-id} 구현 계획", p
|
|
|
208
165
|
당신은 Planner 에이전트다. 구현 계획을 작성한다.
|
|
209
166
|
|
|
210
167
|
## 입력
|
|
168
|
+
.crew/plans/{task-id}/spec.md 를 읽어라.
|
|
211
169
|
.crew/plans/{task-id}/analysis.md 를 읽어라.
|
|
212
|
-
{유저 가치 유형 시}: .crew/plans/{task-id}/spec.md 도 읽어라.
|
|
213
170
|
brief.md는 읽지 않는다.
|
|
214
171
|
|
|
215
172
|
## 출력
|
|
@@ -241,6 +198,7 @@ plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명
|
|
|
241
198
|
## 규칙
|
|
242
199
|
- 코드를 작성하지 않는다.
|
|
243
200
|
- analysis.md의 아키텍처 방향과 가드레일을 따른다.
|
|
201
|
+
- spec.md에 정의된 비즈니스 규칙을 그대로 따른다. 임의로 비즈니스 결정을 추가하지 않는다.
|
|
244
202
|
- 태스크 하나가 4시간 초과 시 분해한다.
|
|
245
203
|
- "나중에 결정" 금지. 모르면 위험 요소에 기록.
|
|
246
204
|
- 필요시 Explorer 서브에이전트를 호출할 수 있다.
|
|
@@ -252,8 +210,8 @@ plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명
|
|
|
252
210
|
이번은 이전 계획이 리뷰에서 FAIL을 받은 후 재작성하는 것이다.
|
|
253
211
|
|
|
254
212
|
## 입력
|
|
213
|
+
.crew/plans/{task-id}/spec.md 를 읽어라.
|
|
255
214
|
.crew/plans/{task-id}/analysis.md 를 읽어라.
|
|
256
|
-
{유저 가치 유형 시}: .crew/plans/{task-id}/spec.md 도 읽어라.
|
|
257
215
|
.crew/plans/{task-id}/review-{n}.md 를 읽어라.
|
|
258
216
|
brief.md는 읽지 않는다.
|
|
259
217
|
|
|
@@ -266,6 +224,7 @@ plan.md 최상단에 "이전 피드백 반영" 섹션을 추가한다.
|
|
|
266
224
|
|
|
267
225
|
## 규칙
|
|
268
226
|
- analysis.md의 아키텍처 방향과 가드레일을 따른다.
|
|
227
|
+
- spec.md에 정의된 비즈니스 규칙을 그대로 따른다. 임의로 비즈니스 결정을 추가하지 않는다.
|
|
269
228
|
- 피드백을 무시하거나 같은 내용으로 작성하지 않는다.
|
|
270
229
|
```
|
|
271
230
|
|
|
@@ -273,7 +232,7 @@ plan.md 최상단에 "이전 피드백 반영" 섹션을 추가한다.
|
|
|
273
232
|
|
|
274
233
|
---
|
|
275
234
|
|
|
276
|
-
### Step
|
|
235
|
+
### Step 4 — PlanEvaluator 에이전트 실행
|
|
277
236
|
|
|
278
237
|
**모델**: sonnet (하드 임계값 판정에서 Opus 합리화 방지)
|
|
279
238
|
|
|
@@ -289,29 +248,29 @@ Agent(subagent_type="plan-evaluator", description="PlanEvaluator: {task-id} 계
|
|
|
289
248
|
당신은 PlanEvaluator 에이전트다. 계획을 검증한다.
|
|
290
249
|
|
|
291
250
|
## 입력
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
이 파일만 읽는다. 유저 가치 유형에서 brief.md는 읽지 않는다.
|
|
251
|
+
.crew/plans/{task-id}/spec.md + .crew/plans/{task-id}/analysis.md + .crew/plans/{task-id}/plan.md
|
|
252
|
+
이 파일만 읽는다. brief.md는 읽지 않는다.
|
|
295
253
|
|
|
296
254
|
## 검증 항목 (하드 임계값)
|
|
297
255
|
아래 각 항목에 YES 또는 NO로만 답한다. 부분 점수 없음.
|
|
298
256
|
|
|
299
257
|
[ ] E1. 검증 시나리오 완성도 — 모든 태스크에 검증 방법이 명시되어 있는가?
|
|
300
|
-
[ ] E2.
|
|
258
|
+
[ ] E2. spec 전체 커버리지 — spec.md의 수용 기준, 유저 플로우, UI 구조, 비즈니스 규칙이 전부 태스크로 커버되는가? (수용 기준만이 아니라 spec 전체를 검증)
|
|
301
259
|
[ ] E3. 코드 참조 사실 여부 — 언급한 파일/모듈이 존재하는가? (Explorer 서브에이전트 호출)
|
|
302
260
|
[ ] E4. 실행 가능성 — 구현자가 바로 시작할 수 있는 수준인가?
|
|
303
261
|
[ ] E5. 테스트 전략 정합성 — analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가?
|
|
304
262
|
- TDD: 각 구현 태스크가 RED→GREEN→REFACTOR 순서로 구성되어 있는가? 테스트 파일 경로가 명시되어 있는가?
|
|
305
263
|
- Tests-after: 구현 태스크 뒤에 테스트 작성 태스크가 있는가? 테스트 파일 경로가 명시되어 있는가?
|
|
306
264
|
- None: 이 항목을 YES로 처리한다.
|
|
265
|
+
[ ] E6. 비즈니스 가정 0개 — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가? plan에 "~로 가정", "~로 판단" 등 spec에 근거 없는 비즈니스 결정이 있으면 NO.
|
|
307
266
|
|
|
308
267
|
## 판정 규칙
|
|
309
|
-
-
|
|
268
|
+
- 6개 항목 모두 YES → PASS
|
|
310
269
|
- 하나라도 NO → FAIL
|
|
311
270
|
- "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
|
|
312
271
|
|
|
313
272
|
## FAIL 시 근본 원인 분류 (필수)
|
|
314
|
-
- spec 결함 (
|
|
273
|
+
- spec 결함 (spec.md 자체가 문제) → 오케스트레이터에 알린다
|
|
315
274
|
- plan 결함 (계획 구성/표현 문제) → Planner 재시도 가능
|
|
316
275
|
|
|
317
276
|
## E3 코드 참조 확인
|
|
@@ -320,37 +279,45 @@ Agent(subagent_type="explorer", description="코드 참조 확인: {파일 목
|
|
|
320
279
|
|
|
321
280
|
## 출력
|
|
322
281
|
아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
|
|
323
|
-
형식: 판정(PASS/FAIL), 항목별 결과(E1-
|
|
282
|
+
형식: 판정(PASS/FAIL), 항목별 결과(E1-E6 YES/NO + 근거), FAIL 상세(NO 항목의 문제+수정 방향), 근본 원인 분류(FAIL 시).
|
|
324
283
|
```
|
|
325
284
|
|
|
326
|
-
**Step
|
|
285
|
+
**Step 4 결과 저장 (오케스트레이터 직접)**:
|
|
327
286
|
|
|
328
287
|
PlanEvaluator 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
|
|
329
288
|
오케스트레이터가 PlanEvaluator의 반환 텍스트를 `.crew/plans/{task-id}/review.md`로 저장한다.
|
|
330
289
|
|
|
331
290
|
---
|
|
332
291
|
|
|
333
|
-
### Step
|
|
292
|
+
### Step 5 — PASS 처리
|
|
334
293
|
|
|
335
294
|
PlanEvaluator PASS이면:
|
|
336
295
|
|
|
337
|
-
**
|
|
296
|
+
**5a. review.md 확인**
|
|
338
297
|
|
|
339
298
|
review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
|
|
340
299
|
|
|
341
|
-
**
|
|
300
|
+
**5b. contract.md 작성 (오케스트레이터 직접)**
|
|
342
301
|
|
|
343
302
|
```markdown
|
|
344
303
|
# 스프린트 계약: {task-id}
|
|
345
304
|
|
|
346
305
|
생성일: {date}
|
|
347
|
-
유형: {유저 가치 | 엔지니어링}
|
|
348
306
|
|
|
349
307
|
## 목표
|
|
350
|
-
{spec.md
|
|
308
|
+
{spec.md에서 추출한 한 문장}
|
|
351
309
|
|
|
352
310
|
## 수용 기준
|
|
353
|
-
- [ ] {spec.md의 수용 기준을 그대로 복사
|
|
311
|
+
- [ ] {spec.md의 수용 기준을 그대로 복사}
|
|
312
|
+
|
|
313
|
+
## 유저 플로우
|
|
314
|
+
{spec.md의 유저 플로우 섹션이 있으면 그대로 복사}
|
|
315
|
+
|
|
316
|
+
## UI 구조 및 주요 콘텐츠
|
|
317
|
+
{spec.md의 UI 구조 섹션이 있으면 그대로 복사}
|
|
318
|
+
|
|
319
|
+
## 비즈니스 규칙
|
|
320
|
+
{spec.md의 비즈니스 규칙 섹션이 있으면 그대로 복사}
|
|
354
321
|
|
|
355
322
|
## 가드레일
|
|
356
323
|
### Must
|
|
@@ -373,6 +340,7 @@ review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
|
|
|
373
340
|
- 기대 결과: {검증할 것}
|
|
374
341
|
|
|
375
342
|
## 참조 문서
|
|
343
|
+
- 요구사항: .crew/plans/{task-id}/spec.md
|
|
376
344
|
- 사전 분석: .crew/plans/{task-id}/analysis.md
|
|
377
345
|
- 구현 계획: .crew/plans/{task-id}/plan.md
|
|
378
346
|
|
|
@@ -383,11 +351,11 @@ PlanEvaluator PASS — review.md 참조
|
|
|
383
351
|
ACTIVE
|
|
384
352
|
```
|
|
385
353
|
|
|
386
|
-
**
|
|
354
|
+
**5c. .loop_count 정리**
|
|
387
355
|
|
|
388
356
|
`.loop_count` 파일이 존재하면 삭제한다.
|
|
389
357
|
|
|
390
|
-
**
|
|
358
|
+
**5d. 완료 반환**
|
|
391
359
|
|
|
392
360
|
```
|
|
393
361
|
상태: COMPLETE
|
|
@@ -397,22 +365,22 @@ contract.md 경로: .crew/plans/{task-id}/contract.md
|
|
|
397
365
|
|
|
398
366
|
---
|
|
399
367
|
|
|
400
|
-
### Step
|
|
368
|
+
### Step 6 — FAIL 처리 (피드백 보존 루프)
|
|
401
369
|
|
|
402
370
|
PlanEvaluator FAIL이면:
|
|
403
371
|
|
|
404
|
-
**
|
|
372
|
+
**6a. FAIL 원인 분류**
|
|
405
373
|
|
|
406
374
|
PlanEvaluator가 review.md에 기록한 근본 원인 분류를 확인한다.
|
|
407
375
|
|
|
408
|
-
- **spec 결함** (
|
|
376
|
+
- **spec 결함** (spec.md 자체가 문제):
|
|
409
377
|
- Planner를 재시도해도 고칠 수 없다.
|
|
410
378
|
- 즉시 에스컬레이션:
|
|
411
379
|
|
|
412
380
|
```
|
|
413
381
|
PlanEvaluator가 spec 결함을 이유로 FAIL을 냈습니다.
|
|
414
382
|
Planner 재시도로는 해결할 수 없습니다.
|
|
415
|
-
[1]
|
|
383
|
+
[1] crew-interview를 재실행하여 spec.md를 재작성
|
|
416
384
|
[2] spec.md를 직접 수정
|
|
417
385
|
[3] 이 태스크를 보류
|
|
418
386
|
```
|
|
@@ -420,13 +388,13 @@ Planner 재시도로는 해결할 수 없습니다.
|
|
|
420
388
|
- **plan 결함** (계획 구성/표현 문제):
|
|
421
389
|
- 피드백 보존 루프를 진행한다.
|
|
422
390
|
|
|
423
|
-
**
|
|
391
|
+
**6b. 루프 카운터 읽기**
|
|
424
392
|
|
|
425
393
|
`.crew/plans/{task-id}/.loop_count` 파일을 읽는다.
|
|
426
394
|
- 파일이 없으면 카운터 = 0 (첫 번째 FAIL)
|
|
427
395
|
- 파일이 있으면 파일 내용(정수)이 카운터 값
|
|
428
396
|
|
|
429
|
-
**
|
|
397
|
+
**6c. 에스컬레이션 판단**
|
|
430
398
|
|
|
431
399
|
카운터 값 >= 4이면 즉시 에스컬레이션:
|
|
432
400
|
|
|
@@ -440,7 +408,7 @@ Planner 재시도로는 해결할 수 없습니다.
|
|
|
440
408
|
|
|
441
409
|
에스컬레이션 시 `.loop_count` 파일을 삭제한다.
|
|
442
410
|
|
|
443
|
-
**
|
|
411
|
+
**6d. 피드백 아카이브**
|
|
444
412
|
|
|
445
413
|
`n = 카운터 + 1` (이번 회차 번호)
|
|
446
414
|
|
|
@@ -449,13 +417,13 @@ plan.md → plan-{n}.md 로 이름 변경
|
|
|
449
417
|
review.md → review-{n}.md 로 이름 변경
|
|
450
418
|
```
|
|
451
419
|
|
|
452
|
-
**
|
|
420
|
+
**6e. 루프 카운터 증가 저장**
|
|
453
421
|
|
|
454
422
|
`카운터 + 1`을 `.loop_count` 파일에 저장한다.
|
|
455
423
|
|
|
456
|
-
**
|
|
424
|
+
**6f. Step 3로 돌아감 (retry)**
|
|
457
425
|
|
|
458
|
-
Step
|
|
426
|
+
Step 3(Planner)로 돌아간다. retry 프롬프트의 `{n}`에 Step 6d에서 계산한 값을 대입한다.
|
|
459
427
|
TechLead는 재실행하지 않는다 — 기술적 사실은 변하지 않으므로 analysis.md를 재사용한다.
|
|
460
428
|
|
|
461
429
|
---
|
|
@@ -478,11 +446,10 @@ Planner + PlanEvaluator 사이클은 최대 5회 (초기 1회 + retry 최대 4
|
|
|
478
446
|
|
|
479
447
|
| 에이전트 | subagent_type | 모델 | 주입할 파일 | 차단할 파일 |
|
|
480
448
|
|----------|--------------|------|------------|------------|
|
|
481
|
-
|
|
|
482
|
-
|
|
|
483
|
-
| Planner (
|
|
484
|
-
|
|
|
485
|
-
| PlanEvaluator | plan-evaluator | sonnet | spec.md/brief.md + analysis.md + plan.md | brief.md (유저 가치 시) |
|
|
449
|
+
| TechLead | techlead | opus | spec.md | — |
|
|
450
|
+
| Planner (첫 번째) | planner | opus | spec.md + analysis.md | brief.md |
|
|
451
|
+
| Planner (retry) | planner | opus | spec.md + analysis.md + review-{n}.md | brief.md |
|
|
452
|
+
| PlanEvaluator | plan-evaluator | sonnet | spec.md + analysis.md + plan.md | brief.md |
|
|
486
453
|
|
|
487
454
|
**중요**: 모든 에이전트 호출 시 반드시 `subagent_type` 파라미터를 지정해야 한다. `subagent_type`이 없으면 PreToolUse hook이 호출을 차단한다. `model` 파라미터는 생략 가능 — hook이 에이전트 정의에서 자동 주입한다.
|
|
488
455
|
|
|
@@ -503,7 +470,7 @@ Planner + PlanEvaluator 사이클은 최대 5회 (초기 1회 + retry 최대 4
|
|
|
503
470
|
```json
|
|
504
471
|
{
|
|
505
472
|
"status": "ESCALATE",
|
|
506
|
-
"phase": "
|
|
473
|
+
"phase": "spec-gate" | "techlead-fail" | "planner-fail" | "evaluator-spec-defect" | "loop-overflow",
|
|
507
474
|
"reason": "자유형 텍스트"
|
|
508
475
|
}
|
|
509
476
|
```
|