@walwal-harness/cli 4.0.0-alpha.9 → 4.0.0-beta.2
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 +235 -273
- package/assets/templates/config.json +1 -48
- package/assets/templates/gitignore-append.txt +1 -0
- package/bin/init.js +42 -18
- package/package.json +1 -1
- package/scripts/harness-dashboard-v4.sh +27 -88
- package/scripts/harness-next.sh +4 -15
- package/scripts/harness-user-prompt-submit.sh +10 -0
- package/skills/dispatcher/SKILL.md +7 -2
- package/skills/team-action/SKILL.md +26 -0
- package/skills/team-stop/SKILL.md +19 -0
- package/scripts/harness-control-v4.sh +0 -97
- package/scripts/harness-studio-v4.sh +0 -122
- package/scripts/harness-team-worker.sh +0 -415
- 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,342 @@
|
|
|
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
|
-
Claude Code에서 아무 요청이나 입력하면 **UserPromptSubmit 훅이 자동으로 Dispatcher를 호출**합니다. 또는 명시적으로:
|
|
89
|
-
|
|
90
76
|
```
|
|
91
|
-
|
|
77
|
+
❯ 하네스 엔지니어링 시작
|
|
92
78
|
```
|
|
93
79
|
|
|
94
|
-
|
|
80
|
+
또는 Claude Code에서 아무 요청 → UserPromptSubmit 훅이 자동으로 Dispatcher를 호출합니다.
|
|
81
|
+
|
|
82
|
+
### 3. 파이프라인 자동 선택
|
|
83
|
+
|
|
84
|
+
Dispatcher가 요청을 분석하여 파이프라인을 결정합니다:
|
|
95
85
|
|
|
96
86
|
```
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
│ └─ "브레인스토밍 필요합니까?" → Y: Brainstormer → Planner
|
|
101
|
-
│ → N: Planner 직행
|
|
102
|
-
├─ 실수 지적 → Gotcha 기록 → 해당 에이전트 재작업
|
|
103
|
-
├─ 특정 에이전트 명령 → 해당 에이전트 직접 라우팅
|
|
104
|
-
└─ 메타/인사 → 일반 응답
|
|
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)
|
|
105
90
|
```
|
|
106
91
|
|
|
107
|
-
### 4.
|
|
92
|
+
### 4. 순차 실행
|
|
108
93
|
|
|
109
|
-
각 에이전트가
|
|
94
|
+
각 에이전트가 독립 Claude Code 세션에서 실행됩니다:
|
|
110
95
|
|
|
111
96
|
```
|
|
112
|
-
|
|
97
|
+
❯ /harness-planner # Plan 작성
|
|
98
|
+
❯ /harness-generator-frontend # 코드 생성
|
|
99
|
+
❯ /harness-evaluator-functional # E2E 테스트
|
|
113
100
|
```
|
|
114
101
|
|
|
115
|
-
|
|
102
|
+
에이전트가 완료되면 **새 세션**을 시작하면 자동으로 다음 에이전트를 안내합니다.
|
|
116
103
|
|
|
117
|
-
|
|
118
|
-
═══ Sprint 1 / FULLSTACK ═══════════════════
|
|
104
|
+
### 5. Eval FAIL → 자동 재작업
|
|
119
105
|
|
|
120
|
-
|
|
106
|
+
Evaluator FAIL 시 → 실패 원인 + 피드백과 함께 Generator로 자동 리라우팅 (최대 10회).
|
|
121
107
|
|
|
122
|
-
|
|
123
|
-
```
|
|
108
|
+
---
|
|
124
109
|
|
|
125
|
-
|
|
110
|
+
## Quick Start — Agent Teams (v4)
|
|
126
111
|
|
|
127
|
-
|
|
112
|
+
Claude Code의 **네이티브 Agent Teams 기능**을 사용하여 3개 Teammate가 Feature 단위로 Gen→Eval을 병렬 실행합니다.
|
|
128
113
|
|
|
129
|
-
|
|
114
|
+
```
|
|
115
|
+
기존 (v3): Planner → Gen(F-001~028 전부) → Eval(전부)
|
|
116
|
+
v4: Planner → 3 Teammates 병렬, 각 Feature 단위 Gen→Eval
|
|
117
|
+
```
|
|
130
118
|
|
|
131
|
-
|
|
119
|
+
### 1. Agent Teams 활성화
|
|
132
120
|
|
|
133
|
-
|
|
121
|
+
```bash
|
|
122
|
+
npm install @walwal-harness/cli@next
|
|
123
|
+
npx walwal-harness v4 # settings.json에 env var 설정 + queue 초기화
|
|
124
|
+
```
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
또는 수동으로:
|
|
136
127
|
|
|
128
|
+
```json
|
|
129
|
+
// .claude/settings.json
|
|
130
|
+
{
|
|
131
|
+
"env": {
|
|
132
|
+
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
137
135
|
```
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
136
|
+
|
|
137
|
+
### 2. Claude Code 시작
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
claude # 기본 모드
|
|
141
|
+
claude --teammate-mode tmux # tmux split pane 모드 (권장)
|
|
141
142
|
```
|
|
142
143
|
|
|
143
|
-
###
|
|
144
|
+
### 3. Planner 실행
|
|
144
145
|
|
|
145
146
|
```
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
❯ 하네스 엔지니어링 시작
|
|
148
|
+
# Dispatcher → Planner → feature-list.json 생성
|
|
148
149
|
```
|
|
149
150
|
|
|
150
|
-
###
|
|
151
|
+
### 4. Teams 가동
|
|
151
152
|
|
|
152
153
|
```
|
|
153
|
-
|
|
154
|
+
❯ /harness-team-action
|
|
154
155
|
```
|
|
155
156
|
|
|
156
|
-
|
|
157
|
+
이 명령은:
|
|
158
|
+
1. `feature-list.json` → `feature-queue.json` 초기화 (dependency-aware topological sort)
|
|
159
|
+
2. 3개 Teammate 생성 (Claude의 네이티브 Agent Teams)
|
|
160
|
+
3. 각 Teammate가 Queue에서 Feature를 가져와 Gen→Eval 자율 실행
|
|
157
161
|
|
|
158
|
-
###
|
|
162
|
+
### 5. 모니터링 & 제어
|
|
159
163
|
|
|
160
|
-
|
|
164
|
+
| 명령 | 동작 |
|
|
165
|
+
|------|------|
|
|
166
|
+
| `/harness-team-action` | Queue 초기화 + 3 Teammates 생성 |
|
|
167
|
+
| `/harness-team-stop` | 모든 Teammates 해산 |
|
|
168
|
+
| `bash scripts/harness-queue-manager.sh status .` | Queue 상태 확인 |
|
|
169
|
+
| `bash scripts/harness-queue-manager.sh requeue F-XXX .` | 실패 Feature 재큐 |
|
|
161
170
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
| **flutter** | **web** | `generator-frontend-flutter` | **`evaluator-functional`** (Playwright!) | **`evaluator-visual`** (Playwright!) |
|
|
166
|
-
| **flutter** | mobile | `generator-frontend-flutter` | `evaluator-functional-flutter` (flutter analyze/test) | **SKIP** |
|
|
167
|
-
| **flutter** | desktop | `generator-frontend-flutter` | `evaluator-functional-flutter` (flutter analyze/test) | **SKIP** |
|
|
171
|
+
**tmux 모드에서 Teammate 간 전환:**
|
|
172
|
+
- `Shift+Down` — Teammate 순회
|
|
173
|
+
- `Ctrl+T` — 태스크 리스트 보기
|
|
168
174
|
|
|
169
|
-
|
|
175
|
+
### 6. 작동 원리
|
|
170
176
|
|
|
171
|
-
|
|
177
|
+
```
|
|
178
|
+
Feature Queue (dependency-aware topological sort)
|
|
179
|
+
Ready: [F-002, F-003, F-007] ← depends_on 충족된 것만
|
|
180
|
+
Blocked: [F-004, F-005, ...] ← 선행 Feature 미완료
|
|
172
181
|
|
|
173
|
-
|
|
182
|
+
Teammate 1: F-002 → 코드 생성 → tsc/eslint 검증 → AC 평가
|
|
183
|
+
PASS → queue에서 pass 처리 → dependents unblock → 다음 Feature
|
|
184
|
+
FAIL → 최대 3회 재시도 → 실패 시 fail 처리
|
|
185
|
+
|
|
186
|
+
Teammate 2: F-003 → (동일 루프)
|
|
187
|
+
Teammate 3: F-007 → (동일 루프)
|
|
188
|
+
```
|
|
174
189
|
|
|
175
|
-
|
|
190
|
+
- 각 Teammate는 Claude Code의 **독립 컨텍스트** (1M token)
|
|
191
|
+
- `SendMessage`로 Teammate 간 직접 소통 (API 변경, 실패 알림 등)
|
|
192
|
+
- Lead(사용자 세션)는 오케스트레이터 — 개입, 리뷰, gotcha 등록
|
|
176
193
|
|
|
177
|
-
|
|
178
|
-
|----------|------|----------|
|
|
179
|
-
| **Dispatcher** | 파이프라인 선택 + Gotcha 관리 + 라우팅 | 항상 (auto-routing 훅) |
|
|
180
|
-
| **Brainstormer** | 러프한 요구사항을 대화형으로 구체화 | Dispatcher가 사용자에게 확인 후 |
|
|
181
|
-
| **Planner** | 제품 사양 + API 계약서 + 서비스 분할 | 파이프라인 시작 시 |
|
|
182
|
-
| **Generator-Backend** | NestJS MSA 구현 (Gateway + Microservices) | FULLSTACK, BE-ONLY |
|
|
183
|
-
| **Generator-Frontend** | React/Next.js UI + API 연동 | FULLSTACK, FE-ONLY (React) |
|
|
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만) |
|
|
194
|
+
### 7. Lead에서 할 수 있는 것
|
|
188
195
|
|
|
189
|
-
|
|
196
|
+
| 할 수 있는 것 | 예시 |
|
|
197
|
+
|--------------|------|
|
|
198
|
+
| Teams 가동/중지 | `/harness-team-action`, `/harness-team-stop` |
|
|
199
|
+
| Queue 상태 확인 | `bash scripts/harness-queue-manager.sh status .` |
|
|
200
|
+
| 실패 Feature 분석 | "F-003이 왜 실패했는지 분석해줘" |
|
|
201
|
+
| Feature 재큐 | `bash scripts/harness-queue-manager.sh requeue F-003 .` |
|
|
202
|
+
| 코드 리뷰 | "F-002의 Sidebar 컴포넌트 리뷰해줘" |
|
|
203
|
+
| Gotcha 등록 | "API 응답에 created_at은 ISO 8601이어야 해" |
|
|
204
|
+
| Teammate에 메시지 | "team-1에게 API 스키마 변경 알려줘" |
|
|
190
205
|
|
|
191
|
-
|
|
192
|
-
바이브코딩 수준의 러프한 요구사항을 **대화형 Q&A로 구체화**하여 Planner가 바로 소비할 수 있는 `brainstorm-spec.md`로 만듭니다.
|
|
206
|
+
**하지 말 것:** `/harness-generator-*`, `/harness-evaluator-*` 직접 호출 — Teammate가 처리합니다.
|
|
193
207
|
|
|
194
|
-
|
|
195
|
-
- HARD-GATE: 사용자 승인 없이 구현 단계로 넘어갈 수 없음
|
|
196
|
-
- 한 번에 한 질문, 객관식 우선
|
|
197
|
-
- 2-3개 접근법 제시 후 사용자가 선택
|
|
198
|
-
- Spec self-review + User Review Gate
|
|
208
|
+
---
|
|
199
209
|
|
|
200
|
-
|
|
210
|
+
## 에이전트
|
|
211
|
+
|
|
212
|
+
| 에이전트 | 역할 | 모델 |
|
|
213
|
+
|----------|------|------|
|
|
214
|
+
| **Dispatcher** | 파이프라인 선택 + Gotcha 관리 | opus |
|
|
215
|
+
| **Brainstormer** | 러프한 요구사항 대화형 구체화 | opus |
|
|
216
|
+
| **Planner** | 제품 사양 + API 계약 + Feature 설계 | opus/ultraplan |
|
|
217
|
+
| **Generator-Backend** | NestJS MSA 구현 | sonnet |
|
|
218
|
+
| **Generator-Frontend** | React/Next.js UI 구현 | sonnet |
|
|
219
|
+
| **Evaluator-Functional** | Playwright E2E 기능 검증 | opus/ultrathink |
|
|
220
|
+
| **Evaluator-Visual** | 디자인, 반응형, 접근성 검증 | opus/ultrathink |
|
|
221
|
+
|
|
222
|
+
### Brainstormer (조건부)
|
|
223
|
+
|
|
224
|
+
[obra/superpowers](https://github.com/obra/superpowers) (MIT License) 기반. 바이브코딩 수준의 러프한 요구사항을 대화형 Q&A로 구체화합니다.
|
|
201
225
|
|
|
202
226
|
---
|
|
203
227
|
|
|
204
228
|
## 핵심 메커니즘
|
|
205
229
|
|
|
206
|
-
### Auto-Routing
|
|
230
|
+
### Auto-Routing
|
|
207
231
|
|
|
208
|
-
|
|
232
|
+
모든 사용자 프롬프트가 Dispatcher를 자동 경유합니다.
|
|
209
233
|
|
|
210
|
-
**per-message opt-out:**
|
|
211
|
-
```
|
|
212
|
-
> harness skip 그냥 이것만 답해줘
|
|
213
|
-
> harness 없이 질문 하나만
|
|
214
|
-
> without harness ...
|
|
215
234
|
```
|
|
235
|
+
# per-message opt-out
|
|
236
|
+
❯ harness skip 그냥 답해줘
|
|
216
237
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// .harness/config.json
|
|
220
|
-
{ "behavior": { "auto_route_dispatcher": false } }
|
|
238
|
+
# 전역 비활성
|
|
239
|
+
.harness/config.json → behavior.auto_route_dispatcher = false
|
|
221
240
|
```
|
|
222
241
|
|
|
223
242
|
### API Contract — 진실의 원천
|
|
224
243
|
|
|
225
|
-
`api-contract.json`이
|
|
244
|
+
`api-contract.json`이 FE ↔ Gateway ↔ Services 간 유일한 계약서입니다.
|
|
226
245
|
|
|
227
|
-
###
|
|
246
|
+
### Gotcha 시스템
|
|
228
247
|
|
|
229
|
-
|
|
248
|
+
사용자가 실수를 지적하면 Dispatcher가 자동 기록 → 이후 세션에서 반복 방지.
|
|
230
249
|
|
|
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
|
-
```
|
|
250
|
+
### Pre-Eval Gate
|
|
237
251
|
|
|
238
|
-
|
|
252
|
+
Generator → Evaluator 전환 전 결정론적 검증 (tsc, eslint, test). 실패 시 Evaluator 세션을 열지 않고 Generator로 자동 리라우팅.
|
|
239
253
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
254
|
+
```json
|
|
255
|
+
// .harness/config.json
|
|
256
|
+
"pre_eval_gate": {
|
|
257
|
+
"frontend_checks": ["npx tsc --noEmit", "npx eslint src/", "npx vitest run --bail 1"],
|
|
258
|
+
"frontend_cwd": "path/to/frontend" // 프로젝트 루트와 다른 경우
|
|
259
|
+
}
|
|
246
260
|
```
|
|
247
261
|
|
|
248
|
-
###
|
|
249
|
-
|
|
250
|
-
Evaluator는 기능 테스트 전에 AGENTS.md의 IA-MAP과 실제 폴더 구조를 대조합니다. 경로 누락이나 소유권 침범이 발견되면 **기능 테스트 없이 즉시 FAIL**합니다.
|
|
251
|
-
|
|
252
|
-
### 브라운필드 지원
|
|
262
|
+
### Evaluation System
|
|
253
263
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
264
|
+
| 설정 | 값 |
|
|
265
|
+
|------|------|
|
|
266
|
+
| PASS 기준 | 2.80 / 3.00 이상 |
|
|
267
|
+
| FAIL 기준 | 2.79 이하 (예외 없음) |
|
|
268
|
+
| Evidence 없는 Score | 0점 강제 |
|
|
269
|
+
| Regression 실패 | 1건이라도 → 전체 FAIL |
|
|
259
270
|
|
|
260
271
|
---
|
|
261
272
|
|
|
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에도 반영)
|
|
273
|
+
## Harness Studio (tmux)
|
|
291
274
|
|
|
292
|
-
|
|
275
|
+
### Studio v3 (Classic)
|
|
293
276
|
|
|
294
|
-
|
|
277
|
+
```bash
|
|
278
|
+
npx walwal-harness studio
|
|
279
|
+
```
|
|
295
280
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
281
|
+
```
|
|
282
|
+
┌──────────────┬──────────────┐
|
|
283
|
+
│ Dashboard │ Monitor │
|
|
284
|
+
│ (Progress) ├──────────────┤
|
|
285
|
+
├──────────────┤ Agent Session │
|
|
286
|
+
│ Control ├──────────────┤
|
|
287
|
+
│ (harness>) │ Eval Review │
|
|
288
|
+
└──────────────┴──────────────┘
|
|
289
|
+
```
|
|
303
290
|
|
|
304
|
-
|
|
291
|
+
### Studio v4 (Agent Teams)
|
|
305
292
|
|
|
306
|
-
|
|
293
|
+
```bash
|
|
294
|
+
npx walwal-harness v4
|
|
295
|
+
```
|
|
307
296
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
| Unit Testing | Jest (BE) + Vitest (FE-React) + flutter test (FE-Flutter) |
|
|
316
|
-
| Database | PostgreSQL / SQLite |
|
|
297
|
+
```
|
|
298
|
+
┌──────────────┬──────────────┬──────────────┐
|
|
299
|
+
│ │ Progress │ Team 1 │
|
|
300
|
+
│ Main ├──────────────┤ Team 2 │
|
|
301
|
+
│ (Claude) │ Prompts │ Team 3 │
|
|
302
|
+
└──────────────┴──────────────┴──────────────┘
|
|
303
|
+
```
|
|
317
304
|
|
|
318
305
|
---
|
|
319
306
|
|
|
320
|
-
##
|
|
321
|
-
|
|
322
|
-
하네스는 자체 reference 파일로 기본 가이드를 제공하지만, 아래 외부 스킬을 설치하면 품질이 향상됩니다. 초기화 시 자동으로 설치 여부를 체크하고 안내합니다.
|
|
307
|
+
## 프로젝트 구조
|
|
323
308
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
309
|
+
```
|
|
310
|
+
your-project/
|
|
311
|
+
├── AGENTS.md # 에이전트 공통 컨텍스트
|
|
312
|
+
├── CLAUDE.md → AGENTS.md # 심볼릭 링크
|
|
313
|
+
├── scripts/
|
|
314
|
+
│ ├── harness-next.sh # 세션 오케스트레이터
|
|
315
|
+
│ ├── harness-session-start.sh # SessionStart 훅
|
|
316
|
+
│ ├── harness-user-prompt-submit.sh # UserPromptSubmit 훅
|
|
317
|
+
│ ├── harness-queue-manager.sh # v4: Feature Queue 관리
|
|
318
|
+
│ ├── harness-team-worker.sh # v4: Team Worker (Gen→Eval 루프)
|
|
319
|
+
│ ├── harness-studio-v4.sh # v4: tmux 레이아웃
|
|
320
|
+
│ ├── harness-dashboard-v4.sh # v4: Progress 패널
|
|
321
|
+
│ ├── harness-prompts-v4.sh # v4: Prompts 패널
|
|
322
|
+
│ └── lib/
|
|
323
|
+
├── .harness/
|
|
324
|
+
│ ├── config.json # 하네스 설정
|
|
325
|
+
│ ├── HARNESS.md # 상세 가이드
|
|
326
|
+
│ ├── progress.json # 세션 간 상태
|
|
327
|
+
│ ├── progress.log # append-only 히스토리
|
|
328
|
+
│ ├── gotchas/ # 에이전트별 실수 기록
|
|
329
|
+
│ ├── actions/
|
|
330
|
+
│ │ ├── feature-list.json # 기능 목록 + AC
|
|
331
|
+
│ │ ├── feature-queue.json # v4: Feature Queue 상태
|
|
332
|
+
│ │ ├── api-contract.json # API 계약서
|
|
333
|
+
│ │ └── plan.md # 제품 사양
|
|
334
|
+
│ └── archive/ # 완료 스프린트 보관
|
|
335
|
+
└── .claude/
|
|
336
|
+
├── settings.json # 훅 등록
|
|
337
|
+
└── skills/ # Claude Code 스킬 (8개)
|
|
338
|
+
```
|
|
330
339
|
|
|
331
340
|
---
|
|
332
341
|
|
|
333
|
-
## Playwright MCP 설정
|
|
342
|
+
## Playwright MCP 설정
|
|
334
343
|
|
|
335
|
-
Evaluator
|
|
344
|
+
Evaluator가 브라우저 테스트를 수행하려면 Playwright MCP가 필요합니다:
|
|
336
345
|
|
|
337
346
|
```json
|
|
347
|
+
// ~/.mcp.json
|
|
338
348
|
{
|
|
339
349
|
"mcpServers": {
|
|
340
350
|
"playwright": {
|
|
@@ -345,8 +355,6 @@ Evaluator-Functional / Evaluator-Visual이 브라우저 테스트를 수행하
|
|
|
345
355
|
}
|
|
346
356
|
```
|
|
347
357
|
|
|
348
|
-
> **Flutter Web (`fe_target=web`) 프로젝트도 Playwright 가 필요합니다** — 컴파일 결과가 일반 웹앱과 동일하므로 React 와 같은 evaluator 를 재사용합니다. **Flutter Mobile/Desktop (`fe_target=mobile`/`desktop`) 프로젝트만** Playwright 없이 `flutter analyze` + `flutter test` 기반으로 동작합니다.
|
|
349
|
-
|
|
350
358
|
---
|
|
351
359
|
|
|
352
360
|
## 트러블슈팅
|
|
@@ -354,76 +362,30 @@ Evaluator-Functional / Evaluator-Visual이 브라우저 테스트를 수행하
|
|
|
354
362
|
### Skills가 로드되지 않아요
|
|
355
363
|
|
|
356
364
|
```bash
|
|
357
|
-
# Claude Code
|
|
358
|
-
|
|
359
|
-
# 프로젝트 디렉토리에서 재진입 후 확인
|
|
365
|
+
/exit # Claude Code 세션 종료
|
|
366
|
+
# 프로젝트 디렉토리에서 재진입
|
|
360
367
|
```
|
|
361
368
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
### Dispatcher가 자동 호출되지 않아요
|
|
365
|
-
|
|
366
|
-
`UserPromptSubmit` 훅이 정상적으로 등록되었는지 확인:
|
|
369
|
+
### 스크립트가 구버전이에요
|
|
367
370
|
|
|
368
371
|
```bash
|
|
369
|
-
|
|
370
|
-
# hooks.UserPromptSubmit 배열에 harness-user-prompt-submit.sh가 있어야 함
|
|
372
|
+
npx walwal-harness # 코어 스크립트 자동 덮어쓰기
|
|
371
373
|
```
|
|
372
374
|
|
|
373
|
-
|
|
375
|
+
### v4 Team이 "No features ready" 반복
|
|
374
376
|
|
|
375
377
|
```bash
|
|
376
|
-
|
|
377
|
-
|
|
378
|
+
# Studio를 재시작하면 자동으로 stale in_progress 복구
|
|
379
|
+
npx walwal-harness v4
|
|
378
380
|
```
|
|
379
381
|
|
|
380
|
-
###
|
|
382
|
+
### Auto-routing 끄기
|
|
381
383
|
|
|
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
384
|
```
|
|
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 } }
|
|
385
|
+
❯ harness skip 답만 해줘
|
|
420
386
|
```
|
|
421
387
|
|
|
422
|
-
또는
|
|
423
|
-
|
|
424
|
-
```
|
|
425
|
-
> harness skip 그냥 이것만 답해줘
|
|
426
|
-
```
|
|
388
|
+
또는 `.harness/config.json`에서 `behavior.auto_route_dispatcher = false`
|
|
427
389
|
|
|
428
390
|
---
|
|
429
391
|
|
|
@@ -432,7 +394,7 @@ bash scripts/scan-project.sh .
|
|
|
432
394
|
- [Anthropic: Effective Harnesses for Long-Running Agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents)
|
|
433
395
|
- [Anthropic: Harness Design for Long-Running Application Development](https://www.anthropic.com/engineering/harness-design-long-running-apps)
|
|
434
396
|
- [Claude Code Skills Documentation](https://code.claude.com/docs/en/skills)
|
|
435
|
-
- [obra/superpowers](https://github.com/obra/superpowers) — Brainstorming skill
|
|
397
|
+
- [obra/superpowers](https://github.com/obra/superpowers) — Brainstorming skill (MIT License)
|
|
436
398
|
|
|
437
399
|
## License
|
|
438
400
|
|