Structure: - control-plane/: Registries, SIMCO directives, CI/CD templates - projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics - shared/: Libs catalog, knowledge-base Key features: - Centralized port, domain, database, and service registries - 23 SIMCO directives + 6 fundamental principles - NEXUS agent profiles with delegation rules - Validation scripts for workspace integrity - Dockerfiles for all services - Path aliases for quick reference 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
400 lines
10 KiB
Bash
Executable File
400 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
# ==============================================================================
|
|
# init-project.sh - Inicializa un nuevo proyecto
|
|
# ==============================================================================
|
|
# Uso: ./init-project.sh <nombre-proyecto> <tipo>
|
|
#
|
|
# Tipos disponibles:
|
|
# - backend : Solo backend
|
|
# - frontend : Solo frontend
|
|
# - fullstack : Backend + Frontend
|
|
# - ml : Backend Python/FastAPI
|
|
#
|
|
# Ejemplo: ./init-project.sh gamilit-platform fullstack
|
|
# ==============================================================================
|
|
|
|
set -e
|
|
|
|
# Colores
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# Parametros
|
|
PROJECT_NAME="${1}"
|
|
PROJECT_TYPE="${2:-fullstack}"
|
|
|
|
# Validar parametros
|
|
if [ -z "$PROJECT_NAME" ]; then
|
|
echo -e "${RED}ERROR: Nombre de proyecto requerido${NC}"
|
|
echo ""
|
|
echo "Uso: $0 <nombre-proyecto> [tipo]"
|
|
echo ""
|
|
echo "Tipos disponibles:"
|
|
echo " - backend : Solo backend"
|
|
echo " - frontend : Solo frontend"
|
|
echo " - fullstack : Backend + Frontend (default)"
|
|
echo " - ml : Backend Python/FastAPI"
|
|
exit 1
|
|
fi
|
|
|
|
# Rutas
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONTROL_PLANE="${SCRIPT_DIR}/../../.."
|
|
TEMPLATES_DIR="${CONTROL_PLANE}/devtools/docker/templates"
|
|
REPOS_DIR="${CONTROL_PLANE}/../repos"
|
|
PROJECT_DIR="${REPOS_DIR}/${PROJECT_NAME}"
|
|
|
|
echo -e "${BLUE}============================================${NC}"
|
|
echo -e "${BLUE} INICIALIZACION DE PROYECTO${NC}"
|
|
echo -e "${BLUE}============================================${NC}"
|
|
echo ""
|
|
echo "Proyecto: $PROJECT_NAME"
|
|
echo "Tipo: $PROJECT_TYPE"
|
|
echo "Directorio: $PROJECT_DIR"
|
|
echo ""
|
|
|
|
# Verificar que no existe
|
|
if [ -d "$PROJECT_DIR" ]; then
|
|
echo -e "${RED}ERROR: El proyecto ya existe: $PROJECT_DIR${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# 1. Crear estructura
|
|
# ------------------------------------------------------------------------------
|
|
echo -e "${YELLOW}[1/4] Creando estructura de directorios...${NC}"
|
|
|
|
mkdir -p "$PROJECT_DIR"/{apps,docker,orchestration,docs,.github/workflows}
|
|
|
|
case "$PROJECT_TYPE" in
|
|
backend)
|
|
mkdir -p "$PROJECT_DIR"/apps/{backend/src,database/{ddl,seeds,migrations}}
|
|
;;
|
|
frontend)
|
|
mkdir -p "$PROJECT_DIR"/apps/frontend/src
|
|
;;
|
|
fullstack)
|
|
mkdir -p "$PROJECT_DIR"/apps/{backend/src,frontend/src,database/{ddl,seeds,migrations}}
|
|
;;
|
|
ml)
|
|
mkdir -p "$PROJECT_DIR"/apps/{backend/src,ml-engine/src,database}
|
|
;;
|
|
*)
|
|
echo -e "${RED}ERROR: Tipo desconocido: $PROJECT_TYPE${NC}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo -e " ${GREEN}[OK]${NC} Estructura creada"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# 2. Crear package.json root
|
|
# ------------------------------------------------------------------------------
|
|
echo -e "${YELLOW}[2/4] Creando archivos base...${NC}"
|
|
|
|
cat > "$PROJECT_DIR/package.json" << EOF
|
|
{
|
|
"name": "${PROJECT_NAME}",
|
|
"version": "1.0.0",
|
|
"private": true,
|
|
"workspaces": [
|
|
"apps/*"
|
|
],
|
|
"scripts": {
|
|
"dev": "echo 'Usar docker-compose up'",
|
|
"build": "npm run build --workspaces --if-present",
|
|
"test": "npm run test --workspaces --if-present",
|
|
"lint": "npm run lint --workspaces --if-present"
|
|
}
|
|
}
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} package.json"
|
|
|
|
# README
|
|
cat > "$PROJECT_DIR/README.md" << EOF
|
|
# ${PROJECT_NAME}
|
|
|
|
## Setup
|
|
|
|
\`\`\`bash
|
|
# Prerequisitos: Tener el workspace inicializado
|
|
# ../control-plane/devtools/scripts/bootstrap/init-workspace.sh
|
|
|
|
# Levantar servicios
|
|
cd docker
|
|
docker-compose up -d
|
|
\`\`\`
|
|
|
|
## Servicios
|
|
|
|
| Servicio | URL |
|
|
|----------|-----|
|
|
| API | http://api.${PROJECT_NAME}.localhost |
|
|
| Web | http://${PROJECT_NAME}.localhost |
|
|
|
|
## Estructura
|
|
|
|
\`\`\`
|
|
${PROJECT_NAME}/
|
|
├── apps/
|
|
│ ├── backend/
|
|
│ └── frontend/
|
|
├── docker/
|
|
├── orchestration/
|
|
└── docs/
|
|
\`\`\`
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} README.md"
|
|
|
|
# .gitignore
|
|
cat > "$PROJECT_DIR/.gitignore" << 'EOF'
|
|
# Dependencies
|
|
node_modules/
|
|
__pycache__/
|
|
venv/
|
|
.venv/
|
|
|
|
# Build
|
|
dist/
|
|
build/
|
|
.next/
|
|
out/
|
|
|
|
# Environment
|
|
.env
|
|
.env.local
|
|
.env.*.local
|
|
|
|
# IDE
|
|
.idea/
|
|
.vscode/
|
|
*.swp
|
|
*.swo
|
|
|
|
# OS
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# Logs
|
|
*.log
|
|
logs/
|
|
|
|
# Test
|
|
coverage/
|
|
.nyc_output/
|
|
|
|
# Docker
|
|
.docker/
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} .gitignore"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# 3. Crear docker-compose
|
|
# ------------------------------------------------------------------------------
|
|
echo -e "${YELLOW}[3/4] Creando docker-compose...${NC}"
|
|
|
|
# Extraer nombre corto para dominios
|
|
SHORT_NAME=$(echo "$PROJECT_NAME" | sed 's/-platform//' | sed 's/-//')
|
|
|
|
cat > "$PROJECT_DIR/docker/docker-compose.yml" << EOF
|
|
version: "3.8"
|
|
|
|
x-logging: &default-logging
|
|
driver: "json-file"
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
|
|
services:
|
|
EOF
|
|
|
|
# Agregar backend si aplica
|
|
if [[ "$PROJECT_TYPE" == "backend" || "$PROJECT_TYPE" == "fullstack" ]]; then
|
|
cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF
|
|
${SHORT_NAME}-api:
|
|
build:
|
|
context: ../apps/backend
|
|
dockerfile: Dockerfile
|
|
container_name: ${SHORT_NAME}-api
|
|
restart: unless-stopped
|
|
expose:
|
|
- "3000"
|
|
environment:
|
|
- NODE_ENV=\${NODE_ENV:-development}
|
|
- PORT=3000
|
|
- DATABASE_URL=\${DATABASE_URL}
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.${SHORT_NAME}-api.rule=Host(\`api.${SHORT_NAME}.localhost\`)"
|
|
- "traefik.http.services.${SHORT_NAME}-api.loadbalancer.server.port=3000"
|
|
networks:
|
|
- ${SHORT_NAME}_\${ENV:-local}
|
|
- infra_shared
|
|
logging:
|
|
<<: *default-logging
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Agregar frontend si aplica
|
|
if [[ "$PROJECT_TYPE" == "frontend" || "$PROJECT_TYPE" == "fullstack" ]]; then
|
|
cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF
|
|
${SHORT_NAME}-web:
|
|
build:
|
|
context: ../apps/frontend
|
|
dockerfile: Dockerfile
|
|
container_name: ${SHORT_NAME}-web
|
|
restart: unless-stopped
|
|
expose:
|
|
- "3001"
|
|
environment:
|
|
- NODE_ENV=\${NODE_ENV:-development}
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.${SHORT_NAME}-web.rule=Host(\`${SHORT_NAME}.localhost\`)"
|
|
- "traefik.http.services.${SHORT_NAME}-web.loadbalancer.server.port=3001"
|
|
networks:
|
|
- ${SHORT_NAME}_\${ENV:-local}
|
|
- infra_shared
|
|
logging:
|
|
<<: *default-logging
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Agregar ML si aplica
|
|
if [[ "$PROJECT_TYPE" == "ml" ]]; then
|
|
cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF
|
|
${SHORT_NAME}-ml:
|
|
build:
|
|
context: ../apps/ml-engine
|
|
dockerfile: Dockerfile
|
|
container_name: ${SHORT_NAME}-ml
|
|
restart: unless-stopped
|
|
expose:
|
|
- "8000"
|
|
environment:
|
|
- ENV=\${ENV:-development}
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.${SHORT_NAME}-ml.rule=Host(\`ml.${SHORT_NAME}.localhost\`)"
|
|
- "traefik.http.services.${SHORT_NAME}-ml.loadbalancer.server.port=8000"
|
|
networks:
|
|
- ${SHORT_NAME}_\${ENV:-local}
|
|
- infra_shared
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Agregar networks
|
|
cat >> "$PROJECT_DIR/docker/docker-compose.yml" << EOF
|
|
networks:
|
|
${SHORT_NAME}_\${ENV:-local}:
|
|
external: true
|
|
infra_shared:
|
|
external: true
|
|
EOF
|
|
|
|
echo -e " ${GREEN}[OK]${NC} docker-compose.yml"
|
|
|
|
# .env.example
|
|
cat > "$PROJECT_DIR/docker/.env.example" << EOF
|
|
# Environment
|
|
NODE_ENV=development
|
|
ENV=local
|
|
|
|
# Database
|
|
DATABASE_URL=postgresql://user:password@postgres:5432/${SHORT_NAME}_db
|
|
|
|
# JWT
|
|
JWT_SECRET=your-secret-key-here
|
|
|
|
# API URL (for frontend)
|
|
REACT_APP_API_URL=http://api.${SHORT_NAME}.localhost
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} .env.example"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# 4. Crear service descriptors placeholder
|
|
# ------------------------------------------------------------------------------
|
|
echo -e "${YELLOW}[4/4] Creando service descriptors...${NC}"
|
|
|
|
if [[ "$PROJECT_TYPE" == "backend" || "$PROJECT_TYPE" == "fullstack" ]]; then
|
|
cat > "$PROJECT_DIR/apps/backend/service.descriptor.yml" << EOF
|
|
# TODO: Completar este service descriptor
|
|
# Ver: control-plane/orchestration/templates/service-descriptor/SERVICE-DESCRIPTOR-TEMPLATE.yml
|
|
|
|
service:
|
|
name: "${SHORT_NAME}-api"
|
|
type: "backend"
|
|
runtime: "node"
|
|
version: "1.0.0"
|
|
description: "TODO: Agregar descripcion"
|
|
owner_agent: "NEXUS-BACKEND"
|
|
|
|
repository:
|
|
name: "${PROJECT_NAME}"
|
|
path: "apps/backend"
|
|
main_branch: "main"
|
|
|
|
ports:
|
|
internal: 3000
|
|
registry_ref: "projects.TODO.api" # TODO: Actualizar
|
|
protocol: "http"
|
|
|
|
# TODO: Completar resto del descriptor
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} apps/backend/service.descriptor.yml (placeholder)"
|
|
fi
|
|
|
|
if [[ "$PROJECT_TYPE" == "frontend" || "$PROJECT_TYPE" == "fullstack" ]]; then
|
|
cat > "$PROJECT_DIR/apps/frontend/service.descriptor.yml" << EOF
|
|
# TODO: Completar este service descriptor
|
|
|
|
service:
|
|
name: "${SHORT_NAME}-web"
|
|
type: "frontend"
|
|
runtime: "static"
|
|
version: "1.0.0"
|
|
description: "TODO: Agregar descripcion"
|
|
owner_agent: "NEXUS-FRONTEND"
|
|
|
|
repository:
|
|
name: "${PROJECT_NAME}"
|
|
path: "apps/frontend"
|
|
main_branch: "main"
|
|
|
|
ports:
|
|
internal: 3001
|
|
registry_ref: "projects.TODO.web" # TODO: Actualizar
|
|
protocol: "http"
|
|
|
|
# TODO: Completar resto del descriptor
|
|
EOF
|
|
echo -e " ${GREEN}[OK]${NC} apps/frontend/service.descriptor.yml (placeholder)"
|
|
fi
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Resultado
|
|
# ------------------------------------------------------------------------------
|
|
echo ""
|
|
echo -e "${BLUE}============================================${NC}"
|
|
echo -e "${GREEN} PROYECTO CREADO: ${PROJECT_NAME}${NC}"
|
|
echo -e "${BLUE}============================================${NC}"
|
|
echo ""
|
|
echo "Proximos pasos:"
|
|
echo " 1. Actualizar service descriptors con valores reales"
|
|
echo " 2. Agregar codigo en apps/"
|
|
echo " 3. Crear Dockerfiles"
|
|
echo " 4. Agregar proyecto a ports.registry.yml"
|
|
echo " 5. cd $PROJECT_DIR/docker && docker-compose up -d"
|
|
echo ""
|