Merge _configs/ into config/ for single configuration directory. Update all path references. Changes: - Move _configs/* to config/ - Update .gitignore for new patterns - No code references to _configs/ found Impact: -1 root directory (layout_conventions.md compliance)
9.8 KiB
✅ RESUMEN FINAL - Arquitectura Correcta Implementada
Fecha: 2025-11-20 Estado: ✅ Documentación Completa y Validada Basado en: Análisis ultrathink + detalles reales del TOML existente
🎯 La Solución Correcta
Problema: Syntaxis necesita una forma declarativa de describir sus servicios, presets y requisitos.
Solución: Módulos KCL modular en syntaxis/configs/*.k
- ✅ Única fuente de verdad
- ✅ Validación nativa en KCL (compile-time)
- ✅ Defaults inteligentes y herencia
- ✅ Generación ON-DEMAND (kcl run → YAML/JSON en stdout)
- ✅ SIN archivos generados/guardados (evita doble verdad)
- ✅ Templates Tera para adaptación a provisioning/provctl/installer
- ✅ NuShell scripts para export on-demand
📁 9 Archivos a Crear
KCL Modules (5 archivos)
| # | Archivo | Ubicación | Contenido |
|---|---|---|---|
| 1 | schemas.k |
syntaxis/configs/ |
6 schemas: Service, Database, Cache, Preset, Deployment + validación nativa |
| 2 | defaults.k |
syntaxis/configs/ |
6 servicios, 3 BDs, 1 caché, 4 presets (basados en services-catalog.toml) |
| 3 | services.k |
syntaxis/configs/ |
Referencia a defaults (permitir personalización futura) |
| 4 | presets.k |
syntaxis/configs/ |
Presets personalizables (local/dev/staging/prod) |
| 5 | deployment.k |
syntaxis/configs/ |
Declaración principal + exports |
Resultado: 5 módulos KCL que definen completamente syntaxis
Tera Templates (3 archivos)
| # | Archivo | Ubicación | Propósito |
|---|---|---|---|
| 6 | provisioning-config.j2 |
syntaxis/templates/ |
Genera config para provisioning |
| 7 | provctl-config.j2 |
syntaxis/templates/ |
Genera TOML para provctl |
| 8 | installer-settings.j2 |
syntaxis/templates/ |
Genera JSON para installer interactivo |
Resultado: 3 templates para adaptar KCL a diferentes consumidores
NuShell Script (1 archivo)
| # | Archivo | Ubicación | Propósito |
|---|---|---|---|
| 9 | export-config.nu |
syntaxis/scripts/ |
On-demand export KCL → YAML/JSON |
Resultado: 1 script para exportación ephemeral (no almacenada)
🔑 Características Principales
1. Validación Nativa en KCL
schema Service:
name: str
type: "cli" | "tui" | "server" | "web" | "database" | "messaging"
port?: int
# Validación compile-time
check: port is not None if type in ["server", "web", "database"]
check: 1 <= port <= 65535 if port is not None
Ventaja: Errores detectados en compilación, no en runtime.
2. Defaults Inteligentes
default_services: {str: schemas.Service} = {
cli = schemas.Service {
name = "syntaxis-cli"
display_name = "syntaxis CLI"
description = "..."
type = "cli"
enabled = True
platform_support = ["linux", "macos", "windows"]
min_memory_mb = 64
# ... 15+ campos con valores por defecto
}
# ... más servicios
}
Ventaja: No repetir defaults en TOML/YAML. Una sola verdad.
3. Herencia de Presets
# defaults.k define base_presets
# presets.k puede refinar
presets: {str: schemas.Preset} = {
dev = defaults.base_presets.dev {
# Override específicos si es necesario
}
}
Ventaja: Presets derivados de base, mantenibles, componibles.
4. Generación On-Demand
# NO se generan archivos guardados:
kcl run syntaxis/configs/deployment.k # → JSON en stdout
nu scripts/export-config.nu yaml # → YAML en stdout
# Resultado: ephemeral (temporal), no en repo
# La verdad declarada = syntaxis/configs/*.k
Ventaja: Un solo lugar a mantener. Sin sincronización.
5. Consumo Adaptativo
provisioning:
Lee: syntaxis/configs/*.k directamente
Valida: Contra esquemas provisioning
Genera: Config provisioning-específica
provctl:
Llama: NuShell script (kcl run)
Obtiene: YAML (temporal)
Usa: Tera template para adaptar
Genera: Config provctl (temporal, no guardado)
syntaxis-installer:
Lee: syntaxis/configs/deployment.k
Ofrece: Presets interactivos
Pregunta: Parámetros específicos
Usa: Tera templates para settings
Genera: Config adaptada a elección del user
Ventaja: Cada herramienta se adapta, sin cambios a syntaxis.
📊 Servicios Reales (del TOML existente)
Los 6 servicios están basados en detalles reales del services-catalog.toml:
1. syntaxis-cli
- Type: cli
- Enabled by default: ✅ True
- Min Memory: 64 MB
- Database: Required (sqlite, surrealdb)
- Config location: ~/.config/syntaxis
2. syntaxis-tui
- Type: tui
- Min Memory: 128 MB
- Requires: syntaxis-cli
- Platforms: linux, macos (no windows)
- Config location: ~/.config/syntaxis
3. syntaxis-api
- Type: server
- Port: 3000
- Health check: GET /health (200)
- Min Memory: 256 MB
- Background service: ✅
- Database: Required (sqlite, surrealdb)
4. syntaxis-dashboard
- Type: web
- Port: 8080
- Requires: syntaxis-api
- Health check: GET / (200)
- Min Memory: 128 MB
- Background service: ✅
5. surrealdb
- Type: database
- Port: 8000
- Health check: GET / (200)
- Min Memory: 256 MB
- Platforms: linux, macos
- Background service: ✅
6. nats
- Type: messaging
- Port: 4222
- Health check: GET /healthz@8222 (200)
- Min Memory: 256 MB
- Platforms: linux, macos
- Background service: ✅
🎬 Presets Reales (de patterns en TOML)
Local: CLI Only
Services: [cli]
Manager: manual
Use cases: CI/CD, Headless servers
Dev: Development with API
Services: [cli, tui, api, dashboard, surrealdb]
Manager: provctl
Database: sqlite
Cache: disabled
Use cases: Team development, API testing, Dashboard dev
Staging: Multi-machine
Services: [cli, api, dashboard, surrealdb, nats]
Manager: provisioning
Database: postgres
Cache: enabled (redis)
Use cases: Integration testing, Load testing
Production: Minimal
Services: [api, surrealdb, nats]
Manager: provisioning
Database: postgres
Cache: enabled (redis)
Use cases: Kubernetes, Docker, Cloud
💡 Cómo Funciona en Práctica
Scenario 1: Developer Local (provisioning no disponible)
$ syntaxis-installer --preset dev
✅ Detecta: provctl disponible
✅ Lee: syntaxis/configs/deployment.k
✅ Pregunta: "¿Base de datos? [sqlite/postgres]"
User responde: sqlite
✅ Ejecuta:
$ kcl run syntaxis/configs/deployment.k > /tmp/deployment.json
$ tera --template provisioning-config.j2 \
--input /tmp/deployment.json \
--values database_type=sqlite \
> /tmp/provctl-config.toml
$ provctl config apply /tmp/provctl-config.toml
$ rm /tmp/* # No guardar temporales
✅ Resultado: Servicios dev corriendo localmente vía provctl
Clave: Configuración generada on-demand, no almacenada.
Scenario 2: Workspace con provisioning
# En provisioning/kcl/workspace.k
import /path/to/syntaxis/configs/deployment as sx
# Usar declaración KCL de syntaxis
syntaxis_config = sx.deployment
# provisioning valida y orquesta
# (Lee KCL directamente, sin conversión)
# Resultado: syntaxis integrada en infra como proyecto más
Clave: provisioning lee KCL directamente, sin cambios.
Scenario 3: NuShell Integration
# Exportar cuando algo lo necesita:
def export-syntaxis [format: string = "yaml"] {
kcl run syntaxis/configs/deployment.k --format json \
| from json | to $format
}
# Uso:
export-syntaxis yaml > /tmp/deployment.yaml # Temporal
export-syntaxis json | to yaml # Pipe directo
Clave: Export en stdout, no archivos persistentes.
✅ Por Qué Es Correcto
| Aspecto | ❌ TOML compilado | ✅ KCL Modular |
|---|---|---|
| Fuente de verdad | Dispersa, confusa | KCL, única, clara |
| Validación | TOML sin validación | KCL compile-time |
| Defaults | Repetidos en TOML | Herencia en KCL |
| Herencia | No existe | Native en schemas |
| Generación | Almacenada (ruido) | On-demand (ephemeral) |
| Mantenimiento | Múltiples archivos | Un main (deployment.k) |
| Adaptación | Fija | Parametrizada |
| Reutilización | Limitada | Modular, importable |
🚀 Próximos Pasos
-
Crear 5 módulos KCL (Fase 1)
- Seguir IMPLEMENTATION_CORRECT.md, Pasos 1.1-1.5
- Validar compilación de cada uno
-
Crear 3 templates Tera (Fase 2)
- Seguir IMPLEMENTATION_CORRECT.md, Pasos 2.1-2.3
- Validar render
-
Crear 1 script NuShell (Fase 3)
- Seguir IMPLEMENTATION_CORRECT.md, Paso 3.1
- Validar export
-
Integrar con syntaxis-installer (Fase 4)
- Cargar deployment.k
- Ofrecer presets
- Ejecutar en modo dev/prod
-
Integrar con provisioning (Fase 5, si existe workspace)
- Importar deployment.k
- Validar contra esquemas
- Orquestar
📚 Documentos de Referencia
- ARCHITECTURE_CORRECT_FINAL.md - Arquitectura completa + ejemplos
- IMPLEMENTATION_CORRECT.md - Pasos exactos para crear 9 archivos
🎓 Conceptos Clave
KCL como Lenguaje Declarativo
- Type-safe (no JSON)
- Validación nativa
- Schemas con herencia
- Templates Tera para adaptación
Modularidad
- Imports entre módulos
- Reutilización de schemas
- Composición de presets
On-Demand Generation
- No almacenar outputs
- Mantener única fuente de verdad
- Adaptar per-consumidor
Consumo Adaptativo
- provisioning: KCL directo
- provctl: YAML via NuShell
- installer: parametrizado
- Cada uno adapta sin cambios
Arquitectura validada. Lista para implementar. ✅
Lee IMPLEMENTATION_CORRECT.md y comienza a crear los 9 archivos.