@walwal-harness/cli 4.0.0-alpha.19 → 4.0.0-alpha.20
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/package.json +1 -1
- package/scripts/harness-studio-v4.sh +46 -98
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@walwal-harness/cli",
|
|
3
|
-
"version": "4.0.0-alpha.
|
|
3
|
+
"version": "4.0.0-alpha.20",
|
|
4
4
|
"description": "Production harness for AI agent engineering — Planner, Generator(BE/FE), Evaluator(Func/Visual), optional Brainstormer (requirements refinement). Supports React and Flutter FE stacks.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"walwal-harness": "bin/init.js"
|
|
@@ -32,136 +32,84 @@ if [ -z "$PROJECT_ROOT" ] || [ ! -d "$PROJECT_ROOT/.harness" ]; then
|
|
|
32
32
|
echo "Error: .harness/ not found."; exit 1
|
|
33
33
|
fi
|
|
34
34
|
|
|
35
|
+
PROJECT_ROOT="$(cd "$PROJECT_ROOT" && pwd)"
|
|
35
36
|
echo "Project: $PROJECT_ROOT"
|
|
36
|
-
echo "Session: $SESSION_NAME"
|
|
37
37
|
|
|
38
38
|
tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
|
|
39
|
-
sleep
|
|
39
|
+
sleep 1
|
|
40
|
+
# Ensure no leftover session
|
|
41
|
+
tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
|
|
40
42
|
|
|
41
|
-
# ──
|
|
43
|
+
# ── Queue ──
|
|
42
44
|
QUEUE="$PROJECT_ROOT/.harness/actions/feature-queue.json"
|
|
43
45
|
if [ ! -f "$QUEUE" ]; then
|
|
44
|
-
echo "Initializing feature queue..."
|
|
45
46
|
bash "$SCRIPT_DIR/harness-queue-manager.sh" init "$PROJECT_ROOT"
|
|
46
47
|
else
|
|
47
|
-
echo "Recovering stale queue state..."
|
|
48
48
|
bash "$SCRIPT_DIR/harness-queue-manager.sh" recover "$PROJECT_ROOT"
|
|
49
49
|
fi
|
|
50
50
|
|
|
51
51
|
# ══════════════════════════════════════════
|
|
52
|
-
#
|
|
53
|
-
#
|
|
52
|
+
# Layout: use PANE IDs (not indices!) to avoid renumbering issues
|
|
53
|
+
#
|
|
54
|
+
# 1. MAIN
|
|
55
|
+
# 2. split-h MAIN → MAIN | RIGHT (RIGHT = pane ID captured)
|
|
56
|
+
# 3. split-h RIGHT → MID | RIGHT (use -P to capture MID ID, RIGHT stays)
|
|
57
|
+
# 4. split-v RIGHT → T1 | T2_AREA (RIGHT becomes T1, T2_AREA captured)
|
|
58
|
+
# 5. split-v T2_AREA → T2 | T3 (T2_AREA becomes T2, T3 captured)
|
|
59
|
+
# 6. split-v MID → PROGRESS | PROMPTS (MID becomes PROGRESS, PROMPTS captured)
|
|
54
60
|
# ══════════════════════════════════════════
|
|
55
61
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
# 1. Main (left, 34%)
|
|
59
|
-
PANE_MAIN=$(tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 220 -y 55 \
|
|
62
|
+
# 1. MAIN
|
|
63
|
+
P_MAIN=$(tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 220 -y 55 \
|
|
60
64
|
-P -F '#{pane_id}')
|
|
61
65
|
|
|
62
|
-
# 2.
|
|
63
|
-
|
|
64
|
-
-P -F '#{pane_id}'
|
|
65
|
-
"bash '${SCRIPT_DIR}/harness-team-worker.sh' 1 '${PROJECT_ROOT}'")
|
|
66
|
-
|
|
67
|
-
# 3. Middle column — split from Right (50/50)
|
|
68
|
-
PANE_MID=$(tmux split-window -h -p 50 -t "$PANE_RIGHT" -c "$PROJECT_ROOT" \
|
|
69
|
-
-P -F '#{pane_id}' \
|
|
70
|
-
"bash '${SCRIPT_DIR}/harness-team-worker.sh' 2 '${PROJECT_ROOT}'")
|
|
71
|
-
|
|
72
|
-
# Now layout: [Main 34%] [Right 33%] [Mid 33%]
|
|
73
|
-
# Right = Team 1, Mid = Team 2
|
|
74
|
-
# But we need: [Main] [Dashboard area] [Teams area]
|
|
75
|
-
# Swap: Right should be dashboard, Mid should stay as teams
|
|
76
|
-
# Actually after split: PANE_RIGHT stays left (=Team1), PANE_MID is new right (=Team2)
|
|
77
|
-
# We need to rethink...
|
|
78
|
-
|
|
79
|
-
# Let me use a cleaner approach: create all columns first with placeholder shells
|
|
80
|
-
|
|
81
|
-
tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
|
|
82
|
-
sleep 0.3
|
|
83
|
-
|
|
84
|
-
# === Clean rebuild ===
|
|
85
|
-
|
|
86
|
-
# Pane 0: Main
|
|
87
|
-
tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 220 -y 55
|
|
88
|
-
|
|
89
|
-
# Split: [Main 34% | Rest 66%]
|
|
90
|
-
tmux split-window -h -p 66 -t "${SESSION_NAME}:0.0" -c "$PROJECT_ROOT"
|
|
91
|
-
|
|
92
|
-
# Split Rest: [Main 34% | Mid 50% | Right 50%] (of the 66%)
|
|
93
|
-
tmux split-window -h -p 50 -t "${SESSION_NAME}:0.1" -c "$PROJECT_ROOT"
|
|
94
|
-
|
|
95
|
-
# Now: pane 0 = Main (left), pane 1 = Mid, pane 2 = Right
|
|
96
|
-
# Split Mid vertically: Progress (60%) / Prompts (40%)
|
|
97
|
-
tmux split-window -v -p 40 -t "${SESSION_NAME}:0.1" -c "$PROJECT_ROOT"
|
|
98
|
-
|
|
99
|
-
# Now: pane 0=Main, pane 1=Mid-top(Progress), pane 2=Right, pane 3=Mid-bottom(Prompts)
|
|
100
|
-
# Split Right into 3 Teams
|
|
101
|
-
tmux split-window -v -p 66 -t "${SESSION_NAME}:0.2" -c "$PROJECT_ROOT"
|
|
102
|
-
tmux split-window -v -p 50 -t "${SESSION_NAME}:0.3" -c "$PROJECT_ROOT"
|
|
66
|
+
# 2. RIGHT column (66% of total)
|
|
67
|
+
P_RIGHT=$(tmux split-window -h -p 66 -t "$P_MAIN" -c "$PROJECT_ROOT" \
|
|
68
|
+
-P -F '#{pane_id}')
|
|
103
69
|
|
|
104
|
-
#
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
#
|
|
108
|
-
# pane 3 = Prompts (mid-bottom)
|
|
109
|
-
# pane 4 = Team area mid (split from pane 2's bottom sibling? — tmux numbering is tricky)
|
|
70
|
+
# 3. MID column — split RIGHT, new pane goes LEFT of RIGHT (using -b flag)
|
|
71
|
+
P_MID=$(tmux split-window -hb -p 50 -t "$P_RIGHT" -c "$PROJECT_ROOT" \
|
|
72
|
+
-P -F '#{pane_id}')
|
|
73
|
+
# P_MID = left half (mid column), P_RIGHT = right half (teams column)
|
|
110
74
|
|
|
111
|
-
#
|
|
112
|
-
|
|
113
|
-
|
|
75
|
+
# 4. T1/T2 area — split RIGHT vertically (66% goes to new pane below)
|
|
76
|
+
P_T2_AREA=$(tmux split-window -v -p 66 -t "$P_RIGHT" -c "$PROJECT_ROOT" \
|
|
77
|
+
-P -F '#{pane_id}')
|
|
78
|
+
P_T1="$P_RIGHT"
|
|
79
|
+
# P_T1 = top 34%, P_T2_AREA = bottom 66%
|
|
114
80
|
|
|
115
|
-
#
|
|
116
|
-
|
|
81
|
+
# 5. T2/T3 — split T2_AREA (50/50)
|
|
82
|
+
P_T3=$(tmux split-window -v -p 50 -t "$P_T2_AREA" -c "$PROJECT_ROOT" \
|
|
83
|
+
-P -F '#{pane_id}')
|
|
84
|
+
P_T2="$P_T2_AREA"
|
|
117
85
|
|
|
118
|
-
#
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
# [5] Team-bottom
|
|
86
|
+
# 6. Progress/Prompts — split MID vertically
|
|
87
|
+
P_PROMPTS=$(tmux split-window -v -p 40 -t "$P_MID" -c "$PROJECT_ROOT" \
|
|
88
|
+
-P -F '#{pane_id}')
|
|
89
|
+
P_PROGRESS="$P_MID"
|
|
123
90
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
91
|
+
# ── Commands (using pane IDs — stable regardless of index renumbering) ──
|
|
92
|
+
tmux send-keys -t "$P_MAIN" "unset npm_config_prefix 2>/dev/null; clear && claude --dangerously-skip-permissions" Enter
|
|
93
|
+
tmux send-keys -t "$P_PROGRESS" "exec bash '${SCRIPT_DIR}/harness-dashboard-v4.sh' '${PROJECT_ROOT}'" Enter
|
|
94
|
+
tmux send-keys -t "$P_PROMPTS" "exec bash '${SCRIPT_DIR}/harness-prompts-v4.sh' '${PROJECT_ROOT}'" Enter
|
|
95
|
+
tmux send-keys -t "$P_T1" "exec bash '${SCRIPT_DIR}/harness-team-worker.sh' 1 '${PROJECT_ROOT}'" Enter
|
|
96
|
+
tmux send-keys -t "$P_T2" "exec bash '${SCRIPT_DIR}/harness-team-worker.sh' 2 '${PROJECT_ROOT}'" Enter
|
|
97
|
+
tmux send-keys -t "$P_T3" "exec bash '${SCRIPT_DIR}/harness-team-worker.sh' 3 '${PROJECT_ROOT}'" Enter
|
|
130
98
|
|
|
131
|
-
|
|
132
|
-
P_PROGRESS="${PANES[1]}"
|
|
133
|
-
P_TEAM1="${PANES[2]}"
|
|
134
|
-
P_PROMPTS="${PANES[3]}"
|
|
135
|
-
P_TEAM2="${PANES[4]}"
|
|
136
|
-
P_TEAM3="${PANES[5]}"
|
|
137
|
-
|
|
138
|
-
# Send commands to each pane
|
|
139
|
-
tmux send-keys -t "$P_MAIN" "unset npm_config_prefix 2>/dev/null; clear && claude --dangerously-skip-permissions" Enter
|
|
140
|
-
tmux send-keys -t "$P_PROGRESS" "bash '${SCRIPT_DIR}/harness-dashboard-v4.sh' '${PROJECT_ROOT}'" Enter
|
|
141
|
-
tmux send-keys -t "$P_PROMPTS" "bash '${SCRIPT_DIR}/harness-prompts-v4.sh' '${PROJECT_ROOT}'" Enter
|
|
142
|
-
tmux send-keys -t "$P_TEAM1" "bash '${SCRIPT_DIR}/harness-team-worker.sh' 1 '${PROJECT_ROOT}'" Enter
|
|
143
|
-
tmux send-keys -t "$P_TEAM2" "bash '${SCRIPT_DIR}/harness-team-worker.sh' 2 '${PROJECT_ROOT}'" Enter
|
|
144
|
-
tmux send-keys -t "$P_TEAM3" "bash '${SCRIPT_DIR}/harness-team-worker.sh' 3 '${PROJECT_ROOT}'" Enter
|
|
145
|
-
|
|
146
|
-
# Titles
|
|
99
|
+
# ── Titles ──
|
|
147
100
|
tmux select-pane -t "$P_MAIN" -T "Main"
|
|
148
101
|
tmux select-pane -t "$P_PROGRESS" -T "Progress"
|
|
149
102
|
tmux select-pane -t "$P_PROMPTS" -T "Prompts"
|
|
150
|
-
tmux select-pane -t "$
|
|
151
|
-
tmux select-pane -t "$
|
|
152
|
-
tmux select-pane -t "$
|
|
103
|
+
tmux select-pane -t "$P_T1" -T "Team 1"
|
|
104
|
+
tmux select-pane -t "$P_T2" -T "Team 2"
|
|
105
|
+
tmux select-pane -t "$P_T3" -T "Team 3"
|
|
153
106
|
|
|
154
107
|
tmux set-option -t "$SESSION_NAME" pane-border-status top 2>/dev/null || true
|
|
155
108
|
tmux set-option -t "$SESSION_NAME" pane-border-format " #{pane_title} " 2>/dev/null || true
|
|
156
|
-
|
|
157
|
-
# Focus Main
|
|
158
109
|
tmux select-pane -t "$P_MAIN"
|
|
159
110
|
|
|
160
|
-
# Attach
|
|
161
111
|
if [ -n "${TMUX:-}" ]; then
|
|
162
112
|
tmux switch-client -t "$SESSION_NAME"
|
|
163
113
|
else
|
|
164
|
-
echo ""
|
|
165
|
-
echo "Launching Harness Studio v4..."
|
|
166
114
|
tmux attach -t "$SESSION_NAME"
|
|
167
115
|
fi
|