@jjlabsio/claude-crew 0.1.33 → 0.1.35

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 (43) 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/hooks/enforce-delegation.mjs +51 -0
  24. package/package.json +8 -3
  25. package/scripts/crew-agent-runner.mjs +382 -0
  26. package/scripts/lib/build.mjs +213 -0
  27. package/scripts/lib/cli.mjs +30 -0
  28. package/scripts/lib/config.mjs +33 -0
  29. package/scripts/lib/contracts.mjs +146 -0
  30. package/scripts/lib/dispatch.mjs +241 -0
  31. package/scripts/lib/installHooks.mjs +136 -0
  32. package/scripts/lib/pluginRoot.mjs +10 -0
  33. package/scripts/lib/prepare.mjs +37 -0
  34. package/scripts/lib/render.mjs +138 -0
  35. package/scripts/lib/renderFollowup.mjs +51 -0
  36. package/scripts/lib/resolve.mjs +72 -0
  37. package/scripts/lib/skillDispatchContract.mjs +93 -0
  38. package/scripts/lib/validate.mjs +104 -0
  39. package/skills/crew-agent-runner/SKILL.md +113 -0
  40. package/skills/crew-dev/SKILL.md +171 -776
  41. package/skills/crew-interview/SKILL.md +137 -57
  42. package/skills/crew-plan/SKILL.md +224 -460
  43. package/skills/crew-setup/SKILL.md +32 -19
@@ -11,7 +11,7 @@
11
11
  "name": "claude-crew",
12
12
  "source": "./",
13
13
  "description": "오케스트레이터 + PM, 플래너, 개발, QA, 마케팅 에이전트 팀으로 단일 제품의 개발과 마케팅을 통합 관리",
14
- "version": "0.1.33",
14
+ "version": "0.1.35",
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.33"
31
+ "version": "0.1.35"
32
32
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-crew",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
4
4
  "description": "1인 SaaS 개발자를 위한 멀티 에이전트 오케스트레이션 — 개발, 마케팅, 일정을 한 대화에서 통합 관리",
5
5
  "author": {
6
6
  "name": "Jaejin Song",
@@ -18,16 +18,17 @@
18
18
  ],
19
19
  "agents": [
20
20
  "./agents/pm.md",
21
+ "./agents/techlead.md",
21
22
  "./agents/planner.md",
23
+ "./agents/plan-evaluator.md",
24
+ "./agents/explorer.md",
25
+ "./agents/researcher.md",
22
26
  "./agents/dev.md",
23
- "./agents/qa.md",
24
27
  "./agents/code-reviewer.md",
25
- "./agents/techlead.md",
26
- "./agents/researcher.md",
27
- "./agents/explorer.md",
28
- "./agents/plan-evaluator.md"
28
+ "./agents/qa.md"
29
29
  ],
30
30
  "skills": [
31
- "./skills/"
31
+ "./skills/",
32
+ "./skills/crew-agent-runner/SKILL.md"
32
33
  ]
33
34
  }
package/README.md CHANGED
@@ -86,6 +86,28 @@ Claude Code에서:
86
86
  | **CodeReviewer** | 코드 리뷰 | dev |
87
87
  | **QA** | 실행 검증 | dev |
88
88
 
89
+ ## 두 가지 사용 모드
90
+
91
+ claude-crew는 **다른 프로젝트에 설치되어 사용되는 플러그인**이다. 두 가지 모드로 구분된다.
92
+
93
+ ### 사용자 모드
94
+
95
+ 이 plugin을 자기 프로젝트에 설치해서 SaaS 개발에 활용하는 일반 사용자.
96
+
97
+ - 직접 호출하는 슬래시 명령: `/crew`, `/crew-setup`, `/task`, `/tasks`, `/crew-interview`, `/crew-plan`, `/crew-dev`.
98
+ - 디버그용 직접 호출 가능 명령: `node scripts/crew-agent-runner.mjs resolve --role <role> --json` (provider/model/contract 통합 표 확인).
99
+ - plugin이 설치된 위치(`~/.claude/plugins/...` 등)에 무관하게 동작 — plugin script가 자기 위치를 자동으로 인식.
100
+
101
+ ### 개발자 모드
102
+
103
+ claude-crew 자체를 개발하는 사람 (이 repo 안에서 작업).
104
+
105
+ - `node scripts/crew-agent-runner.mjs build`: contracts/instructions에서 `agents/{role}.md` + `plugin.json` agents 배열 derive.
106
+ - `node scripts/crew-agent-runner.mjs validate`: build 결과와 현재 파일 정합성 검사 + sandbox 정합성 검증.
107
+ - `node scripts/crew-agent-runner.mjs install-hooks`: pre-commit hook 설치 (drift 차단).
108
+
109
+ 위 세 명령은 **plugin source repo 안에서만 동작**한다. 사용자 환경에서 호출하면 가드로 차단된다 (`.claude-plugin/plugin.json` + `package.json.name === "@jjlabsio/claude-crew"` 감지). 사용자에게는 의미 없는 명령이므로 정상이다.
110
+
89
111
  ## 모델 설정
90
112
 
91
113
  `/crew-setup`에서 에이전트별 provider/model을 설정합니다. 설정하지 않은 에이전트는 `data/provider-catalog.json`의 `agent_defaults`를 따릅니다.
@@ -5,6 +5,13 @@ description: 코드 품질 판정 — git diff + 가드레일(인라인) + 기
5
5
  tools: [Read, Glob, Grep]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: false
12
+ canUseShell: false
13
+ canWriteCrewFiles: true
14
+
8
15
  # CodeReviewer 에이전트
9
16
 
10
17
  코드만 보고 판단한다. 구현 의도나 수용 기준을 알 필요가 없다.
package/agents/dev.md CHANGED
@@ -5,6 +5,13 @@ description: plan.md + contract.md 기반으로 코드를 구현하고 자체
5
5
  tools: [Read, Write, Edit, Glob, Grep, Bash]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: workspace-write
10
+ canAskUser: false
11
+ canRequestAgent: false
12
+ canUseShell: true
13
+ canWriteCrewFiles: true
14
+
8
15
  # Dev 에이전트
9
16
 
10
17
  plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/타입/테스트/실행 검증) 5개를 모두 통과해야 완료를 선언한다.
@@ -5,6 +5,13 @@ description: 코드베이스 탐색 전용 — 병렬 x2-3, Read-only
5
5
  tools: [Read, Glob, Grep]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: false
12
+ canUseShell: false
13
+ canWriteCrewFiles: false
14
+
8
15
  # Explorer 서브에이전트
9
16
 
10
17
  코드베이스를 탐색하여 사실(파일 존재, 함수 시그니처, 패턴)을 수집한다. 판단하지 않는다.
@@ -5,6 +5,13 @@ description: 계획 검증 — E1-E8 하드 임계값 판정. Sonnet 사용 (Opu
5
5
  tools: [Read, Agent]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: true
12
+ canUseShell: false
13
+ canWriteCrewFiles: true
14
+
8
15
  # PlanEvaluator 에이전트
9
16
 
10
17
  하드 임계값 기반 판정. 주관적 판단 최소화. 모호하면 NO.
package/agents/planner.md CHANGED
@@ -5,6 +5,13 @@ description: analysis.md 기반으로 구현 계획(plan.md)을 작성한다
5
5
  tools: [Read, Write, Agent]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: true
12
+ canUseShell: false
13
+ canWriteCrewFiles: true
14
+
8
15
  # Planner 에이전트
9
16
 
10
17
  코드를 작성하지 않는다. analysis.md의 아키텍처 방향과 가드레일을 따른다.
package/agents/pm.md CHANGED
@@ -5,6 +5,13 @@ description: 유저 인터뷰를 통해 요구사항을 확정하고 spec.md를
5
5
  tools: [AskUserQuestion, Read, Write]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: true
11
+ canRequestAgent: false
12
+ canUseShell: false
13
+ canWriteCrewFiles: true
14
+
8
15
  # PM 에이전트
9
16
 
10
17
  유저와 직접 대화하여 요구사항을 확정한다. 추측하지 않고 질문한다.
package/agents/qa.md CHANGED
@@ -5,6 +5,13 @@ description: 실행 검증 — 빌드/린트/타입/테스트/E2E 직접 실행
5
5
  tools: [Read, Glob, Grep, Bash]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: false
12
+ canUseShell: true
13
+ canWriteCrewFiles: true
14
+
8
15
  # QA 에이전트
9
16
 
10
17
  모든 검증은 직접 실행한다. "통과할 것이다"는 증거가 아니다.
@@ -46,7 +53,7 @@ tools: [Read, Glob, Grep, Bash]
46
53
  | 3 | 타입 | PASS/FAIL | `{cmd}` | {output} |
47
54
  | 4 | 테스트 | PASS/FAIL | `{cmd}` | {output} |
48
55
  | 5 | 테스트 전략 준수 | PASS/FAIL | `{cmd}` | {output} |
49
- | 6 | E2E | PASS/FAIL | `{cmd}` | {시나리오별 결과} |
56
+ | 6 | E2E | PASS/FAIL | `{cmd/절차}` | {시나리오별 결과} |
50
57
  | 7 | 실행 검증 | PASS/FAIL | `{cmd/절차}` | {실행 결과} |
51
58
 
52
59
  ## E2E 시나리오 상세
@@ -5,6 +5,13 @@ description: 외부 정보 조사 — 필요시만 호출, Read-only
5
5
  tools: [WebSearch, WebFetch, Read]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: false
11
+ canRequestAgent: false
12
+ canUseShell: false
13
+ canWriteCrewFiles: false
14
+
8
15
  # Researcher 서브에이전트
9
16
 
10
17
  외부 문서, 라이브러리 API, 레퍼런스를 조사하여 사실을 수집한다. 판단하지 않는다.
@@ -5,6 +5,13 @@ description: 사전 분석, 아키텍처 방향 판단, 가드레일 정의. Exp
5
5
  tools: [AskUserQuestion, Read, Agent]
6
6
  ---
7
7
 
8
+ ## Capability
9
+ workspaceAccess: read-only
10
+ canAskUser: true
11
+ canRequestAgent: true
12
+ canUseShell: false
13
+ canWriteCrewFiles: true
14
+
8
15
  # TechLead 에이전트
9
16
 
10
17
  탐색(양)은 서브에이전트에게 위임하고, 판단(질)은 직접 수행한다.
@@ -0,0 +1,350 @@
1
+ {
2
+ "version": 1,
3
+ "roles": [
4
+ {
5
+ "role": "pm",
6
+ "inputs": {
7
+ "allowed": [
8
+ ".crew/plans/{task-id}/brief.md"
9
+ ],
10
+ "denied": []
11
+ },
12
+ "outputs": [
13
+ {
14
+ "type": "artifact",
15
+ "target": ".crew/plans/{task-id}/spec.md"
16
+ }
17
+ ],
18
+ "capabilities": {
19
+ "workspaceAccess": "read-only"
20
+ },
21
+ "policy": {
22
+ "maxAttempts": 1,
23
+ "fallbackProvider": null,
24
+ "escalateAfterAttempts": 1,
25
+ "consecutiveSameFailureLimit": 1
26
+ },
27
+ "claudeSubagent": {
28
+ "name": "pm",
29
+ "model": "opus",
30
+ "description": "유저 인터뷰를 통해 요구사항을 확정하고 spec.md를 작성한다",
31
+ "tools": [
32
+ "AskUserQuestion",
33
+ "Read",
34
+ "Write"
35
+ ]
36
+ }
37
+ },
38
+ {
39
+ "role": "techlead",
40
+ "inputs": {
41
+ "allowed": [
42
+ ".crew/plans/{task-id}/spec.md"
43
+ ],
44
+ "denied": [
45
+ ".crew/plans/{task-id}/brief.md"
46
+ ]
47
+ },
48
+ "outputs": [
49
+ {
50
+ "type": "artifact",
51
+ "target": ".crew/plans/{task-id}/analysis.md"
52
+ }
53
+ ],
54
+ "capabilities": {
55
+ "workspaceAccess": "read-only"
56
+ },
57
+ "policy": {
58
+ "maxAttempts": 1,
59
+ "fallbackProvider": null,
60
+ "escalateAfterAttempts": 1,
61
+ "consecutiveSameFailureLimit": 1
62
+ },
63
+ "claudeSubagent": {
64
+ "name": "techlead",
65
+ "model": "opus",
66
+ "description": "사전 분석, 아키텍처 방향 판단, 가드레일 정의. Explorer/Researcher 서브에이전트를 호출한다",
67
+ "tools": [
68
+ "AskUserQuestion",
69
+ "Read",
70
+ "Agent"
71
+ ]
72
+ }
73
+ },
74
+ {
75
+ "role": "planner",
76
+ "inputs": {
77
+ "allowed": [
78
+ ".crew/plans/{task-id}/spec.md",
79
+ ".crew/plans/{task-id}/analysis.md",
80
+ ".crew/plans/{task-id}/review-{n}.md"
81
+ ],
82
+ "denied": [
83
+ ".crew/plans/{task-id}/brief.md"
84
+ ]
85
+ },
86
+ "outputs": [
87
+ {
88
+ "type": "artifact",
89
+ "target": ".crew/plans/{task-id}/plan.md"
90
+ }
91
+ ],
92
+ "capabilities": {
93
+ "workspaceAccess": "read-only"
94
+ },
95
+ "policy": {
96
+ "maxAttempts": 5,
97
+ "fallbackProvider": null,
98
+ "escalateAfterAttempts": 5,
99
+ "consecutiveSameFailureLimit": 3
100
+ },
101
+ "claudeSubagent": {
102
+ "name": "planner",
103
+ "model": "opus",
104
+ "description": "analysis.md 기반으로 구현 계획(plan.md)을 작성한다",
105
+ "tools": [
106
+ "Read",
107
+ "Write",
108
+ "Agent"
109
+ ]
110
+ }
111
+ },
112
+ {
113
+ "role": "plan-evaluator",
114
+ "inputs": {
115
+ "allowed": [
116
+ ".crew/plans/{task-id}/spec.md",
117
+ ".crew/plans/{task-id}/analysis.md",
118
+ ".crew/plans/{task-id}/plan.md"
119
+ ],
120
+ "denied": [
121
+ ".crew/plans/{task-id}/brief.md"
122
+ ]
123
+ },
124
+ "outputs": [
125
+ {
126
+ "type": "artifact",
127
+ "target": ".crew/plans/{task-id}/review.md"
128
+ }
129
+ ],
130
+ "capabilities": {
131
+ "workspaceAccess": "read-only"
132
+ },
133
+ "policy": {
134
+ "maxAttempts": 1,
135
+ "fallbackProvider": null,
136
+ "escalateAfterAttempts": 1,
137
+ "consecutiveSameFailureLimit": 1
138
+ },
139
+ "claudeSubagent": {
140
+ "name": "plan-evaluator",
141
+ "model": "sonnet",
142
+ "description": "계획 검증 — E1-E8 하드 임계값 판정. Sonnet 사용 (Opus 합리화 방지)",
143
+ "tools": [
144
+ "Read",
145
+ "Agent"
146
+ ]
147
+ }
148
+ },
149
+ {
150
+ "role": "explorer",
151
+ "inputs": {
152
+ "allowed": [
153
+ "request.prompt"
154
+ ],
155
+ "denied": []
156
+ },
157
+ "outputs": [
158
+ {
159
+ "type": "report",
160
+ "target": "stdout"
161
+ }
162
+ ],
163
+ "capabilities": {
164
+ "workspaceAccess": "read-only"
165
+ },
166
+ "policy": {
167
+ "maxAttempts": 1,
168
+ "fallbackProvider": null,
169
+ "escalateAfterAttempts": 1,
170
+ "consecutiveSameFailureLimit": 1
171
+ },
172
+ "claudeSubagent": {
173
+ "name": "explorer",
174
+ "model": "haiku",
175
+ "description": "코드베이스 탐색 전용 — 병렬 x2-3, Read-only",
176
+ "tools": [
177
+ "Read",
178
+ "Glob",
179
+ "Grep"
180
+ ]
181
+ }
182
+ },
183
+ {
184
+ "role": "researcher",
185
+ "inputs": {
186
+ "allowed": [
187
+ "request.prompt"
188
+ ],
189
+ "denied": []
190
+ },
191
+ "outputs": [
192
+ {
193
+ "type": "report",
194
+ "target": "stdout"
195
+ }
196
+ ],
197
+ "capabilities": {
198
+ "workspaceAccess": "read-only"
199
+ },
200
+ "policy": {
201
+ "maxAttempts": 1,
202
+ "fallbackProvider": null,
203
+ "escalateAfterAttempts": 1,
204
+ "consecutiveSameFailureLimit": 1
205
+ },
206
+ "claudeSubagent": {
207
+ "name": "researcher",
208
+ "model": "sonnet",
209
+ "description": "외부 정보 조사 — 필요시만 호출, Read-only",
210
+ "tools": [
211
+ "WebSearch",
212
+ "WebFetch",
213
+ "Read"
214
+ ]
215
+ }
216
+ },
217
+ {
218
+ "role": "dev",
219
+ "inputs": {
220
+ "allowed": [
221
+ ".crew/plans/{task-id}/plan.md",
222
+ ".crew/plans/{task-id}/contract.md",
223
+ ".crew/plans/{task-id}/review-report-{n}.md",
224
+ ".crew/plans/{task-id}/qa-report-{n}.md"
225
+ ],
226
+ "denied": [
227
+ ".crew/plans/{task-id}/brief.md",
228
+ ".crew/plans/{task-id}/spec.md",
229
+ ".crew/plans/{task-id}/analysis.md"
230
+ ]
231
+ },
232
+ "outputs": [
233
+ {
234
+ "type": "artifact",
235
+ "target": ".crew/plans/{task-id}/dev-log.md"
236
+ },
237
+ {
238
+ "type": "code",
239
+ "target": "<workspace files>"
240
+ }
241
+ ],
242
+ "capabilities": {
243
+ "workspaceAccess": "workspace-write"
244
+ },
245
+ "policy": {
246
+ "maxAttempts": 5,
247
+ "fallbackProvider": "claude",
248
+ "escalateAfterAttempts": 5,
249
+ "consecutiveSameFailureLimit": 3
250
+ },
251
+ "claudeSubagent": {
252
+ "name": "dev",
253
+ "model": "opus",
254
+ "description": "plan.md + contract.md 기반으로 코드를 구현하고 자체 검증한다",
255
+ "tools": [
256
+ "Read",
257
+ "Write",
258
+ "Edit",
259
+ "Glob",
260
+ "Grep",
261
+ "Bash"
262
+ ]
263
+ }
264
+ },
265
+ {
266
+ "role": "code-reviewer",
267
+ "inputs": {
268
+ "allowed": [
269
+ "git diff HEAD -- ':!.crew/'",
270
+ "guardrails.inline"
271
+ ],
272
+ "denied": [
273
+ ".crew/**"
274
+ ]
275
+ },
276
+ "outputs": [
277
+ {
278
+ "type": "artifact",
279
+ "target": ".crew/plans/{task-id}/review-report.md"
280
+ },
281
+ {
282
+ "type": "artifact",
283
+ "target": ".crew/plans/{task-id}/final-review-report.md"
284
+ }
285
+ ],
286
+ "capabilities": {
287
+ "workspaceAccess": "read-only"
288
+ },
289
+ "policy": {
290
+ "maxAttempts": 1,
291
+ "fallbackProvider": null,
292
+ "escalateAfterAttempts": 1,
293
+ "consecutiveSameFailureLimit": 1
294
+ },
295
+ "claudeSubagent": {
296
+ "name": "code-reviewer",
297
+ "model": "opus",
298
+ "description": "코드 품질 판정 — git diff + 가드레일(인라인) + 기존 코드 탐색",
299
+ "tools": [
300
+ "Read",
301
+ "Glob",
302
+ "Grep"
303
+ ]
304
+ }
305
+ },
306
+ {
307
+ "role": "qa",
308
+ "inputs": {
309
+ "allowed": [
310
+ ".crew/plans/{task-id}/plan.md"
311
+ ],
312
+ "denied": [
313
+ ".crew/plans/{task-id}/contract.md",
314
+ ".crew/plans/{task-id}/brief.md",
315
+ ".crew/plans/{task-id}/spec.md"
316
+ ]
317
+ },
318
+ "outputs": [
319
+ {
320
+ "type": "artifact",
321
+ "target": ".crew/plans/{task-id}/qa-report.md"
322
+ },
323
+ {
324
+ "type": "artifact",
325
+ "target": ".crew/plans/{task-id}/final-qa-report.md"
326
+ }
327
+ ],
328
+ "capabilities": {
329
+ "workspaceAccess": "read-only"
330
+ },
331
+ "policy": {
332
+ "maxAttempts": 1,
333
+ "fallbackProvider": null,
334
+ "escalateAfterAttempts": 1,
335
+ "consecutiveSameFailureLimit": 1
336
+ },
337
+ "claudeSubagent": {
338
+ "name": "qa",
339
+ "model": "sonnet",
340
+ "description": "실행 검증 — 빌드/린트/타입/테스트/E2E 직접 실행",
341
+ "tools": [
342
+ "Read",
343
+ "Glob",
344
+ "Grep",
345
+ "Bash"
346
+ ]
347
+ }
348
+ }
349
+ ]
350
+ }
@@ -0,0 +1,47 @@
1
+ # CodeReviewer 에이전트
2
+
3
+ 코드만 보고 판단한다. 구현 의도나 수용 기준을 알 필요가 없다.
4
+
5
+ ## 입력
6
+
7
+ - `git diff` (오케스트레이터가 프롬프트에 인라인으로 포함)
8
+ - 가드레일 (오케스트레이터가 contract.md에서 추출하여 인라인 주입)
9
+
10
+ ## 접근 금지
11
+
12
+ - `contract.md`, `plan.md`, `brief.md`, `spec.md`, `dev-log.md` — 읽지 않는다.
13
+
14
+ ## 출력
15
+
16
+ - `review-report.md`
17
+
18
+ ## 검토 항목
19
+
20
+ 1. **가드레일 위반** — 인라인 주입된 Must/Must NOT 위반 여부 (위반 시 critical)
21
+ 2. **코드베이스 컨벤션 준수** — 네이밍, 파일 구조, import 패턴 (기존 코드를 Glob/Grep/Read로 탐색하여 확인)
22
+ 3. **보안 취약점** — injection, XSS, 인증 우회, 하드코딩된 시크릿
23
+ 4. **불필요한 복잡도** — 과도한 추상화, 죽은 코드, 중복
24
+ 5. **잠재적 버그** — null 참조, 경쟁 조건, 리소스 누수
25
+ 6. **에러 처리 적절성**
26
+
27
+ ## review-report.md 출력 형식
28
+
29
+ ```markdown
30
+ # 코드 리뷰: {task-id}
31
+
32
+ ## 판정: PASS / FAIL
33
+
34
+ ## 지적 사항
35
+ | # | 심각도 | 파일:라인 | 내용 | 수정 방법 |
36
+ |---|--------|----------|------|----------|
37
+ | 1 | critical/major/minor | path:line | 문제 설명 | 구체적 수정 제안 |
38
+
39
+ ## 요약
40
+ - critical: N개, major: N개, minor: N개
41
+ ```
42
+
43
+ ## 판정 규칙
44
+
45
+ - 가드레일 위반 → critical
46
+ - critical 또는 major 지적이 1개 이상 → FAIL
47
+ - minor만 있거나 지적 없음 → PASS
@@ -0,0 +1,48 @@
1
+ # Dev 에이전트
2
+
3
+ plan.md의 유저 스토리를 순차 구현하고, 자체 검증(빌드/린트/타입/테스트/실행 검증) 5개를 모두 통과해야 완료를 선언한다.
4
+
5
+ ## 입력
6
+
7
+ - `plan.md` + `contract.md`
8
+ - retry 시: 위 + `review-report-{n}.md` + `qa-report-{n}.md`
9
+
10
+ ## 접근 금지
11
+
12
+ - `brief.md`, `spec.md`, `analysis.md` — 읽지 않는다.
13
+
14
+ ## 출력
15
+
16
+ - 구현된 코드
17
+ - `dev-log.md`
18
+
19
+ ## dev-log.md 형식
20
+
21
+ ```markdown
22
+ # 구현 로그: {task-id}
23
+
24
+ ## 수정 이력 (retry {n}) — retry 시에만
25
+ - {수정 내용 요약}
26
+
27
+ ## 구현 요약
28
+ - {유저 스토리별 구현 내용 1줄 요약}
29
+
30
+ ## 자체 검증 결과
31
+ - 빌드: PASS/FAIL + 명령어 + 출력
32
+ - 린트: PASS/FAIL + 명령어 + 출력
33
+ - 타입: PASS/FAIL + 명령어 + 출력
34
+ - 테스트: PASS/FAIL + 명령어 + 출력 (통과/실패 수)
35
+ - 실행 검증: PASS/FAIL + 실행 절차 + 실제 결과
36
+
37
+ ## 변경 파일 목록
38
+ - {파일 경로 + 변경 요약}
39
+ ```
40
+
41
+ ## 규칙
42
+
43
+ - plan.md에 없는 것을 구현하지 않는다 (스코프 크리프 금지).
44
+ - 자체 검증 5개(빌드/린트/타입/테스트/실행 검증) 모두 PASS해야 완료를 선언할 수 있다.
45
+ - 실행 검증: plan.md의 `## 실행 검증` 절차를 직접 실행하여 기능이 실제로 동작하는지 확인한다. 테스트 파일 실행이 아니라 기능 자체를 사용자 관점에서 실행하는 것이다.
46
+ - 자체 검증이 실패하면 직접 수정하여 통과시킨다.
47
+ - 기존 코드베이스의 컨벤션을 따른다.
48
+ - retry 시 피드백 파일을 먼저 읽고, FAIL 항목만 수정한다. 지적하지 않은 부분을 추가로 변경하지 않는다.
@@ -0,0 +1,14 @@
1
+ # Explorer 서브에이전트
2
+
3
+ 코드베이스를 탐색하여 사실(파일 존재, 함수 시그니처, 패턴)을 수집한다. 판단하지 않는다.
4
+
5
+ ## 호출 가능한 에이전트
6
+
7
+ TechLead, Planner, PlanEvaluator
8
+
9
+ ## 규칙
10
+
11
+ - Read-only. 파일을 수정하지 않는다.
12
+ - 사실만 보고한다. 의견이나 권고를 하지 않는다.
13
+ - 호출자가 요청한 정보만 찾아 반환한다.
14
+ - 찾지 못한 것도 명시적으로 보고한다 ("파일 X는 존재하지 않음").