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>
This commit is contained in:
245
.claude/helpers/sync-v3-metrics.sh
Executable file
245
.claude/helpers/sync-v3-metrics.sh
Executable file
@@ -0,0 +1,245 @@
|
||||
#!/bin/bash
|
||||
# Claude Flow V3 - Auto-sync Metrics from Actual Implementation
|
||||
# Scans the V3 codebase and updates metrics to reflect reality
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
V3_DIR="$PROJECT_ROOT/v3"
|
||||
METRICS_DIR="$PROJECT_ROOT/.claude-flow/metrics"
|
||||
SECURITY_DIR="$PROJECT_ROOT/.claude-flow/security"
|
||||
|
||||
# Ensure directories exist
|
||||
mkdir -p "$METRICS_DIR" "$SECURITY_DIR"
|
||||
|
||||
# Colors
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
RESET='\033[0m'
|
||||
|
||||
log() {
|
||||
echo -e "${CYAN}[sync] $1${RESET}"
|
||||
}
|
||||
|
||||
# Count V3 modules
|
||||
count_modules() {
|
||||
local count=0
|
||||
local modules=()
|
||||
|
||||
if [ -d "$V3_DIR/@claude-flow" ]; then
|
||||
for dir in "$V3_DIR/@claude-flow"/*/; do
|
||||
if [ -d "$dir" ]; then
|
||||
name=$(basename "$dir")
|
||||
modules+=("$name")
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
echo "$count"
|
||||
}
|
||||
|
||||
# Calculate module completion percentage
|
||||
calculate_module_progress() {
|
||||
local module="$1"
|
||||
local module_dir="$V3_DIR/@claude-flow/$module"
|
||||
|
||||
if [ ! -d "$module_dir" ]; then
|
||||
echo "0"
|
||||
return
|
||||
fi
|
||||
|
||||
local has_src=$([ -d "$module_dir/src" ] && echo 1 || echo 0)
|
||||
local has_index=$([ -f "$module_dir/src/index.ts" ] || [ -f "$module_dir/index.ts" ] && echo 1 || echo 0)
|
||||
local has_tests=$([ -d "$module_dir/__tests__" ] || [ -d "$module_dir/tests" ] && echo 1 || echo 0)
|
||||
local has_package=$([ -f "$module_dir/package.json" ] && echo 1 || echo 0)
|
||||
local file_count=$(find "$module_dir" -name "*.ts" -type f 2>/dev/null | wc -l)
|
||||
|
||||
# Calculate progress based on structure and content
|
||||
local progress=0
|
||||
[ "$has_src" -eq 1 ] && ((progress += 20))
|
||||
[ "$has_index" -eq 1 ] && ((progress += 20))
|
||||
[ "$has_tests" -eq 1 ] && ((progress += 20))
|
||||
[ "$has_package" -eq 1 ] && ((progress += 10))
|
||||
[ "$file_count" -gt 5 ] && ((progress += 15))
|
||||
[ "$file_count" -gt 10 ] && ((progress += 15))
|
||||
|
||||
# Cap at 100
|
||||
[ "$progress" -gt 100 ] && progress=100
|
||||
|
||||
echo "$progress"
|
||||
}
|
||||
|
||||
# Check security CVE status
|
||||
check_security_status() {
|
||||
local cves_fixed=0
|
||||
local security_dir="$V3_DIR/@claude-flow/security/src"
|
||||
|
||||
# CVE-1: Input validation - check for input-validator.ts
|
||||
if [ -f "$security_dir/input-validator.ts" ]; then
|
||||
lines=$(wc -l < "$security_dir/input-validator.ts" 2>/dev/null || echo 0)
|
||||
[ "$lines" -gt 100 ] && ((cves_fixed++))
|
||||
fi
|
||||
|
||||
# CVE-2: Path traversal - check for path-validator.ts
|
||||
if [ -f "$security_dir/path-validator.ts" ]; then
|
||||
lines=$(wc -l < "$security_dir/path-validator.ts" 2>/dev/null || echo 0)
|
||||
[ "$lines" -gt 100 ] && ((cves_fixed++))
|
||||
fi
|
||||
|
||||
# CVE-3: Command injection - check for safe-executor.ts
|
||||
if [ -f "$security_dir/safe-executor.ts" ]; then
|
||||
lines=$(wc -l < "$security_dir/safe-executor.ts" 2>/dev/null || echo 0)
|
||||
[ "$lines" -gt 100 ] && ((cves_fixed++))
|
||||
fi
|
||||
|
||||
echo "$cves_fixed"
|
||||
}
|
||||
|
||||
# Calculate overall DDD progress
|
||||
calculate_ddd_progress() {
|
||||
local total_progress=0
|
||||
local module_count=0
|
||||
|
||||
for dir in "$V3_DIR/@claude-flow"/*/; do
|
||||
if [ -d "$dir" ]; then
|
||||
name=$(basename "$dir")
|
||||
progress=$(calculate_module_progress "$name")
|
||||
((total_progress += progress))
|
||||
((module_count++))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$module_count" -gt 0 ]; then
|
||||
echo $((total_progress / module_count))
|
||||
else
|
||||
echo 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Count total lines of code
|
||||
count_total_lines() {
|
||||
find "$V3_DIR" -name "*.ts" -type f -exec cat {} \; 2>/dev/null | wc -l
|
||||
}
|
||||
|
||||
# Count total files
|
||||
count_total_files() {
|
||||
find "$V3_DIR" -name "*.ts" -type f 2>/dev/null | wc -l
|
||||
}
|
||||
|
||||
# Check domains (map modules to domains)
|
||||
count_domains() {
|
||||
local domains=0
|
||||
|
||||
# Map @claude-flow modules to DDD domains
|
||||
[ -d "$V3_DIR/@claude-flow/swarm" ] && ((domains++)) # task-management
|
||||
[ -d "$V3_DIR/@claude-flow/memory" ] && ((domains++)) # session-management
|
||||
[ -d "$V3_DIR/@claude-flow/performance" ] && ((domains++)) # health-monitoring
|
||||
[ -d "$V3_DIR/@claude-flow/cli" ] && ((domains++)) # lifecycle-management
|
||||
[ -d "$V3_DIR/@claude-flow/integration" ] && ((domains++)) # event-coordination
|
||||
|
||||
echo "$domains"
|
||||
}
|
||||
|
||||
# Main sync function
|
||||
sync_metrics() {
|
||||
log "Scanning V3 implementation..."
|
||||
|
||||
local modules=$(count_modules)
|
||||
local domains=$(count_domains)
|
||||
local ddd_progress=$(calculate_ddd_progress)
|
||||
local cves_fixed=$(check_security_status)
|
||||
local total_files=$(count_total_files)
|
||||
local total_lines=$(count_total_lines)
|
||||
local timestamp=$(date -Iseconds)
|
||||
|
||||
# Determine security status
|
||||
local security_status="PENDING"
|
||||
if [ "$cves_fixed" -eq 3 ]; then
|
||||
security_status="CLEAN"
|
||||
elif [ "$cves_fixed" -gt 0 ]; then
|
||||
security_status="IN_PROGRESS"
|
||||
fi
|
||||
|
||||
log "Found: $modules modules, $domains domains, $total_files files, $total_lines lines"
|
||||
log "DDD Progress: ${ddd_progress}%, Security: $cves_fixed/3 CVEs fixed"
|
||||
|
||||
# Update v3-progress.json
|
||||
cat > "$METRICS_DIR/v3-progress.json" << EOF
|
||||
{
|
||||
"domains": {
|
||||
"completed": $domains,
|
||||
"total": 5,
|
||||
"list": [
|
||||
{"name": "task-management", "status": "$([ -d "$V3_DIR/@claude-flow/swarm" ] && echo "complete" || echo "pending")", "module": "swarm"},
|
||||
{"name": "session-management", "status": "$([ -d "$V3_DIR/@claude-flow/memory" ] && echo "complete" || echo "pending")", "module": "memory"},
|
||||
{"name": "health-monitoring", "status": "$([ -d "$V3_DIR/@claude-flow/performance" ] && echo "complete" || echo "pending")", "module": "performance"},
|
||||
{"name": "lifecycle-management", "status": "$([ -d "$V3_DIR/@claude-flow/cli" ] && echo "complete" || echo "pending")", "module": "cli"},
|
||||
{"name": "event-coordination", "status": "$([ -d "$V3_DIR/@claude-flow/integration" ] && echo "complete" || echo "pending")", "module": "integration"}
|
||||
]
|
||||
},
|
||||
"ddd": {
|
||||
"progress": $ddd_progress,
|
||||
"modules": $modules,
|
||||
"totalFiles": $total_files,
|
||||
"totalLines": $total_lines
|
||||
},
|
||||
"swarm": {
|
||||
"activeAgents": 0,
|
||||
"totalAgents": 15,
|
||||
"topology": "hierarchical-mesh",
|
||||
"coordination": "$([ -d "$V3_DIR/@claude-flow/swarm" ] && echo "ready" || echo "pending")"
|
||||
},
|
||||
"lastUpdated": "$timestamp",
|
||||
"autoSynced": true
|
||||
}
|
||||
EOF
|
||||
|
||||
# Update security audit status
|
||||
cat > "$SECURITY_DIR/audit-status.json" << EOF
|
||||
{
|
||||
"status": "$security_status",
|
||||
"cvesFixed": $cves_fixed,
|
||||
"totalCves": 3,
|
||||
"criticalVulnerabilities": [
|
||||
{
|
||||
"id": "CVE-1",
|
||||
"description": "Input validation bypass",
|
||||
"severity": "critical",
|
||||
"status": "$([ -f "$V3_DIR/@claude-flow/security/src/input-validator.ts" ] && echo "fixed" || echo "pending")",
|
||||
"fixedBy": "input-validator.ts"
|
||||
},
|
||||
{
|
||||
"id": "CVE-2",
|
||||
"description": "Path traversal vulnerability",
|
||||
"severity": "critical",
|
||||
"status": "$([ -f "$V3_DIR/@claude-flow/security/src/path-validator.ts" ] && echo "fixed" || echo "pending")",
|
||||
"fixedBy": "path-validator.ts"
|
||||
},
|
||||
{
|
||||
"id": "CVE-3",
|
||||
"description": "Command injection vulnerability",
|
||||
"severity": "critical",
|
||||
"status": "$([ -f "$V3_DIR/@claude-flow/security/src/safe-executor.ts" ] && echo "fixed" || echo "pending")",
|
||||
"fixedBy": "safe-executor.ts"
|
||||
}
|
||||
],
|
||||
"lastAudit": "$timestamp",
|
||||
"autoSynced": true
|
||||
}
|
||||
EOF
|
||||
|
||||
log "Metrics synced successfully!"
|
||||
|
||||
# Output summary for statusline
|
||||
echo ""
|
||||
echo -e "${GREEN}V3 Implementation Status:${RESET}"
|
||||
echo " Modules: $modules"
|
||||
echo " Domains: $domains/5"
|
||||
echo " DDD Progress: ${ddd_progress}%"
|
||||
echo " Security: $cves_fixed/3 CVEs fixed ($security_status)"
|
||||
echo " Codebase: $total_files files, $total_lines lines"
|
||||
}
|
||||
|
||||
# Run sync
|
||||
sync_metrics
|
||||
Reference in New Issue
Block a user