Files
CrmClinicas/.claude/helpers/worker-manager.sh
Consultoria AS 79b5d86325 feat: CRM Clinicas SaaS - MVP completo
- Auth: Login/Register con creacion de clinica
- Dashboard: KPIs reales, graficas recharts
- Pacientes: CRUD completo con busqueda
- Agenda: FullCalendar, drag-and-drop, vista recepcion
- Expediente: Notas SOAP, signos vitales, CIE-10
- Facturacion: Facturas con IVA, campos CFDI SAT
- Inventario: Productos, stock, movimientos, alertas
- Configuracion: Clinica, equipo, catalogo servicios
- Supabase self-hosted: 18 tablas con RLS multi-tenant
- Docker + Nginx para produccion

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 07:04:14 +00:00

171 lines
5.0 KiB
Bash
Executable File

#!/bin/bash
# Claude Flow V3 - Unified Worker Manager
# Orchestrates all background workers with proper scheduling
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
METRICS_DIR="$PROJECT_ROOT/.claude-flow/metrics"
PID_FILE="$METRICS_DIR/worker-manager.pid"
LOG_FILE="$METRICS_DIR/worker-manager.log"
mkdir -p "$METRICS_DIR"
# Worker definitions: name:script:interval_seconds
WORKERS=(
"perf:perf-worker.sh:300" # 5 min
"health:health-monitor.sh:300" # 5 min
"patterns:pattern-consolidator.sh:900" # 15 min
"ddd:ddd-tracker.sh:600" # 10 min
"adr:adr-compliance.sh:900" # 15 min
"security:security-scanner.sh:1800" # 30 min
"learning:learning-optimizer.sh:1800" # 30 min
)
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
run_worker() {
local name="$1"
local script="$2"
local script_path="$SCRIPT_DIR/$script"
if [ -x "$script_path" ]; then
"$script_path" check 2>/dev/null &
fi
}
run_all_workers() {
log "Running all workers (non-blocking)..."
for worker_def in "${WORKERS[@]}"; do
IFS=':' read -r name script interval <<< "$worker_def"
run_worker "$name" "$script"
done
# Don't wait - truly non-blocking
log "All workers spawned"
}
run_daemon() {
local interval="${1:-60}"
log "Starting worker manager daemon (interval: ${interval}s)"
echo $$ > "$PID_FILE"
trap 'log "Shutting down..."; rm -f "$PID_FILE"; exit 0' SIGTERM SIGINT
while true; do
run_all_workers
sleep "$interval"
done
}
status_all() {
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ Claude Flow V3 - Worker Status ║"
echo "╠══════════════════════════════════════════════════════════════╣"
for worker_def in "${WORKERS[@]}"; do
IFS=':' read -r name script interval <<< "$worker_def"
local script_path="$SCRIPT_DIR/$script"
if [ -x "$script_path" ]; then
local status=$("$script_path" status 2>/dev/null || echo "No data")
printf "║ %-10s │ %-48s ║\n" "$name" "$status"
fi
done
echo "╠══════════════════════════════════════════════════════════════╣"
# Check if daemon is running
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
echo "║ Daemon: RUNNING (PID: $(cat "$PID_FILE")) ║"
else
echo "║ Daemon: NOT RUNNING ║"
fi
echo "╚══════════════════════════════════════════════════════════════╝"
}
force_all() {
log "Force running all workers..."
for worker_def in "${WORKERS[@]}"; do
IFS=':' read -r name script interval <<< "$worker_def"
local script_path="$SCRIPT_DIR/$script"
if [ -x "$script_path" ]; then
log "Running $name..."
"$script_path" force 2>&1 | while read -r line; do
log " [$name] $line"
done
fi
done
log "All workers completed"
}
case "${1:-help}" in
"start"|"daemon")
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
echo "Worker manager already running (PID: $(cat "$PID_FILE"))"
exit 1
fi
run_daemon "${2:-60}" &
echo "Worker manager started (PID: $!)"
;;
"stop")
if [ -f "$PID_FILE" ]; then
kill "$(cat "$PID_FILE")" 2>/dev/null || true
rm -f "$PID_FILE"
echo "Worker manager stopped"
else
echo "Worker manager not running"
fi
;;
"run"|"once")
run_all_workers
;;
"force")
force_all
;;
"status")
status_all
;;
"logs")
tail -50 "$LOG_FILE" 2>/dev/null || echo "No logs available"
;;
"help"|*)
cat << EOF
Claude Flow V3 - Worker Manager
Usage: $0 <command> [options]
Commands:
start [interval] Start daemon (default: 60s cycle)
stop Stop daemon
run Run all workers once
force Force run all workers (ignore throttle)
status Show all worker status
logs Show recent logs
Workers:
perf Performance benchmarks (5 min)
health System health monitoring (5 min)
patterns Pattern consolidation (15 min)
ddd DDD progress tracking (10 min)
adr ADR compliance checking (15 min)
security Security scanning (30 min)
learning Learning optimization (30 min)
Examples:
$0 start 120 # Start with 2-minute cycle
$0 force # Run all now
$0 status # Check all status
EOF
;;
esac