@walwal-harness/cli 5.3.2 → 5.4.1
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/assets/templates/memory.md +11 -0
- package/package.json +1 -1
- package/scripts/harness-dashboard.sh +2 -2
- package/scripts/harness-tmux.sh +23 -11
- package/skills/dispatcher/SKILL.md +12 -3
- package/skills/evaluator-functional/SKILL.md +10 -0
- package/skills/evaluator-visual/SKILL.md +10 -0
- package/skills/planner/SKILL.md +29 -0
|
@@ -52,3 +52,14 @@ docmeta:
|
|
|
52
52
|
6. 각 단계마다 **어떤 도구/방법으로 검증했는지**(tsc/eslint/curl/playwright 등) 명시.
|
|
53
53
|
- **Context**: 사용자가 대시보드 로그만 보고 진행 상황을 파악해야 하는데, 기존 축약 로그로는 4대 질문에 답이 안 보인다는 피드백.
|
|
54
54
|
- **Applies to**: Team Worker(Generator + Evaluator), Solo Mode Generator/Evaluator, 모든 `logev` 호출 지점.
|
|
55
|
+
|
|
56
|
+
### [M-002] FE Evaluation은 Playwright 필수
|
|
57
|
+
- **Date**: 2026-04-20
|
|
58
|
+
- **Status**: verified
|
|
59
|
+
- **TTL**: 영구
|
|
60
|
+
- **Lesson**: 웹 렌더링 가능한 FE Feature(React, Next, Flutter Web, RN Web 등)는 **Evaluator-Functional과 Evaluator-Visual이 반드시 Playwright MCP 도구(`mcp__playwright__browser_*`)를 호출하여 실제 브라우저 조작으로 검증**한다. 코드 열람/grep/정적 분석만으로 PASS 판정 금지. 각 AC에 대해 사용한 playwright 도구 이름과 결과를 `evaluation-*.md`에 증거로 남겨야 하며, 증거 없는 AC는 0점 강제.
|
|
61
|
+
- **Context**: FE 피처가 실제 UX를 검증하지 않고 코드 존재 여부만으로 PASS되는 문제.
|
|
62
|
+
- **Applies to**:
|
|
63
|
+
- Planner: FE Feature AC에 `type: visual|e2e|a11y` + `verify.tool: "playwright"` + `verify.steps` 명시 필수.
|
|
64
|
+
- Evaluator-Functional / Evaluator-Visual: FE Feature 평가 시 Playwright 도구 호출 없이 진행 금지.
|
|
65
|
+
- 네이티브 모바일/데스크톱 스택은 `validation.visual.enabled == false`일 때만 MANUAL_REQUIRED로 우회 허용.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.1",
|
|
4
4
|
"description": "Production harness for AI agent engineering — Solo/Team mode, Planner, Generator(BE/FE), Evaluator(Func/Visual), optional Brainstormer. Supports React, Next.js, and Flutter FE stacks.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"walwal-harness": "bin/init.js"
|
|
@@ -382,7 +382,7 @@ render_dashboard() {
|
|
|
382
382
|
render_team_status
|
|
383
383
|
render_team_features
|
|
384
384
|
render_team_bottleneck
|
|
385
|
-
|
|
385
|
+
# Archive Prompt는 별도 패널(harness-prompt-history.sh)에서 렌더링 — Dashboard 모니터링 영역 보호
|
|
386
386
|
;;
|
|
387
387
|
*)
|
|
388
388
|
render_solo_sprint_overview
|
|
@@ -393,7 +393,7 @@ render_dashboard() {
|
|
|
393
393
|
fi
|
|
394
394
|
|
|
395
395
|
render_solo_agent_info
|
|
396
|
-
|
|
396
|
+
# Archive Prompt는 별도 패널(harness-prompt-history.sh)에서 렌더링
|
|
397
397
|
;;
|
|
398
398
|
esac
|
|
399
399
|
}
|
package/scripts/harness-tmux.sh
CHANGED
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
# Team Mode (--team):
|
|
5
5
|
# ┌──────────────┬──────────────┬──────────────┐
|
|
6
6
|
# │ │ │ TEAM 1 │
|
|
7
|
-
# │ Dashboard │
|
|
8
|
-
# │ (queue + │
|
|
9
|
-
# │ status + │
|
|
10
|
-
# │
|
|
11
|
-
#
|
|
12
|
-
# │
|
|
7
|
+
# │ Dashboard │ │ │
|
|
8
|
+
# │ (queue + │ Gotcha & ├──────────────┤
|
|
9
|
+
# │ status + │ Memory │ TEAM 2 │
|
|
10
|
+
# │ features) │ │ │
|
|
11
|
+
# ├──────────────┤ ├──────────────┤
|
|
12
|
+
# │ Archive │ │ TEAM 3 │
|
|
13
|
+
# │ Prompt │ │ │
|
|
13
14
|
# └──────────────┴──────────────┴──────────────┘
|
|
15
|
+
# (Archive Prompt는 별도 패널 — Dashboard 모니터링 영역 보호)
|
|
14
16
|
#
|
|
15
17
|
# Rendering strategy:
|
|
16
18
|
# 1. iTerm2 detected → native split panes (no tmux needed)
|
|
@@ -104,6 +106,12 @@ launch_iterm2_team() {
|
|
|
104
106
|
set name to "harness-studio"
|
|
105
107
|
write text "cd '${PROJECT_ROOT}' && bash '${SCRIPT_DIR}/harness-dashboard.sh' '${PROJECT_ROOT}'"
|
|
106
108
|
|
|
109
|
+
-- Split down (bottom of Dashboard column) → Archive Prompt
|
|
110
|
+
set archivePane to (split horizontally with default profile)
|
|
111
|
+
tell archivePane
|
|
112
|
+
write text "cd '${PROJECT_ROOT}' && bash '${SCRIPT_DIR}/harness-prompt-history.sh' '${PROJECT_ROOT}'"
|
|
113
|
+
end tell
|
|
114
|
+
|
|
107
115
|
-- Split right → Gotcha & Memory
|
|
108
116
|
set dashPane to (split vertically with default profile)
|
|
109
117
|
tell dashPane
|
|
@@ -182,15 +190,19 @@ launch_tmux_team() {
|
|
|
182
190
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-monitor.sh\" \"${PROJECT_ROOT}\" --team 2'")
|
|
183
191
|
PANE_T3=$(tmux split-window -v -p 50 -t "$PANE_T2" -c "$PROJECT_ROOT" -P -F '#{pane_id}' \
|
|
184
192
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-monitor.sh\" \"${PROJECT_ROOT}\" --team 3'")
|
|
193
|
+
# Dashboard 열을 상(Dashboard)/하(Archive Prompt)로 분할 — archive가 길어져도 모니터링 유지
|
|
194
|
+
PANE_ARCHIVE=$(tmux split-window -v -p 35 -t "$PANE_DASH" -c "$PROJECT_ROOT" -P -F '#{pane_id}' \
|
|
195
|
+
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-prompt-history.sh\" \"${PROJECT_ROOT}\"'")
|
|
185
196
|
|
|
186
197
|
tmux send-keys -t "$PANE_DASH" "bash \"${SCRIPT_DIR}/harness-dashboard.sh\" \"${PROJECT_ROOT}\"" Enter
|
|
187
198
|
tmux send-keys -t "$PANE_GOTCHA" "bash \"${SCRIPT_DIR}/harness-gotcha-memory.sh\" \"${PROJECT_ROOT}\"" Enter
|
|
188
199
|
|
|
189
|
-
tmux select-pane -t "$PANE_DASH"
|
|
190
|
-
tmux select-pane -t "$
|
|
191
|
-
tmux select-pane -t "$
|
|
192
|
-
tmux select-pane -t "$
|
|
193
|
-
tmux select-pane -t "$
|
|
200
|
+
tmux select-pane -t "$PANE_DASH" -T "Dashboard"
|
|
201
|
+
tmux select-pane -t "$PANE_ARCHIVE" -T "Archive Prompt"
|
|
202
|
+
tmux select-pane -t "$PANE_GOTCHA" -T "Gotcha & Memory"
|
|
203
|
+
tmux select-pane -t "$PANE_T1" -T "TEAM 1"
|
|
204
|
+
tmux select-pane -t "$PANE_T2" -T "TEAM 2"
|
|
205
|
+
tmux select-pane -t "$PANE_T3" -T "TEAM 3"
|
|
194
206
|
tmux select-pane -t "$PANE_DASH"
|
|
195
207
|
|
|
196
208
|
tmux set-option -t "$SESSION_NAME" pane-border-status top 2>/dev/null || true
|
|
@@ -27,9 +27,18 @@ disable-model-invocation: false
|
|
|
27
27
|
2. `.harness/progress.log`에 요약 한 줄 추가
|
|
28
28
|
3. **모드 감지**: `.harness/progress.json`의 `mode` 필드 확인
|
|
29
29
|
- **`"team"`**: Team Mode 활성. 별도 안내 없이 즉시 STOP.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
출력 (아래 3줄을 그대로 사용):
|
|
31
|
+
```
|
|
32
|
+
✓ Dispatcher 완료 — pipeline.json 생성됨 (next_agent=<값>).
|
|
33
|
+
→ 별도 tmux 창의 Team Worker들이 이 파일을 감지해 자동으로 다음 에이전트를 실행합니다. 사용자 입력은 필요 없습니다.
|
|
34
|
+
→ 진행 상황은 tmux Dashboard/Team 패널에서 확인하세요. 중단하려면 `bash scripts/harness-tmux.sh --kill`.
|
|
35
|
+
```
|
|
36
|
+
- **`"solo"` / `"paused"`**: Solo Mode. 자동 실행되는 것이 아무것도 없음 — 사용자 입력 대기.
|
|
37
|
+
출력 (아래 2줄을 그대로 사용):
|
|
38
|
+
```
|
|
39
|
+
✓ Dispatcher 완료 — pipeline.json 생성됨 (next_agent=<값>). 자동 실행은 시작되지 않았습니다.
|
|
40
|
+
→ 다음 에이전트를 돌리려면 `/harness-solo` 를 입력하거나, 그냥 후속 지시를 프롬프트로 주세요.
|
|
41
|
+
```
|
|
33
42
|
4. **STOP. 다음 에이전트를 직접 호출하지 않는다.**
|
|
34
43
|
- Team 모드에서는 `/harness-team 실행하시겠습니까?` 같은 **질문을 하지 않는다**. Teams는 이미 실행 중이거나 사용자가 별도로 시작한다.
|
|
35
44
|
|
|
@@ -50,6 +50,16 @@ disable-model-invocation: true
|
|
|
50
50
|
- 코드 읽기는 평가가 아님 — **반드시 앱을 조작**.
|
|
51
51
|
- 기준 미달 = FAIL. 예외 없음.
|
|
52
52
|
|
|
53
|
+
## FE Playwright Mandatory Rule (v5.4)
|
|
54
|
+
|
|
55
|
+
**프론트엔드 Feature(FE-ONLY 또는 FULLSTACK의 FE 부분)는 반드시 Playwright MCP 도구 호출로 검증**한다. 예외 없음.
|
|
56
|
+
|
|
57
|
+
- 필수 호출 도구 (최소 1회 이상): `mcp__playwright__browser_navigate`, `mcp__playwright__browser_snapshot` 또는 `mcp__playwright__browser_take_screenshot`, 그리고 AC 검증을 위한 interaction (`browser_click`, `browser_type`, `browser_fill_form`, `browser_evaluate` 등).
|
|
58
|
+
- **금지**: 소스 코드 열람, grep, 정적 분석만으로 FE Feature를 PASS 처리하는 것.
|
|
59
|
+
- **금지**: "dev 서버 기동 실패"로 Playwright 단계를 스킵하는 것. 서버 기동까지 Evaluator의 책임.
|
|
60
|
+
- `evaluation-functional.md`에 호출한 **playwright 도구 이름 + 결과 요약**을 AC별로 기술. 도구 호출 증거 없으면 해당 AC는 자동 0점(Evidence 없는 Score = 0점 강제 규칙).
|
|
61
|
+
- BE-ONLY Feature는 이 규칙 대상 아님 (CLI 기반 API 테스트 유지).
|
|
62
|
+
|
|
53
63
|
## Startup
|
|
54
64
|
|
|
55
65
|
1. `AGENTS.md` 읽기 — IA-MAP
|
|
@@ -43,6 +43,16 @@ disable-model-invocation: true
|
|
|
43
43
|
5. **STOP.**
|
|
44
44
|
6. 출력: `"✖ Evaluator-Visual FAIL. bash scripts/harness-next.sh 실행하여 재작업 대상 확인."`
|
|
45
45
|
|
|
46
|
+
## FE Playwright Mandatory Rule (v5.4)
|
|
47
|
+
|
|
48
|
+
**웹 렌더링 가능한 FE Feature에 대해서는 Playwright MCP 사용이 강제**된다 (`validation.visual.enabled == true` 또는 전통 웹 스택).
|
|
49
|
+
|
|
50
|
+
- 필수 호출: `mcp__playwright__browser_navigate` + `mcp__playwright__browser_take_screenshot` (AC당 최소 1장) + 레이아웃/반응형 검증을 위한 `browser_resize`.
|
|
51
|
+
- 접근성: `browser_snapshot`으로 accessibility tree 확보 후 axe-core 평가 연결.
|
|
52
|
+
- **금지**: 스크린샷/스냅샷 없이 "코드만 봐서 OK" 처리.
|
|
53
|
+
- `evaluation-visual.md`에 사용한 playwright 도구 이름과 뷰포트/URL을 명시. 도구 호출 증거 없으면 해당 기준 자동 0점.
|
|
54
|
+
- `validation.visual.enabled == false`인 네이티브 스택은 Visual Skip Flow 적용 (예외).
|
|
55
|
+
|
|
46
56
|
## Startup
|
|
47
57
|
|
|
48
58
|
1. `AGENTS.md` 읽기
|
package/skills/planner/SKILL.md
CHANGED
|
@@ -78,6 +78,35 @@ disable-model-invocation: true
|
|
|
78
78
|
- 각 기능에 `layer`, `service`, `depends_on` 명시
|
|
79
79
|
- API 계약의 스키마는 Pydantic/class-validator로 직접 변환 가능한 수준
|
|
80
80
|
|
|
81
|
+
## FE Feature AC 작성 규칙 (v5.4) — Playwright 강제
|
|
82
|
+
|
|
83
|
+
`layer`가 `"fe"` 또는 `"frontend"`인 Feature(또는 FULLSTACK의 FE 부분)에 대해서는 `acceptance_criteria`의 Executable AC가 **반드시 Playwright MCP로 검증 가능한 형태**로 작성되어야 한다.
|
|
84
|
+
|
|
85
|
+
각 AC 항목에 다음 필드를 명시:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"id": "AC-3",
|
|
90
|
+
"description": "로그인 성공 시 /dashboard로 리다이렉트",
|
|
91
|
+
"type": "e2e",
|
|
92
|
+
"verify": {
|
|
93
|
+
"tool": "playwright",
|
|
94
|
+
"steps": [
|
|
95
|
+
"browser_navigate: http://localhost:3000/login",
|
|
96
|
+
"browser_fill_form: email/password",
|
|
97
|
+
"browser_click: submit",
|
|
98
|
+
"browser_snapshot: 현재 URL=/dashboard 확인"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- `type`: `"visual" | "e2e" | "a11y"` (웹 렌더링 없는 네이티브는 `"manual"` 가능, 다만 pipeline.json의 visual.enabled=false일 때만).
|
|
105
|
+
- `verify.tool`: 웹/Flutter Web/React Native Web은 반드시 `"playwright"`. 네이티브 모바일/데스크톱은 예외 허용.
|
|
106
|
+
- `verify.steps`: Evaluator가 호출할 playwright MCP 도구(`browser_navigate`, `browser_click`, `browser_type`, `browser_snapshot`, `browser_take_screenshot` 등) 이름 + 인자 요약을 순서대로 기술.
|
|
107
|
+
|
|
108
|
+
**금지**: FE AC를 "컴포넌트가 존재한다", "코드가 작성되어 있다" 같이 코드 검증만으로 충족되는 표현으로 쓰는 것. AC는 **사용자 경험을 실제 브라우저에서 조작**해야 검증 가능해야 한다.
|
|
109
|
+
|
|
81
110
|
## Team 병렬 스케줄링 규칙 (필수)
|
|
82
111
|
|
|
83
112
|
Team Mode는 **최대 3팀이 동시 작업**한다. Planner는 feature-list.json 설계 시 다음 규칙을 반드시 준수한다.
|