@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@walwal-harness/cli",
3
- "version": "4.0.0-alpha.19",
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 0.5
39
+ sleep 1
40
+ # Ensure no leftover session
41
+ tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
40
42
 
41
- # ── Init/recover queue ──
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
- # Build layout all panes use direct command execution
53
- # Panes that exit will show "Pane is dead" instead of closing
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
- tmux set-option -g remain-on-exit on 2>/dev/null || true
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. Right area (66%) will become Teams
63
- PANE_RIGHT=$(tmux split-window -h -p 66 -t "$PANE_MAIN" -c "$PROJECT_ROOT" \
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
- # Now 6 panes. Let's identify them by listing:
105
- # pane 0 = Main (left)
106
- # pane 1 = Progress (mid-top)
107
- # pane 2 = Team area top
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
- # Instead of guessing pane numbers, send commands to each pane by index after creation
112
- # First set remain-on-exit for this session
113
- tmux set-option -t "$SESSION_NAME" remain-on-exit on 2>/dev/null || true
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
- # Get all pane IDs in order
116
- PANES=($(tmux list-panes -t "$SESSION_NAME" -F '#{pane_id}'))
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
- # Should be 6 panes. Assign by position:
119
- # Visual order (left-to-right, top-to-bottom):
120
- # [0] Main [1] Progress [2] Team-top
121
- # [3] Prompts [4] Team-mid
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
- if [ ${#PANES[@]} -ne 6 ]; then
125
- echo "ERROR: Expected 6 panes, got ${#PANES[@]}"
126
- echo "Panes: ${PANES[*]}"
127
- tmux attach -t "$SESSION_NAME"
128
- exit 1
129
- fi
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
- P_MAIN="${PANES[0]}"
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 "$P_TEAM1" -T "Team 1"
151
- tmux select-pane -t "$P_TEAM2" -T "Team 2"
152
- tmux select-pane -t "$P_TEAM3" -T "Team 3"
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