@walwal-harness/cli 4.0.0-alpha.2 → 4.0.0-alpha.21
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/README.md +253 -270
- package/assets/templates/config.json +1 -48
- package/assets/templates/gitignore-append.txt +1 -0
- package/bin/init.js +1 -0
- package/package.json +1 -1
- package/scripts/harness-dashboard-v4.sh +58 -81
- package/scripts/harness-next.sh +4 -15
- package/scripts/harness-prompts-v4.sh +106 -0
- package/scripts/harness-queue-manager.sh +59 -5
- package/scripts/harness-session-start.sh +18 -0
- package/scripts/harness-studio-v4.sh +69 -69
- package/scripts/harness-team-worker.sh +136 -123
- package/scripts/harness-user-prompt-submit.sh +31 -1
- package/skills/dispatcher/SKILL.md +7 -2
- package/skills/team-action/SKILL.md +58 -0
- package/skills/team-stop/SKILL.md +31 -0
- package/skills/evaluator-functional-flutter/SKILL.md +0 -206
- package/skills/evaluator-functional-flutter/references/ia-compliance.md +0 -77
- package/skills/evaluator-functional-flutter/references/scoring-rubric.md +0 -132
- package/skills/evaluator-functional-flutter/references/static-check-rules.md +0 -99
- package/skills/generator-frontend-flutter/SKILL.md +0 -173
- package/skills/generator-frontend-flutter/references/anti-patterns.md +0 -320
- package/skills/generator-frontend-flutter/references/api-layer-pattern.md +0 -233
- package/skills/generator-frontend-flutter/references/flutter-web-pattern.md +0 -273
- package/skills/generator-frontend-flutter/references/i18n-pattern.md +0 -102
- package/skills/generator-frontend-flutter/references/riverpod-pattern.md +0 -199
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# walwal-harness
|
|
1
|
+
# @walwal-harness/cli
|
|
2
2
|
|
|
3
3
|
**AI 에이전트를 위한 프로덕션 하네스 엔지니어링 프레임워크**
|
|
4
4
|
|
|
@@ -9,332 +9,363 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## 두 가지 모드
|
|
13
|
+
|
|
14
|
+
| 모드 | 설명 | 실행 방법 |
|
|
15
|
+
|------|------|----------|
|
|
16
|
+
| **Classic (v3)** | 순차 실행 — Planner → Generator → Evaluator 1세션씩 | `하네스 엔지니어링 시작` |
|
|
17
|
+
| **Agent Teams (v4)** | 병렬 실행 — 3 Team이 Feature 단위 Gen→Eval 루프 동시 실행 | `/harness-team` 또는 `npx walwal-harness v4` |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
12
21
|
## 설치
|
|
13
22
|
|
|
23
|
+
### 첫 설치
|
|
24
|
+
|
|
14
25
|
```bash
|
|
26
|
+
cd your-project
|
|
15
27
|
npm install @walwal-harness/cli
|
|
16
28
|
```
|
|
17
29
|
|
|
18
|
-
`postinstall`이
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
5. `UserPromptSubmit` 훅 등록 (모든 프롬프트를 Dispatcher 경유 자동 라우팅)
|
|
25
|
-
6. `AGENTS.md` 생성 + `CLAUDE.md` 심볼릭 링크
|
|
26
|
-
7. 기존 프로젝트면 구조 스캔 → IA-MAP 자동 생성
|
|
30
|
+
`postinstall`이 자동으로:
|
|
31
|
+
1. `.harness/` 디렉토리 스캐폴딩
|
|
32
|
+
2. `.claude/skills/` 에 에이전트 스킬 설치 (8개)
|
|
33
|
+
3. `scripts/` 에 오케스트레이션 스크립트 설치
|
|
34
|
+
4. SessionStart / UserPromptSubmit 훅 등록
|
|
35
|
+
5. `AGENTS.md` + `CLAUDE.md` 심볼릭 링크 생성
|
|
27
36
|
|
|
28
37
|
> **중요:** 설치 후 Claude Code 세션을 **재시작**해야 skills가 인식됩니다.
|
|
29
|
-
> `/exit` → 디렉터리 재진입이 필요합니다.
|
|
30
38
|
|
|
31
|
-
###
|
|
39
|
+
### 기존 설치자 업데이트
|
|
32
40
|
|
|
33
41
|
```bash
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
npx walwal-harness --help # 도움말
|
|
37
|
-
```
|
|
42
|
+
# latest (v3 안정판)
|
|
43
|
+
npm update @walwal-harness/cli
|
|
38
44
|
|
|
39
|
-
|
|
45
|
+
# v4 alpha (Agent Teams)
|
|
46
|
+
npm install @walwal-harness/cli@next
|
|
40
47
|
|
|
48
|
+
# 스크립트 동기화 (코어 스크립트 자동 덮어쓰기)
|
|
49
|
+
npx walwal-harness
|
|
41
50
|
```
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
│ └── lib/
|
|
52
|
-
│ └── harness-render-progress.sh # 프로그레스 바 렌더러
|
|
53
|
-
├── .harness/
|
|
54
|
-
│ ├── config.json # 하네스 설정
|
|
55
|
-
│ ├── HARNESS.md # 하네스 상세 가이드
|
|
56
|
-
│ ├── progress.json # 세션 간 상태 (기계 판독)
|
|
57
|
-
│ ├── gotchas/ # 에이전트별 실수 기록
|
|
58
|
-
│ ├── actions/ # 활성 스프린트 문서
|
|
59
|
-
│ └── archive/ # 완료 스프린트 보관 (불변)
|
|
60
|
-
└── .claude/
|
|
61
|
-
├── settings.json # 훅 등록 (SessionStart + UserPromptSubmit)
|
|
62
|
-
└── skills/ # Claude Code 스킬 (9개)
|
|
63
|
-
├── harness-dispatcher/
|
|
64
|
-
├── harness-brainstorming/
|
|
65
|
-
├── harness-planner/
|
|
66
|
-
├── harness-generator-backend/
|
|
67
|
-
├── harness-generator-frontend/
|
|
68
|
-
├── harness-generator-frontend-flutter/
|
|
69
|
-
├── harness-evaluator-functional/
|
|
70
|
-
├── harness-evaluator-functional-flutter/
|
|
71
|
-
└── harness-evaluator-visual/
|
|
51
|
+
|
|
52
|
+
### CLI 명령어
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx walwal-harness # 초기화 / 스크립트 업데이트
|
|
56
|
+
npx walwal-harness --force # 강제 재초기화
|
|
57
|
+
npx walwal-harness studio # Harness Studio v3 (tmux 5-pane)
|
|
58
|
+
npx walwal-harness v4 # Harness Studio v4 (Agent Teams, tmux 6-pane)
|
|
59
|
+
npx walwal-harness --help # 도움말
|
|
72
60
|
```
|
|
73
61
|
|
|
74
62
|
---
|
|
75
63
|
|
|
76
|
-
## Quick Start
|
|
64
|
+
## Quick Start — Classic Mode (v3)
|
|
77
65
|
|
|
78
66
|
### 1. 설치 + 재시작
|
|
79
67
|
|
|
80
68
|
```bash
|
|
81
69
|
cd your-project
|
|
82
70
|
npm install @walwal-harness/cli
|
|
83
|
-
# Claude Code
|
|
71
|
+
# Claude Code 재시작 (/exit → 재진입)
|
|
84
72
|
```
|
|
85
73
|
|
|
86
74
|
### 2. 하네스 시작
|
|
87
75
|
|
|
88
|
-
|
|
76
|
+
```
|
|
77
|
+
❯ 하네스 엔지니어링 시작
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
또는 Claude Code에서 아무 요청 → UserPromptSubmit 훅이 자동으로 Dispatcher를 호출합니다.
|
|
81
|
+
|
|
82
|
+
### 3. 파이프라인 자동 선택
|
|
83
|
+
|
|
84
|
+
Dispatcher가 요청을 분석하여 파이프라인을 결정합니다:
|
|
89
85
|
|
|
90
86
|
```
|
|
91
|
-
|
|
87
|
+
FULLSTACK : Planner → Gen-BE → Gen-FE → Eval-Func → Eval-Visual
|
|
88
|
+
FE-ONLY : Planner(light) → Gen-FE → Eval-Func → Eval-Visual
|
|
89
|
+
BE-ONLY : Planner → Gen-BE → Eval-Func(API-only)
|
|
92
90
|
```
|
|
93
91
|
|
|
94
|
-
###
|
|
92
|
+
### 4. 순차 실행
|
|
93
|
+
|
|
94
|
+
각 에이전트가 독립 Claude Code 세션에서 실행됩니다:
|
|
95
95
|
|
|
96
96
|
```
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
│ └─ "브레인스토밍 필요합니까?" → Y: Brainstormer → Planner
|
|
101
|
-
│ → N: Planner 직행
|
|
102
|
-
├─ 실수 지적 → Gotcha 기록 → 해당 에이전트 재작업
|
|
103
|
-
├─ 특정 에이전트 명령 → 해당 에이전트 직접 라우팅
|
|
104
|
-
└─ 메타/인사 → 일반 응답
|
|
97
|
+
❯ /harness-planner # Plan 작성
|
|
98
|
+
❯ /harness-generator-frontend # 코드 생성
|
|
99
|
+
❯ /harness-evaluator-functional # E2E 테스트
|
|
105
100
|
```
|
|
106
101
|
|
|
107
|
-
|
|
102
|
+
에이전트가 완료되면 **새 세션**을 시작하면 자동으로 다음 에이전트를 안내합니다.
|
|
103
|
+
|
|
104
|
+
### 5. Eval FAIL → 자동 재작업
|
|
105
|
+
|
|
106
|
+
Evaluator FAIL 시 → 실패 원인 + 피드백과 함께 Generator로 자동 리라우팅 (최대 10회).
|
|
107
|
+
|
|
108
|
+
---
|
|
108
109
|
|
|
109
|
-
|
|
110
|
+
## Quick Start — Agent Teams (v4)
|
|
111
|
+
|
|
112
|
+
> **v4는 alpha 단계입니다.** `npm install @walwal-harness/cli@next`로 설치하세요.
|
|
113
|
+
|
|
114
|
+
### 개요
|
|
115
|
+
|
|
116
|
+
3개 Agent Team이 **Feature 단위**로 Gen→Eval 루프를 **병렬 실행**합니다.
|
|
110
117
|
|
|
111
118
|
```
|
|
112
|
-
|
|
119
|
+
기존 (v3): Planner → Gen(F-001~028 전부) → Eval(전부)
|
|
120
|
+
v4: Planner → 3 Teams 병렬, 각 Team이 Feature 1개씩 Gen→Eval
|
|
113
121
|
```
|
|
114
122
|
|
|
115
|
-
|
|
123
|
+
### 1. 설치
|
|
116
124
|
|
|
125
|
+
```bash
|
|
126
|
+
npm install @walwal-harness/cli@next
|
|
127
|
+
npx walwal-harness # 스크립트 동기화
|
|
117
128
|
```
|
|
118
|
-
═══ Sprint 1 / FULLSTACK ═══════════════════
|
|
119
129
|
|
|
120
|
-
|
|
130
|
+
### 2. Planner 실행 (Classic으로)
|
|
121
131
|
|
|
122
|
-
|
|
132
|
+
v4에서도 Planner는 먼저 실행해야 합니다:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
❯ 하네스 엔지니어링 시작
|
|
136
|
+
# Dispatcher → Planner → feature-list.json 생성
|
|
123
137
|
```
|
|
124
138
|
|
|
125
|
-
###
|
|
139
|
+
### 3. Studio 실행
|
|
126
140
|
|
|
127
|
-
|
|
141
|
+
**터미널에서** (Claude 세션 밖에서):
|
|
128
142
|
|
|
129
|
-
|
|
143
|
+
```bash
|
|
144
|
+
npx walwal-harness v4
|
|
145
|
+
```
|
|
130
146
|
|
|
131
|
-
|
|
147
|
+
### 4. Teams 가동/중지
|
|
132
148
|
|
|
133
|
-
|
|
149
|
+
Studio가 열리면 Main pane의 Claude에서:
|
|
134
150
|
|
|
135
|
-
|
|
151
|
+
```
|
|
152
|
+
❯ /harness-team-action # Queue 초기화 + 3 Teams 백그라운드 실행
|
|
153
|
+
❯ /harness-team-stop # 모든 Teams 중지
|
|
154
|
+
```
|
|
136
155
|
|
|
156
|
+
**흐름 요약:**
|
|
137
157
|
```
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
158
|
+
npx walwal-harness v4 ← 터미널에서 Studio 실행
|
|
159
|
+
Main에서:
|
|
160
|
+
❯ 하네스 엔지니어링 시작 ← Planner가 feature-list.json 생성
|
|
161
|
+
❯ /harness-team-action ← Queue 생성 + Teams 가동 → 자율 실행 시작
|
|
162
|
+
(모니터링, 개입, gotcha 등록...)
|
|
163
|
+
❯ /harness-team-stop ← 필요 시 중지
|
|
141
164
|
```
|
|
142
165
|
|
|
143
|
-
###
|
|
166
|
+
### 5. Team 관리 명령어
|
|
167
|
+
|
|
168
|
+
| 명령 | 동작 |
|
|
169
|
+
|------|------|
|
|
170
|
+
| `/harness-team-action` | Queue 초기화 + 3 Teams 가동 |
|
|
171
|
+
| `/harness-team-stop` | 모든 Teams 중지 |
|
|
172
|
+
| `bash scripts/harness-queue-manager.sh status .` | Queue 상태 확인 |
|
|
173
|
+
| `bash scripts/harness-queue-manager.sh requeue F-XXX .` | 실패한 Feature 재큐 |
|
|
174
|
+
| `tail -f /tmp/harness-team-1.log` | Team 1 로그 실시간 확인 |
|
|
175
|
+
|
|
176
|
+
### 6. tmux 레이아웃
|
|
144
177
|
|
|
145
178
|
```
|
|
146
|
-
|
|
147
|
-
|
|
179
|
+
┌──────────────┬──────────────┬──────────────┐
|
|
180
|
+
│ │ Progress │ Team 1 │
|
|
181
|
+
│ │ (Queue, │ Gen→Eval │
|
|
182
|
+
│ Main │ Teams, ├──────────────┤
|
|
183
|
+
│ (Claude) │ Features) │ Team 2 │
|
|
184
|
+
│ ├──────────────┤ Gen→Eval │
|
|
185
|
+
│ │ Prompts ├──────────────┤
|
|
186
|
+
│ │ (History) │ Team 3 │
|
|
187
|
+
│ │ │ Gen→Eval │
|
|
188
|
+
└──────────────┴──────────────┴──────────────┘
|
|
148
189
|
```
|
|
149
190
|
|
|
150
|
-
|
|
191
|
+
| 패널 | 역할 |
|
|
192
|
+
|------|------|
|
|
193
|
+
| **Main** | 사용자 대화형 Claude — 오케스트레이터 역할 |
|
|
194
|
+
| **Progress** | Feature Queue + Team 상태 + Feature 목록 (자동 갱신) |
|
|
195
|
+
| **Prompts** | 사용자 매뉴얼 프롬프트 + Team 활동 로그 (newest first) |
|
|
196
|
+
| **Team 1~3** | `claude -p --dangerously-skip-permissions` headless worker |
|
|
197
|
+
|
|
198
|
+
### 5. 작동 원리
|
|
151
199
|
|
|
152
200
|
```
|
|
153
|
-
|
|
201
|
+
Feature Queue (dependency-aware topological sort)
|
|
202
|
+
Ready: [F-002, F-003, F-007] ← depends_on 충족된 것만
|
|
203
|
+
Blocked: [F-004, F-005, ...] ← 선행 Feature 미완료
|
|
204
|
+
|
|
205
|
+
Team 1: dequeue F-002 → worktree 생성 → Gen → Gate → Eval
|
|
206
|
+
PASS → merge to main → worktree 정리 → unblock dependents → dequeue next
|
|
207
|
+
FAIL → retry (max 3) → 3회 실패 시 failed 처리
|
|
154
208
|
```
|
|
155
209
|
|
|
156
|
-
|
|
210
|
+
- 각 Team은 **git worktree**로 격리 실행 (파일 충돌 없음)
|
|
211
|
+
- Feature PASS 시 main으로 **auto-merge** + worktree 즉시 삭제
|
|
212
|
+
- Merge conflict 시 auto-rebase 시도
|
|
157
213
|
|
|
158
|
-
###
|
|
214
|
+
### 9. Main에서 할 수 있는 것
|
|
159
215
|
|
|
160
|
-
|
|
216
|
+
Main Claude는 **오케스트레이터**입니다:
|
|
161
217
|
|
|
162
|
-
|
|
|
163
|
-
|
|
164
|
-
|
|
|
165
|
-
|
|
|
166
|
-
|
|
|
167
|
-
|
|
|
218
|
+
| 할 수 있는 것 | 예시 |
|
|
219
|
+
|--------------|------|
|
|
220
|
+
| Teams 가동/중지 | `/harness-team-action`, `/harness-team-stop` |
|
|
221
|
+
| 상태 확인 | `bash scripts/harness-queue-manager.sh status .` |
|
|
222
|
+
| 실패 Feature 분석 | "F-003이 왜 실패했는지 로그 확인해줘" |
|
|
223
|
+
| Feature 재큐 | `bash scripts/harness-queue-manager.sh requeue F-003 .` |
|
|
224
|
+
| 코드 리뷰 | "F-002의 Sidebar 컴포넌트 리뷰해줘" |
|
|
225
|
+
| Gotcha 등록 | "API 응답에 created_at은 ISO 8601이어야 해" |
|
|
168
226
|
|
|
169
|
-
|
|
227
|
+
**하지 말 것:** `/harness-generator-*`, `/harness-evaluator-*` 직접 호출 — Team이 처리합니다.
|
|
170
228
|
|
|
171
229
|
---
|
|
172
230
|
|
|
173
231
|
## 에이전트
|
|
174
232
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
|
178
|
-
|
|
179
|
-
| **
|
|
180
|
-
| **
|
|
181
|
-
| **
|
|
182
|
-
| **
|
|
183
|
-
| **
|
|
184
|
-
| **Generator-Frontend-Flutter** | Flutter (Riverpod + Retrofit + ARB i18n) | FULLSTACK, FE-ONLY (Flutter) |
|
|
185
|
-
| **Evaluator-Functional** | Playwright E2E 기능 검증 | FULLSTACK, FE-ONLY (React) |
|
|
186
|
-
| **Evaluator-Functional-Flutter** | flutter analyze/test + 정적 anti-pattern 검증 | FULLSTACK, FE-ONLY (Flutter) |
|
|
187
|
-
| **Evaluator-Visual** | 디자인 일관성, 반응형, 접근성, AI슬롭 감지 | FULLSTACK, FE-ONLY (React만) |
|
|
233
|
+
| 에이전트 | 역할 | 모델 |
|
|
234
|
+
|----------|------|------|
|
|
235
|
+
| **Dispatcher** | 파이프라인 선택 + Gotcha 관리 | opus |
|
|
236
|
+
| **Brainstormer** | 러프한 요구사항 대화형 구체화 | opus |
|
|
237
|
+
| **Planner** | 제품 사양 + API 계약 + Feature 설계 | opus/ultraplan |
|
|
238
|
+
| **Generator-Backend** | NestJS MSA 구현 | sonnet |
|
|
239
|
+
| **Generator-Frontend** | React/Next.js UI 구현 | sonnet |
|
|
240
|
+
| **Evaluator-Functional** | Playwright E2E 기능 검증 | opus/ultrathink |
|
|
241
|
+
| **Evaluator-Visual** | 디자인, 반응형, 접근성 검증 | opus/ultrathink |
|
|
188
242
|
|
|
189
243
|
### Brainstormer (조건부)
|
|
190
244
|
|
|
191
|
-
[obra/superpowers](https://github.com/obra/superpowers) (MIT License)
|
|
192
|
-
바이브코딩 수준의 러프한 요구사항을 **대화형 Q&A로 구체화**하여 Planner가 바로 소비할 수 있는 `brainstorm-spec.md`로 만듭니다.
|
|
193
|
-
|
|
194
|
-
**핵심 원칙:**
|
|
195
|
-
- HARD-GATE: 사용자 승인 없이 구현 단계로 넘어갈 수 없음
|
|
196
|
-
- 한 번에 한 질문, 객관식 우선
|
|
197
|
-
- 2-3개 접근법 제시 후 사용자가 선택
|
|
198
|
-
- Spec self-review + User Review Gate
|
|
199
|
-
|
|
200
|
-
**실행 조건:** Dispatcher가 "브레인스토밍 과정이 필요합니까? (Y/N)" 라고 묻고 사용자가 Y 응답한 경우에만. 피드백/이터레이션/직접 명령에서는 자동 스킵.
|
|
245
|
+
[obra/superpowers](https://github.com/obra/superpowers) (MIT License) 기반. 바이브코딩 수준의 러프한 요구사항을 대화형 Q&A로 구체화합니다.
|
|
201
246
|
|
|
202
247
|
---
|
|
203
248
|
|
|
204
249
|
## 핵심 메커니즘
|
|
205
250
|
|
|
206
|
-
### Auto-Routing
|
|
251
|
+
### Auto-Routing
|
|
207
252
|
|
|
208
|
-
|
|
253
|
+
모든 사용자 프롬프트가 Dispatcher를 자동 경유합니다.
|
|
209
254
|
|
|
210
|
-
**per-message opt-out:**
|
|
211
|
-
```
|
|
212
|
-
> harness skip 그냥 이것만 답해줘
|
|
213
|
-
> harness 없이 질문 하나만
|
|
214
|
-
> without harness ...
|
|
215
255
|
```
|
|
256
|
+
# per-message opt-out
|
|
257
|
+
❯ harness skip 그냥 답해줘
|
|
216
258
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// .harness/config.json
|
|
220
|
-
{ "behavior": { "auto_route_dispatcher": false } }
|
|
259
|
+
# 전역 비활성
|
|
260
|
+
.harness/config.json → behavior.auto_route_dispatcher = false
|
|
221
261
|
```
|
|
222
262
|
|
|
223
263
|
### API Contract — 진실의 원천
|
|
224
264
|
|
|
225
|
-
`api-contract.json`이
|
|
226
|
-
|
|
227
|
-
### AGENTS.md — 에이전트 불문 범용 컨텍스트
|
|
265
|
+
`api-contract.json`이 FE ↔ Gateway ↔ Services 간 유일한 계약서입니다.
|
|
228
266
|
|
|
229
|
-
|
|
267
|
+
### Gotcha 시스템
|
|
230
268
|
|
|
231
|
-
|
|
232
|
-
├── apps/gateway/ # [BE] API Gateway → Generator-Backend
|
|
233
|
-
├── apps/service-a/ # [BE] Microservice → Generator-Backend
|
|
234
|
-
├── apps/web/ # [FE] Frontend App → Generator-Frontend
|
|
235
|
-
└── .harness/ # [HARNESS] 하네스 시스템 → Planner
|
|
236
|
-
```
|
|
269
|
+
사용자가 실수를 지적하면 Dispatcher가 자동 기록 → 이후 세션에서 반복 방지.
|
|
237
270
|
|
|
238
|
-
###
|
|
271
|
+
### Pre-Eval Gate
|
|
239
272
|
|
|
240
|
-
|
|
273
|
+
Generator → Evaluator 전환 전 결정론적 검증 (tsc, eslint, test). 실패 시 Evaluator 세션을 열지 않고 Generator로 자동 리라우팅.
|
|
241
274
|
|
|
275
|
+
```json
|
|
276
|
+
// .harness/config.json
|
|
277
|
+
"pre_eval_gate": {
|
|
278
|
+
"frontend_checks": ["npx tsc --noEmit", "npx eslint src/", "npx vitest run --bail 1"],
|
|
279
|
+
"frontend_cwd": "path/to/frontend" // 프로젝트 루트와 다른 경우
|
|
280
|
+
}
|
|
242
281
|
```
|
|
243
|
-
사용자: "API 응답에 created_at은 ISO 8601로 반환해야 해"
|
|
244
|
-
→ Dispatcher: generator-backend.md에 [G-001] 기록
|
|
245
|
-
→ Generator-BE 다음 세션: gotchas 읽기 → 같은 실수 방지
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### IA Structure Compliance — Step 0 Gate
|
|
249
|
-
|
|
250
|
-
Evaluator는 기능 테스트 전에 AGENTS.md의 IA-MAP과 실제 폴더 구조를 대조합니다. 경로 누락이나 소유권 침범이 발견되면 **기능 테스트 없이 즉시 FAIL**합니다.
|
|
251
282
|
|
|
252
|
-
###
|
|
283
|
+
### Evaluation System
|
|
253
284
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
285
|
+
| 설정 | 값 |
|
|
286
|
+
|------|------|
|
|
287
|
+
| PASS 기준 | 2.80 / 3.00 이상 |
|
|
288
|
+
| FAIL 기준 | 2.79 이하 (예외 없음) |
|
|
289
|
+
| Evidence 없는 Score | 0점 강제 |
|
|
290
|
+
| Regression 실패 | 1건이라도 → 전체 FAIL |
|
|
259
291
|
|
|
260
292
|
---
|
|
261
293
|
|
|
262
|
-
##
|
|
263
|
-
|
|
264
|
-
### React / Next.js (기본)
|
|
265
|
-
|
|
266
|
-
| 항목 | 상세 |
|
|
267
|
-
|------|------|
|
|
268
|
-
| Generator | `harness-generator-frontend` — RSC, App Router, Tailwind CSS, Cache Components |
|
|
269
|
-
| Evaluator-Func | `harness-evaluator-functional` — Playwright MCP (`browser_*`) E2E 테스트 |
|
|
270
|
-
| Evaluator-Visual | `harness-evaluator-visual` — 스크린샷 기반 디자인/접근성/반응형 검증 |
|
|
271
|
-
| 레퍼런스 | Vercel Best Practices, Design System Rules, AI Forbidden Patterns, Component Patterns |
|
|
272
|
-
|
|
273
|
-
### Flutter (Dart) — Web / Mobile / Desktop
|
|
274
|
-
|
|
275
|
-
| 항목 | Web (`fe_target=web`) | Mobile/Desktop (`fe_target=mobile`/`desktop`) |
|
|
276
|
-
|------|----------------------|---------------------------------------------|
|
|
277
|
-
| Generator | `harness-generator-frontend-flutter` (Web 가이드 활성) | `harness-generator-frontend-flutter` (Mobile/Desktop 가이드) |
|
|
278
|
-
| Eval-Func | **`harness-evaluator-functional`** (Playwright MCP) | `harness-evaluator-functional-flutter` (`flutter analyze` + `flutter test` + build_runner drift + FL-01~FL-08 정적 검증) |
|
|
279
|
-
| Eval-Visual | **`harness-evaluator-visual`** (Playwright 스크린샷/반응형/접근성) | **SKIP** (브라우저 없음) |
|
|
280
|
-
| 레퍼런스 공통 | API Layer Pattern, Riverpod Pattern, i18n Pattern, Anti-Patterns | 동일 |
|
|
281
|
-
| 레퍼런스 추가 | **Flutter Web Pattern** (`dart:html`/`package:web` 허용, go_router, CORS, PWA, 빌드/호스팅) | — |
|
|
282
|
-
| dart:html / package:web | **허용** (가능하면 conditional import 권장) | **금지** (모바일/데스크톱 빌드 실패 유발) |
|
|
283
|
-
| 빌드 명령 | `flutter build web --release` / `flutter run -d chrome` | `flutter build apk` / `flutter build ios` / `flutter build macos` 등 |
|
|
284
|
-
|
|
285
|
-
### FE 스택 + 타겟 감지
|
|
286
|
-
|
|
287
|
-
1. `scan-project.sh`가 `pubspec.yaml` + `flutter:` 키를 탐지하여 `fe_stack = "flutter"` 설정
|
|
288
|
-
2. 같은 스캔이 `web/index.html`, `android/`, `ios/`, `macos/`/`windows/`/`linux/` 존재 여부로 `fe_target` 자동 판정 (`web` / `mobile` / `desktop`)
|
|
289
|
-
3. Planner 가 모호한 경우(멀티 타겟, unknown) 사용자에게 단 한 번 확인하고 `pipeline.json.fe_target` 확정
|
|
290
|
-
4. `harness-next.sh`가 `fe_stack + fe_target` 조합에 따라 FE 에이전트를 자동 치환 (Agent Bar에도 반영)
|
|
294
|
+
## Harness Studio (tmux)
|
|
291
295
|
|
|
292
|
-
|
|
296
|
+
### Studio v3 (Classic)
|
|
293
297
|
|
|
294
|
-
|
|
298
|
+
```bash
|
|
299
|
+
npx walwal-harness studio
|
|
300
|
+
```
|
|
295
301
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
302
|
+
```
|
|
303
|
+
┌──────────────┬──────────────┐
|
|
304
|
+
│ Dashboard │ Monitor │
|
|
305
|
+
│ (Progress) ├──────────────┤
|
|
306
|
+
├──────────────┤ Agent Session │
|
|
307
|
+
│ Control ├──────────────┤
|
|
308
|
+
│ (harness>) │ Eval Review │
|
|
309
|
+
└──────────────┴──────────────┘
|
|
310
|
+
```
|
|
303
311
|
|
|
304
|
-
|
|
312
|
+
### Studio v4 (Agent Teams)
|
|
305
313
|
|
|
306
|
-
|
|
314
|
+
```bash
|
|
315
|
+
npx walwal-harness v4
|
|
316
|
+
```
|
|
307
317
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
| Unit Testing | Jest (BE) + Vitest (FE-React) + flutter test (FE-Flutter) |
|
|
316
|
-
| Database | PostgreSQL / SQLite |
|
|
318
|
+
```
|
|
319
|
+
┌──────────────┬──────────────┬──────────────┐
|
|
320
|
+
│ │ Progress │ Team 1 │
|
|
321
|
+
│ Main ├──────────────┤ Team 2 │
|
|
322
|
+
│ (Claude) │ Prompts │ Team 3 │
|
|
323
|
+
└──────────────┴──────────────┴──────────────┘
|
|
324
|
+
```
|
|
317
325
|
|
|
318
326
|
---
|
|
319
327
|
|
|
320
|
-
##
|
|
321
|
-
|
|
322
|
-
하네스는 자체 reference 파일로 기본 가이드를 제공하지만, 아래 외부 스킬을 설치하면 품질이 향상됩니다. 초기화 시 자동으로 설치 여부를 체크하고 안내합니다.
|
|
328
|
+
## 프로젝트 구조
|
|
323
329
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
+
```
|
|
331
|
+
your-project/
|
|
332
|
+
├── AGENTS.md # 에이전트 공통 컨텍스트
|
|
333
|
+
├── CLAUDE.md → AGENTS.md # 심볼릭 링크
|
|
334
|
+
├── scripts/
|
|
335
|
+
│ ├── harness-next.sh # 세션 오케스트레이터
|
|
336
|
+
│ ├── harness-session-start.sh # SessionStart 훅
|
|
337
|
+
│ ├── harness-user-prompt-submit.sh # UserPromptSubmit 훅
|
|
338
|
+
│ ├── harness-queue-manager.sh # v4: Feature Queue 관리
|
|
339
|
+
│ ├── harness-team-worker.sh # v4: Team Worker (Gen→Eval 루프)
|
|
340
|
+
│ ├── harness-studio-v4.sh # v4: tmux 레이아웃
|
|
341
|
+
│ ├── harness-dashboard-v4.sh # v4: Progress 패널
|
|
342
|
+
│ ├── harness-prompts-v4.sh # v4: Prompts 패널
|
|
343
|
+
│ └── lib/
|
|
344
|
+
├── .harness/
|
|
345
|
+
│ ├── config.json # 하네스 설정
|
|
346
|
+
│ ├── HARNESS.md # 상세 가이드
|
|
347
|
+
│ ├── progress.json # 세션 간 상태
|
|
348
|
+
│ ├── progress.log # append-only 히스토리
|
|
349
|
+
│ ├── gotchas/ # 에이전트별 실수 기록
|
|
350
|
+
│ ├── actions/
|
|
351
|
+
│ │ ├── feature-list.json # 기능 목록 + AC
|
|
352
|
+
│ │ ├── feature-queue.json # v4: Feature Queue 상태
|
|
353
|
+
│ │ ├── api-contract.json # API 계약서
|
|
354
|
+
│ │ └── plan.md # 제품 사양
|
|
355
|
+
│ └── archive/ # 완료 스프린트 보관
|
|
356
|
+
└── .claude/
|
|
357
|
+
├── settings.json # 훅 등록
|
|
358
|
+
└── skills/ # Claude Code 스킬 (8개)
|
|
359
|
+
```
|
|
330
360
|
|
|
331
361
|
---
|
|
332
362
|
|
|
333
|
-
## Playwright MCP 설정
|
|
363
|
+
## Playwright MCP 설정
|
|
334
364
|
|
|
335
|
-
Evaluator
|
|
365
|
+
Evaluator가 브라우저 테스트를 수행하려면 Playwright MCP가 필요합니다:
|
|
336
366
|
|
|
337
367
|
```json
|
|
368
|
+
// ~/.mcp.json
|
|
338
369
|
{
|
|
339
370
|
"mcpServers": {
|
|
340
371
|
"playwright": {
|
|
@@ -345,8 +376,6 @@ Evaluator-Functional / Evaluator-Visual이 브라우저 테스트를 수행하
|
|
|
345
376
|
}
|
|
346
377
|
```
|
|
347
378
|
|
|
348
|
-
> **Flutter Web (`fe_target=web`) 프로젝트도 Playwright 가 필요합니다** — 컴파일 결과가 일반 웹앱과 동일하므로 React 와 같은 evaluator 를 재사용합니다. **Flutter Mobile/Desktop (`fe_target=mobile`/`desktop`) 프로젝트만** Playwright 없이 `flutter analyze` + `flutter test` 기반으로 동작합니다.
|
|
349
|
-
|
|
350
379
|
---
|
|
351
380
|
|
|
352
381
|
## 트러블슈팅
|
|
@@ -354,76 +383,30 @@ Evaluator-Functional / Evaluator-Visual이 브라우저 테스트를 수행하
|
|
|
354
383
|
### Skills가 로드되지 않아요
|
|
355
384
|
|
|
356
385
|
```bash
|
|
357
|
-
# Claude Code
|
|
358
|
-
|
|
359
|
-
# 프로젝트 디렉토리에서 재진입 후 확인
|
|
386
|
+
/exit # Claude Code 세션 종료
|
|
387
|
+
# 프로젝트 디렉토리에서 재진입
|
|
360
388
|
```
|
|
361
389
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
### Dispatcher가 자동 호출되지 않아요
|
|
365
|
-
|
|
366
|
-
`UserPromptSubmit` 훅이 정상적으로 등록되었는지 확인:
|
|
390
|
+
### 스크립트가 구버전이에요
|
|
367
391
|
|
|
368
392
|
```bash
|
|
369
|
-
|
|
370
|
-
# hooks.UserPromptSubmit 배열에 harness-user-prompt-submit.sh가 있어야 함
|
|
393
|
+
npx walwal-harness # 코어 스크립트 자동 덮어쓰기
|
|
371
394
|
```
|
|
372
395
|
|
|
373
|
-
|
|
396
|
+
### v4 Team이 "No features ready" 반복
|
|
374
397
|
|
|
375
398
|
```bash
|
|
376
|
-
|
|
377
|
-
|
|
399
|
+
# Studio를 재시작하면 자동으로 stale in_progress 복구
|
|
400
|
+
npx walwal-harness v4
|
|
378
401
|
```
|
|
379
402
|
|
|
380
|
-
###
|
|
403
|
+
### Auto-routing 끄기
|
|
381
404
|
|
|
382
|
-
Brainstormer는 Dispatcher가 "브레인스토밍 필요합니까?" 물을 때만 실행됩니다. **N**으로 답하면 Planner로 직행합니다. 피드백/이터레이션/특정 에이전트 명령에서는 질문 자체가 나오지 않습니다.
|
|
383
|
-
|
|
384
|
-
### Flutter 프로젝트인데 React 에이전트가 실행돼요
|
|
385
|
-
|
|
386
|
-
```bash
|
|
387
|
-
# 프로젝트 루트에 pubspec.yaml이 있고 flutter: 키가 존재하는지 확인
|
|
388
|
-
grep "flutter:" pubspec.yaml
|
|
389
|
-
|
|
390
|
-
# 재스캔
|
|
391
|
-
bash scripts/scan-project.sh .
|
|
392
|
-
# pipeline.json의 fe_stack + fe_target 값 확인
|
|
393
|
-
cat .harness/actions/pipeline.json | jq '.fe_stack, .fe_target'
|
|
394
405
|
```
|
|
395
|
-
|
|
396
|
-
### Flutter Web 프로젝트인데 evaluator-functional-flutter (정적 분석) 가 실행돼요
|
|
397
|
-
|
|
398
|
-
`fe_target` 이 `web` 으로 감지되지 않아서 발생합니다. 다음 두 가지를 확인:
|
|
399
|
-
|
|
400
|
-
```bash
|
|
401
|
-
# 1) Flutter 프로젝트 루트에 web/index.html 이 존재하는가?
|
|
402
|
-
ls -la web/index.html
|
|
403
|
-
# 없으면 Flutter Web 활성화:
|
|
404
|
-
flutter config --enable-web
|
|
405
|
-
flutter create --platforms=web .
|
|
406
|
-
|
|
407
|
-
# 2) pipeline.json 의 fe_target 값 확인
|
|
408
|
-
jq '.fe_target' .harness/actions/pipeline.json
|
|
409
|
-
# "mobile" 또는 "unknown" 이면 수동 수정 또는 재스캔
|
|
410
|
-
bash scripts/scan-project.sh .
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
`fe_target = web` 으로 확정되면 Playwright 기반 `evaluator-functional` + `evaluator-visual` 이 자동 사용됩니다.
|
|
414
|
-
|
|
415
|
-
### Auto-routing을 끄고 싶어요
|
|
416
|
-
|
|
417
|
-
```json
|
|
418
|
-
// .harness/config.json
|
|
419
|
-
{ "behavior": { "auto_route_dispatcher": false } }
|
|
406
|
+
❯ harness skip 답만 해줘
|
|
420
407
|
```
|
|
421
408
|
|
|
422
|
-
또는
|
|
423
|
-
|
|
424
|
-
```
|
|
425
|
-
> harness skip 그냥 이것만 답해줘
|
|
426
|
-
```
|
|
409
|
+
또는 `.harness/config.json`에서 `behavior.auto_route_dispatcher = false`
|
|
427
410
|
|
|
428
411
|
---
|
|
429
412
|
|
|
@@ -432,7 +415,7 @@ bash scripts/scan-project.sh .
|
|
|
432
415
|
- [Anthropic: Effective Harnesses for Long-Running Agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)
|
|
433
416
|
- [Anthropic: Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps)
|
|
434
417
|
- [Claude Code Skills Documentation](https://code.claude.com/docs/en/skills)
|
|
435
|
-
- [obra/superpowers](https://github.com/obra/superpowers) — Brainstorming skill
|
|
418
|
+
- [obra/superpowers](https://github.com/obra/superpowers) — Brainstorming skill (MIT License)
|
|
436
419
|
|
|
437
420
|
## License
|
|
438
421
|
|