forge-pipeline 0.7.0 → 0.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/forge +52 -3
- package/lib/prompts.sh +1 -1
- package/package.json +1 -1
package/forge
CHANGED
|
@@ -388,16 +388,18 @@ forge_dashboard() {
|
|
|
388
388
|
local sessions
|
|
389
389
|
sessions="$(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep "^forge-" || true)"
|
|
390
390
|
|
|
391
|
+
local has_agents=false
|
|
392
|
+
|
|
393
|
+
# ── Tmux agents (background) ──
|
|
391
394
|
if [ -n "$sessions" ]; then
|
|
395
|
+
has_agents=true
|
|
392
396
|
while IFS= read -r session; do
|
|
393
397
|
local agent_name="${session#forge-}"
|
|
394
398
|
local status_icon="${GREEN}● running${RESET}"
|
|
395
399
|
local last_line=""
|
|
396
400
|
|
|
397
|
-
# Check for log file
|
|
398
401
|
local log_file="$forge_root/.forge/logs/${agent_name}.log"
|
|
399
402
|
if [ -f "$log_file" ]; then
|
|
400
|
-
# Get last non-empty line, strip ANSI codes, truncate
|
|
401
403
|
last_line="$(tail -5 "$log_file" 2>/dev/null | grep -v '^$' | tail -1 | sed 's/\x1b\[[0-9;]*m//g' | head -c 50 || true)"
|
|
402
404
|
fi
|
|
403
405
|
|
|
@@ -405,11 +407,45 @@ forge_dashboard() {
|
|
|
405
407
|
done <<< "$sessions"
|
|
406
408
|
fi
|
|
407
409
|
|
|
410
|
+
# ── Foreground agents (detected via recent log activity) ──
|
|
411
|
+
local now_ts
|
|
412
|
+
now_ts=$(date +%s)
|
|
413
|
+
if [ -d "$forge_root/.forge/logs" ]; then
|
|
414
|
+
for log_file in "$forge_root/.forge/logs"/*.log; do
|
|
415
|
+
[ -f "$log_file" ] || continue
|
|
416
|
+
local agent_name
|
|
417
|
+
agent_name="$(basename "$log_file" .log)"
|
|
418
|
+
|
|
419
|
+
# Skip if already shown as tmux session
|
|
420
|
+
if tmux has-session -t "forge-${agent_name}" 2>/dev/null; then
|
|
421
|
+
continue
|
|
422
|
+
fi
|
|
423
|
+
|
|
424
|
+
# Skip if already done
|
|
425
|
+
if [ -f "$forge_root/.forge/status/${agent_name}.done" ]; then
|
|
426
|
+
continue
|
|
427
|
+
fi
|
|
428
|
+
|
|
429
|
+
# Check if log was modified in the last 30 seconds (actively running)
|
|
430
|
+
local file_mtime
|
|
431
|
+
file_mtime=$(stat -f %m "$log_file" 2>/dev/null || stat -c %Y "$log_file" 2>/dev/null || echo 0)
|
|
432
|
+
local age=$((now_ts - file_mtime))
|
|
433
|
+
|
|
434
|
+
if [ "$age" -lt 30 ]; then
|
|
435
|
+
has_agents=true
|
|
436
|
+
local last_line
|
|
437
|
+
last_line="$(tail -5 "$log_file" 2>/dev/null | grep -v '^$' | tail -1 | sed 's/\x1b\[[0-9;]*m//g' | head -c 50 || true)"
|
|
438
|
+
printf " %-28s ${YELLOW}● active${RESET} %s\n" "$agent_name" "$last_line"
|
|
439
|
+
fi
|
|
440
|
+
done
|
|
441
|
+
fi
|
|
442
|
+
|
|
408
443
|
# ── Completed agents ──
|
|
409
444
|
local done_files
|
|
410
445
|
done_files="$(find "$forge_root/.forge/status" -name "*.done" -not -name "spec.done" -not -name "plan.done" -not -name "implement.done" -not -name "integrate.done" -not -name "audit.done" -not -name "fix.done" -not -name "finalize.done" 2>/dev/null || true)"
|
|
411
446
|
|
|
412
447
|
if [ -n "$done_files" ]; then
|
|
448
|
+
has_agents=true
|
|
413
449
|
while IFS= read -r done_file; do
|
|
414
450
|
local agent_name
|
|
415
451
|
agent_name="$(basename "$done_file" .done)"
|
|
@@ -423,7 +459,7 @@ forge_dashboard() {
|
|
|
423
459
|
done <<< "$done_files"
|
|
424
460
|
fi
|
|
425
461
|
|
|
426
|
-
if [
|
|
462
|
+
if [ "$has_agents" = false ]; then
|
|
427
463
|
printf " ${DIM}(no agents yet)${RESET}\n"
|
|
428
464
|
fi
|
|
429
465
|
|
|
@@ -435,6 +471,19 @@ forge_dashboard() {
|
|
|
435
471
|
total_expected=$(find "$forge_root/.forge/status" -name "*.expected" 2>/dev/null | wc -l | tr -d ' ')
|
|
436
472
|
local running_count=0
|
|
437
473
|
[ -n "$sessions" ] && running_count=$(echo "$sessions" | wc -l | tr -d ' ')
|
|
474
|
+
# Count foreground agents (logs modified in last 30s without .done)
|
|
475
|
+
if [ -d "$forge_root/.forge/logs" ]; then
|
|
476
|
+
for lf in "$forge_root/.forge/logs"/*.log; do
|
|
477
|
+
[ -f "$lf" ] || continue
|
|
478
|
+
local an
|
|
479
|
+
an="$(basename "$lf" .log)"
|
|
480
|
+
tmux has-session -t "forge-${an}" 2>/dev/null && continue
|
|
481
|
+
[ -f "$forge_root/.forge/status/${an}.done" ] && continue
|
|
482
|
+
local mt
|
|
483
|
+
mt=$(stat -f %m "$lf" 2>/dev/null || stat -c %Y "$lf" 2>/dev/null || echo 0)
|
|
484
|
+
[ $((now_ts - mt)) -lt 30 ] && running_count=$((running_count + 1))
|
|
485
|
+
done
|
|
486
|
+
fi
|
|
438
487
|
|
|
439
488
|
printf " ${BOLD}Running:${RESET} %d ${BOLD}Done:${RESET} %d" "$running_count" "$total_done"
|
|
440
489
|
if [ "$total_expected" -gt 0 ]; then
|
package/lib/prompts.sh
CHANGED