@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.
Files changed (40) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +8 -7
  3. package/README.md +22 -0
  4. package/agents/code-reviewer.md +7 -0
  5. package/agents/dev.md +7 -0
  6. package/agents/explorer.md +7 -0
  7. package/agents/plan-evaluator.md +7 -0
  8. package/agents/planner.md +7 -0
  9. package/agents/pm.md +7 -0
  10. package/agents/qa.md +8 -1
  11. package/agents/researcher.md +7 -0
  12. package/agents/techlead.md +7 -0
  13. package/data/agent-contracts.json +350 -0
  14. package/data/agent-instructions/code-reviewer.md +47 -0
  15. package/data/agent-instructions/dev.md +48 -0
  16. package/data/agent-instructions/explorer.md +14 -0
  17. package/data/agent-instructions/plan-evaluator.md +68 -0
  18. package/data/agent-instructions/planner.md +73 -0
  19. package/data/agent-instructions/pm.md +47 -0
  20. package/data/agent-instructions/qa.md +65 -0
  21. package/data/agent-instructions/researcher.md +15 -0
  22. package/data/agent-instructions/techlead.md +66 -0
  23. package/package.json +8 -3
  24. package/scripts/crew-agent-runner.mjs +323 -0
  25. package/scripts/lib/build.mjs +213 -0
  26. package/scripts/lib/cli.mjs +30 -0
  27. package/scripts/lib/config.mjs +33 -0
  28. package/scripts/lib/contracts.mjs +146 -0
  29. package/scripts/lib/dispatch.mjs +241 -0
  30. package/scripts/lib/installHooks.mjs +136 -0
  31. package/scripts/lib/pluginRoot.mjs +10 -0
  32. package/scripts/lib/render.mjs +110 -0
  33. package/scripts/lib/renderFollowup.mjs +51 -0
  34. package/scripts/lib/resolve.mjs +72 -0
  35. package/scripts/lib/validate.mjs +100 -0
  36. package/skills/crew-agent-runner/SKILL.md +115 -0
  37. package/skills/crew-dev/SKILL.md +162 -780
  38. package/skills/crew-interview/SKILL.md +135 -44
  39. package/skills/crew-plan/SKILL.md +217 -414
  40. package/skills/crew-setup/SKILL.md +32 -19
@@ -8,7 +8,7 @@ description: TechLead + Planner + PlanEvaluator 계획 파이프라인 — contr
8
8
  crew-interview가 생성한 spec.md를 입력으로 받아 **HOW(어떻게 만드는가)**를 결정하고 `contract.md`를 생성한다.
9
9
  `contract.md`가 생성되어야 crew-dev가 시작할 수 있다.
10
10
 
11
- 에이전트 간 소통은 파일을 통해서만 이루어진다. 에이전트의 추론 과정은 다른 에이전트에게 전달되지 않는다.
11
+ 에이전트 간 소통은 파일 산출물과 중앙 `crew-agent-runner` 스킬의 dispatch 계약을 통해서만 이루어진다. 에이전트의 추론 과정은 다른 에이전트에게 전달되지 않는다.
12
12
 
13
13
  ---
14
14
 
@@ -40,439 +40,262 @@ crew-interview가 생성한 spec.md를 입력으로 받아 **HOW(어떻게 만
40
40
 
41
41
  ## 실행 순서
42
42
 
43
- TechLead, Planner, PlanEvaluator는 모두 provider 설정 대상이다. 오케스트레이터는 단계에서 `runAgent(role, prompt, providerConfig)`를 사용한다.
43
+ 에이전트 단계는 중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다. 문서는 역할, 입력, 기대 산출물, 검증 기준만 정의하며 실행 방식은 runner 계약을 따른다.
44
44
 
45
- - Claude provider이면 기존 Claude Code `Agent` 호출을 사용한다.
46
- - Codex provider이면 read-only companion task를 사용하고, 산출물은 `<crew-agent-result>.artifact`로 반환받아 오케스트레이터가 `.crew/` 파일에 저장한다.
47
- - Codex TechLead/Planner가 Explorer/Researcher가 필요하면 직접 호출하지 않고 `needs_agent`를 반환한다. 오케스트레이터가 요청된 에이전트를 실행한 뒤 결과를 원래 Codex thread에 `--resume-last`로 주입한다.
45
+ ### Step 1 spec.md 검증
48
46
 
49
- ### Step 1 — spec.md 유효성 검사 (오케스트레이터 직접)
47
+ role: orchestrator
50
48
 
51
- `.crew/plans/{task-id}/spec.md`를 확인한다.
49
+ inputs:
50
+ - `.crew/plans/{task-id}/spec.md`
52
51
 
53
- **게이트**: spec.md가 존재하고 비어 있지 않음을 확인한다.
54
- 실패 즉시 에스컬레이션:
52
+ output:
53
+ - spec gate result → continue 또는 ESCALATE
55
54
 
56
- ```
57
- spec.md가 없거나 비어 있습니다. crew-interview를 먼저 실행해야 합니다.
58
- [1] crew-interview를 실행하여 spec.md 생성
59
- [2] spec.md 직접 작성하여 재시도
60
- [3] 이 태스크를 보류
61
- ```
55
+ role instructions:
56
+ - spec.md가 존재하고 비어 있지 않은지 확인한다.
57
+ - WHAT(무엇을 만드는가)은 spec.md 이미 정의되어 있어야 한다.
58
+ - spec.md 없거나 비어 있으면 crew-interview 실행, spec.md 직접 보완, 태스크 보류 중 하나를 선택하도록 에스컬레이션한다.
62
59
 
63
- ---
60
+ success gate:
61
+ - spec.md가 존재한다.
62
+ - spec.md가 비어 있지 않다.
64
63
 
65
- ### Step 2 — TechLead 에이전트 실행
64
+ failure handling:
65
+ - spec gate 실패 시 즉시 ESCALATE.
66
+ - retry/escalate 규칙은 contract.policy에 따른다.
66
67
 
67
- **provider/model**: 설정 resolver가 결정한다 (기본값: `agent_defaults.techlead`).
68
+ ---
68
69
 
69
- Claude provider 호출 예:
70
+ ### Step 2 — TechLead 실행
70
71
 
71
- ```
72
- Agent(subagent_type="techlead", description="TechLead: {task-id} 사전 분석", prompt="...")
73
- ```
72
+ 중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
74
73
 
75
- 에이전트 프롬프트:
74
+ role: techlead
76
75
 
77
- ```
78
- 당신은 TechLead 에이전트다. 사전 분석을 수행하고 아키텍처 방향을 판단한다.
79
-
80
- ## 입력
81
- .crew/plans/{task-id}/spec.md 를 읽어라.
82
-
83
- spec.md에는 목표, 스코프 경계, 유저 플로우, UI 구조, 비즈니스 규칙, 수용 기준이 포함되어 있다.
84
- WHAT(무엇을 만드는가)은 이미 정의되어 있으므로, HOW(어떻게 만드는가)에 집중하라.
85
-
86
- ## 서브에이전트 호출
87
- - Explorer (Haiku): 코드베이스 탐색. 항상 호출. 병렬 2-3개로 호출하라.
88
- runAgent(role="explorer", description="코드베이스 탐색: {탐색 대상}", prompt="...")
89
- **필수 탐색 항목**: 테스트 인프라도 반드시 탐색한다. Explorer 중 1개는 다음을 확인:
90
- - 테스트 프레임워크 설정 파일 (jest.config.*, vitest.config.*, pytest.ini 등)
91
- - 대표적인 테스트 파일 2-3개의 패턴
92
- - 커버리지 설정 여부
93
- - 테스트 실행 스크립트 (package.json scripts 등)
94
- - Researcher (Sonnet): 외부 리서치. 필요시만 호출.
95
- runAgent(role="researcher", description="외부 리서치: {리서치 대상}", prompt="...")
96
- **외부 API/서비스가 관련된 경우**: spec.md에 언급된 각 외부 대상(엔드포인트, 서비스, 플랫폼)에 대해 **개별적으로** 문서/인터페이스를 조사하라. 하나의 대상에 대한 문서를 다른 대상에 일반화하지 않는다. 문서가 확인되지 않는 대상은 "미검증 인터페이스"로 명시한다.
97
-
98
- ## 출력
99
- 아래 필수 섹션을 포함한 분석 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
100
-
101
- 필수 섹션: 요구사항 보완, 코드베이스 맥락(관련 파일/기존 패턴/테스트 구조), 아키텍처 방향(권장+대안), 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라(프레임워크/패턴/유무), 외부 인터페이스 검증(해당 시), 외부 리서치(해당 시).
102
-
103
- ## 규칙
104
- - 요구사항에 빈틈이 있으면 AskUserQuestion으로 유저에게 직접 질문하라.
105
- - 탐색(양)은 서브에이전트에게, 판단(질)은 직접.
106
- ```
76
+ inputs:
77
+ - `.crew/plans/{task-id}/spec.md`
78
+
79
+ output:
80
+ - complete.artifact → `.crew/plans/{task-id}/analysis.md`
107
81
 
108
- **Step 2 결과 저장 (오케스트레이터 직접)**:
82
+ role instructions:
83
+ - 사전 분석을 수행하고 아키텍처 방향을 판단한다.
84
+ - WHAT은 이미 정의되어 있으므로 HOW에 집중한다.
85
+ - 코드베이스 맥락, 관련 파일, 기존 패턴, 테스트 구조를 확인한다.
86
+ - Explorer 역할의 탐색이 필요한 경우 runner 계약의 후속 요청 형식으로 코드베이스 탐색을 요청한다.
87
+ - 테스트 인프라 탐색은 필수다. 프레임워크 설정, 대표 테스트 파일, 커버리지 설정, 테스트 실행 스크립트를 확인한다.
88
+ - 외부 API/서비스가 관련된 경우 Researcher 역할의 조사가 필요한 항목을 분리해 요청한다.
89
+ - 외부 대상마다 문서와 인터페이스를 개별 확인하고, 확인되지 않은 대상은 "미검증 인터페이스"로 명시한다.
90
+ - 요구사항에 빈틈이 있으면 blocked user 상태로 질문과 선택지를 반환한다.
91
+ - 필수 섹션: 요구사항 보완, 코드베이스 맥락, 아키텍처 방향, 엣지 케이스/리스크, 가드레일(Must/Must NOT), 테스트 인프라, 외부 인터페이스 검증(해당 시), 외부 리서치(해당 시).
109
92
 
110
- TechLead 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
111
- 오케스트레이터가 TechLead의 반환 텍스트를 `.crew/plans/{task-id}/analysis.md`로 저장한다.
93
+ success gate:
94
+ - analysis.md 산출물이 생성될 수 있는 complete.artifact가 있다.
95
+ - 가드레일 섹션이 비어 있지 않다.
96
+ - 테스트 인프라 섹션이 프레임워크/패턴/유무를 명시한다.
112
97
 
113
- **실패 조건**: analysis.md가 없거나 가드레일 섹션이 비어 있으면 즉시 에스컬레이션.
98
+ failure handling:
99
+ - analysis 산출물이 없거나 가드레일이 비어 있으면 ESCALATE.
100
+ - retry/escalate 규칙은 contract.policy에 따른다.
114
101
 
115
102
  ---
116
103
 
117
- ### Step 2.5 — 테스트 전략 결정 (오케스트레이터 직접)
104
+ ### Step 2.5 — 테스트 전략 결정
118
105
 
119
- TechLead의 analysis.md에서 테스트 인프라 섹션을 확인한 후, 오케스트레이터가 유저에게 테스트 전략을 질문한다.
106
+ role: orchestrator
120
107
 
121
- **테스트 인프라가 있는 경우**:
108
+ inputs:
109
+ - `.crew/plans/{task-id}/analysis.md`
122
110
 
123
- ```
124
- 테스트 인프라가 감지되었습니다: {프레임워크명}
125
- 테스트 전략을 선택하세요:
126
- [1] TDD — 각 태스크를 RED(실패 테스트) → GREEN(최소 구현) → REFACTOR로 구성
127
- [2] Tests-after — 구현 태스크 완료 후 테스트 태스크 추가
128
- [3] None — 자동화 테스트 없음 (QA 에이전트 검증만)
129
- ```
111
+ output:
112
+ - selected test strategy → `.crew/plans/{task-id}/analysis.md`의 `## 테스트 전략` 섹션
130
113
 
131
- **테스트 인프라가 없는 경우**:
114
+ role instructions:
115
+ - TechLead의 테스트 인프라 섹션을 기준으로 유저에게 테스트 전략을 선택하게 한다.
116
+ - 테스트 인프라가 있으면 TDD, Tests-after, None 중 하나를 선택하게 한다.
117
+ - 테스트 인프라가 없고 TDD 또는 Tests-after를 선택하면 vitest, jest, bun test, pytest, 기타 중 하나를 선택하게 한다.
118
+ - 선택 결과를 analysis.md 하단의 `## 테스트 전략` 섹션으로 기록한다.
132
119
 
133
- ```
134
- 테스트 인프라가 감지되지 않았습니다.
135
- 테스트 전략을 선택하세요:
136
- [1] TDD — 테스트 인프라 셋업 RED GREEN → REFACTOR구현
137
- [2] Tests-after — 테스트 인프라 셋업 후 구현 완료 뒤 테스트 추가
138
- [3] None — 자동화 테스트 없음 (QA 에이전트 검증만)
139
- ```
120
+ success gate:
121
+ - 결정 값이 TDD, Tests-after, None 중 하나다.
122
+ - 프레임워크 값이 기존 감지 결과 또는 유저 선택으로 명시된다.
123
+ - 인프라 셋업 필요 여부가 YES 또는 NO명시된다.
140
124
 
141
- [1] 또는 [2] 선택 시 인프라가 없으면 추가 질문:
142
-
143
- ```
144
- 테스트 프레임워크를 선택하세요:
145
- [1] vitest [2] jest [3] bun test [4] pytest [5] 기타 (직접 입력)
146
- ```
147
-
148
- **결과 기록**: 선택된 테스트 전략을 analysis.md 하단에 추가한다:
149
-
150
- ```markdown
151
- ## 테스트 전략
152
- - 결정: {TDD | Tests-after | None}
153
- - 프레임워크: {기존 감지된 프레임워크 또는 유저 선택}
154
- - 인프라 셋업 필요: {YES | NO}
155
- ```
125
+ failure handling:
126
+ - 유저 선택이 없으면 blocked user 상태로 보류한다.
127
+ - retry/escalate 규칙은 contract.policy에 따른다.
156
128
 
157
129
  ---
158
130
 
159
- ### Step 3 — Planner 에이전트 실행
160
-
161
- **provider/model**: 설정 resolver가 결정한다 (기본값: `agent_defaults.planner`).
162
-
163
- Claude provider 호출 예:
164
-
165
- ```
166
- Agent(subagent_type="planner", description="Planner: {task-id} 구현 계획", prompt="...")
167
- ```
168
-
169
- **첫 번째 실행 시 에이전트 프롬프트**:
170
-
171
- ```
172
- 당신은 Planner 에이전트다. 구현 계획을 작성한다.
173
-
174
- ## 입력
175
- .crew/plans/{task-id}/spec.md 읽어라.
176
- .crew/plans/{task-id}/analysis.md 읽어라.
177
- brief.md는 읽지 않는다.
178
-
179
- ## 출력
180
- .crew/plans/{task-id}/plan.md 작성하라.
181
-
182
- plan.md 필수 구조: 유저 스토리(US-N) 단위. 유저 스토리에 구현 태스크 + 테스트 시나리오(최소 2개: 정상+에러). 위험 요소 섹션. 검증 시나리오 섹션(조건/행위/기대 결과 — contract.md에 그대로 포함됨). 실행 검증 섹션(필수 — contract.md에 그대로 포함됨).
183
-
184
- ## 테스트 전략
185
- analysis.md의 `## 테스트 전략` 섹션을 확인하고, 결정에 따라 태스크 구조를 달리한다.
186
-
187
- ### TDD인 경우
188
- - 인프라 셋업이 필요하면 첫 번째 태스크로 "테스트 인프라 셋업"을 추가한다.
189
- - 각 유저 스토리의 구현 태스크를 다음 순서로 구성한다:
190
- 1. RED — 실패하는 테스트 작성 (테스트 파일 경로 명시)
191
- 2. GREEN — 테스트를 통과하는 최소한의 코드 작성
192
- 3. REFACTOR — 코드 품질 개선 (필요시)
193
- - 각 태스크의 수용 기준에 포함: `테스트 파일: {경로}`, `테스트 실행 결과: PASS`
194
-
195
- ### Tests-after인 경우
196
- - 인프라 셋업이 필요하면 첫 번째 태스크로 "테스트 인프라 셋업"을 추가한다.
197
- - 구현 태스크를 먼저 나열한 후, 별도의 테스트 작성 태스크를 추가한다.
198
- - 테스트 태스크의 수용 기준에 포함: `테스트 파일: {경로}`, `테스트 실행 결과: PASS`
199
-
200
- ### None인 경우
201
- - 현재와 동일. 자동화 테스트 태스크 없이 검증 시나리오만 포함한다.
202
-
203
- plan.md 최상단에 `## 테스트 전략` 섹션을 두어 결정 사항을 명시한다.
204
-
205
- ### 외부 인터페이스 가정 (외부 API/서비스가 관련된 경우 필수)
206
- analysis.md에 `## 외부 인터페이스 검증` 섹션이 있으면, plan.md에 `## 외부 인터페이스 가정` 섹션을 반드시 작성한다.
207
- 각 외부 대상에 대해 가정하는 인터페이스와 검증 상태를 명시한다:
208
-
209
- | 대상 | 가정하는 인터페이스 | 근거 | 검증 상태 |
210
- |------|------------------|------|----------|
211
- | {대상 1} | {인터페이스 설명} | 공식 문서 확인 | 검증됨 |
212
- | {대상 2} | {대상 1과 동일} | 문서 없음, 유추 | 미검증 |
213
-
214
- **"미검증" 대상이 있으면**: 해당 대상에 대한 **스파이크 태스크**를 구현 태스크 앞에 배치한다.
215
- 스파이크 태스크는 실제 API를 호출하여 인터페이스를 확인하고, 검증된 대상과의 차이점을 기록한다.
216
- 차이가 발견되면 이후 구현 태스크의 접근 방식을 스파이크 결과에 따라 분기하도록 계획한다.
217
-
218
- ### 실행 검증 (필수, 테스트 전략과 무관하게 항상 포함)
219
- 유닛 테스트/자동화 테스트와 별개로, 구현된 기능을 실제로 실행하여 동작을 확인하는 절차를 `## 실행 검증` 섹션에 반드시 작성한다.
220
- - 백엔드/API: 실제 API 호출 명령어(curl/httpie), 스크립트 실행, DB 쿼리 등
221
- - UI/프론트엔드: 개발 서버 실행 후 브라우저에서 직접 조작하는 절차
222
- - CLI/라이브러리: 실제 사용 예시 실행
223
- "테스트 파일 실행"은 실행 검증이 아니다. 실제 기능을 사용자 관점에서 동작시키는 것이 실행 검증이다.
224
- 각 실행 검증 항목은 다음 형식으로 작성한다:
225
- - 실행 방법: {구체적 명령어 또는 절차}
226
- - 기대 결과: {확인할 출력 또는 동작}
227
-
228
- ## 규칙
131
+ ### Step 3 — Planner 실행
132
+
133
+ 중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
134
+
135
+ role: planner
136
+
137
+ inputs:
138
+ - `.crew/plans/{task-id}/spec.md`
139
+ - `.crew/plans/{task-id}/analysis.md`
140
+ - retry 시 `.crew/plans/{task-id}/review-{n}.md`
141
+
142
+ output:
143
+ - complete.artifact → `.crew/plans/{task-id}/plan.md`
144
+
145
+ role instructions:
146
+ - 구현 계획을 유저 스토리(US-N) 단위로 작성한다.
147
+ - brief.md 입력으로 사용하지 않는다.
148
+ - 유저 스토리에 구현 태스크와 테스트 시나리오를 포함한다. 테스트 시나리오는 최소 정상 1개와 에러 1개를 포함한다.
149
+ - 위험 요소 섹션, 검증 시나리오 섹션, 실행 검증 섹션을 포함한다.
150
+ - plan.md 최상단에 `## 테스트 전략` 섹션을 두고 analysis.md의 결정을 반영한다.
151
+ - TDD인 경우 각 구현 태스크를 RED, GREEN, REFACTOR 순서로 구성하고 테스트 파일 경로와 테스트 실행 결과 기준을 명시한다.
152
+ - Tests-after인 경우 구현 태스크 뒤에 별도 테스트 작성 태스크를 추가하고 테스트 파일 경로와 테스트 실행 결과 기준을 명시한다.
153
+ - None인 경우 자동화 테스트 태스크 없이 검증 시나리오와 실행 검증을 유지한다.
154
+ - 테스트 인프라 셋업이 필요하면 번째 태스크로 테스트 인프라 셋업을 추가한다.
155
+ - 외부 인터페이스 검증 섹션에 미검증 대상이 있으면 구현 태스크 앞에 스파이크 태스크를 배치한다.
156
+ - 실행 검증은 사용자 관점에서 실제 기능을 동작시키는 절차여야 하며, 테스트 파일 실행만으로 대체하지 않는다.
157
+ - retry 시 review-{n}.md의 FAIL 사유를 먼저 반영하고, 최상단에 이전 피드백 반영 섹션을 추가한다.
229
158
  - 코드를 작성하지 않는다.
230
159
  - analysis.md의 아키텍처 방향과 가드레일을 따른다.
231
- - spec.md에 정의된 비즈니스 규칙을 그대로 따른다. 임의로 비즈니스 결정을 추가하지 않는다.
232
- - 태스크 하나가 4시간 초과 분해한다.
233
- - "나중에 결정" 금지. 모르면 위험 요소에 기록.
234
- - 필요시 Explorer 서브에이전트를 호출할 수 있다.
235
- ```
236
-
237
- **retry 시 에이전트 프롬프트**:
238
-
239
- ```
240
- 이번은 이전 계획이 리뷰에서 FAIL을 받은 후 재작성하는 것이다.
160
+ - spec.md에 없는 비즈니스 결정을 추가하지 않는다.
161
+ - 태스크 하나가 4시간을 초과하면 분해한다.
162
+ - "나중에 결정" 쓰지 않는다. 모르면 위험 요소에 기록한다.
241
163
 
242
- ## 입력
243
- .crew/plans/{task-id}/spec.md 읽어라.
244
- .crew/plans/{task-id}/analysis.md 읽어라.
245
- .crew/plans/{task-id}/review-{n}.md 읽어라.
246
- brief.md는 읽지 않는다.
164
+ success gate:
165
+ - plan.md 산출물이 생성될 수 있는 complete.artifact가 있다.
166
+ - 유저 스토리 단위 태스크 목록이 비어 있지 않다.
167
+ - `## 테스트 전략`, 위험 요소, 검증 시나리오, 실행 검증 섹션이 있다.
168
+ - 선택된 테스트 전략과 태스크 구조가 일치한다.
247
169
 
248
- ## 필수 선행 작업
249
- review-{n}.md를 먼저 읽어라. 이전 plan FAIL을 받았는지 확인하고, 지적된 항목을 명시적으로 수정하라.
250
-
251
- ## 출력
252
- .crew/plans/{task-id}/plan.md 를 새로 작성하라.
253
- plan.md 최상단에 "이전 피드백 반영" 섹션을 추가한다.
254
-
255
- ## 규칙
256
- - analysis.md의 아키텍처 방향과 가드레일을 따른다.
257
- - spec.md에 정의된 비즈니스 규칙을 그대로 따른다. 임의로 비즈니스 결정을 추가하지 않는다.
258
- - 피드백을 무시하거나 같은 내용으로 작성하지 않는다.
259
- ```
260
-
261
- **실패 조건**: plan.md가 없거나 태스크 목록이 비어 있으면 즉시 에스컬레이션.
170
+ failure handling:
171
+ - plan 산출물이 없거나 태스크 목록이 비어 있으면 ESCALATE.
172
+ - PlanEvaluator FAIL 이후에는 Step 6의 피드백 보존 루프를 따른다.
173
+ - retry/escalate 규칙은 contract.policy에 따른다.
262
174
 
263
175
  ---
264
176
 
265
- ### Step 4 — PlanEvaluator 에이전트 실행
266
-
267
- **provider/model**: 설정 resolver가 결정한다 (기본값: `agent_defaults.plan-evaluator`).
268
-
269
- Claude provider 호출 예:
270
-
271
- ```
272
- Agent(subagent_type="plan-evaluator", description="PlanEvaluator: {task-id} 계획 검증", prompt="...")
273
- ```
274
-
275
- 에이전트 프롬프트:
276
-
277
- ```
278
- 당신은 PlanEvaluator 에이전트다. 계획을 검증한다.
279
-
280
- ## 입력
281
- .crew/plans/{task-id}/spec.md + .crew/plans/{task-id}/analysis.md + .crew/plans/{task-id}/plan.md
282
- 파일만 읽는다. brief.md는 읽지 않는다.
283
-
284
- ## 검증 항목 (하드 임계값)
285
- 아래 항목에 YES 또는 NO로만 답한다. 부분 점수 없음.
286
-
287
- [ ] E1. 검증 시나리오 완성도 모든 태스크에 검증 방법이 명시되어 있는가?
288
- [ ] E2. spec 전체 커버리지 spec.md 수용 기준, 유저 플로우, UI 구조, 비즈니스 규칙이 전부 태스크로 커버되는가? (수용 기준만이 아니라 spec 전체를 검증)
289
- [ ] E3. 코드 참조 사실 여부 언급한 파일/모듈이 존재하는가? (Explorer 서브에이전트 호출)
290
- [ ] E4. 실행 가능성 구현자가 바로 시작할 있는 수준인가?
291
- [ ] E5. 테스트 전략 정합성 analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가?
292
- - TDD: 구현 태스크가 RED→GREEN→REFACTOR 순서로 구성되어 있는가? 테스트 파일 경로가 명시되어 있는가?
293
- - Tests-after: 구현 태스크 뒤에 테스트 작성 태스크가 있는가? 테스트 파일 경로가 명시되어 있는가?
294
- - None: 항목을 YES 처리한다.
295
- [ ] E6. 비즈니스 가정 0개 — plan.md가 spec.md에 없는 비즈니스 로직을 임의로 추가하지 않았는가? plan에 "~로 가정", "~로 판단" 등 spec에 근거 없는 비즈니스 결정이 있으면 NO.
296
- [ ] E7. 실행 검증 포함 — plan.md에 `## 실행 검증` 섹션이 있고, 유닛 테스트와 별개로 구현된 기능을 실제로 실행하여 동작을 확인하는 절차가 구체적으로 명시되어 있는가?
297
- - 항목에 실행 방법(명령어/절차)과 기대 결과가 있는가?
298
- - "테스트 파일 실행"만으로 구성되어 있으면 NO.
299
- - 백엔드라면 실제 API 호출/스크립트 실행, UI라면 브라우저 조작 절차가 있어야 YES.
300
- [ ] E8. 외부 인터페이스 가정 검증 — plan.md에서 여러 외부 서비스/엔드포인트를 동일한 인터페이스로 처리하는 태스크가 있는가? 있다면:
301
- - `## 외부 인터페이스 가정` 섹션에 각 대상별 검증 상태가 명시되어 있는가?
302
- - "미검증" 대상에 대해 스파이크 태스크가 구현 태스크 앞에 배치되어 있는가?
303
- - 외부 API가 관련되지 않은 경우 이 항목을 YES로 처리한다.
304
-
305
- ## 판정 규칙
306
- - 8개 항목 모두 YES → PASS
307
- - 하나라도 NO → FAIL
308
- - "아마 의도했을 것"이라고 추측하지 않는다. 모호하면 NO.
309
-
310
- ## FAIL 시 근본 원인 분류 (필수)
311
- - spec 결함 (spec.md 자체가 문제) → 오케스트레이터에 알린다
312
- - plan 결함 (계획 구성/표현 문제) → Planner 재시도 가능
313
-
314
- ## E3 코드 참조 확인
315
- Explorer 서브에이전트를 호출하여 plan.md에서 참조하는 파일/모듈이 존재하는지 확인하라.
316
- runAgent(role="explorer", description="코드 참조 확인: {파일 목록 요약}", prompt="plan.md에서 참조하는 다음 파일/모듈이 존재하는지 확인하라: {파일 목록}")
317
-
318
- ## 출력
319
- 아래 형식으로 검증 결과를 텍스트로 반환하라. 파일을 직접 작성하지 않는다.
320
- 형식: 판정(PASS/FAIL), 항목별 결과(E1-E8 YES/NO + 근거), FAIL 상세(NO 항목의 문제+수정 방향), 근본 원인 분류(FAIL 시).
321
- ```
322
-
323
- **Step 4 결과 저장 (오케스트레이터 직접)**:
324
-
325
- PlanEvaluator 에이전트는 read-only이므로 파일을 직접 작성하지 않는다.
326
- 오케스트레이터가 PlanEvaluator의 반환 텍스트를 `.crew/plans/{task-id}/review.md`로 저장한다.
177
+ ### Step 4 — PlanEvaluator 실행
178
+
179
+ 중앙 `crew-agent-runner` 스킬의 dispatch 절차로 실행한다.
180
+
181
+ role: plan-evaluator
182
+
183
+ inputs:
184
+ - `.crew/plans/{task-id}/spec.md`
185
+ - `.crew/plans/{task-id}/analysis.md`
186
+ - `.crew/plans/{task-id}/plan.md`
187
+
188
+ output:
189
+ - complete.artifact → `.crew/plans/{task-id}/review.md`
190
+
191
+ role instructions:
192
+ - 계획을 검증하고 PASS 또는 FAIL을 판정한다.
193
+ - brief.md 입력으로 사용하지 않는다.
194
+ - 아래 8개 항목을 YES 또는 NO로만 판정한다. 부분 점수는 없다.
195
+ - E1. 검증 시나리오 완성도: 모든 태스크에 검증 방법이 명시되어 있는가?
196
+ - E2. spec 전체 커버리지: spec.md의 수용 기준, 유저 플로우, UI 구조, 비즈니스 규칙이 전부 태스크로 커버되는가?
197
+ - E3. 코드 참조 사실 여부: 언급한 파일/모듈이 존재하는가?
198
+ - E4. 실행 가능성: 구현자가 바로 시작할 수 있는 수준인가?
199
+ - E5. 테스트 전략 정합성: analysis.md의 테스트 전략 결정과 plan.md의 태스크 구조가 일치하는가?
200
+ - E6. 비즈니스 가정 0개: plan.md가 spec.md 없는 비즈니스 로직을 임의로 추가하지 않았는가?
201
+ - E7. 실행 검증 포함: 실제 기능을 사용자 관점에서 동작시키는 구체 절차가 있는가?
202
+ - E8. 외부 인터페이스 가정 검증: 미검증 외부 대상에 대한 검증 상태와 스파이크 태스크가 있는가?
203
+ - 8개 항목 모두 YES이면 PASS, 하나라도 NO이면 FAIL이다.
204
+ - 모호하면 NO로 판정한다.
205
+ - FAIL 근본 원인을 spec 결함 또는 plan 결함으로 분류한다.
206
+ - 출력 형식: 판정(PASS/FAIL), 항목별 결과(E1-E8 YES/NO + 근거), FAIL 상세, 근본 원인 분류(FAIL 시).
207
+
208
+ success gate:
209
+ - review.md 산출물이 생성될 있는 complete.artifact가 있다.
210
+ - 판정이 PASS 또는 FAIL로 명시된다.
211
+ - E1-E8의 YES/NO와 근거가 모두 포함된다.
212
+ - FAIL이면 근본 원인 분류가 포함된다.
213
+
214
+ failure handling:
215
+ - review 산출물이 없거나 판정이 없으면 ESCALATE.
216
+ - FAIL이면 Step 6의 피드백 보존 루프를 따른다.
217
+ - retry/escalate 규칙은 contract.policy에 따른다.
327
218
 
328
219
  ---
329
220
 
330
221
  ### Step 5 — PASS 처리
331
222
 
332
- PlanEvaluator PASS이면:
333
-
334
- **5a. review.md 확인**
335
-
336
- review.md가 정상적으로 작성되었고 판정이 PASS임을 확인한다.
337
-
338
- **5b. contract.md 작성 (오케스트레이터 직접)**
339
-
340
- ```markdown
341
- # 스프린트 계약: {task-id}
342
-
343
- 생성일: {date}
344
-
345
- ## 목표
346
- {spec.md에서 추출한 한 문장}
223
+ role: orchestrator
347
224
 
348
- ## 수용 기준
349
- - [ ] {spec.md의 수용 기준을 그대로 복사}
225
+ inputs:
226
+ - `.crew/plans/{task-id}/spec.md`
227
+ - `.crew/plans/{task-id}/analysis.md`
228
+ - `.crew/plans/{task-id}/plan.md`
229
+ - `.crew/plans/{task-id}/review.md`
350
230
 
351
- ## 유저 플로우
352
- {spec.md의 유저 플로우 섹션이 있으면 그대로 복사}
231
+ output:
232
+ - contract artifact `.crew/plans/{task-id}/contract.md`
233
+ - COMPLETE response
353
234
 
354
- ## UI 구조 및 주요 콘텐츠
355
- {spec.md의 UI 구조 섹션이 있으면 그대로 복사}
235
+ role instructions:
236
+ - review.md의 판정이 PASS인지 확인한다.
237
+ - contract.md에는 목표, 수용 기준, 유저 플로우, UI 구조 및 주요 콘텐츠, 비즈니스 규칙, 가드레일, 테스트 전략, 검증 시나리오, 실행 검증, 참조 문서, 검증 이력, 워크트리, 상태를 포함한다.
238
+ - 목표와 수용 기준은 spec.md의 내용을 기준으로 한다.
239
+ - 가드레일은 analysis.md의 Must/Must NOT을 기준으로 한다.
240
+ - 검증 시나리오와 실행 검증은 plan.md의 해당 섹션을 기준으로 한다.
241
+ - 상태는 ACTIVE로 둔다.
242
+ - `.loop_count`가 있으면 정리한다.
356
243
 
357
- ## 비즈니스 규칙
358
- {spec.md 비즈니스 규칙 섹션이 있으면 그대로 복사}
244
+ success gate:
245
+ - review.md 판정이 PASS다.
246
+ - contract.md 산출물이 생성된다.
247
+ - contract.md 상태가 ACTIVE다.
359
248
 
360
- ## 가드레일
361
- ### Must
362
- - {analysis.md에서 추출}
249
+ failure handling:
250
+ - PASS 확인 또는 contract 생성에 실패하면 ESCALATE.
251
+ - retry/escalate 규칙은 contract.policy에 따른다.
363
252
 
364
- ### Must NOT
365
- - {analysis.md에서 추출}
253
+ 완료 반환:
366
254
 
367
- ## 테스트 전략
368
- - 결정: {TDD | Tests-after | None}
369
- - 프레임워크: {프레임워크명}
370
- - 인프라 셋업 필요: {YES | NO}
371
-
372
- ## 검증 시나리오
373
- {plan.md의 검증 시나리오 섹션을 그대로 복사}
374
-
375
- ### {시나리오 1 제목}
376
- - 조건: {사전 상태}
377
- - 행위: {실행할 것}
378
- - 기대 결과: {검증할 것}
379
-
380
- ## 실행 검증
381
- {plan.md의 실행 검증 섹션을 그대로 복사}
382
-
383
- ### {검증 1 제목}
384
- - 실행 방법: {구체적 명령어 또는 절차}
385
- - 기대 결과: {확인할 출력 또는 동작}
386
-
387
- ## 참조 문서
388
- - 요구사항: .crew/plans/{task-id}/spec.md
389
- - 사전 분석: .crew/plans/{task-id}/analysis.md
390
- - 구현 계획: .crew/plans/{task-id}/plan.md
391
-
392
- ## 검증 이력
393
- PlanEvaluator PASS — review.md 참조
394
-
395
- ## 워크트리
396
- mode: new
397
-
398
- ## 상태
399
- ACTIVE
400
- ```
401
-
402
- **5c. .loop_count 정리**
403
-
404
- `.loop_count` 파일이 존재하면 삭제한다.
405
-
406
- **5d. 완료 반환**
407
-
408
- ```
409
- 상태: COMPLETE
410
- task-id: {task-id}
411
- contract.md 경로: .crew/plans/{task-id}/contract.md
255
+ ```json
256
+ {
257
+ "status": "COMPLETE",
258
+ "task_id": "{task-id}",
259
+ "contract_path": ".crew/plans/{task-id}/contract.md"
260
+ }
412
261
  ```
413
262
 
414
263
  ---
415
264
 
416
- ### Step 6 — FAIL 처리 (피드백 보존 루프)
417
-
418
- PlanEvaluator FAIL이면:
419
-
420
- **6a. FAIL 원인 분류**
421
-
422
- PlanEvaluator가 review.md에 기록한 근본 원인 분류를 확인한다.
423
-
424
- - **spec 결함** (spec.md 자체가 문제):
425
- - Planner를 재시도해도 고칠 수 없다.
426
- - 즉시 에스컬레이션:
427
-
428
- ```
429
- PlanEvaluator가 spec 결함을 이유로 FAIL을 냈습니다.
430
- Planner 재시도로는 해결할 수 없습니다.
431
- [1] crew-interview를 재실행하여 spec.md를 재작성
432
- [2] spec.md를 직접 수정
433
- [3] 태스크를 보류
434
- ```
435
-
436
- - **plan 결함** (계획 구성/표현 문제):
437
- - 피드백 보존 루프를 진행한다.
438
-
439
- **6b. 루프 카운터 읽기**
440
-
441
- `.crew/plans/{task-id}/.loop_count` 파일을 읽는다.
442
- - 파일이 없으면 카운터 = 0 (첫 번째 FAIL)
443
- - 파일이 있으면 파일 내용(정수)이 카운터 값
444
-
445
- **6c. 에스컬레이션 판단**
446
-
447
- 카운터 값 >= 4이면 즉시 에스컬레이션:
448
-
449
- ```
450
- 계획 파이프라인이 5회 반복 후에도 수렴하지 않았습니다.
451
- 현재 review.md의 FAIL 사유를 첨부합니다.
452
- [1] 스코프를 좁혀서 재시도
453
- [2] 수용 기준을 직접 수정
454
- [3] 이 태스크를 보류
455
- ```
456
-
457
- 에스컬레이션 시 `.loop_count` 파일을 삭제한다.
458
-
459
- **6d. 피드백 아카이브**
460
-
461
- `n = 카운터 + 1` (이번 회차 번호)
462
-
463
- ```
464
- plan.md → plan-{n}.md 로 이름 변경
465
- review.md → review-{n}.md 로 이름 변경
466
- ```
467
-
468
- **6e. 루프 카운터 증가 저장**
469
-
470
- `카운터 + 1`을 `.loop_count` 파일에 저장한다.
471
-
472
- **6f. Step 3로 돌아감 (retry)**
473
-
474
- Step 3(Planner)로 돌아간다. retry 프롬프트의 `{n}`에 Step 6d에서 계산한 값을 대입한다.
475
- TechLead는 재실행하지 않는다 — 기술적 사실은 변하지 않으므로 analysis.md를 재사용한다.
265
+ ### Step 6 — FAIL 처리
266
+
267
+ role: orchestrator
268
+
269
+ inputs:
270
+ - `.crew/plans/{task-id}/plan.md`
271
+ - `.crew/plans/{task-id}/review.md`
272
+ - `.crew/plans/{task-id}/.loop_count`
273
+
274
+ output:
275
+ - archived feedback → `.crew/plans/{task-id}/plan-{n}.md`, `.crew/plans/{task-id}/review-{n}.md`
276
+ - updated loop counter → `.crew/plans/{task-id}/.loop_count`
277
+ - retry route → Step 3
278
+ - 또는 ESCALATE response
279
+
280
+ role instructions:
281
+ - PlanEvaluator가 기록한 근본 원인 분류를 확인한다.
282
+ - spec 결함이면 Planner 재시도로 해결할 수 없으므로 즉시 에스컬레이션한다.
283
+ - plan 결함이면 피드백 보존 루프를 진행한다.
284
+ - 루프 카운터가 없으면 0으로 본다.
285
+ - 루프 카운터가 4 이상이면 5회 반복 후 미수렴으로 에스컬레이션하고 카운터를 정리한다.
286
+ - 이번 회차 번호 n은 카운터 + 1이다.
287
+ - 현재 plan.md와 review.md를 각각 plan-{n}.md, review-{n}.md로 보존한다.
288
+ - 카운터를 n으로 갱신한다.
289
+ - TechLead는 재실행하지 않고 Step 3 retry로 돌아간다.
290
+
291
+ success gate:
292
+ - spec 결함이면 ESCALATE가 반환된다.
293
+ - plan 결함이고 카운터가 4 미만이면 실패 계획과 리뷰가 보존된다.
294
+ - retry에 사용할 review-{n}.md가 존재한다.
295
+
296
+ failure handling:
297
+ - 아카이브 또는 카운터 갱신에 실패하면 ESCALATE.
298
+ - retry/escalate 규칙은 contract.policy에 따른다.
476
299
 
477
300
  ---
478
301
 
@@ -490,38 +313,18 @@ Planner + PlanEvaluator 사이클은 최대 5회 (초기 1회 + retry 최대 4
490
313
 
491
314
  ---
492
315
 
493
- ## 에이전트 호출 컨텍스트 규칙
494
-
495
- 오케스트레이터는 모든 에이전트를 `runAgent(role, prompt, providerConfig)` 규칙으로 호출한다.
496
-
497
- - Claude provider: `Agent(subagent_type="{role}", model="{model}", description="...", prompt="...")`
498
- - Codex provider: `node "${CLAUDE_PLUGIN_ROOT}/scripts/crew-codex-companion.mjs" task --json --expect-crew-result --model {model} --effort {reasoning} --prompt-file {promptFile}`
499
- - `data/provider-catalog.json`의 `agent_runtime.{role}.codex_sandbox`가 `workspace-write`일 때만 `--write`를 붙인다. plan 단계 에이전트는 모두 read-only다.
500
- - Codex provider는 `.crew/` 파일을 직접 읽거나 쓰지 않는다. 필요한 `spec.md`, `analysis.md`, `plan.md`, `review-{n}.md` 내용은 오케스트레이터가 프롬프트에 인라인 주입한다.
316
+ ## 에이전트 실행 컨텍스트 규칙
501
317
 
502
- | 에이전트 | subagent_type | 기본 provider/model | 주입할 파일 | 차단할 파일 |
503
- |----------|--------------|------|------------|------------|
504
- | TechLead | techlead | `agent_defaults.techlead` | spec.md | — |
505
- | Planner (첫 번째) | planner | `agent_defaults.planner` | spec.md + analysis.md | brief.md |
506
- | Planner (retry) | planner | `agent_defaults.planner` | spec.md + analysis.md + review-{n}.md | brief.md |
507
- | PlanEvaluator | plan-evaluator | `agent_defaults.plan-evaluator` | spec.md + analysis.md + plan.md | brief.md |
318
+ 중앙 `crew-agent-runner` 스킬의 dispatch 절차를 단일 실행 경로로 사용한다. crew-plan은 실행 방식, 런타임 선택, 후속 요청 처리, 사용자 질문 처리의 세부 절차를 정의하지 않는다.
508
319
 
509
- **중요**: provider/model은 `.crew/config.json`, `~/.claude/crew/config.json`, `data/provider-catalog.json`의 `agent_defaults` 순서로 해석한다. Claude provider는 `Agent(subagent_type=..., model=...)`로 호출하고, Codex provider는 `scripts/crew-codex-companion.mjs task`로 호출한다.
510
-
511
- Codex provider 결과는 마지막 `<crew-agent-result>` 블록으로 파싱한다.
512
-
513
- ```json
514
- {
515
- "status": "complete | blocked_on_user | needs_agent | needs_tool | failed",
516
- "artifact": "최종 산출물 또는 결과",
517
- "questions": [],
518
- "requests": [],
519
- "summary": "짧은 요약",
520
- "error": null
521
- }
522
- ```
320
+ | 단계 | role | 입력 | 차단할 입력 | 기대 산출물 |
321
+ |------|------|------|-------------|-------------|
322
+ | Step 2 | techlead | spec.md | — | analysis.md |
323
+ | Step 3 | planner | spec.md + analysis.md | brief.md | plan.md |
324
+ | Step 3 retry | planner | spec.md + analysis.md + review-{n}.md | brief.md | plan.md |
325
+ | Step 4 | plan-evaluator | spec.md + analysis.md + plan.md | brief.md | review.md |
523
326
 
524
- `blocked_on_user`는 오케스트레이터가 `AskUserQuestion`으로 처리한다. `needs_agent`는 Explorer/Researcher 요청된 role을 `runAgent`로 실행한 결과를 원래 에이전트에 `--resume-last`로 주입한다. 에이전트 실행의 후속 루프는 최대 5회다.
327
+ 후속 탐색, 외부 조사, 사용자 질문, 재개 흐름은 runner가 정의한 상태 처리와 followup 계약을 따른다. 역할은 complete 상태의 artifact로 산출물 본문을 반환해야 한다.
525
328
 
526
329
  ---
527
330
 
@@ -540,7 +343,7 @@ Codex provider 결과는 마지막 `<crew-agent-result>` 블록으로 파싱한
540
343
  ```json
541
344
  {
542
345
  "status": "ESCALATE",
543
- "phase": "spec-gate" | "techlead-fail" | "planner-fail" | "evaluator-spec-defect" | "loop-overflow",
346
+ "phase": "spec-gate | techlead-fail | planner-fail | evaluator-spec-defect | loop-overflow",
544
347
  "reason": "자유형 텍스트"
545
348
  }
546
349
  ```