692 lines
18 KiB
Markdown
692 lines
18 KiB
Markdown
|
|
# 🚀 PLAN DE IMPLEMENTACIÓN - Syntaxis como TaskService Integrado
|
||
|
|
|
||
|
|
**Fecha**: 2025-11-20
|
||
|
|
**Estado**: Listo para implementación
|
||
|
|
**Precedencia**: Arquitectura validada en SOLUTION_ARCHITECTURE_CORRECT.md
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📋 Resumen Ejecutivo
|
||
|
|
|
||
|
|
Implementaremos una **arquitectura de 3 capas** que integra syntaxis con provisioning y provctl sin modificaciones forzadas a ninguno de los dos sistemas.
|
||
|
|
|
||
|
|
```
|
||
|
|
CAPA 1 (Provisioning) → KCL TaskService (syntaxis.k)
|
||
|
|
↓ genera
|
||
|
|
CAPA 2 (provctl) → TOML Config (syntaxis-dev.toml)
|
||
|
|
↑ consume
|
||
|
|
CAPA 3 (syntaxis) → Presets (deployment-presets.kcl)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 Objetivos Finales
|
||
|
|
|
||
|
|
1. **Syntaxis es un taskservs en provisioning** - Definido como KCL, consumible por provisioning como cualquier otro servicio
|
||
|
|
2. **provctl puede gestionar syntaxis localmente** - Sin cambios a provctl, usando TOML generado desde KCL
|
||
|
|
3. **Developer elige modo de deployment** - Presets (local/dev/staging/prod) con UX clara
|
||
|
|
4. **Cero recompilación** - Cambios en definición = solo guardar archivo KCL
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📂 CAPA 1: TaskService en Provisioning
|
||
|
|
|
||
|
|
### Ubicación y Estructura
|
||
|
|
|
||
|
|
```
|
||
|
|
/Users/Akasha/project-provisioning/provisioning/extensions/taskservs/development/syntaxis/
|
||
|
|
├── kcl/
|
||
|
|
│ ├── kcl.mod
|
||
|
|
│ ├── kcl.mod.lock
|
||
|
|
│ ├── syntaxis.k ← SCHEMA PRINCIPAL
|
||
|
|
│ ├── dependencies.k ← REQUISITOS DEL SISTEMA
|
||
|
|
│ └── version.k ← VERSIONADO
|
||
|
|
├── default/
|
||
|
|
│ ├── install-syntaxis.sh ← SCRIPT DE INSTALACIÓN
|
||
|
|
│ ├── env-syntaxis.j2 ← TEMPLATE VARIABLES (Tera)
|
||
|
|
│ ├── syntaxis-env.sh ← SETUP ENVIROMENT
|
||
|
|
│ └── health-check.sh ← VALIDACIÓN DE SALUD
|
||
|
|
├── examples/
|
||
|
|
│ ├── syntaxis-dev.k ← EJEMPLO: DESARROLLO
|
||
|
|
│ ├── syntaxis-prod.k ← EJEMPLO: PRODUCCIÓN
|
||
|
|
│ ├── syntaxis-staging.k ← EJEMPLO: STAGING
|
||
|
|
│ └── README.md ← GUÍA DE EJEMPLOS
|
||
|
|
├── README.md ← DOCUMENTACIÓN TASKSERV
|
||
|
|
└── .gitkeep
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.1: Crear estructura base
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
set -e
|
||
|
|
|
||
|
|
TASKSERV_PATH="/Users/Akasha/project-provisioning/provisioning/extensions/taskservs/development/syntaxis"
|
||
|
|
|
||
|
|
# Crear directorios
|
||
|
|
mkdir -p "$TASKSERV_PATH/kcl"
|
||
|
|
mkdir -p "$TASKSERV_PATH/default"
|
||
|
|
mkdir -p "$TASKSERV_PATH/examples"
|
||
|
|
|
||
|
|
# Crear archivos vacíos
|
||
|
|
touch "$TASKSERV_PATH/kcl/kcl.mod"
|
||
|
|
touch "$TASKSERV_PATH/kcl/kcl.mod.lock"
|
||
|
|
touch "$TASKSERV_PATH/.gitkeep"
|
||
|
|
|
||
|
|
echo "✅ Estructura base creada"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.2: Crear kcl/syntaxis.k
|
||
|
|
|
||
|
|
**Basado en**: `/Users/Akasha/project-provisioning/provisioning/extensions/taskservs/development/n8n/kcl/n8n.k`
|
||
|
|
|
||
|
|
**Contenido esperado** (263 líneas como n8n):
|
||
|
|
|
||
|
|
```kcl
|
||
|
|
# syntaxis.k - Syntaxis Project Management Platform TaskService Schema
|
||
|
|
# Version: 1.0.0
|
||
|
|
# Patrón: Similar a n8n.k pero adaptado a servicios de syntaxis
|
||
|
|
|
||
|
|
schema Database:
|
||
|
|
"""Database configuration for Syntaxis"""
|
||
|
|
typ: "sqlite" | "postgres" | "mysql" = "sqlite"
|
||
|
|
host?: str
|
||
|
|
port?: int
|
||
|
|
user?: str = "syntaxis"
|
||
|
|
password?: str
|
||
|
|
path?: str = "/var/lib/syntaxis/db.sqlite"
|
||
|
|
|
||
|
|
schema Cache:
|
||
|
|
"""Cache configuration"""
|
||
|
|
enabled: bool = False
|
||
|
|
typ: "redis" | "memcached" = "redis"
|
||
|
|
host?: str = "127.0.0.1"
|
||
|
|
port?: int = 6379
|
||
|
|
|
||
|
|
schema API:
|
||
|
|
"""REST API Service"""
|
||
|
|
enabled: bool = True
|
||
|
|
port: int = 3000
|
||
|
|
host: str = "127.0.0.1"
|
||
|
|
protocol: "http" | "https" = "http"
|
||
|
|
|
||
|
|
schema TUI:
|
||
|
|
"""Terminal User Interface"""
|
||
|
|
enabled: bool = False
|
||
|
|
|
||
|
|
schema Dashboard:
|
||
|
|
"""Web Dashboard"""
|
||
|
|
enabled: bool = False
|
||
|
|
port: int = 8080
|
||
|
|
|
||
|
|
schema CLI:
|
||
|
|
"""Command Line Interface"""
|
||
|
|
enabled: bool = True
|
||
|
|
|
||
|
|
schema Syntaxis:
|
||
|
|
"""Syntaxis Project Management Platform"""
|
||
|
|
name: str = "syntaxis"
|
||
|
|
version: str = "1.0.0"
|
||
|
|
work_path: str = "/var/lib/syntaxis"
|
||
|
|
|
||
|
|
cli: CLI = { enabled = True }
|
||
|
|
api: API = { enabled = False, port = 3000 }
|
||
|
|
tui: TUI = { enabled = False }
|
||
|
|
dashboard: Dashboard = { enabled = False, port = 8080 }
|
||
|
|
|
||
|
|
db: Database = { typ = "sqlite" }
|
||
|
|
cache: Cache = { enabled = False }
|
||
|
|
|
||
|
|
log_level: str = "info"
|
||
|
|
dependencies: [str] = []
|
||
|
|
|
||
|
|
schema Syntaxis_Dev(Syntaxis):
|
||
|
|
"""Development configuration"""
|
||
|
|
api.enabled = True
|
||
|
|
api.protocol = "http"
|
||
|
|
api.port = 3000
|
||
|
|
|
||
|
|
dashboard.enabled = True
|
||
|
|
dashboard.port = 8080
|
||
|
|
|
||
|
|
db.typ = "sqlite"
|
||
|
|
db.path = "/var/lib/syntaxis/syntaxis-dev.db"
|
||
|
|
|
||
|
|
log_level = "debug"
|
||
|
|
dependencies = ["surrealdb"]
|
||
|
|
|
||
|
|
schema Syntaxis_Production(Syntaxis):
|
||
|
|
"""Production configuration"""
|
||
|
|
api.enabled = True
|
||
|
|
api.protocol = "https"
|
||
|
|
api.port = 443
|
||
|
|
|
||
|
|
dashboard.enabled = True
|
||
|
|
dashboard.port = 8080
|
||
|
|
|
||
|
|
db.typ = "postgres"
|
||
|
|
db.host = "localhost"
|
||
|
|
db.port = 5432
|
||
|
|
db.user = "syntaxis"
|
||
|
|
db.password = "***"
|
||
|
|
|
||
|
|
cache.enabled = True
|
||
|
|
cache.typ = "redis"
|
||
|
|
cache.host = "localhost"
|
||
|
|
cache.port = 6379
|
||
|
|
|
||
|
|
log_level = "warn"
|
||
|
|
dependencies = ["postgres", "redis", "nats"]
|
||
|
|
|
||
|
|
# Instancia para desarrollo
|
||
|
|
syntaxis_dev: Syntaxis = Syntaxis_Dev {
|
||
|
|
name = "syntaxis-dev"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Instancia para producción
|
||
|
|
syntaxis_prod: Syntaxis = Syntaxis_Production {
|
||
|
|
name = "syntaxis-prod"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Archivos de referencia**:
|
||
|
|
- Real n8n schema: `/Users/Akasha/project-provisioning/provisioning/extensions/taskservs/development/n8n/kcl/n8n.k`
|
||
|
|
- Postgres example: `/Users/Akasha/project-provisioning/provisioning/extensions/taskservs/databases/postgres/kcl/postgres.k`
|
||
|
|
|
||
|
|
### Paso 1.3: Crear kcl/dependencies.k
|
||
|
|
|
||
|
|
```kcl
|
||
|
|
# dependencies.k - System requirements for Syntaxis TaskService
|
||
|
|
|
||
|
|
schema SystemRequirement:
|
||
|
|
name: str
|
||
|
|
version: str
|
||
|
|
optional: bool = False
|
||
|
|
|
||
|
|
system_requirements = [
|
||
|
|
SystemRequirement {
|
||
|
|
name = "rust"
|
||
|
|
version = "1.75+"
|
||
|
|
optional = True
|
||
|
|
}
|
||
|
|
SystemRequirement {
|
||
|
|
name = "systemd"
|
||
|
|
version = "latest"
|
||
|
|
optional = False
|
||
|
|
}
|
||
|
|
]
|
||
|
|
|
||
|
|
health_checks = [
|
||
|
|
{
|
||
|
|
type = "http"
|
||
|
|
endpoint = "http://127.0.0.1:3000/health"
|
||
|
|
interval_seconds = 10
|
||
|
|
timeout_seconds = 5
|
||
|
|
}
|
||
|
|
]
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.4: Crear default/install-syntaxis.sh
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
# install-syntaxis.sh - Installation script for Syntaxis TaskService
|
||
|
|
# Template: Will be processed by Tera during provisioning build
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
SYNTAXIS_VERSION="{{version}}"
|
||
|
|
WORK_PATH="{{work_path}}"
|
||
|
|
LOG_LEVEL="{{log_level}}"
|
||
|
|
|
||
|
|
echo "Installing Syntaxis ${SYNTAXIS_VERSION}..."
|
||
|
|
|
||
|
|
# Create directories
|
||
|
|
mkdir -p "${WORK_PATH}"
|
||
|
|
mkdir -p /var/lib/syntaxis/db
|
||
|
|
mkdir -p /var/log/syntaxis
|
||
|
|
|
||
|
|
# Download/install binary
|
||
|
|
# (This would come from actual build/release process)
|
||
|
|
# For now: placeholder
|
||
|
|
echo "✅ Syntaxis installed to ${WORK_PATH}"
|
||
|
|
echo "✅ Log level: ${LOG_LEVEL}"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.5: Crear default/env-syntaxis.j2
|
||
|
|
|
||
|
|
```jinja2
|
||
|
|
{# env-syntaxis.j2 - Environment variables template for Syntaxis #}
|
||
|
|
{# Processed by Tera during provisioning build #}
|
||
|
|
|
||
|
|
# Syntaxis Environment Configuration
|
||
|
|
export SYNTAXIS_WORK_PATH="{{ work_path }}"
|
||
|
|
export SYNTAXIS_LOG_LEVEL="{{ log_level }}"
|
||
|
|
|
||
|
|
# API Configuration
|
||
|
|
export SYNTAXIS_API_ENABLED="{{ api.enabled }}"
|
||
|
|
export SYNTAXIS_API_PORT="{{ api.port }}"
|
||
|
|
export SYNTAXIS_API_HOST="{{ api.host }}"
|
||
|
|
export SYNTAXIS_API_PROTOCOL="{{ api.protocol }}"
|
||
|
|
|
||
|
|
# Database Configuration
|
||
|
|
export SYNTAXIS_DB_TYPE="{{ db.typ }}"
|
||
|
|
{% if db.typ == "sqlite" %}
|
||
|
|
export DATABASE_URL="sqlite://{{ db.path }}"
|
||
|
|
{% elif db.typ == "postgres" %}
|
||
|
|
export DATABASE_URL="postgres://{{ db.user }}@{{ db.host }}:{{ db.port }}/syntaxis"
|
||
|
|
{% endif %}
|
||
|
|
|
||
|
|
# Cache Configuration
|
||
|
|
export SYNTAXIS_CACHE_ENABLED="{{ cache.enabled }}"
|
||
|
|
{% if cache.enabled %}
|
||
|
|
export REDIS_URL="redis://{{ cache.host }}:{{ cache.port }}"
|
||
|
|
{% endif %}
|
||
|
|
|
||
|
|
# Logging
|
||
|
|
export RUST_LOG="{{ log_level }}"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.6: Crear examples/syntaxis-dev.k
|
||
|
|
|
||
|
|
```kcl
|
||
|
|
# examples/syntaxis-dev.k - Development preset configuration
|
||
|
|
|
||
|
|
import ..kcl.syntaxis as sx
|
||
|
|
|
||
|
|
# Development configuration instance
|
||
|
|
config_dev: sx.Syntaxis = sx.Syntaxis_Dev {
|
||
|
|
name = "syntaxis-dev"
|
||
|
|
version = "latest"
|
||
|
|
work_path = "/var/lib/syntaxis"
|
||
|
|
log_level = "debug"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 1.7: Crear examples/syntaxis-prod.k
|
||
|
|
|
||
|
|
```kcl
|
||
|
|
# examples/syntaxis-prod.k - Production preset configuration
|
||
|
|
|
||
|
|
import ..kcl.syntaxis as sx
|
||
|
|
|
||
|
|
# Production configuration instance
|
||
|
|
config_prod: sx.Syntaxis = sx.Syntaxis_Production {
|
||
|
|
name = "syntaxis-prod"
|
||
|
|
version = "1.0.0"
|
||
|
|
work_path = "/var/lib/syntaxis"
|
||
|
|
log_level = "warn"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📂 CAPA 2: Configuración para provctl
|
||
|
|
|
||
|
|
### Ubicación y Estructura
|
||
|
|
|
||
|
|
```
|
||
|
|
/Users/Akasha/Development/provctl/examples/stage1-extended-definitions/
|
||
|
|
├── syntaxis-local-dev.toml ← DESARROLLO LOCAL
|
||
|
|
├── syntaxis-staging.toml ← STAGING
|
||
|
|
├── syntaxis-prod.toml ← PRODUCCIÓN
|
||
|
|
└── README.md ← DOCUMENTACIÓN
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 2.1: Crear syntaxis-local-dev.toml
|
||
|
|
|
||
|
|
**Basado en**: `/Users/Akasha/Development/provctl/examples/stage1-extended-definitions/minimal-app.toml`
|
||
|
|
|
||
|
|
```toml
|
||
|
|
# syntaxis-local-dev.toml
|
||
|
|
# Configuration for syntaxis in local development environment
|
||
|
|
# Consumed by: provctl
|
||
|
|
# Generated from: provisioning/extensions/taskservs/development/syntaxis/kcl/syntaxis.k
|
||
|
|
|
||
|
|
[service]
|
||
|
|
name = "syntaxis-api"
|
||
|
|
binary = "/usr/local/bin/syntaxis-api"
|
||
|
|
args = ["--bind", "127.0.0.1:3000", "--log-level", "debug"]
|
||
|
|
working_directory = "/var/lib/syntaxis"
|
||
|
|
restart_strategy = "on_failure"
|
||
|
|
restart_delay_seconds = 5
|
||
|
|
|
||
|
|
[service.env_vars]
|
||
|
|
DATABASE_URL = "sqlite:///var/lib/syntaxis/syntaxis-dev.db"
|
||
|
|
RUST_LOG = "debug"
|
||
|
|
SYNTAXIS_LOG_LEVEL = "debug"
|
||
|
|
SYNTAXIS_WORK_PATH = "/var/lib/syntaxis"
|
||
|
|
|
||
|
|
[service.user]
|
||
|
|
name = "syntaxis"
|
||
|
|
uid = 1001
|
||
|
|
gid = 1001
|
||
|
|
home = "/var/lib/syntaxis"
|
||
|
|
|
||
|
|
[[health_checks]]
|
||
|
|
type = "http"
|
||
|
|
endpoint = "http://127.0.0.1:3000/health"
|
||
|
|
interval_seconds = 10
|
||
|
|
timeout_seconds = 5
|
||
|
|
unhealthy_threshold = 3
|
||
|
|
|
||
|
|
[[data_services]]
|
||
|
|
name = "surrealdb"
|
||
|
|
type = "SurrealDB"
|
||
|
|
url = "http://127.0.0.1:8000"
|
||
|
|
required = false
|
||
|
|
|
||
|
|
[networking]
|
||
|
|
port_bindings = [
|
||
|
|
{ service_port = 3000, host_port = 3000, protocol = "tcp" }
|
||
|
|
]
|
||
|
|
|
||
|
|
[logging]
|
||
|
|
enabled = true
|
||
|
|
output_path = "/var/log/syntaxis/api.log"
|
||
|
|
level = "debug"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 2.2: Crear syntaxis-prod.toml
|
||
|
|
|
||
|
|
```toml
|
||
|
|
# syntaxis-prod.toml
|
||
|
|
# Configuration for syntaxis in production environment
|
||
|
|
# Consumed by: provctl
|
||
|
|
# Generated from: provisioning/extensions/taskservs/development/syntaxis/kcl/syntaxis.k
|
||
|
|
|
||
|
|
[service]
|
||
|
|
name = "syntaxis-api"
|
||
|
|
binary = "/usr/local/bin/syntaxis-api"
|
||
|
|
args = ["--bind", "0.0.0.0:3000", "--log-level", "warn"]
|
||
|
|
working_directory = "/var/lib/syntaxis"
|
||
|
|
restart_strategy = "always"
|
||
|
|
restart_delay_seconds = 10
|
||
|
|
|
||
|
|
[service.env_vars]
|
||
|
|
DATABASE_URL = "postgres://syntaxis:***@postgres.local:5432/syntaxis"
|
||
|
|
RUST_LOG = "warn"
|
||
|
|
SYNTAXIS_LOG_LEVEL = "warn"
|
||
|
|
SYNTAXIS_WORK_PATH = "/var/lib/syntaxis"
|
||
|
|
|
||
|
|
[service.user]
|
||
|
|
name = "syntaxis"
|
||
|
|
uid = 1001
|
||
|
|
gid = 1001
|
||
|
|
home = "/var/lib/syntaxis"
|
||
|
|
|
||
|
|
[[health_checks]]
|
||
|
|
type = "http"
|
||
|
|
endpoint = "http://127.0.0.1:3000/health"
|
||
|
|
interval_seconds = 30
|
||
|
|
timeout_seconds = 10
|
||
|
|
unhealthy_threshold = 5
|
||
|
|
|
||
|
|
[[data_services]]
|
||
|
|
name = "postgres"
|
||
|
|
type = "PostgreSQL"
|
||
|
|
url = "postgres://localhost:5432"
|
||
|
|
required = true
|
||
|
|
|
||
|
|
[[data_services]]
|
||
|
|
name = "redis"
|
||
|
|
type = "Redis"
|
||
|
|
url = "redis://127.0.0.1:6379"
|
||
|
|
required = true
|
||
|
|
|
||
|
|
[networking]
|
||
|
|
port_bindings = [
|
||
|
|
{ service_port = 3000, host_port = 3000, protocol = "tcp" }
|
||
|
|
]
|
||
|
|
|
||
|
|
[logging]
|
||
|
|
enabled = true
|
||
|
|
output_path = "/var/log/syntaxis/api.log"
|
||
|
|
level = "warn"
|
||
|
|
rotation = "daily"
|
||
|
|
retention_days = 30
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📂 CAPA 3: Presets en Syntaxis
|
||
|
|
|
||
|
|
### Ubicación y Estructura
|
||
|
|
|
||
|
|
```
|
||
|
|
/Users/Akasha/Development/syntaxis/configs/
|
||
|
|
├── deployment-presets.kcl ← PRESETS DECLARATIVOS (NUEVO)
|
||
|
|
└── database.toml ← (Existente)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Paso 3.1: Crear deployment-presets.kcl
|
||
|
|
|
||
|
|
```kcl
|
||
|
|
# configs/deployment-presets.kcl
|
||
|
|
# Deployment mode presets for Syntaxis
|
||
|
|
# Consumed by: syntaxis-installer
|
||
|
|
# Defines different deployment scenarios (local, dev, staging, production)
|
||
|
|
|
||
|
|
schema DeploymentMode:
|
||
|
|
"""Defines how syntaxis should be deployed"""
|
||
|
|
name: str
|
||
|
|
description: str
|
||
|
|
services_enabled: [str] # Which services to enable
|
||
|
|
manager: "manual" | "provctl" | "provisioning" = "manual"
|
||
|
|
auto_start: bool = False
|
||
|
|
health_checks_enabled: bool = False
|
||
|
|
|
||
|
|
# LOCAL: CLI only (manual, no daemon)
|
||
|
|
mode_local: DeploymentMode = {
|
||
|
|
name = "local"
|
||
|
|
description = "Single machine, CLI only (manual execution)"
|
||
|
|
services_enabled = ["cli"]
|
||
|
|
manager = "manual"
|
||
|
|
auto_start = False
|
||
|
|
health_checks_enabled = False
|
||
|
|
}
|
||
|
|
|
||
|
|
# DEVELOPMENT: Full stack with provctl
|
||
|
|
mode_dev: DeploymentMode = {
|
||
|
|
name = "dev"
|
||
|
|
description = "Full development stack with provctl orchestration"
|
||
|
|
services_enabled = ["cli", "api", "tui", "dashboard", "database"]
|
||
|
|
manager = "provctl"
|
||
|
|
auto_start = True
|
||
|
|
health_checks_enabled = True
|
||
|
|
}
|
||
|
|
|
||
|
|
# STAGING: Multi-machine with provisioning
|
||
|
|
mode_staging: DeploymentMode = {
|
||
|
|
name = "staging"
|
||
|
|
description = "Staging environment on multiple machines"
|
||
|
|
services_enabled = ["cli", "api", "dashboard", "database", "cache"]
|
||
|
|
manager = "provisioning"
|
||
|
|
auto_start = True
|
||
|
|
health_checks_enabled = True
|
||
|
|
}
|
||
|
|
|
||
|
|
# PRODUCTION: HA with provisioning
|
||
|
|
mode_production: DeploymentMode = {
|
||
|
|
name = "production"
|
||
|
|
description = "Production environment with high availability"
|
||
|
|
services_enabled = ["api", "dashboard", "database", "cache", "nats"]
|
||
|
|
manager = "provisioning"
|
||
|
|
auto_start = True
|
||
|
|
health_checks_enabled = True
|
||
|
|
}
|
||
|
|
|
||
|
|
# All presets
|
||
|
|
deployment_modes = {
|
||
|
|
local = mode_local
|
||
|
|
dev = mode_dev
|
||
|
|
staging = mode_staging
|
||
|
|
production = mode_production
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔄 Paso 4: Integración - Conexión entre Capas
|
||
|
|
|
||
|
|
### 4.1: Generación TOML desde KCL (En provisioning build)
|
||
|
|
|
||
|
|
**En provisioning CI/build pipeline** (pseudocódigo):
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Compilar KCL schema
|
||
|
|
kcl compile provisioning/extensions/taskservs/development/syntaxis/kcl/syntaxis.k
|
||
|
|
|
||
|
|
# 2. Generar TOML para provctl usando Tera template
|
||
|
|
for preset in dev staging prod; do
|
||
|
|
kcl_values=$(kcl export syntaxis_$preset)
|
||
|
|
tera --template default/env-syntaxis.j2 \
|
||
|
|
--values $kcl_values \
|
||
|
|
--output generated/provctl/syntaxis-${preset}.toml
|
||
|
|
done
|
||
|
|
|
||
|
|
# 3. Validar TOML generado
|
||
|
|
provctl config validate generated/provctl/syntaxis-*.toml
|
||
|
|
|
||
|
|
echo "✅ Generated TOML configurations for provctl"
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4.2: Consumo en syntaxis-installer
|
||
|
|
|
||
|
|
**En syntaxis-installer** (pseudocódigo):
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Load deployment presets
|
||
|
|
let presets = load_kcl("syntaxis/configs/deployment-presets.kcl");
|
||
|
|
|
||
|
|
// Ask user which mode
|
||
|
|
let selected = user_choose_preset(presets);
|
||
|
|
|
||
|
|
// Check if provctl available
|
||
|
|
if provctl_available() && selected.manager == "provctl" {
|
||
|
|
// Auto-configure with provctl
|
||
|
|
let config = load_toml(&format!("provctl/syntaxis-{}.toml", selected.name));
|
||
|
|
provctl::apply(config)?;
|
||
|
|
} else if selected.manager == "provisioning" {
|
||
|
|
// Guide for provisioning setup
|
||
|
|
println!("Use provisioning for this mode...");
|
||
|
|
} else {
|
||
|
|
// Manual setup
|
||
|
|
println!("Manual setup instructions...");
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## ✅ Checklist de Implementación
|
||
|
|
|
||
|
|
### Fase 1: Crear TaskService (Provisioning)
|
||
|
|
- [ ] Crear estructura base en `/provisioning/extensions/taskservs/development/syntaxis/`
|
||
|
|
- [ ] Crear `kcl/syntaxis.k` con schemas (base + dev + prod)
|
||
|
|
- [ ] Crear `kcl/dependencies.k` con requisitos
|
||
|
|
- [ ] Crear `default/install-syntaxis.sh`
|
||
|
|
- [ ] Crear `default/env-syntaxis.j2` template
|
||
|
|
- [ ] Crear ejemplos en `examples/`
|
||
|
|
- [ ] Validar KCL compila sin errores
|
||
|
|
- [ ] Documentar en `README.md`
|
||
|
|
|
||
|
|
### Fase 2: Crear Configs provctl
|
||
|
|
- [ ] Crear `syntaxis-local-dev.toml` en provctl
|
||
|
|
- [ ] Crear `syntaxis-prod.toml` en provctl
|
||
|
|
- [ ] Crear `syntaxis-staging.toml` en provctl
|
||
|
|
- [ ] Validar TOML syntax
|
||
|
|
- [ ] Probar con `provctl config validate`
|
||
|
|
|
||
|
|
### Fase 3: Crear Presets en syntaxis
|
||
|
|
- [ ] Crear `syntaxis/configs/deployment-presets.kcl`
|
||
|
|
- [ ] Definir 4 modos (local, dev, staging, production)
|
||
|
|
- [ ] Validar KCL compila
|
||
|
|
- [ ] Documentar en README
|
||
|
|
|
||
|
|
### Fase 4: Integración
|
||
|
|
- [ ] Configurar generación TOML en provisioning build
|
||
|
|
- [ ] Agregar script de validación TOML
|
||
|
|
- [ ] Extender syntaxis-installer para leer presets
|
||
|
|
- [ ] Implementar detección de provctl
|
||
|
|
- [ ] Implementar flujo de aplicación automática
|
||
|
|
- [ ] Crear tests de integración
|
||
|
|
|
||
|
|
### Fase 5: Testing & Validation
|
||
|
|
- [ ] Unit tests para cada KCL schema
|
||
|
|
- [ ] Integration tests: KCL → TOML → provctl
|
||
|
|
- [ ] E2E test: installer completo
|
||
|
|
- [ ] Documentar ejemplos de uso
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 Matrices de Decisión
|
||
|
|
|
||
|
|
### ¿KCL o YAML para presets?
|
||
|
|
|
||
|
|
| Aspecto | KCL | YAML |
|
||
|
|
|---------|-----|------|
|
||
|
|
| Type-safety | ✅ Nativo | ❌ Ninguna |
|
||
|
|
| Validation | ✅ Nativo | ❌ Manual |
|
||
|
|
| Consistency | ✅ Enforced | ⚠️ Conventions |
|
||
|
|
| Learning curve | ⚠️ Moderate | ✅ Low |
|
||
|
|
| Ecosystem fit | ✅ Already using | ⚠️ Different |
|
||
|
|
|
||
|
|
**Decisión**: **KCL** (aprovecha inversión existente en provisioning)
|
||
|
|
|
||
|
|
### ¿Generar TOML en build o runtime?
|
||
|
|
|
||
|
|
| Aspecto | Build time | Runtime |
|
||
|
|
|---------|-----------|---------|
|
||
|
|
| Performance | ✅ Fast | ⚠️ Slower |
|
||
|
|
| Consistency | ✅ Deterministic | ⚠️ Variable |
|
||
|
|
| Debugging | ✅ Static | ⚠️ Dynamic |
|
||
|
|
| Flexibility | ⚠️ Fixed | ✅ Dynamic |
|
||
|
|
|
||
|
|
**Decisión**: **Build time** (Option A en PROVCTL_KCL_INTEGRATION.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 Resultado Final
|
||
|
|
|
||
|
|
Después de completar todos los pasos:
|
||
|
|
|
||
|
|
```
|
||
|
|
syntaxis-installer --preset dev
|
||
|
|
↓
|
||
|
|
1. Lee deployment-presets.kcl
|
||
|
|
2. Muestra opción: "¿Quieres desarrollo automático con provctl?"
|
||
|
|
3. Si SÍ:
|
||
|
|
- Detecta provctl disponible
|
||
|
|
- Carga syntaxis/configs/deployment-presets.kcl
|
||
|
|
- Lee provisioning taskserv (syntaxis.k)
|
||
|
|
- Obtiene config TOML generada (syntaxis-dev.toml)
|
||
|
|
- Ejecuta: provctl config apply syntaxis-dev.toml
|
||
|
|
- Inicia servicios automáticamente
|
||
|
|
✅ "Listo para usar"
|
||
|
|
4. Si NO:
|
||
|
|
- Muestra guía manual para configuración
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔗 Documentos Relacionados
|
||
|
|
|
||
|
|
- **SOLUTION_ARCHITECTURE_CORRECT.md** - Arquitectura detallada con ejemplos
|
||
|
|
- **PROVCTL_KCL_INTEGRATION.md** - Respuesta a "¿Provctl necesita cambios?"
|
||
|
|
- **CURRENT_STATE_ANALYSIS.md** - Análisis de estado actual
|
||
|
|
- **README_CLEAN.md** - Resumen ejecutivo
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📝 Notas Importantes
|
||
|
|
|
||
|
|
1. **No hay cambios a provctl** - Solo consumir TOML generado
|
||
|
|
2. **No hay cambios a provisioning** - Solo usar patrón existente (taskservs)
|
||
|
|
3. **No hay recompilación** - Cambios en KCL = solo guardar archivo
|
||
|
|
4. **Reutilizable** - Otros proyectos pueden seguir el mismo patrón
|
||
|
|
5. **Fallback graceful** - Si no hay provctl/provisioning, guía manual
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Siguiente paso**: Proceder con Fase 1 (Crear TaskService en provisioning)
|