@walwal-harness/cli 4.0.0-alpha.2 → 4.0.0-alpha.4
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 +32 -28
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.4",
|
|
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"
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# harness-studio-v4.sh — Harness Studio v4:
|
|
2
|
+
# harness-studio-v4.sh — Harness Studio v4: 3-Column Layout
|
|
3
3
|
#
|
|
4
|
-
#
|
|
5
|
-
# │
|
|
6
|
-
# │
|
|
7
|
-
# │
|
|
8
|
-
#
|
|
9
|
-
# │
|
|
10
|
-
#
|
|
11
|
-
#
|
|
4
|
+
# ┌──────────────┬──────────────┬──────────────┐
|
|
5
|
+
# │ │ │ Team 1 │
|
|
6
|
+
# │ │ ├──────────────┤
|
|
7
|
+
# │ Main │ Dashboard │ Team 2 │
|
|
8
|
+
# │ (Claude) │ (read-only) ├──────────────┤
|
|
9
|
+
# │ │ │ Team 3 │
|
|
10
|
+
# └──────────────┴──────────────┴──────────────┘
|
|
11
|
+
#
|
|
12
|
+
# Main: 사용자가 직접 Claude Code를 실행하는 대화형 세션
|
|
13
|
+
# Dashboard: feature-queue + team status 자동 갱신 (입력 불가)
|
|
14
|
+
# Team 1~3: claude -p headless worker (입력 불가, 로그만 표시)
|
|
12
15
|
#
|
|
13
16
|
# Usage:
|
|
14
17
|
# bash scripts/harness-studio-v4.sh [project-root]
|
|
@@ -20,7 +23,6 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
|
20
23
|
SESSION_NAME="harness-v4"
|
|
21
24
|
|
|
22
25
|
PROJECT_ROOT=""
|
|
23
|
-
KILL=false
|
|
24
26
|
|
|
25
27
|
for arg in "$@"; do
|
|
26
28
|
case "$arg" in
|
|
@@ -60,37 +62,39 @@ if [ ! -f "$QUEUE" ]; then
|
|
|
60
62
|
fi
|
|
61
63
|
|
|
62
64
|
# ══════════════════════════════════════════
|
|
63
|
-
#
|
|
65
|
+
# 3-Column Layout (Main | Dashboard | Teams)
|
|
64
66
|
# ══════════════════════════════════════════
|
|
65
67
|
|
|
66
|
-
# 1
|
|
67
|
-
|
|
68
|
+
# Column 1: Main (interactive shell — user runs claude here)
|
|
69
|
+
PANE_MAIN=$(tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 220 -y 55 \
|
|
70
|
+
-P -F '#{pane_id}')
|
|
71
|
+
|
|
72
|
+
# Column 2: Dashboard (split right from Main, 66% remaining → 33% each of 3 cols)
|
|
73
|
+
PANE_DASH=$(tmux split-window -h -p 66 -t "$PANE_MAIN" -c "$PROJECT_ROOT" \
|
|
68
74
|
-P -F '#{pane_id}' \
|
|
69
75
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-dashboard-v4.sh\" \"${PROJECT_ROOT}\"'")
|
|
70
76
|
|
|
71
|
-
#
|
|
77
|
+
# Column 3: Team 1 (split right from Dashboard, 50% of remaining = 33% total)
|
|
72
78
|
PANE_T1=$(tmux split-window -h -p 50 -t "$PANE_DASH" -c "$PROJECT_ROOT" \
|
|
73
79
|
-P -F '#{pane_id}' \
|
|
74
80
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-team-worker.sh\" 1 \"${PROJECT_ROOT}\"'")
|
|
75
81
|
|
|
76
|
-
#
|
|
77
|
-
PANE_CTRL=$(tmux split-window -v -p 25 -t "$PANE_DASH" -c "$PROJECT_ROOT" \
|
|
78
|
-
-P -F '#{pane_id}' \
|
|
79
|
-
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-control-v4.sh\" \"${PROJECT_ROOT}\"'")
|
|
80
|
-
|
|
81
|
-
# 4. Team 2 (middle-right, split from Team 1)
|
|
82
|
+
# Team 2 (split below Team 1)
|
|
82
83
|
PANE_T2=$(tmux split-window -v -p 66 -t "$PANE_T1" -c "$PROJECT_ROOT" \
|
|
83
84
|
-P -F '#{pane_id}' \
|
|
84
85
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-team-worker.sh\" 2 \"${PROJECT_ROOT}\"'")
|
|
85
86
|
|
|
86
|
-
#
|
|
87
|
+
# Team 3 (split below Team 2)
|
|
87
88
|
PANE_T3=$(tmux split-window -v -p 50 -t "$PANE_T2" -c "$PROJECT_ROOT" \
|
|
88
89
|
-P -F '#{pane_id}' \
|
|
89
90
|
"bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-team-worker.sh\" 3 \"${PROJECT_ROOT}\"'")
|
|
90
91
|
|
|
92
|
+
# ── Launch Claude in Main pane ──
|
|
93
|
+
tmux send-keys -t "$PANE_MAIN" "unset npm_config_prefix 2>/dev/null; clear && claude --dangerously-skip-permissions" Enter
|
|
94
|
+
|
|
91
95
|
# ── Pane titles ──
|
|
96
|
+
tmux select-pane -t "$PANE_MAIN" -T "Main"
|
|
92
97
|
tmux select-pane -t "$PANE_DASH" -T "Dashboard"
|
|
93
|
-
tmux select-pane -t "$PANE_CTRL" -T "Control"
|
|
94
98
|
tmux select-pane -t "$PANE_T1" -T "Team 1"
|
|
95
99
|
tmux select-pane -t "$PANE_T2" -T "Team 2"
|
|
96
100
|
tmux select-pane -t "$PANE_T3" -T "Team 3"
|
|
@@ -98,18 +102,18 @@ tmux select-pane -t "$PANE_T3" -T "Team 3"
|
|
|
98
102
|
tmux set-option -t "$SESSION_NAME" pane-border-status top 2>/dev/null || true
|
|
99
103
|
tmux set-option -t "$SESSION_NAME" pane-border-format " #{pane_title} " 2>/dev/null || true
|
|
100
104
|
|
|
101
|
-
# Focus
|
|
102
|
-
tmux select-pane -t "$
|
|
105
|
+
# ── Focus Main pane ──
|
|
106
|
+
tmux select-pane -t "$PANE_MAIN"
|
|
103
107
|
|
|
104
|
-
# Attach
|
|
108
|
+
# ── Attach ──
|
|
105
109
|
if [ -n "${TMUX:-}" ]; then
|
|
106
110
|
tmux switch-client -t "$SESSION_NAME"
|
|
107
111
|
else
|
|
108
112
|
echo ""
|
|
109
113
|
echo "Launching Harness Studio v4..."
|
|
110
|
-
echo "
|
|
111
|
-
echo "
|
|
112
|
-
echo " Team 1-3 (right)
|
|
114
|
+
echo " Main (left) : Interactive — run 'claude' here"
|
|
115
|
+
echo " Dashboard (mid) : Feature Queue + Team status (auto-refresh)"
|
|
116
|
+
echo " Team 1-3 (right) : Parallel workers (headless, log only)"
|
|
113
117
|
echo ""
|
|
114
118
|
tmux attach -t "$SESSION_NAME"
|
|
115
119
|
fi
|