@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.
|
|
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
|
-
|
|
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
|
|
246
|
-
|
|
247
|
-
|
|
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 "$
|
|
254
|
-
echo -e " ${DIM}${
|
|
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 -
|
|
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
|
package/scripts/harness-tmux.sh
CHANGED
|
@@ -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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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"
|