@walwal-harness/cli 3.7.2 → 3.7.3

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": "3.7.2",
3
+ "version": "3.7.3",
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,22 +1,21 @@
1
1
  #!/bin/bash
2
- # harness-tmux.sh — Harness Studio tmux 4-pane 레이아웃
2
+ # harness-tmux.sh — Harness Studio tmux 5-pane 레이아웃
3
3
  #
4
- # ┌───────────────────────────┬─────────────────────────┐
5
- # │ │ Monitor (compact) │
6
- # │ Main: Control Center ├─────────────────────────┤
7
- # │ (Dashboard + Manual │ Agent Session │
8
- # │ Prompt + Orchestration) │ (claude --skip-perms) │
9
- # │ ├─────────────────────────┤
10
- # │ │ Eval Review │
11
- # │ │ (eval 결과 요약) │
12
- # └───────────────────────────┴─────────────────────────┘
4
+ # ┌─────────────────────────┬────────────────────────┐
5
+ # │ Dashboard (auto-refresh)│ Monitor (compact) │
6
+ # │ ├────────────────────────┤
7
+ # │ │ Agent Session (claude) │
8
+ # ├─────────────────────────┤ │
9
+ # │ Control (harness> _) ├────────────────────────┤
10
+ # │ │ Eval Review │
11
+ # └─────────────────────────┴────────────────────────┘
13
12
  #
14
13
  # Usage:
15
14
  # bash scripts/harness-tmux.sh [project-root]
16
15
  # bash scripts/harness-tmux.sh /path/to/project --ai
17
16
  #
18
17
  # Options:
19
- # --ai Eval Review에서 claude -p 로 AI 요약 생성
18
+ # --ai Eval Review에서 claude -p AI 요약
20
19
  # --detach 세션 생성 후 attach 하지 않음
21
20
  # --kill 기존 harness-studio 세션 종료
22
21
 
@@ -34,7 +33,7 @@ for arg in "$@"; do
34
33
  --ai) USE_AI="--ai" ;;
35
34
  --detach) DETACH=true ;;
36
35
  --kill)
37
- tmux kill-session -t "$SESSION_NAME" 2>/dev/null && echo "Session '$SESSION_NAME' killed." || echo "No session to kill."
36
+ tmux kill-session -t "$SESSION_NAME" 2>/dev/null && echo "Killed." || echo "No session."
38
37
  exit 0
39
38
  ;;
40
39
  *)
@@ -43,7 +42,6 @@ for arg in "$@"; do
43
42
  esac
44
43
  done
45
44
 
46
- # Auto-detect project root
47
45
  if [ -z "$PROJECT_ROOT" ]; then
48
46
  dir="$(pwd)"
49
47
  while [ "$dir" != "/" ]; do
@@ -53,18 +51,16 @@ if [ -z "$PROJECT_ROOT" ]; then
53
51
  fi
54
52
 
55
53
  if [ -z "$PROJECT_ROOT" ] || [ ! -d "$PROJECT_ROOT/.harness" ]; then
56
- echo "Error: .harness/ directory not found."
57
- echo "Usage: bash scripts/harness-tmux.sh [project-root]"
54
+ echo "Error: .harness/ not found."
58
55
  exit 1
59
56
  fi
60
57
 
61
58
  echo "Project: $PROJECT_ROOT"
62
59
  echo "Session: $SESSION_NAME"
63
60
 
64
- # Kill existing session if any
65
61
  tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
66
62
 
67
- # ── Resolve Claude command for Agent Session ──
63
+ # ── Resolve Claude command ──
68
64
  HANDOFF="$PROJECT_ROOT/.harness/handoff.json"
69
65
  CLAUDE_CMD="claude --dangerously-skip-permissions"
70
66
  if [ -f "$HANDOFF" ]; then
@@ -75,66 +71,65 @@ if [ -f "$HANDOFF" ]; then
75
71
  fi
76
72
 
77
73
  # ══════════════════════════════════════════
78
- # Layout Construction
79
- # ══════════════════════════════════════════
80
- # ══════════════════════════════════════════
81
- # Pane layout:
82
- # 0 = Dashboard (top-left, auto-refresh)
83
- # 1 = Monitor (top-right, compact)
84
- # 2 = Agent Session (mid-right, claude)
85
- # 3 = Eval Review (bottom-right)
86
- # 4 = Control Prompt (bottom-left, interactive)
74
+ # Build layout using explicit pane IDs
87
75
  # ══════════════════════════════════════════
88
76
 
89
- # Step 1: Create session → Pane 0 = Dashboard (top-left)
90
- tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 200 -y 50 \
91
- "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-dashboard.sh\" \"${PROJECT_ROOT}\"'"
77
+ # 1. Create session → capture Dashboard pane ID
78
+ PANE_DASHBOARD=$(tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 200 -y 50 \
79
+ -P -F '#{pane_id}' \
80
+ "bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-dashboard.sh\" \"${PROJECT_ROOT}\"'")
92
81
 
93
- # Step 2: Split right column (45%) → Pane 1 = Monitor (top-right, compact)
94
- tmux split-window -h -p 45 -t "$SESSION_NAME" -c "$PROJECT_ROOT" \
95
- "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-monitor.sh\" \"${PROJECT_ROOT}\"'"
82
+ # 2. Split Dashboard horizontally (55% left / 45% right) → Monitor pane
83
+ PANE_MONITOR=$(tmux split-window -h -p 45 -t "$PANE_DASHBOARD" -c "$PROJECT_ROOT" \
84
+ -P -F '#{pane_id}' \
85
+ "bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-monitor.sh\" \"${PROJECT_ROOT}\"'")
96
86
 
97
- # Step 3: Split Pane 1 vertically (80% below) → Pane 2 = Agent Session
98
- tmux split-window -v -p 80 -t "${SESSION_NAME}.1" -c "$PROJECT_ROOT"
99
- tmux send-keys -t "${SESSION_NAME}.2" "$CLAUDE_CMD" Enter
87
+ # 3. Split Dashboard vertically (75% top / 25% bottom) → Control pane
88
+ PANE_CONTROL=$(tmux split-window -v -p 25 -t "$PANE_DASHBOARD" -c "$PROJECT_ROOT" \
89
+ -P -F '#{pane_id}' \
90
+ "bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-control.sh\" \"${PROJECT_ROOT}\"'")
100
91
 
101
- # Step 4: Split Pane 2 vertically (50%) → Pane 3 = Eval Review
102
- tmux split-window -v -p 50 -t "${SESSION_NAME}.2" -c "$PROJECT_ROOT" \
103
- "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-eval-watcher.sh\" \"${PROJECT_ROOT}\" ${USE_AI}'"
92
+ # 4. Split Monitor vertically (15% top / 85% bottom) → Agent Session pane
93
+ PANE_AGENT=$(tmux split-window -v -p 85 -t "$PANE_MONITOR" -c "$PROJECT_ROOT" \
94
+ -P -F '#{pane_id}')
104
95
 
105
- # Step 5: Split Dashboard (Pane 0) vertically → Pane 4 = Control Prompt (bottom-left)
106
- # Dashboard gets ~75% height, Control Prompt gets ~25%
107
- tmux split-window -v -p 25 -t "${SESSION_NAME}.0" -c "$PROJECT_ROOT"
108
- tmux send-keys -t "${SESSION_NAME}.4" "bash ${SCRIPT_DIR}/harness-control.sh '${PROJECT_ROOT}'" Enter
96
+ # 5. Split Agent Session vertically (55% top / 45% bottom) → Eval Review pane
97
+ PANE_EVAL=$(tmux split-window -v -p 45 -t "$PANE_AGENT" -c "$PROJECT_ROOT" \
98
+ -P -F '#{pane_id}' \
99
+ "bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-eval-watcher.sh\" \"${PROJECT_ROOT}\" ${USE_AI}'")
109
100
 
110
- # ── Select Control Prompt as active (where user types) ──
111
- tmux select-pane -t "${SESSION_NAME}.4"
101
+ # 6. Launch Claude in Agent Session (needs interactive shell, so use send-keys)
102
+ # Prefix with unset to avoid nvm warnings
103
+ tmux send-keys -t "$PANE_AGENT" "unset npm_config_prefix 2>/dev/null; $CLAUDE_CMD" Enter
112
104
 
113
105
  # ── Pane titles ──
114
- tmux select-pane -t "${SESSION_NAME}.0" -T "Dashboard"
115
- tmux select-pane -t "${SESSION_NAME}.1" -T "Monitor"
116
- tmux select-pane -t "${SESSION_NAME}.2" -T "Agent Session"
117
- tmux select-pane -t "${SESSION_NAME}.3" -T "Eval Review"
118
- tmux select-pane -t "${SESSION_NAME}.4" -T "Control"
106
+ tmux select-pane -t "$PANE_DASHBOARD" -T "Dashboard"
107
+ tmux select-pane -t "$PANE_MONITOR" -T "Monitor"
108
+ tmux select-pane -t "$PANE_CONTROL" -T "Control"
109
+ tmux select-pane -t "$PANE_AGENT" -T "Agent Session"
110
+ tmux select-pane -t "$PANE_EVAL" -T "Eval Review"
119
111
 
120
112
  tmux set-option -t "$SESSION_NAME" pane-border-status top 2>/dev/null || true
121
113
  tmux set-option -t "$SESSION_NAME" pane-border-format " #{pane_title} " 2>/dev/null || true
122
114
 
115
+ # ── Focus on Control pane (where user types) ──
116
+ tmux select-pane -t "$PANE_CONTROL"
117
+
123
118
  # ── Attach ──
124
119
  if [ "$DETACH" = true ]; then
125
120
  echo ""
126
- echo "Session created. Attach with:"
127
- echo " tmux attach -t $SESSION_NAME"
121
+ echo "Session created. Attach: tmux attach -t $SESSION_NAME"
128
122
  else
129
123
  if [ -n "${TMUX:-}" ]; then
130
124
  tmux switch-client -t "$SESSION_NAME"
131
125
  else
132
126
  echo ""
133
127
  echo "Launching harness-studio..."
134
- echo " Control Center (left) : Dashboard + manual prompting"
135
- echo " Monitor (right↑) : Agent lifecycle (compact)"
136
- echo " Agent Session (right↔) : claude --dangerously-skip-permissions"
137
- echo " Eval Review (right↓) : Evaluation summaries"
128
+ echo " Dashboard (left↑) : Auto-refresh progress"
129
+ echo " Control (left↓) : Manual commands (next/retry/stop/log)"
130
+ echo " Monitor (right↑) : Agent lifecycle (compact)"
131
+ echo " Agent Session (right↔): claude --dangerously-skip-permissions"
132
+ echo " Eval Review (right↓): Evaluation summaries"
138
133
  echo ""
139
134
  tmux attach -t "$SESSION_NAME"
140
135
  fi