# ZCATCONFIG - Sistema de Configuracion Declarativo > **IMPORTANTE PARA CLAUDE**: Lee la seccion "PROTOCOLO DE INICIO" antes de hacer cualquier cosa. --- ## PROTOCOLO DE INICIO (LEER PRIMERO) ### Paso 1: Leer normas del equipo ``` /mnt/cello2/arno/re/recode/teamdocs/LAST_UPDATE.md ``` ### Paso 2: Verificar estado del proyecto ```bash cd /mnt/cello2/arno/re/recode/zig/zcatconfig git status git log --oneline -5 PATH=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2:$PATH zig build test ``` --- ## INFORMACION DEL PROYECTO | Campo | Valor | |-------|-------| | **Nombre** | zcatconfig | | **Version** | v0.2.1 | | **Fecha inicio** | 2025-12-17 | | **Estado** | FUNCIONAL - Integrado en zsimifactu | | **Lenguaje** | Zig 0.15.2 | | **Dependencias** | Ninguna (Zig puro) | ### Descripcion **zcatconfig** es una libreria para gestion de configuracion declarativa: - Definicion de variables con metadatos (tipo, default, descripcion, categoria) - Persistencia a archivo de texto legible con comentarios - Validacion de valores (rangos, enums, tipos) - Sistema Get/Set generico con inline for + @field - **ConfigManager**: Gestor autonomo con observers y auto-save - **FileWatcher**: Detecta cambios en archivo via mtime (hot-reload) - **loadFromString**: Carga config desde string embebido --- ## ORIGEN: zsimifactu config/ Esta libreria extrae y generaliza el sistema de configuracion implementado en zsimifactu. ### Archivos originales en zsimifactu: ``` src/config/ ├── config.zig # Re-exports publicos ├── types.zig # ConfigVariable, ConfigVarType, Color ├── variables.zig # Definiciones declarativas (proyecto-especifico) ├── structures.zig # Config struct (proyecto-especifico) ├── engine.zig # Meta-engine Get/Set con validacion └── persistence.zig # Load/Save archivo texto ``` ### Que se extrae a zcatconfig: - types.zig (completo) - engine.zig (generalizado) - persistence.zig (generalizado) ### Que queda en el proyecto consumidor: - variables.zig (definiciones especificas del proyecto) - structures.zig (struct Config especifico) --- ## ARQUITECTURA ``` ┌─────────────────────────────────────────────────────────────────┐ │ PROYECTO CONSUMIDOR │ │ │ │ variables.zig: │ │ pub const config_variables = [_]ConfigVariable{ │ │ .{ .name = "auto_save", .var_type = .boolean, ... }, │ │ .{ .name = "font_size", .var_type = .integer, ... }, │ │ }; │ │ │ │ structures.zig: │ │ pub const Config = struct { │ │ auto_save: bool = true, │ │ font_size: i32 = 14, │ │ }; │ ├─────────────────────────────────────────────────────────────────┤ │ ZCATCONFIG │ │ │ │ types.zig: │ │ ConfigVariable, ConfigVarType, ConfigResult, Color │ │ │ │ engine.zig: │ │ Engine(comptime variables, comptime ConfigStruct) │ │ - get(), set(), getByName(), setByName() │ │ - Validacion automatica │ │ │ │ persistence.zig: │ │ - load(config, path, variables) │ │ - save(config, path, variables) │ │ - Formato: @variable_name: valor # comentario │ └─────────────────────────────────────────────────────────────────┘ ``` --- ## API PROPUESTA ### Uso basico ```zig const zcatconfig = @import("zcatconfig"); // En el proyecto consumidor: const variables = @import("config/variables.zig"); const Config = @import("config/structures.zig").Config; // Crear engine tipado const Engine = zcatconfig.Engine(variables.config_variables, Config); // Uso var config = Config{}; Engine.load(&config, "app_config.txt") catch {}; config.font_size = 16; try Engine.save(&config, "app_config.txt"); ``` ### Tipos de variables soportados | Tipo | Zig Type | Formato archivo | |------|----------|-----------------| | boolean | bool | Si/No | | integer | i32 | 123 | | float | f32 | 1.5 | | string | []const u8 | texto libre | | color | Color | RGB(r,g,b) | | enum_tipo | enum | NombreVariante | --- ## COMANDOS ```bash # Compilar PATH=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2:$PATH zig build # Tests PATH=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2:$PATH zig build test ``` --- ## RUTAS ```bash # Este proyecto /mnt/cello2/arno/re/recode/zig/zcatconfig/ # Proyecto origen (referencia) /mnt/cello2/arno/re/recode/zig/zsimifactu/src/config/ # Documentacion equipo /mnt/cello2/arno/re/recode/teamdocs/ ``` --- ## PLAN DE TRABAJO ### Fase 1: Estructura base ✅ - [x] Crear proyecto (build.zig, CLAUDE.md) - [x] Extraer types.zig de zsimifactu - [x] Adaptar engine.zig (parametrizar variables y Config) - [x] Adaptar persistence.zig ### Fase 2: Generalizacion ✅ - [x] Engine generico con comptime - [x] Tests unitarios - [x] Documentacion API ### Fase 3: Integracion ✅ - [x] Integrar en zsimifactu como dependencia - [x] Verificar que zsimifactu funciona igual ### Fase 4: ConfigManager ✅ - [x] ConfigManager con loadOrCreate, auto-save, observers - [x] Sistema de observers con contexto - [x] isDirty tracking ### Fase 5: FileWatcher + Utils ✅ - [x] FileWatcher para hot-reload (mtime polling) - [x] loadFromString para defaults embebidos - [x] updateMtime para evitar auto-detectar cambios propios --- ## API PRINCIPAL ### ConfigManager (gestor autonomo) ```zig const zcatconfig = @import("zcatconfig"); // Crear ConfigManager tipado const MyConfigManager = zcatconfig.ConfigManager(&variables, MyConfig, "mi_app"); // Inicializar (carga o crea archivo) var manager = try MyConfigManager.init(allocator, "config.txt"); defer manager.deinit(); // Auto-save si dirty // Acceso const cfg = manager.getConfig(); try manager.set("@mi_variable", "nuevo_valor"); // Observers manager.addObserver(myCallback, my_context); ``` ### FileWatcher (hot-reload) ```zig var watcher = zcatconfig.FileWatcher.init("config.txt", 1000); // check cada 1s // En main loop: if (watcher.checkForChanges()) { // Recargar configuracion } // Despues de guardar: watcher.updateMtime(); // Evitar detectar nuestro propio cambio ``` ### loadFromString (defaults embebidos) ```zig const defaults = @embedFile("defaults.txt"); zcatconfig.loadFromString(&variables, Config, &config, defaults); ``` --- ## EQUIPO - **Usuario (R.Eugenio)**: Desarrollador principal - **Claude**: Asistente de programacion (Claude Code / Opus 4.5) --- ## HISTORIAL | Fecha | Version | Cambios | |-------|---------|---------| | 2025-12-18 | v0.2.1 | FileWatcher, loadFromString, updateMtime | | 2025-12-17 | v0.2.0 | ConfigManager con observers, auto-save, isDirty | | 2025-12-17 | v0.1.0 | Proyecto creado, Engine + persistence |