@walwal-harness/cli 3.6.4 → 3.6.5

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.6.4",
3
+ "version": "3.6.5",
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"
@@ -231,6 +231,11 @@ render_build_status() {
231
231
  echo ""
232
232
  }
233
233
 
234
+ # Strip all ANSI escape sequences from a string
235
+ strip_ansi() {
236
+ sed 's/\x1b\[[0-9;]*m//g; s/\x1b\[[0-9;]*[a-zA-Z]//g'
237
+ }
238
+
234
239
  render_failure_info() {
235
240
  if [ ! -f "$PROGRESS" ]; then return; fi
236
241
 
@@ -240,18 +245,17 @@ render_failure_info() {
240
245
  if [ -n "$failure_agent" ] && [ "$failure_agent" != "null" ]; then
241
246
  local failure_loc failure_msg
242
247
  failure_loc=$(jq -r '.failure.location // ""' "$PROGRESS")
243
- failure_msg=$(jq -r '.failure.message // ""' "$PROGRESS")
248
+ # Get raw message, strip ANSI codes, take first meaningful line
249
+ failure_msg=$(jq -r '.failure.message // ""' "$PROGRESS" | strip_ansi | tr '\n' ' ' | sed 's/ */ /g')
244
250
 
245
- # Truncate long failure messages (take first 3 lines)
246
- local short_msg
247
- short_msg=$(echo "$failure_msg" | head -3 | tr '\n' ' ')
248
- if [ ${#short_msg} -gt 80 ]; then
249
- short_msg="${short_msg:0:78}.."
251
+ # Truncate to 80 chars
252
+ if [ ${#failure_msg} -gt 80 ]; then
253
+ failure_msg="${failure_msg:0:78}.."
250
254
  fi
251
255
 
252
256
  echo -e " ${RED}${BOLD}FAIL${RESET} ${RED}${failure_agent} → ${failure_loc}${RESET}"
253
- if [ -n "$short_msg" ]; then
254
- echo -e " ${DIM}${short_msg}${RESET}"
257
+ if [ -n "$failure_msg" ]; then
258
+ echo -e " ${DIM}${failure_msg}${RESET}"
255
259
  fi
256
260
  echo ""
257
261
  fi
@@ -4,7 +4,7 @@
4
4
  # Usage: bash scripts/harness-eval-watcher.sh [project-root] [--ai]
5
5
  # --ai evaluation 완료 시 claude -p 로 AI 요약 생성 (API 비용 발생)
6
6
 
7
- set -euo pipefail
7
+ set -uo pipefail
8
8
 
9
9
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
10
10
 
@@ -69,7 +69,7 @@ extract_eval_summary() {
69
69
 
70
70
  # Extract Verdict (PASS/FAIL)
71
71
  local verdict
72
- verdict=$(grep -i "verdict\|result\|판정" "$file" | head -3)
72
+ verdict=$(grep -i "verdict\|result\|판정" "$file" 2>/dev/null | head -3 || true)
73
73
  if [ -n "$verdict" ]; then
74
74
  if echo "$verdict" | grep -qi "PASS"; then
75
75
  echo -e " ${GREEN}${BOLD}VERDICT: PASS${RESET}"
@@ -83,7 +83,7 @@ extract_eval_summary() {
83
83
 
84
84
  # Extract Score
85
85
  local score_line
86
- score_line=$(grep -iE "score|점수|weighted|가중" "$file" | head -3)
86
+ score_line=$(grep -iE "score|점수|weighted|가중" "$file" 2>/dev/null | head -3 || true)
87
87
  if [ -n "$score_line" ]; then
88
88
  echo -e " ${BOLD}Score${RESET}"
89
89
  echo "$score_line" | while IFS= read -r line; do
@@ -107,7 +107,7 @@ extract_eval_summary() {
107
107
 
108
108
  # Extract individual rubric items (R1-R5 or V1-V5)
109
109
  local rubric_lines
110
- rubric_lines=$(grep -E "^[|#].*[RV][1-5]" "$file" | head -10)
110
+ rubric_lines=$(grep -E "^[|#].*[RV][1-5]" "$file" 2>/dev/null | head -10 || true)
111
111
  if [ -n "$rubric_lines" ]; then
112
112
  echo -e " ${BOLD}Rubric${RESET}"
113
113
  echo "$rubric_lines" | while IFS= read -r line; do
@@ -118,7 +118,7 @@ extract_eval_summary() {
118
118
 
119
119
  # Extract FAIL reasons
120
120
  local fail_lines
121
- fail_lines=$(grep -iE "fail|실패|regression|불일치|위반" "$file" | head -5)
121
+ fail_lines=$(grep -iE "fail|실패|regression|불일치|위반" "$file" 2>/dev/null | head -5 || true)
122
122
  if [ -n "$fail_lines" ]; then
123
123
  echo -e " ${RED}${BOLD}Issues${RESET}"
124
124
  echo "$fail_lines" | while IFS= read -r line; do
@@ -129,7 +129,7 @@ extract_eval_summary() {
129
129
 
130
130
  # Extract action items / recommendations
131
131
  local action_lines
132
- action_lines=$(grep -iE "recommend|action|수정|개선|필요|re-generate" "$file" | head -5)
132
+ action_lines=$(grep -iE "recommend|action|수정|개선|필요|re-generate" "$file" 2>/dev/null | head -5 || true)
133
133
  if [ -n "$action_lines" ]; then
134
134
  echo -e " ${YELLOW}${BOLD}Actions${RESET}"
135
135
  echo "$action_lines" | while IFS= read -r line; do
@@ -3,7 +3,7 @@
3
3
  # audit.log 스트리밍 + progress.json 변경 감지
4
4
  # Usage: bash scripts/harness-monitor.sh [project-root]
5
5
 
6
- set -euo pipefail
6
+ set -uo pipefail
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
9
9
 
@@ -68,22 +68,17 @@ tmux kill-session -t "$SESSION_NAME" 2>/dev/null || true
68
68
  tmux new-session -d -s "$SESSION_NAME" -c "$PROJECT_ROOT" -x 200 -y 50
69
69
 
70
70
  # Split right column (40% width)
71
- tmux split-window -h -l 80 -t "$SESSION_NAME" -c "$PROJECT_ROOT"
72
-
73
- # Pane 1 (top-right): Dashboard
74
- tmux send-keys -t "${SESSION_NAME}.1" "bash ${SCRIPT_DIR}/harness-dashboard.sh '${PROJECT_ROOT}'" Enter
71
+ # Use direct command execution (not send-keys) to avoid shell init noise (nvm warnings etc.)
72
+ tmux split-window -h -l 80 -t "$SESSION_NAME" -c "$PROJECT_ROOT" \
73
+ "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-dashboard.sh\" \"${PROJECT_ROOT}\"'"
75
74
 
76
75
  # Split pane 1 vertically for Monitor
77
- tmux split-window -v -t "${SESSION_NAME}.1" -c "$PROJECT_ROOT"
78
-
79
- # Pane 2 (mid-right): Monitor
80
- tmux send-keys -t "${SESSION_NAME}.2" "bash ${SCRIPT_DIR}/harness-monitor.sh '${PROJECT_ROOT}'" Enter
76
+ tmux split-window -v -t "${SESSION_NAME}.1" -c "$PROJECT_ROOT" \
77
+ "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-monitor.sh\" \"${PROJECT_ROOT}\"'"
81
78
 
82
79
  # Split pane 2 vertically for Eval
83
- tmux split-window -v -t "${SESSION_NAME}.2" -c "$PROJECT_ROOT"
84
-
85
- # Pane 3 (bottom-right): Eval Watcher
86
- tmux send-keys -t "${SESSION_NAME}.3" "bash ${SCRIPT_DIR}/harness-eval-watcher.sh '${PROJECT_ROOT}' ${USE_AI}" Enter
80
+ tmux split-window -v -t "${SESSION_NAME}.2" -c "$PROJECT_ROOT" \
81
+ "exec bash --norc --noprofile -c 'exec bash \"${SCRIPT_DIR}/harness-eval-watcher.sh\" \"${PROJECT_ROOT}\" ${USE_AI}'"
87
82
 
88
83
  # ── Launch Claude in Main pane ──
89
84
  HANDOFF="$PROJECT_ROOT/.harness/handoff.json"