@walwal-harness/cli 5.7.1 → 5.7.2

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": "5.7.1",
3
+ "version": "5.7.2",
4
4
  "description": "Production harness for AI agent engineering — Solo/Team mode, Planner, Generator(BE/FE), Evaluator chain (Code-Quality → Functional → Visual), optional Brainstormer. Supports React, Next.js, and Flutter FE stacks.",
5
5
  "bin": {
6
6
  "walwal-harness": "bin/init.js"
@@ -1,6 +1,7 @@
1
1
  #!/bin/bash
2
- # harness-gotcha-memory.sh — Gotcha & Memory pane (index view)
2
+ # harness-gotcha-memory.sh — Gotcha · Memory · Conventions pane (index view)
3
3
  # 활성 에이전트의 gotcha를 최상단으로, 나머지는 요약(최근 3항목+총개수)으로 표시
4
+ # + Shared Memory 요약 + Conventions 요약 (shared + 활성 에이전트별)
4
5
  # Usage: bash scripts/harness-gotcha-memory.sh [project-root]
5
6
 
6
7
  set -uo pipefail
@@ -16,6 +17,7 @@ fi
16
17
 
17
18
  MEMORY_FILE="$PROJECT_ROOT/.harness/memory.md"
18
19
  GOTCHAS_DIR="$PROJECT_ROOT/.harness/gotchas"
20
+ CONVENTIONS_DIR="$PROJECT_ROOT/.harness/conventions"
19
21
  PROGRESS="$PROJECT_ROOT/.harness/progress.json"
20
22
 
21
23
  BOLD="\033[1m"
@@ -45,6 +47,12 @@ compute_signature() {
45
47
  stat -f '%N %m %z' "$f" 2>/dev/null
46
48
  done
47
49
  fi
50
+ if [ -d "$CONVENTIONS_DIR" ]; then
51
+ for f in "$CONVENTIONS_DIR"/*.md; do
52
+ [ -e "$f" ] || continue
53
+ stat -f '%N %m %z' "$f" 2>/dev/null
54
+ done
55
+ fi
48
56
  } | md5 -q 2>/dev/null || echo "$RANDOM"
49
57
  }
50
58
 
@@ -115,6 +123,55 @@ render_gotcha_entry() {
115
123
  fi
116
124
  }
117
125
 
126
+ render_conventions_summary() {
127
+ if [ ! -d "$CONVENTIONS_DIR" ]; then
128
+ echo -e "${DIM}(conventions/ 없음)${RESET}"
129
+ return
130
+ fi
131
+
132
+ local active="$1"
133
+ local any=false
134
+
135
+ # Shared 먼저, 그다음 활성 에이전트, 그다음 나머지
136
+ local ordered_files=()
137
+ [ -f "$CONVENTIONS_DIR/shared.md" ] && ordered_files+=("$CONVENTIONS_DIR/shared.md")
138
+ if [ -n "$active" ] && [ -f "$CONVENTIONS_DIR/${active}.md" ]; then
139
+ ordered_files+=("$CONVENTIONS_DIR/${active}.md")
140
+ fi
141
+ for cand in "$CONVENTIONS_DIR"/*.md; do
142
+ [ -e "$cand" ] || continue
143
+ local base; base=$(basename "$cand" .md)
144
+ [ "$base" = "README" ] && continue
145
+ [ "$cand" = "$CONVENTIONS_DIR/shared.md" ] && continue
146
+ [ -n "$active" ] && [ "$cand" = "$CONVENTIONS_DIR/${active}.md" ] && continue
147
+ ordered_files+=("$cand")
148
+ done
149
+
150
+ for f in "${ordered_files[@]}"; do
151
+ [ -e "$f" ] || continue
152
+ local name count
153
+ name=$(basename "$f" .md)
154
+ count=$(count_items "$f")
155
+ if [ "$name" = "shared" ]; then
156
+ echo -e "${BOLD}${CYAN}▸ ${name}${RESET} ${DIM}(${count} items · shared)${RESET}"
157
+ elif [ -n "$active" ] && [ "$name" = "$active" ]; then
158
+ echo -e "${BOLD}${BG_YELLOW} ▸ ${name} ${RESET} ${DIM}(${count} items · ACTIVE)${RESET}"
159
+ else
160
+ echo -e "${BOLD}${GREEN}▸ ${name}${RESET} ${DIM}(${count} items)${RESET}"
161
+ fi
162
+ if [ "$count" -eq 0 ]; then
163
+ echo -e " ${DIM}(항목 없음)${RESET}"
164
+ else
165
+ recent_titles "$f" "$RECENT_N" | while IFS= read -r t; do
166
+ echo -e " ${DIM}·${RESET} $t"
167
+ done
168
+ fi
169
+ any=true
170
+ done
171
+
172
+ [ "$any" = "false" ] && echo -e "${DIM}(항목 없음)${RESET}"
173
+ }
174
+
118
175
  render_memory_summary() {
119
176
  if [ ! -f "$MEMORY_FILE" ]; then
120
177
  echo -e "${DIM}(memory.md 없음)${RESET}"
@@ -145,7 +202,7 @@ render() {
145
202
  active_file=""
146
203
  [ -n "$active" ] && active_file=$(file_for_agent "$active")
147
204
 
148
- echo -e "${BOLD}${MAGENTA}GOTCHA INDEX${RESET} ${DIM}$(date +%H:%M:%S) · recent=${RECENT_N} · refresh ${REFRESH_SEC}s${RESET}"
205
+ echo -e "${BOLD}${MAGENTA}RULES INDEX${RESET} ${DIM}Gotcha · Memory · Conventions · $(date +%H:%M:%S) · recent=${RECENT_N} · refresh ${REFRESH_SEC}s${RESET}"
149
206
  if [ -n "$active" ]; then
150
207
  echo -e "${DIM}active agent:${RESET} ${BOLD}${YELLOW}${active}${RESET}"
151
208
  else
@@ -171,6 +228,11 @@ render() {
171
228
  done
172
229
  fi
173
230
 
231
+ echo ""
232
+ echo -e "${DIM}${hr}${RESET}"
233
+ echo -e "${BOLD}${CYAN}▣ CONVENTIONS${RESET} ${DIM}(.harness/conventions)${RESET}"
234
+ render_conventions_summary "$active"
235
+
174
236
  echo ""
175
237
  echo -e "${DIM}${hr}${RESET}"
176
238
  render_memory_summary
@@ -199,7 +199,7 @@ launch_tmux_team() {
199
199
 
200
200
  tmux select-pane -t "$PANE_DASH" -T "Dashboard"
201
201
  tmux select-pane -t "$PANE_ARCHIVE" -T "Archive Prompt"
202
- tmux select-pane -t "$PANE_GOTCHA" -T "Gotcha & Memory"
202
+ tmux select-pane -t "$PANE_GOTCHA" -T "Gotcha · Memory · Conventions"
203
203
  tmux select-pane -t "$PANE_T1" -T "TEAM 1"
204
204
  tmux select-pane -t "$PANE_T2" -T "TEAM 2"
205
205
  tmux select-pane -t "$PANE_T3" -T "TEAM 3"