@walwal-harness/cli 4.0.0-beta.1 → 4.0.0-beta.11
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/bin/init.js +97 -49
- package/package.json +4 -2
- package/scripts/harness-dashboard-v4.sh +45 -0
- package/scripts/harness-monitor.sh +202 -67
- package/scripts/harness-prompt-history.sh +126 -0
- package/scripts/harness-studio-setup.sh +143 -0
- package/scripts/harness-studio.sh +66 -0
- package/scripts/harness-tmux-v4.sh +136 -0
- package/scripts/harness-user-prompt-submit.sh +13 -10
- package/skills/team-action/SKILL.md +192 -39
- package/skills/team-stop/SKILL.md +17 -6
|
@@ -1,64 +1,217 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harness-team-action
|
|
3
|
-
description: "v4 Agent Teams 가동.
|
|
3
|
+
description: "v4 Agent Teams 가동. Studio 레이아웃 구축 → Queue 초기화 → Gen↔Eval 분리 사이클 팀 병렬 실행. 트리거: '/harness-team-action', 'team 시작', '팀 가동'"
|
|
4
4
|
disable-model-invocation: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# /harness-team-action — Agent Teams 가동
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Step 0: Studio 레이아웃 자동 구축
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
- `.harness/actions/feature-list.json`이 존재해야 함 (Planner가 생성)
|
|
11
|
+
3-column 대시보드 레이아웃을 자동 구축합니다:
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
```bash
|
|
14
|
+
bash scripts/harness-studio-setup.sh .
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
스크립트 출력을 확인합니다:
|
|
18
|
+
|
|
19
|
+
- **`Layout ready`** → 현재 터미널에 split 완료. 바로 Step 1로.
|
|
20
|
+
- **`ATTACH_TMUX=harness-studio`** → 새 tmux 세션이 생성됨 (tmux 밖에서 실행한 경우).
|
|
21
|
+
사용자에게 아래 안내를 출력하고 **STOP**합니다:
|
|
15
22
|
|
|
16
|
-
|
|
23
|
+
```
|
|
24
|
+
Studio 레이아웃이 준비되었습니다!
|
|
25
|
+
다른 터미널에서 아래 명령을 실행하세요:
|
|
17
26
|
|
|
18
|
-
|
|
27
|
+
tmux attach -t harness-studio
|
|
28
|
+
|
|
29
|
+
새 창에서 Claude가 자동 실행됩니다. 거기서 "팀 가동"을 입력하면 Teams가 시작됩니다.
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- **`already set up`** → 이미 구축됨. 바로 Step 1로.
|
|
33
|
+
|
|
34
|
+
## Step 1: Queue 초기화
|
|
19
35
|
|
|
20
36
|
```bash
|
|
21
|
-
if [ ! -f .harness/actions/feature-queue.json ]; then
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
if [ ! -f .harness/actions/feature-queue.json ]; then bash scripts/harness-queue-manager.sh init .; else bash scripts/harness-queue-manager.sh recover .; fi && bash scripts/harness-queue-manager.sh status .
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Step 2: Feature 할당 (dequeue)
|
|
41
|
+
|
|
42
|
+
Queue status 결과를 확인하여 `ready` 큐에 feature가 있는지 확인합니다.
|
|
43
|
+
ready feature 수와 설정된 concurrency 중 작은 값만큼 팀을 생성합니다 (최대 3).
|
|
44
|
+
|
|
45
|
+
**각 팀마다** dequeue 명령으로 feature를 원자적으로 할당합니다:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
bash scripts/harness-queue-manager.sh dequeue {TEAM_NUMBER} .
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
dequeue 결과로 feature ID가 반환됩니다. 빈 결과면 해당 팀은 생성하지 않습니다.
|
|
52
|
+
|
|
53
|
+
## Step 3: Agent 도구로 팀 생성 (Gen↔Eval 분리 사이클)
|
|
54
|
+
|
|
55
|
+
dequeue로 할당받은 feature마다 **Agent 도구**를 호출합니다.
|
|
56
|
+
**반드시 `isolation: "worktree"`를 사용**하여 각 팀이 독립된 코드 복사본에서 작업합니다.
|
|
57
|
+
|
|
58
|
+
**독립적인 팀들은 단일 메시지에서 병렬로 호출**하세요 (한 번의 응답에 여러 Agent 도구 호출).
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
Agent({
|
|
62
|
+
description: "Team-{N}: {FEATURE_ID}",
|
|
63
|
+
isolation: "worktree",
|
|
64
|
+
prompt: "<아래 Team Worker 프롬프트>"
|
|
65
|
+
})
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Team Worker 프롬프트
|
|
69
|
+
|
|
27
70
|
```
|
|
71
|
+
당신은 Harness Team-{N} 워커입니다. 하나의 Feature에 대해 Gen→Eval 사이클을 수행합니다.
|
|
28
72
|
|
|
29
|
-
|
|
73
|
+
## 할당된 Feature
|
|
74
|
+
- Feature ID: {FEATURE_ID}
|
|
75
|
+
- 프로젝트 루트: 현재 디렉토리 (worktree 복사본)
|
|
76
|
+
- 하네스 루트: 메인 프로젝트 루트 (worktree가 아닌 원본)
|
|
30
77
|
|
|
31
|
-
|
|
78
|
+
## 실시간 로깅 (필수)
|
|
79
|
+
|
|
80
|
+
모든 Phase 전환 시 반드시 아래 두 명령을 실행하세요. Monitor 대시보드에 실시간 반영됩니다.
|
|
81
|
+
|
|
82
|
+
**progress.log 기록** (하네스 루트의 progress.log에 append):
|
|
83
|
+
```bash
|
|
84
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | {ACTION} | {DETAIL}" >> {HARNESS_ROOT}/.harness/progress.log
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**queue phase 업데이트** (feature-queue.json의 팀 상태 갱신):
|
|
88
|
+
```bash
|
|
89
|
+
bash {HARNESS_ROOT}/scripts/harness-queue-manager.sh update_phase {FEATURE_ID} {PHASE} .
|
|
90
|
+
```
|
|
32
91
|
|
|
33
|
-
|
|
34
|
-
|
|
92
|
+
> {HARNESS_ROOT}는 worktree의 원본 프로젝트 경로입니다. `git worktree list` 첫 줄에서 확인 가능합니다.
|
|
93
|
+
> 워커 시작 시 먼저 실행: `HARNESS_ROOT=$(git worktree list | head -1 | awk '{print $1}')`
|
|
35
94
|
|
|
36
|
-
|
|
95
|
+
## Phase 1: Generator (코드 생성)
|
|
37
96
|
|
|
38
|
-
|
|
97
|
+
**시작 시 로깅:**
|
|
98
|
+
```bash
|
|
99
|
+
HARNESS_ROOT=$(git worktree list | head -1 | awk '{print $1}')
|
|
100
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | gen | {FEATURE_ID} start" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
101
|
+
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" update_phase {FEATURE_ID} gen "$HARNESS_ROOT"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
1. Feature 정보 확인:
|
|
105
|
+
- `jq '.features[] | select(.id == "{FEATURE_ID}")' .harness/actions/feature-list.json`
|
|
106
|
+
- `.harness/actions/api-contract.json`에서 관련 엔드포인트 확인
|
|
107
|
+
- AC(Acceptance Criteria) 목록을 정확히 파악
|
|
108
|
+
|
|
109
|
+
2. 코드 생성:
|
|
110
|
+
- AGENTS.md의 IA-MAP에 따라 올바른 디렉토리에 코드 작성
|
|
111
|
+
- AC의 모든 항목을 충족하도록 구현
|
|
112
|
+
|
|
113
|
+
3. Pre-eval 게이트 (자체):
|
|
114
|
+
- tsc (타입 체크) 실행
|
|
115
|
+
- eslint (린트) 실행
|
|
116
|
+
- 컴파일 에러가 있으면 직접 수정 (Eval에 넘기지 않음)
|
|
117
|
+
|
|
118
|
+
**Gen 완료 로깅:**
|
|
119
|
+
```bash
|
|
120
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | gen | {FEATURE_ID} done — {변경파일수} files" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Phase 2: Evaluator (독립 평가 — Agent 도구 사용)
|
|
124
|
+
|
|
125
|
+
**Eval 시작 로깅:**
|
|
126
|
+
```bash
|
|
127
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | eval | {FEATURE_ID} eval start" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
128
|
+
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" update_phase {FEATURE_ID} eval "$HARNESS_ROOT"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
코드 생성이 완료되면 **별도 Agent를 생성하여 평가**합니다.
|
|
132
|
+
이 Evaluator Agent는 당신(Generator)의 추론 과정을 모릅니다.
|
|
133
|
+
오직 코드와 AC만 보고 판단합니다.
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
Agent({
|
|
137
|
+
description: "Eval: {FEATURE_ID}",
|
|
138
|
+
prompt: "<아래 Evaluator 프롬프트>"
|
|
139
|
+
})
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
#### Evaluator 프롬프트
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
당신은 독립 Evaluator입니다. Generator가 작성한 코드를 AC 기준으로 냉정하게 평가합니다.
|
|
146
|
+
Generator의 의도나 추론 과정은 알 수 없습니다. 오직 코드와 결과만 봅니다.
|
|
147
|
+
|
|
148
|
+
## 평가 대상
|
|
149
|
+
- Feature ID: {FEATURE_ID}
|
|
150
|
+
- AC 확인: `jq '.features[] | select(.id == "{FEATURE_ID}").acceptance_criteria' .harness/actions/feature-list.json`
|
|
151
|
+
|
|
152
|
+
## 평가 기준
|
|
153
|
+
1. AC 100% 충족 여부 (부분 통과 = FAIL)
|
|
154
|
+
2. api-contract.json과의 일치 여부 (엔드포인트, 요청/응답 스키마)
|
|
155
|
+
3. tsc, eslint 통과 여부
|
|
156
|
+
4. 보안 취약점 여부 (OWASP Top 10)
|
|
157
|
+
5. 기존 코드와의 regression 여부
|
|
158
|
+
|
|
159
|
+
## 출력 형식
|
|
160
|
+
반드시 아래 형식으로 결과를 반환하세요:
|
|
161
|
+
|
|
162
|
+
VERDICT: PASS 또는 FAIL
|
|
163
|
+
SCORE: X.XX / 3.00
|
|
164
|
+
EVIDENCE:
|
|
165
|
+
- AC-1: [PASS/FAIL] 근거
|
|
166
|
+
- AC-2: [PASS/FAIL] 근거
|
|
167
|
+
- ...
|
|
168
|
+
FEEDBACK: (FAIL인 경우만) 구체적 수정 지시
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Phase 3: 결과 처리
|
|
172
|
+
|
|
173
|
+
Evaluator Agent 결과를 확인합니다:
|
|
174
|
+
|
|
175
|
+
### PASS인 경우 (VERDICT: PASS, SCORE ≥ 2.80):
|
|
176
|
+
```bash
|
|
177
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | pass | {FEATURE_ID} PASS score={SCORE}" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
178
|
+
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" pass {FEATURE_ID} "$HARNESS_ROOT"
|
|
179
|
+
```
|
|
180
|
+
변경 파일 목록과 AC 충족 요약을 Lead에게 반환.
|
|
181
|
+
|
|
182
|
+
### FAIL인 경우:
|
|
183
|
+
```bash
|
|
184
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | fail | {FEATURE_ID} FAIL #{ATTEMPT} — {사유요약}" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
185
|
+
```
|
|
186
|
+
1. Evaluator의 FEEDBACK을 읽고 코드를 수정 (Phase 1로 돌아감)
|
|
187
|
+
2. 수정 후 다시 Phase 2 (새 Evaluator Agent 생성 — 이전 Eval 컨텍스트 없음)
|
|
188
|
+
3. 최대 3회 시도. 3회 모두 FAIL이면:
|
|
189
|
+
```bash
|
|
190
|
+
echo "$(date +'%Y-%m-%d %H:%M') | team-{N} | fail | {FEATURE_ID} FINAL FAIL after 3 attempts" >> "$HARNESS_ROOT/.harness/progress.log"
|
|
191
|
+
bash "$HARNESS_ROOT/scripts/harness-queue-manager.sh" fail {FEATURE_ID} "$HARNESS_ROOT"
|
|
192
|
+
```
|
|
193
|
+
실패 사유와 마지막 Eval 결과를 Lead에게 반환.
|
|
194
|
+
```
|
|
39
195
|
|
|
40
|
-
|
|
41
|
-
- `.harness/actions/feature-queue.json`의 `ready` 배열에서 첫 번째 Feature를 가져옴
|
|
42
|
-
- 해당 Feature에 대해: 코드 생성 → `tsc --noEmit` + `eslint` 검증 → AC 기반 기능 평가
|
|
43
|
-
- PASS 시: `bash scripts/harness-queue-manager.sh pass {FEATURE_ID} .` 실행 후 다음 Feature
|
|
44
|
-
- FAIL 시: 최대 3회 재시도, 3회 실패 시 `bash scripts/harness-queue-manager.sh fail {FEATURE_ID} .`
|
|
45
|
-
- AGENTS.md의 파일 소유권 규칙 준수
|
|
196
|
+
## Step 4: 결과 수집 및 다음 라운드
|
|
46
197
|
|
|
47
|
-
|
|
198
|
+
모든 Team Agent가 완료되면:
|
|
199
|
+
1. 각 Agent 반환 메시지에서 PASS/FAIL 확인
|
|
200
|
+
2. Queue 상태 재확인: `bash scripts/harness-queue-manager.sh status .`
|
|
201
|
+
3. ready 큐에 새로 unblock된 feature가 있으면 → **Step 2로 돌아가서** 추가 팀 생성
|
|
202
|
+
4. ready=0, in_progress=0이면 → 최종 결과 보고
|
|
48
203
|
|
|
49
|
-
|
|
204
|
+
## 핵심 원칙
|
|
50
205
|
|
|
51
|
-
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
- Feature 완료 시 `feature-list.json`의 해당 Feature `passes`에 `["generator-frontend", "evaluator-functional"]` 추가
|
|
56
|
-
- 다른 Teammate의 Feature 코드를 수정하지 않음
|
|
57
|
-
- 완료/실패 시 Lead에게 `SendMessage`로 결과 보고
|
|
206
|
+
### 자기 의식 편향 차단
|
|
207
|
+
- Generator가 자기 코드를 평가하지 않음
|
|
208
|
+
- Evaluator는 항상 새 Agent (Generator의 추론 과정을 모름)
|
|
209
|
+
- FAIL 후 재시도 시에도 새 Evaluator를 생성 (이전 Eval 기억 없음)
|
|
58
210
|
|
|
59
|
-
|
|
211
|
+
### 중복 방지
|
|
212
|
+
- dequeue는 원자적 (lock 사용) — 같은 feature를 두 번 할당 불가
|
|
213
|
+
- ready가 0이면 팀을 생성하지 않음
|
|
60
214
|
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
- 중지: `/harness-team-stop`
|
|
215
|
+
### 격리
|
|
216
|
+
- 각 팀은 `isolation: "worktree"`로 독립 코드 복사본에서 작업
|
|
217
|
+
- 팀 간 코드 충돌 없음
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: harness-team-stop
|
|
3
|
-
description: "v4 Agent Teams
|
|
3
|
+
description: "v4 Agent Teams 중지 + Studio 정리. 실행 중인 Teammate 해산, tmux 세션 종료. 트리거: '/harness-team-stop', 'team 중지', 'agent team 멈춰', '팀 멈춰', '팀 중지'"
|
|
4
4
|
disable-model-invocation: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# /harness-team-stop — Agent Teams 중지
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Step 1: Queue 상태 저장
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
현재 in_progress feature를 ready로 복구합니다 (재시작 시 이어서 가능):
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
```bash
|
|
14
|
+
bash scripts/harness-queue-manager.sh recover .
|
|
15
|
+
bash scripts/harness-queue-manager.sh status .
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Step 2: tmux Studio 세션 정리
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
tmux kill-session -t harness-studio 2>/dev/null && echo "Studio session killed." || echo "No studio session."
|
|
22
|
+
```
|
|
14
23
|
|
|
15
|
-
##
|
|
24
|
+
## Step 3: 완료 안내
|
|
16
25
|
|
|
17
26
|
```
|
|
18
|
-
|
|
27
|
+
Teams 중지 완료.
|
|
28
|
+
- Queue 상태 보존됨 (in_progress → ready로 복구)
|
|
29
|
+
- 재시작: /harness-team-action
|
|
19
30
|
```
|