refactor: reorganizar dev-scripts en subdirectorios server/ y agent/

Se separan los scripts de gestión en dos categorías claras:
- dev-scripts/server/ — operaciones del launcher (start, stop, restart, ps, logs, dashboard)
- dev-scripts/agent/ — operaciones de agentes (new, register, verify, avatar, remove, list)

Se añade create-full.sh como script unificado que ejecuta scaffold + build + register + verify.
Se incluyen READMEs en cada subdirectorio documentando los scripts disponibles.
Los scripts originales en la raíz de dev-scripts/ se eliminan.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 21:53:19 +00:00
parent c1889ab0c7
commit 6858a5f13e
19 changed files with 379 additions and 76 deletions
+71
View File
@@ -0,0 +1,71 @@
# dev-scripts/server
Scripts para gestionar el ciclo de vida del launcher unificado que ejecuta todos los agentes habilitados.
## Scripts
### start.sh
Inicia el launcher unificado. Compila el binario y ejecuta los tests si es necesario antes de arrancar. Reporta el número de agentes habilitados.
```bash
./dev-scripts/server/start.sh
```
### stop.sh
Detiene el launcher de forma ordenada. Envía SIGTERM, espera 5 segundos, y si no termina usa SIGKILL.
```bash
./dev-scripts/server/stop.sh
```
### restart.sh
Reinicia el launcher (ejecuta stop.sh seguido de start.sh).
```bash
./dev-scripts/server/restart.sh
```
### ps.sh
Muestra el estado del proceso del launcher con métricas detalladas: PID, uptime, uso de memoria, CPU y tamaño de logs.
```bash
./dev-scripts/server/ps.sh
```
### logs.sh
Sigue los logs del launcher en tiempo real (tail -f). Acepta un argumento opcional para el número de líneas iniciales.
```bash
./dev-scripts/server/logs.sh # últimas líneas por defecto
./dev-scripts/server/logs.sh 50 # últimas 50 líneas
```
### dashboard.sh
Abre la TUI interactiva (bubbletea) para gestión visual de bots. Permite ver estado, iniciar/detener agentes y ver logs desde una interfaz de terminal.
```bash
./dev-scripts/server/dashboard.sh
```
### server.sh
CLI unificado que enruta comandos a los scripts individuales. Útil como punto de entrada único.
```bash
./dev-scripts/server/server.sh start # → start.sh
./dev-scripts/server/server.sh stop # → stop.sh
./dev-scripts/server/server.sh restart # → restart.sh
./dev-scripts/server/server.sh status # resumen general del servidor
./dev-scripts/server/server.sh ps # → ps.sh
./dev-scripts/server/server.sh logs # → logs.sh
./dev-scripts/server/server.sh kill # SIGKILL forzado (emergencia)
./dev-scripts/server/server.sh enable <id> # habilita un agente
./dev-scripts/server/server.sh disable <id> # deshabilita un agente
./dev-scripts/server/server.sh dashboard # → dashboard.sh
```
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
# dashboard.sh — lanza el TUI interactivo de gestión de bots
# Uso: ./dev-scripts/server/dashboard.sh
source "$(dirname "$0")/../_common.sh"
exec "$GO" run ./cmd/dashboard "$@"
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# logs.sh — sigue los logs de agentes (logs/<agent>/YYYY-MM-DD.jsonl)
#
# Uso:
# ./dev-scripts/server/logs.sh # tail -f de todos los agentes (hoy)
# ./dev-scripts/server/logs.sh assistant-bot # tail -f de un agente específico
# ./dev-scripts/server/logs.sh assistant-bot 100 # últimas 100 líneas
source "$(dirname "$0")/../_common.sh"
LOG_DIR="logs"
AGENT_ID="${1:-}"
LINES="${2:-50}"
if [[ ! -d "$LOG_DIR" ]]; then
fail "No hay logs todavía — inicia el launcher primero"
fi
TODAY="$(date -u +%Y-%m-%d)"
if [[ -n "$AGENT_ID" ]]; then
# Logs de un agente específico
LOG_FILE="$LOG_DIR/$AGENT_ID/$TODAY.jsonl"
if [[ ! -f "$LOG_FILE" ]]; then
# Try to find the latest log file for this agent
LATEST="$(ls -t "$LOG_DIR/$AGENT_ID/"*.jsonl 2>/dev/null | head -1)"
if [[ -z "$LATEST" ]]; then
fail "No hay logs para $AGENT_ID"
fi
LOG_FILE="$LATEST"
fi
info "Siguiendo logs: $LOG_FILE"
dim " Ctrl+C para salir"
echo ""
tail -n "$LINES" -f "$LOG_FILE"
else
# Logs de todos los agentes (archivos de hoy)
FILES=$(find "$LOG_DIR" -name "$TODAY.jsonl" 2>/dev/null)
if [[ -z "$FILES" ]]; then
# Fallback: latest file from each agent
FILES=""
for d in "$LOG_DIR"/*/; do
LATEST="$(ls -t "$d"*.jsonl 2>/dev/null | head -1)"
[[ -n "$LATEST" ]] && FILES="$FILES $LATEST"
done
fi
if [[ -z "$FILES" ]]; then
fail "No hay logs todavía — inicia el launcher primero"
fi
info "Siguiendo logs de todos los agentes (hoy: $TODAY)"
dim " Ctrl+C para salir"
echo ""
# shellcheck disable=SC2086
tail -n "$LINES" -f $FILES
fi
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
# ps.sh — muestra el estado del launcher unificado y agentes
#
# Uso:
# ./dev-scripts/server/ps.sh
source "$(dirname "$0")/../_common.sh"
if ! is_launcher_running; then
echo ""
dim " Launcher no está corriendo."
echo ""
echo " Agentes:"
while IFS='|' read -r id _v enabled _d _c; do
if [[ "$enabled" == "true" ]]; then
echo -e " ${GRN}${RST} $id (enabled)"
else
echo -e " ${DIM}$id (disabled)${RST}"
fi
done < <(list_agents_raw)
exit 0
fi
pid="$(read_launcher_pid)"
# Uptime
if [[ -f /proc/$pid/stat ]]; then
start_ticks=$(awk '{print $22}' /proc/$pid/stat 2>/dev/null || echo 0)
clk_tck=$(getconf CLK_TCK)
boot_time=$(awk '/btime/{print $2}' /proc/stat)
proc_start=$((boot_time + start_ticks / clk_tck))
now=$(date +%s)
elapsed=$((now - proc_start))
days=$((elapsed / 86400))
hours=$(( (elapsed % 86400) / 3600 ))
mins=$(( (elapsed % 3600) / 60 ))
if [[ $days -gt 0 ]]; then
uptime="${days}d ${hours}h"
elif [[ $hours -gt 0 ]]; then
uptime="${hours}h ${mins}m"
else
uptime="${mins}m"
fi
else
uptime="n/a"
fi
# Memory and CPU
read -r mem_kb cpu_pct < <(ps -p "$pid" -o rss=,pcpu= 2>/dev/null || echo "0 0")
if [[ "$mem_kb" -gt 1048576 ]]; then
mem="$(( mem_kb / 1048576 )) GB"
elif [[ "$mem_kb" -gt 1024 ]]; then
mem="$(( mem_kb / 1024 )) MB"
else
mem="${mem_kb} KB"
fi
# Log size
log="$(launcher_log_file)"
if [[ -f "$log" ]]; then
log_bytes=$(stat -c%s "$log" 2>/dev/null || echo 0)
if [[ "$log_bytes" -gt 1048576 ]]; then
log_size="$(( log_bytes / 1048576 )) MB"
elif [[ "$log_bytes" -gt 1024 ]]; then
log_size="$(( log_bytes / 1024 )) KB"
else
log_size="${log_bytes} B"
fi
else
log_size="-"
fi
echo ""
echo -e " ${GRN}● Launcher running${RST} PID $pid"
echo -e " uptime: $uptime mem: $mem cpu: ${cpu_pct}% log: $log_size"
echo ""
echo " Agentes:"
while IFS='|' read -r id _v enabled _d _c; do
if [[ "$enabled" == "true" ]]; then
echo -e " ${GRN}${RST} $id (enabled, running in launcher)"
else
echo -e " ${DIM}$id (disabled)${RST}"
fi
done < <(list_agents_raw)
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
# restart.sh — reinicia el launcher unificado
#
# Uso:
# ./dev-scripts/server/restart.sh
source "$(dirname "$0")/../_common.sh"
info "Deteniendo launcher..."
"$REPO_ROOT/dev-scripts/server/stop.sh"
echo ""
info "Iniciando launcher..."
"$REPO_ROOT/dev-scripts/server/start.sh"
+139
View File
@@ -0,0 +1,139 @@
#!/usr/bin/env bash
# server.sh — gestión unificada del servidor de bots
#
# Uso:
# ./dev-scripts/server/server.sh start # iniciar el launcher
# ./dev-scripts/server/server.sh stop # detener el launcher
# ./dev-scripts/server/server.sh restart # reiniciar el launcher
# ./dev-scripts/server/server.sh status # resumen general del servidor
# ./dev-scripts/server/server.sh ps # proceso con detalle
# ./dev-scripts/server/server.sh logs [lines] # tail -f de logs
# ./dev-scripts/server/server.sh kill # SIGKILL forzado (emergencia)
# ./dev-scripts/server/server.sh enable <id> # habilitar un agente
# ./dev-scripts/server/server.sh disable <id> # deshabilitar un agente
# ./dev-scripts/server/server.sh dashboard # TUI interactivo
source "$(dirname "$0")/../_common.sh"
CMD="${1:-status}"
shift || true
ARG="${1:-}"
toggle_agent_enabled() {
local id="$1" value="$2"
for cfg in agents/*/config.yaml; do
[[ -f "$cfg" ]] || continue
local cid
cid=$(grep -m1 '^ id:' "$cfg" | awk '{print $2}')
if [[ "$cid" == "$id" ]]; then
sed -i "s/^\\( enabled:\\).*/\\1 $value/" "$cfg"
ok "$id enabled: $value"
info "Reinicia el launcher para aplicar: ./dev-scripts/server/server.sh restart"
return 0
fi
done
fail "Agente '$id' no encontrado"
}
case "$CMD" in
start)
exec "$REPO_ROOT/dev-scripts/server/start.sh"
;;
stop)
exec "$REPO_ROOT/dev-scripts/server/stop.sh"
;;
restart)
exec "$REPO_ROOT/dev-scripts/server/restart.sh"
;;
ps)
exec "$REPO_ROOT/dev-scripts/server/ps.sh"
;;
logs)
exec "$REPO_ROOT/dev-scripts/server/logs.sh" ${ARG:+"$ARG"}
;;
dashboard|tui)
exec "$REPO_ROOT/dev-scripts/server/dashboard.sh"
;;
enable)
[[ -n "$ARG" ]] || fail "Uso: $0 enable <agent-id>"
toggle_agent_enabled "$ARG" "true"
;;
disable)
[[ -n "$ARG" ]] || fail "Uso: $0 disable <agent-id>"
toggle_agent_enabled "$ARG" "false"
;;
kill)
if ! is_launcher_running; then
dim " El launcher no está corriendo."
exit 0
fi
pid="$(read_launcher_pid)"
kill -9 "$pid" 2>/dev/null || true
rm -f "$(launcher_pid_file)"
ok "Launcher killed (PID $pid)"
;;
status)
echo ""
echo -e " ${BLU}Bot Server Status${RST}"
printf '%s\n' " $(printf '─%.0s' {1..40})"
if is_launcher_running; then
pid="$(read_launcher_pid)"
echo -e " ${GRN}● Launcher running${RST} PID $pid"
else
echo -e " ${DIM}○ Launcher stopped${RST}"
fi
echo ""
enabled=0
disabled=0
total=0
while IFS='|' read -r id _v en _d _c; do
((total++)) || true
if [[ "$en" == "true" ]]; then
((enabled++)) || true
else
((disabled++)) || true
fi
done < <(list_agents_raw)
echo -e " Agentes totales: $total"
echo -e " ${GRN}● Enabled:${RST} $enabled"
echo -e " ${DIM}○ Disabled:${RST} $disabled"
echo ""
"$REPO_ROOT/dev-scripts/agent/list.sh"
if is_launcher_running; then
echo ""
"$REPO_ROOT/dev-scripts/server/ps.sh"
fi
;;
*)
echo "Uso: $0 {start|stop|restart|status|ps|logs|kill|enable|disable|dashboard}"
echo ""
echo "Comandos:"
echo " start Iniciar el launcher unificado"
echo " stop Detener el launcher"
echo " restart Reiniciar el launcher"
echo " status Resumen general del servidor"
echo " ps Proceso del launcher con detalle (PID, mem, CPU)"
echo " logs [lines] Tail -f de logs del launcher"
echo " kill SIGKILL forzado (solo emergencias)"
echo " enable <id> Habilitar un agente (requiere restart)"
echo " disable <id> Deshabilitar un agente (requiere restart)"
echo " dashboard TUI interactivo de gestión"
exit 1
;;
esac
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# start.sh — inicia el launcher unificado (todos los agentes habilitados)
#
# Uso:
# ./dev-scripts/server/start.sh # inicia el launcher unificado
source "$(dirname "$0")/../_common.sh"
load_env
if is_launcher_running; then
pid="$(read_launcher_pid)"
fail "El launcher ya está corriendo (PID $pid). Usa restart.sh para reiniciar."
fi
BIN="$REPO_ROOT/bin/launcher"
LOG="$(launcher_log_file)"
PID_F="$(launcher_pid_file)"
# Build if needed
if [[ ! -x "$BIN" ]] || [[ "$(find ./cmd/launcher -newer "$BIN" 2>/dev/null | head -1)" ]]; then
info "Ejecutando tests..."
"$GO" test -tags goolm ./... || fail "Tests fallaron — corrige antes de compilar"
info "Compilando launcher..."
mkdir -p "$(dirname "$BIN")"
"$GO" build -tags goolm -o "$BIN" ./cmd/launcher || fail "Error de compilación"
fi
info "Iniciando launcher unificado..."
nohup "$BIN" --log-level "${LOG_LEVEL:-info}" \
>> "$LOG" 2>&1 &
pid=$!
echo "$pid" > "$PID_F"
sleep 1
if kill -0 "$pid" 2>/dev/null; then
# Count enabled agents
enabled=0
total=0
while IFS='|' read -r _id _v en _d _c; do
((total++)) || true
[[ "$en" == "true" ]] && ((enabled++)) || true
done < <(list_agents_raw)
ok "Launcher PID $pid ($enabled/$total agentes habilitados) → logs: $LOG"
else
rm -f "$PID_F"
fail "Launcher arrancó pero murió — revisa: tail -f $LOG"
fi
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
# stop.sh — detiene el launcher unificado
#
# Uso:
# ./dev-scripts/server/stop.sh
source "$(dirname "$0")/../_common.sh"
if ! is_launcher_running; then
dim " El launcher no está corriendo."
exit 0
fi
pid="$(read_launcher_pid)"
info "Deteniendo launcher (PID $pid)..."
kill -TERM "$pid" 2>/dev/null || true
# Wait up to 5s for graceful shutdown
for _ in {1..10}; do
kill -0 "$pid" 2>/dev/null || break
sleep 0.5
done
# SIGKILL if still alive
if kill -0 "$pid" 2>/dev/null; then
warn "Launcher no respondió a SIGTERM, enviando SIGKILL..."
kill -9 "$pid" 2>/dev/null || true
fi
rm -f "$(launcher_pid_file)"
ok "Launcher detenido"