workspace-v1/control-plane/devtools/scripts/bootstrap/init-project.sh
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
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>
2025-12-23 00:35:19 -06:00

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 ""