@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 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
- 1. `.harness/` 디렉토리 스캐폴딩 (actions, archive, gotchas, config)
21
- 2. `.claude/skills/` 에 에이전트 스킬 설치 (9개)
22
- 3. `scripts/` 오케스트레이션 헬퍼 스크립트 설치
23
- 4. `SessionStart` 등록 (세션 시작 시 진행 상태 표시)
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
- ### CLI 명령
39
+ ### 기존 설치자 업데이트
32
40
 
33
41
  ```bash
34
- npx walwal-harness # 초기화 (postinstall과 동일)
35
- npx walwal-harness --force # 강제 재초기화 (기존 파일 덮어쓰기)
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
- your-project/
43
- ├── AGENTS.md # 에이전트 공통 컨텍스트 (Planner 관리)
44
- ├── CLAUDE.md → AGENTS.md # 심볼릭 링크
45
- ├── scripts/
46
- │ ├── harness-next.sh # 세션 오케스트레이터
47
- │ ├── harness-session-start.sh # SessionStart
48
- │ ├── harness-user-prompt-submit.sh # UserPromptSubmit (auto-routing)
49
- │ ├── scan-project.sh # 프로젝트 구조 스캔
50
- │ ├── init-agents-md.sh # AGENTS.md 생성/리빌드
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 세션 재시작 (/exit → 재진입)
71
+ # Claude Code 재시작 (/exit → 재진입)
84
72
  ```
85
73
 
86
74
  ### 2. 하네스 시작
87
75
 
88
- Claude Code에서 아무 요청이나 입력하면 **UserPromptSubmit 훅이 자동으로 Dispatcher를 호출**합니다. 또는 명시적으로:
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
- ### 3. Dispatcher가 분류
92
+ ### 4. 순차 실행
93
+
94
+ 각 에이전트가 독립 Claude Code 세션에서 실행됩니다:
95
95
 
96
96
  ```
97
- 사용자 입력
98
-
99
- ├─ 신규 기능/제품 요청 → 파이프라인 선택 (FULLSTACK / FE-ONLY / BE-ONLY)
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
- ### 4. 에이전트 순차 실행
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
- Dispatcher 완료. bash scripts/harness-next.sh 실행하여 다음 단계 확인.
119
+ 기존 (v3): Planner Gen(F-001~028 전부) Eval(전부)
120
+ v4: Planner → 3 Teams 병렬, 각 Team이 Feature 1개씩 Gen→Eval
113
121
  ```
114
122
 
115
- `bash scripts/harness-next.sh` 를 실행하면 프로그레스 바 + 다음 에이전트 안내:
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
- Agents: planner✓ generator-backend✓ → [generator-frontend] → evaluator-functional → evaluator-visual
130
+ ### 2. Planner 실행 (Classic으로)
121
131
 
122
- /harness-generator-frontend 실행하세요.
132
+ v4에서도 Planner는 먼저 실행해야 합니다:
133
+
134
+ ```
135
+ ❯ 하네스 엔지니어링 시작
136
+ # Dispatcher → Planner → feature-list.json 생성
123
137
  ```
124
138
 
125
- ### 5. 반복
139
+ ### 3. Studio 실행
126
140
 
127
- FAIL이 발생하면 Evaluator가 원인을 분석하고 해당 Generator로 자동 재작업 라우팅 (최대 10회). PASS하면 다음 Evaluator로 진행. 모든 Evaluator를 통과하면 스프린트 완료 → 아카이브.
141
+ **터미널에서** (Claude 세션 밖에서):
128
142
 
129
- ---
143
+ ```bash
144
+ npx walwal-harness v4
145
+ ```
130
146
 
131
- ## 파이프라인
147
+ ### 4. Teams 가동/중지
132
148
 
133
- Dispatcher사용자 요청을 분석하여 3가지 파이프라인 중 하나를 자동 선택합니다:
149
+ Studio열리면 Main pane의 Claude에서:
134
150
 
135
- ### FULLSTACK (신규 프로젝트)
151
+ ```
152
+ ❯ /harness-team-action # Queue 초기화 + 3 Teams 백그라운드 실행
153
+ ❯ /harness-team-stop # 모든 Teams 중지
154
+ ```
136
155
 
156
+ **흐름 요약:**
137
157
  ```
138
- Brainstormer? → Planner → Generator-BE Generator-FE Evaluator-Func → Evaluator-Visual
139
- │ FAIL
140
- └──→ 재작업 (max 10회)
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
- ### FE-ONLY (기존 API에 프론트엔드 연동)
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
- Brainstormer? → Planner(light) → Generator-FE → Evaluator-Func → Evaluator-Visual
147
- └─ OpenAPI → api-contract.json 자동 변환
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
- ### BE-ONLY (기존 서버에 백엔드 기능 추가)
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
- Brainstormer? Planner → Generator-BE Evaluator-Func(API-only)
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
- > `Brainstormer?` = Dispatcher가 사용자에게 확인 조건부 실행. 명확한 PRD/OpenAPI가 있으면 생략 가능.
210
+ - Team은 **git worktree**로 격리 실행 (파일 충돌 없음)
211
+ - Feature PASS 시 main으로 **auto-merge** + worktree 즉시 삭제
212
+ - Merge conflict 시 auto-rebase 시도
157
213
 
158
- ### Flutter 프로젝트 자동 감지 (Web / Mobile / Desktop)
214
+ ### 9. Main에서 있는
159
215
 
160
- `pubspec.yaml` + `flutter:` 키가 감지되면 FE 에이전트가 **자동 치환**됩니다. **Flutter Web** 은 컴파일 결과가 HTML+JS+CSS 이므로 React 와 동일하게 Playwright 기반 evaluator 를 그대로 사용하고, **Mobile/Desktop** 만 정적 분석 evaluator 로 교체됩니다.
216
+ Main Claude는 **오케스트레이터**입니다:
161
217
 
162
- | fe_stack | fe_target | Generator | Eval-Functional | Eval-Visual |
163
- |----------|-----------|-----------|----------------|-------------|
164
- | react | (n/a) | `generator-frontend` | `evaluator-functional` (Playwright) | `evaluator-visual` |
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** |
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
- **감지 방식**: `scan-project.sh` Flutter 프로젝트의 `web/index.html`, `android/`, `ios/`, `macos/`, `windows/`, `linux/` 디렉터리 존재 여부로 `fe_target` 을 자동 판정. 멀티 타겟 또는 모호한 경우 Planner 가 사용자에게 확인합니다. 치환은 `pipeline.json.fe_stack + fe_target` 조합에 의해 `harness-next.sh` 가 자동 처리합니다.
227
+ **하지 것:** `/harness-generator-*`, `/harness-evaluator-*` 직접 호출 Team이 처리합니다.
170
228
 
171
229
  ---
172
230
 
173
231
  ## 에이전트
174
232
 
175
- ### 9개 에이전트 (조건부 포함)
176
-
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만) |
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) brainstorming 방법론을 이식.
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 (UserPromptSubmit Hook)
251
+ ### Auto-Routing
207
252
 
208
- 설치 시 `.claude/settings.json`에 `UserPromptSubmit` 훅이 자동 등록됩니다. 모든 사용자 프롬프트가 Dispatcher를 경유하도록 컨텍스트를 주입합니다.
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
- ```json
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`이 Frontend ↔ Gateway ↔ Microservices 간 유일한 계약서입니다. Planner만 수정 가능하며, Generator-BE는 이를 구현하고, Generator-FE는 이를 소비합니다.
226
-
227
- ### AGENTS.md — 에이전트 불문 범용 컨텍스트
265
+ `api-contract.json`이 FE ↔ Gateway ↔ Services 간 유일한 계약서입니다.
228
266
 
229
- 모든 AI 에이전트(Claude, Cursor, Copilot, Windsurf)가 읽을 수 있는 공통 진입점입니다. 1차원 IA-MAP으로 폴더별 책임과 소유 에이전트를 명시합니다.
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
- ### Gotcha 시스템 — 실수를 반복하지 않는 에이전트
271
+ ### Pre-Eval Gate
239
272
 
240
- 사용자가 에이전트의 실수를 지적하면 Dispatcher가 자동으로 감지하여 해당 에이전트의 gotchas 파일에 기록합니다. 이후 세션에서 에이전트는 시작 자신의 gotchas를 읽고 같은 실수를 반복하지 않습니다.
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
- - `scan-project.sh`가 Tech Stack, 폴더 구조, 기존 CLAUDE.md를 자동 스캔
256
- - 기존 CLAUDE.md 규칙을 "Preserved Rules" 섹션으로 이관
257
- - 원본은 `.harness/archive/pre-harness-backup/`에 백업
258
- - Flutter 프로젝트 자동 감지 (`pubspec.yaml` + `flutter:`)
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
- ## FE 스택별 지원
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
- | `harness-next.sh` | 세션 오케스트레이터 — progress.json 읽고 다음 에이전트 결정, 프로그레스 바 출력 | `bash scripts/harness-next.sh` |
299
- | `scan-project.sh` | 프로젝트 구조 스캔 → `.harness/actions/scan-result.json` 출력 | `bash scripts/scan-project.sh .` |
300
- | `init-agents-md.sh` | scan-result.json 기반 AGENTS.md 생성/리빌드 | `bash scripts/init-agents-md.sh .` |
301
- | `harness-session-start.sh` | SessionStart 훅 — 세션 시작 시 progress 요약 출력 | (자동 — .claude/settings.json 훅) |
302
- | `harness-user-prompt-submit.sh` | UserPromptSubmit 훅 — 모든 프롬프트를 Dispatcher 경유 라우팅 | (자동 — .claude/settings.json 훅) |
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
- ## Tech Stack
314
+ ```bash
315
+ npx walwal-harness v4
316
+ ```
307
317
 
308
- | 영역 | 기술 |
309
- |------|------|
310
- | Backend | NestJS (TypeScript) + MSA |
311
- | Frontend (React) | React 또는 Next.js (TypeScript) + Tailwind CSS |
312
- | Frontend (Flutter) | Flutter (Dart) + Riverpod + Retrofit + ARB i18n |
313
- | E2E Testing (React) | Playwright MCP |
314
- | E2E Testing (Flutter) | flutter analyze + flutter test + 정적 검증 |
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
- | **vercel** | Vercel/Next.js 배포, 성능 최적화, AI SDK | Generator-FE |
327
- | **web-design-guidelines** | UI/UX 접근성, Web Interface Guidelines | Evaluator-Visual, Generator-FE |
328
- | **taste-skill** | AI 생성 UI 디자인 품질, AI슬롭 감지 | Evaluator-Visual, Generator-FE |
329
- | **supanova-design-skill** | 디자인 시스템 규칙, 시각적 일관성 | Evaluator-Visual, Generator-FE |
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 설정 (React 프로젝트)
363
+ ## Playwright MCP 설정
334
364
 
335
- Evaluator-Functional / Evaluator-Visual이 브라우저 테스트를 수행하려면 Playwright MCP가 필요합니다. `~/.mcp.json`에 추가:
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
- /exit
359
- # 프로젝트 디렉토리에서 재진입 후 확인
386
+ /exit # Claude Code 세션 종료
387
+ # 프로젝트 디렉토리에서 재진입
360
388
  ```
361
389
 
362
- Claude Code는 세션 시작 시 `.claude/skills/`를 스캔합니다. `npm install` 이후 반드시 세션 재시작이 필요합니다.
363
-
364
- ### Dispatcher가 자동 호출되지 않아요
365
-
366
- `UserPromptSubmit` 훅이 정상적으로 등록되었는지 확인:
390
+ ### 스크립트가 구버전이에요
367
391
 
368
392
  ```bash
369
- cat .claude/settings.json
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
- npx walwal-harness --force
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 원본 (MIT License)
418
+ - [obra/superpowers](https://github.com/obra/superpowers) — Brainstorming skill (MIT License)
436
419
 
437
420
  ## License
438
421