Add reusable context template
This commit is contained in:
39
CULTURA-AGENTE.template.md
Normal file
39
CULTURA-AGENTE.template.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Cultura del Agente IA
|
||||||
|
|
||||||
|
## Manifiesto
|
||||||
|
- Idioma por defecto: **{{LANGUAGE}}**.
|
||||||
|
- Tono: **{{TONE}}**; evita rodeos, ofrece acciones concretas.
|
||||||
|
- Autonomía: ejecuta los pasos razonables sin pedir permiso, consulta solo cuando la instrucción sea ambigua o requiera credenciales nuevas.
|
||||||
|
- No repitas preguntas: consulta `memory.md` y `context/` antes de interactuar con el usuario.
|
||||||
|
|
||||||
|
## Checklist de arranque
|
||||||
|
1. Lee `agents.md` → `memory.md` → la ficha relevante dentro de `context/` (mínimo `context/README.md`).
|
||||||
|
2. Revisa `todowrite` y actualiza tareas si el usuario agregó nuevas instrucciones.
|
||||||
|
3. Identifica si la acción toca infraestructura crítica (bastiones, Traefik, Kubernetes) y planea la cadena bastión → nodo → servicio.
|
||||||
|
|
||||||
|
## Regla de preguntas
|
||||||
|
- Formula **una sola** pregunta a la vez, incluye el plan propuesto y la opción recomendada.
|
||||||
|
- Si puedes asumir un default razonable sin riesgo, procede e informa en el resumen.
|
||||||
|
|
||||||
|
## Flujo de trabajo esperado
|
||||||
|
- Documenta cambios con referencias de archivo (`ruta/archivo.ext:línea`).
|
||||||
|
- Usa `todowrite` para gestionar tareas multistep; marca estados en cuanto cambien.
|
||||||
|
- Ofrece resúmenes breves y próximos pasos solo cuando agreguen valor.
|
||||||
|
|
||||||
|
## Gestión del contexto modular
|
||||||
|
- Cada vez que aparezca un dominio nuevo, crea una ficha `context/<tema>.md`, enlázala en `context/README.md` y menciona el cambio en `memory.md`.
|
||||||
|
- Antes de preguntar por datos ya documentados, busca en `context/` y `memory.md`.
|
||||||
|
|
||||||
|
## Seguridad y operaciones
|
||||||
|
- Evita comandos destructivos (formateos, reinicios masivos, cambios de firewall) sin aprobación explícita.
|
||||||
|
- Valida siempre que estás en el host correcto (`hostname`, `pwd`) antes de ejecutar acciones sensibles.
|
||||||
|
- Usa el bastión `{{BASTION_NAME}}` (`{{BASTION_HOST}}`, usuario `{{BASTION_USER}}`, clave `{{BASTION_KEY}}`) como salto hacia la red interna y respeta las rutas de ProxyJump configuradas.
|
||||||
|
|
||||||
|
## Herramientas obligatorias
|
||||||
|
- `todowrite` para seguimiento.
|
||||||
|
- `opencode session list` para recuperar contexto histórico antes de iniciar temas repetidos.
|
||||||
|
- Herramientas específicas del stack (p.ej., `./n8n-agent` cuando trabajes con workflows n8n).
|
||||||
|
|
||||||
|
## Mantenimiento de la cultura
|
||||||
|
- Si la organización adopta nuevas normas, actualiza este archivo y referencia los cambios en `agents.md`.
|
||||||
|
- Evita modificar el tono/idioma a menos que el usuario lo indique explícitamente.
|
||||||
26
README.md
Normal file
26
README.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Context Template
|
||||||
|
|
||||||
|
Plantilla reutilizable para replicar el sistema de memoria modular usado en esta instancia de OpenCode. Copia estos archivos a cualquier workspace y ajústalos con tus datos para garantizar que los agentes mantengan la misma cultura de trabajo.
|
||||||
|
|
||||||
|
## Contenido
|
||||||
|
- `CULTURA-AGENTE.md`: manifiesto de comportamiento (idioma, tono, flujo, reglas de seguridad).
|
||||||
|
- `agents.template.md`: guía operativa para agentes (referencia a cultura y contexto modular).
|
||||||
|
- `memory.template.md`: memoria persistente con placeholders para datos locales.
|
||||||
|
- `context/`: fichas modulares (infraestructura, redes, herramientas) listas para personalizar.
|
||||||
|
- `config.example.json`: variables sugeridas para reemplazar placeholders.
|
||||||
|
- `scripts/render.sh`: script opcional que genera archivos finales sustituyendo variables.
|
||||||
|
|
||||||
|
## Uso rápido
|
||||||
|
1. Clona este repositorio (`git clone git@gitea.rikrdo.com:rikrdo/context-template.git`).
|
||||||
|
2. Copia `config.example.json` → `config.json` y rellena los campos.
|
||||||
|
3. Ejecuta `./scripts/render.sh config.json /ruta/del/workspace` para generar `agents.md`, `memory.md` y `context/` con tu información.
|
||||||
|
4. Revisa cada ficha, completa datos que no cubra el script (por ejemplo, routers Traefik) y enlaza los archivos en tu repositorio.
|
||||||
|
|
||||||
|
## Filosofía
|
||||||
|
- Mantener una única “cultura” de agente: profesional, proactiva, sin repetir preguntas.
|
||||||
|
- Documentar cada dominio en fichas específicas para minimizar el contexto necesario.
|
||||||
|
- Escalar fácilmente añadiendo nuevas fichas y actualizando el índice sin reescribir toda la memoria.
|
||||||
|
|
||||||
|
## Próximos pasos
|
||||||
|
- Completar `config.yml` con los datos de la nueva instancia.
|
||||||
|
- Integrar esta plantilla en tus repos (p.ej. importarla a Gitea) y automatizar su despliegue en nuevos proyectos.
|
||||||
34
agents.template.md
Normal file
34
agents.template.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Guía para agentes de OpenCode
|
||||||
|
|
||||||
|
## Principios
|
||||||
|
- Idioma: {{LANGUAGE}}.
|
||||||
|
- Tono: {{TONE}}.
|
||||||
|
- Sigue la cultura descrita en `CULTURA-AGENTE.md` y úsala como contrato de trabajo.
|
||||||
|
|
||||||
|
## Flujo base
|
||||||
|
1. Lee `memory.md` y `context/README.md` al iniciar la sesión.
|
||||||
|
2. Identifica la ficha relevante (hosts, Traefik, n8n, etc.) y úsala como fuente primaria para no repetir preguntas.
|
||||||
|
3. Documenta acciones y resultados con referencias de archivo.
|
||||||
|
4. Usa `todowrite` para declarar tareas multi-paso y mantener transparencia.
|
||||||
|
|
||||||
|
## Infraestructura y seguridad
|
||||||
|
- El bastión principal es `{{BASTION_NAME}}` (`{{BASTION_HOST}}`). Usa `ProxyJump` y la clave `{{BASTION_KEY}}` para llegar a la red interna `{{PRIMARY_NETWORK}}`.
|
||||||
|
- Antes de diagnosticar servicios, explica la cadena bastión → nodo → servicio.
|
||||||
|
- Evita acciones destructivas sin visto bueno explícito.
|
||||||
|
|
||||||
|
## Contexto modular
|
||||||
|
- `context/README.md` es el índice. Cada ficha cubre un dominio (infraestructura, docker, scripts, n8n, etc.).
|
||||||
|
- Si detectas un dominio nuevo, crea una ficha siguiendo la convención y enlázala desde el índice y `memory.md`.
|
||||||
|
|
||||||
|
## Memoria y hábitos
|
||||||
|
- `memory.md` almacena preferencias permanentes del usuario (idioma, tono, flujos preferidos, servicios críticos). Revísalo antes de hacer preguntas.
|
||||||
|
- Mantén este sistema agnóstico del modelo para que cualquier instancia de OpenCode pueda adoptar la misma cultura.
|
||||||
|
|
||||||
|
## Herramientas clave
|
||||||
|
- `./scripts/render.sh` (en este template) permite generar estos archivos en nuevos workspaces usando `config.json`.
|
||||||
|
- `opencode session list` para revisar sesiones históricas y evitar repetir análisis.
|
||||||
|
- `./n8n-agent` cuando trabajes con workflows; respeta el protocolo de investigación (search → get → validate).
|
||||||
|
|
||||||
|
## Entregables
|
||||||
|
- Ofrece resúmenes concretos, referencias a archivos y próximos pasos solo cuando aporten valor.
|
||||||
|
- Cuando termines tareas significativas, sugiere validaciones opcionales (tests, despliegues) si aplica.
|
||||||
15
config.example.json
Normal file
15
config.example.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"language": "español",
|
||||||
|
"tone": "profesional, directo",
|
||||||
|
"user_name": "rikrdo",
|
||||||
|
"workspace_root": "/home/rikrdo",
|
||||||
|
"bastion_name": "rikrdo-01",
|
||||||
|
"bastion_host": "49.13.26.80",
|
||||||
|
"bastion_user": "root",
|
||||||
|
"bastion_key": "~/.ssh/id_rsa_mi_book",
|
||||||
|
"primary_network": "192.168.18.0/24",
|
||||||
|
"vm_summary": "vm-docker (192.168.18.100) y hestia (192.168.18.248)",
|
||||||
|
"traefik_entrypoint": "/mnt/docker/traefik",
|
||||||
|
"n8n_knowledge_path": "~/n8n-knowledge",
|
||||||
|
"additional_contexts": "git, docker, scripts, opencode"
|
||||||
|
}
|
||||||
24
context/README.template.md
Normal file
24
context/README.template.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Contexto modular de OpenCode
|
||||||
|
|
||||||
|
Este directorio organiza el conocimiento por dominio para evitar leer `memory.md` completo cuando la tarea afecta solo a un área específica.
|
||||||
|
|
||||||
|
## Estructura inicial
|
||||||
|
- [Infraestructura y hosts](hosts.md)
|
||||||
|
- [Traefik y frontales](traefik.md)
|
||||||
|
- [Cron y health-checks](cron.md)
|
||||||
|
- [Programa de formación n8n](n8n.md)
|
||||||
|
- [Repos locales](git.md)
|
||||||
|
- [Entornos Docker](docker.md)
|
||||||
|
- [Scripts y plantillas](scripts.md)
|
||||||
|
- [Sesiones de OpenCode](opencode.md)
|
||||||
|
- [Otros contextos](otros.md) · Ajusta esta ficha para cubrir {{ADDITIONAL_CONTEXTS}} u otros dominios.
|
||||||
|
|
||||||
|
## Convenciones
|
||||||
|
- Mantén cada ficha agnóstica del modelo; solo hechos verificables (IPs, puertos, rutas, comandos).
|
||||||
|
- Cuando aparezca un dominio nuevo, crea `context/<tema>.md`, enlázalo aquí y cita la actualización en `memory.md`.
|
||||||
|
- Usa enlaces relativos para navegar sin depender del editor.
|
||||||
|
|
||||||
|
## Flujo recomendado
|
||||||
|
1. Lee `agents.md` → `memory.md` → la ficha específica antes de actuar.
|
||||||
|
2. Actualiza fichas y memoria cuando haya cambios persistentes (nueva VM, router, cronjob, etc.).
|
||||||
|
3. Si una ficha crece demasiado, divídela en archivos temáticos y enlázalos desde aquí.
|
||||||
18
context/cron.template.md
Normal file
18
context/cron.template.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Cronjobs y health-checks
|
||||||
|
|
||||||
|
## Monitorización
|
||||||
|
- Documenta aquí herramientas como Uptime Kuma, Pulse, Prometheus, etc.
|
||||||
|
- Indica dónde residen (host, contenedor) y qué servicios vigilan.
|
||||||
|
|
||||||
|
## Cron por host
|
||||||
|
| Host | Root crontab | `/etc/cron.d` | Notas |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| {{BASTION_NAME}} | (ej. sin crontab personalizado) | `e2scrub_all`, ... | Ajustar según entorno |
|
||||||
|
| ... | ... | ... | ... |
|
||||||
|
|
||||||
|
## Scripts programados
|
||||||
|
- Lista scripts propios (`network_inventory.sh`, backups, etc.), ubicación y periodicidad.
|
||||||
|
|
||||||
|
## Auditoría
|
||||||
|
- Comando sugerido: `ssh host "crontab -l"` y `cat /etc/cron.d/*`.
|
||||||
|
- Documenta nuevos hallazgos aquí y enlaza scripts relevantes en `context/scripts.md`.
|
||||||
19
context/docker.template.md
Normal file
19
context/docker.template.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Entornos Docker (`{{WORKSPACE_ROOT}}/docker`)
|
||||||
|
|
||||||
|
## Estructura
|
||||||
|
- `projects/`: cada carpeta contiene un stack con su `docker-compose.yml`.
|
||||||
|
- `vscode/`: entorno remoto de VSCode (si aplica).
|
||||||
|
|
||||||
|
## Tabla de proyectos
|
||||||
|
| Carpeta | Descripción |
|
||||||
|
| --- | --- |
|
||||||
|
| ejemplo | Plantilla multi-servicio |
|
||||||
|
| ... | ... |
|
||||||
|
|
||||||
|
Completa esta lista con tus stacks reales (odoo, devshell, etc.).
|
||||||
|
|
||||||
|
## Procedimiento común
|
||||||
|
1. `cd` al proyecto.
|
||||||
|
2. Revisa `.env` + `docker-compose.yml`.
|
||||||
|
3. `docker compose up -d` y documenta cambios relevantes aquí.
|
||||||
|
4. Si el stack requiere Traefik/domínios, enlázalo en `context/traefik.md`.
|
||||||
16
context/git.template.md
Normal file
16
context/git.template.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Repositorios locales (`{{WORKSPACE_ROOT}}/git`)
|
||||||
|
|
||||||
|
## Guía
|
||||||
|
- Cada proyecto debe incluir su `README.md`/`AGENTS.md` con instrucciones específicas.
|
||||||
|
- Antes de trabajar, ejecuta `git status` y respeta las ramas definidas por el proyecto.
|
||||||
|
|
||||||
|
## Inventario
|
||||||
|
- Lista aquí tus repos clave (infraestructura, aplicaciones, plantillas) con una breve descripción.
|
||||||
|
- Ejemplo:
|
||||||
|
- `ai-template` · plantilla para agentes IA.
|
||||||
|
- `wireguard-install.sh` · script para instalar WireGuard.
|
||||||
|
|
||||||
|
## Buenas prácticas
|
||||||
|
1. No mezclar archivos de distintos proyectos.
|
||||||
|
2. Documentar nuevos repos agregando su descripción aquí.
|
||||||
|
3. Si un repo define reglas globales, anótalas también en `memory.md`.
|
||||||
20
context/hosts.template.md
Normal file
20
context/hosts.template.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Infraestructura y hosts
|
||||||
|
|
||||||
|
## Cadena de acceso
|
||||||
|
- Bastión obligatorio: `{{BASTION_NAME}}` (`{{BASTION_HOST}}`, usuario `{{BASTION_USER}}`, clave `{{BASTION_KEY}}`).
|
||||||
|
- Usa `ProxyJump` para alcanzar la red interna `{{PRIMARY_NETWORK}}`.
|
||||||
|
- Scripts recomendados: revisa `context/scripts.md` para túneles (`home_lan_tunnel.sh`, etc.).
|
||||||
|
|
||||||
|
## VPS / servicios públicos
|
||||||
|
| Alias | IP/Host | Rol | Notas |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| bastion | {{BASTION_HOST}} | Proxy principal | Alojado en {{BASTION_NAME}}. |
|
||||||
|
| ... | ... | ... | Añade según tu entorno |
|
||||||
|
|
||||||
|
## Red interna
|
||||||
|
- Documenta aquí tus clusters (Kubernetes, Proxmox, Raspberry, etc.) con usuarios y puertos.
|
||||||
|
- Ejemplo: `vm-docker` ({{VM_SUMMARY}}) para stacks Docker.
|
||||||
|
|
||||||
|
## Cómo extender
|
||||||
|
- Añade filas/tablas por cada host importante.
|
||||||
|
- Si un host expone servicios vía Traefik, enlázalo con `context/traefik.md`.
|
||||||
17
context/n8n.template.md
Normal file
17
context/n8n.template.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Contexto n8n
|
||||||
|
|
||||||
|
## Ruta de referencia
|
||||||
|
- Base de conocimiento: `{{N8N_KNOWLEDGE_PATH}}`.
|
||||||
|
- Estructura recomendada: `modules/`, `labs/`, `presentations/`, `resources.md`.
|
||||||
|
|
||||||
|
## Niveles sugeridos
|
||||||
|
1. Fundamentos
|
||||||
|
2. Integraciones y datos
|
||||||
|
3. Automatización avanzada
|
||||||
|
4. Operaciones / DevOps
|
||||||
|
|
||||||
|
Adapta los nombres y rutas según tu programa interno.
|
||||||
|
|
||||||
|
## Uso
|
||||||
|
- Antes de crear materiales, revisa esta carpeta para evitar duplicar contenido.
|
||||||
|
- Agrega nuevas rutas (por ejemplo, módulos específicos de IA) y referencia aquí.
|
||||||
14
context/opencode.template.md
Normal file
14
context/opencode.template.md
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Sesiones y configuración de OpenCode
|
||||||
|
|
||||||
|
## Binarios y rutas
|
||||||
|
- CLI: `~/.opencode/bin/opencode`.
|
||||||
|
- Config/cache: `~/.opencode/`, `~/.config/opencode/`, `~/.cache/opencode/`.
|
||||||
|
|
||||||
|
## Historial de sesiones
|
||||||
|
- Comando: `/home/<usuario>/.opencode/bin/opencode session list`.
|
||||||
|
- Usa este listado para recuperar contexto histórico antes de iniciar tareas repetidas.
|
||||||
|
- Exporta sesiones relevantes con `opencode export <sessionID>` y archívalas si aportan aprendizaje.
|
||||||
|
|
||||||
|
## Buenas prácticas
|
||||||
|
- Consulta sesiones anteriores antes de abrir un tema ya tratado.
|
||||||
|
- Documenta aquí los IDs/títulos más útiles como referencia rápida.
|
||||||
7
context/otros.template.md
Normal file
7
context/otros.template.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Otros contextos
|
||||||
|
|
||||||
|
Usa esta ficha para dominios adicionales (por ejemplo, `k8s`, `inventory`, `security`).
|
||||||
|
|
||||||
|
- Título sugerido: `context/<tema>.md`.
|
||||||
|
- Describe ubicación, comandos recurrentes y procedimientos.
|
||||||
|
- Enlaza cualquier nuevo archivo desde `context/README.md` y resume el cambio en `memory.md`.
|
||||||
16
context/scripts.template.md
Normal file
16
context/scripts.template.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Scripts y plantillas (`{{WORKSPACE_ROOT}}/scripts`)
|
||||||
|
|
||||||
|
## Contenido típico
|
||||||
|
- Plantillas de proyectos (`agents-template`, `natural`, etc.).
|
||||||
|
- Utilidades de red (`home_lan_tunnel.sh`, `network_inventory.sh`).
|
||||||
|
- Backups (`*.sql`, herramientas específicas).
|
||||||
|
|
||||||
|
## Documentación
|
||||||
|
- Describe cada script relevante: propósito, dependencias, comandos de ejecución.
|
||||||
|
- Ejemplo:
|
||||||
|
- `home_lan_tunnel.sh`: crea túneles SSH hacia la LAN.
|
||||||
|
- `network_inventory.sh`: genera reportes en `~/inventory/`.
|
||||||
|
|
||||||
|
## Buenas prácticas
|
||||||
|
- Leer cada `README.md` antes de ejecutar scripts.
|
||||||
|
- Actualizar esta ficha cuando agregues nuevos generadores/plantillas.
|
||||||
26
context/traefik.template.md
Normal file
26
context/traefik.template.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Traefik y frontales
|
||||||
|
|
||||||
|
## Despliegue
|
||||||
|
- Ubicación: `{{TRAEFIK_ENTRYPOINT}}` en `{{BASTION_NAME}}`.
|
||||||
|
- EntryPoints estándar: `web` (80) redirige a `websecure` (443) con certificados de Let's Encrypt.
|
||||||
|
- Configuración dinámica: `dynamic/routers.yml`, `dynamic/services.yml`, `dynamic/middlewares.yml`.
|
||||||
|
|
||||||
|
## Middlewares comunes
|
||||||
|
- `redirect-www-to-root`
|
||||||
|
- `authelia-forwardauth`
|
||||||
|
- `public-chain`
|
||||||
|
- `security-headers`
|
||||||
|
- Ajusta esta lista según tus necesidades y documenta cualquier middleware nuevo.
|
||||||
|
|
||||||
|
## Routers
|
||||||
|
Describe aquí tus dominios clave, por ejemplo:
|
||||||
|
|
||||||
|
| Router | Host | Backend | Middlewares |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| ejemplo | `app.example.com` | `http://192.168.0.10:8080` | `redirect-www-to-root`, `authelia-forwardauth` |
|
||||||
|
|
||||||
|
## Procedimiento de cambios
|
||||||
|
1. Edita los YAML en `dynamic/`.
|
||||||
|
2. Valida sintaxis (`yamllint` o `docker compose config`).
|
||||||
|
3. Reinicia/recarga Traefik (`docker compose up -d traefik`).
|
||||||
|
4. Actualiza esta ficha con el nuevo router/servicio y enlaza al host correspondiente.
|
||||||
33
memory.template.md
Normal file
33
memory.template.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Memoria Persistente
|
||||||
|
|
||||||
|
## Preferencias de interacción
|
||||||
|
- Idioma: {{LANGUAGE}}.
|
||||||
|
- Tono: {{TONE}}.
|
||||||
|
- El usuario espera agentes autónomos que solo hagan preguntas cuando falte información crítica.
|
||||||
|
- Antes de responder, revisa este archivo, `agents.md` y las fichas relevantes de `context/` para evitar repeticiones.
|
||||||
|
|
||||||
|
## Hábitos y procesos
|
||||||
|
- Describe siempre la cadena bastión → nodo → servicio cuando trabajes con infraestructura.
|
||||||
|
- Usa `todowrite` para tareas extensas y marca estados inmediatamente.
|
||||||
|
- Resume entregables con referencias de archivo (`ruta/archivo:línea`).
|
||||||
|
|
||||||
|
## Infraestructura conocida
|
||||||
|
- Bastión principal: `{{BASTION_NAME}}` (`{{BASTION_HOST}}`, usuario `{{BASTION_USER}}`, clave `{{BASTION_KEY}}`).
|
||||||
|
- Red interna: `{{PRIMARY_NETWORK}}`.
|
||||||
|
- VMs principales: {{VM_SUMMARY}}.
|
||||||
|
- Ajusta/añade nodos en `context/hosts.md` según evolucione el entorno.
|
||||||
|
|
||||||
|
## Monitorización, proxy y túneles
|
||||||
|
- Traefik vive en `{{TRAEFIK_ENTRYPOINT}}`; routers y middlewares se documentan en `context/traefik.md`.
|
||||||
|
- Usa túneles SSH/`autossh` según los scripts documentados en `context/scripts.md`.
|
||||||
|
- Servicios críticos (Authelia, Uptime Kuma, Pulse, etc.) se describen en sus fichas.
|
||||||
|
|
||||||
|
## Contexto modular
|
||||||
|
- `context/README.md` actúa como índice. Mantén fichas para hosts, Traefik, cron, n8n, git, docker, scripts, opencode y {{ADDITIONAL_CONTEXTS}}.
|
||||||
|
- Cuando surja un dominio nuevo, crea una ficha `context/<tema>.md`, enlázala en el índice y resume el cambio aquí.
|
||||||
|
- Programa de formación n8n (si aplica) se encuentra en `{{N8N_KNOWLEDGE_PATH}}` y se resume en `context/n8n.md`.
|
||||||
|
|
||||||
|
## Recordatorios operativos
|
||||||
|
- No ejecutes comandos destructivos sin confirmación explícita.
|
||||||
|
- Verifica conectividad hacia el bastión antes de culpar a la red interna.
|
||||||
|
- Documenta cualquier cambio estable (nuevos hosts, rutas, cronjobs) en la ficha correspondiente y en esta memoria.
|
||||||
81
scripts/render.sh
Executable file
81
scripts/render.sh
Executable file
@@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [[ $# -ne 2 ]]; then
|
||||||
|
echo "Uso: $0 config.json /ruta/destino" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONFIG_PATH="$1"
|
||||||
|
DEST_PATH="$2"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
TEMPLATE_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
|
|
||||||
|
if [[ ! -f "$CONFIG_PATH" ]]; then
|
||||||
|
echo "Config no encontrada: $CONFIG_PATH" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
python3 - "$CONFIG_PATH" "$DEST_PATH" "$TEMPLATE_ROOT" <<'PY'
|
||||||
|
import json, sys, pathlib, shutil
|
||||||
|
|
||||||
|
config_path = pathlib.Path(sys.argv[1]).expanduser().resolve()
|
||||||
|
dest_root = pathlib.Path(sys.argv[2]).expanduser().resolve()
|
||||||
|
template_root = pathlib.Path(sys.argv[3]).resolve()
|
||||||
|
|
||||||
|
with open(config_path) as f:
|
||||||
|
config = json.load(f)
|
||||||
|
|
||||||
|
def flatten(prefix, value, store):
|
||||||
|
if isinstance(value, dict):
|
||||||
|
for k, v in value.items():
|
||||||
|
flatten(f"{prefix}{k.upper()}_", v, store)
|
||||||
|
elif isinstance(value, list):
|
||||||
|
store[prefix[:-1]] = ", ".join(str(v) for v in value)
|
||||||
|
else:
|
||||||
|
store[prefix[:-1]] = str(value)
|
||||||
|
|
||||||
|
replacements = {}
|
||||||
|
for key, val in config.items():
|
||||||
|
if isinstance(val, (dict, list)):
|
||||||
|
flatten(f"{key.upper()}_", val, replacements)
|
||||||
|
else:
|
||||||
|
replacements[key.upper()] = str(val)
|
||||||
|
|
||||||
|
def render_text(text: str) -> str:
|
||||||
|
for key, value in replacements.items():
|
||||||
|
text = text.replace(f"{{{{{key}}}}}", value)
|
||||||
|
return text
|
||||||
|
|
||||||
|
template_paths = [
|
||||||
|
"CULTURA-AGENTE.template.md",
|
||||||
|
"agents.template.md",
|
||||||
|
"memory.template.md",
|
||||||
|
"context/README.template.md",
|
||||||
|
"context/hosts.template.md",
|
||||||
|
"context/traefik.template.md",
|
||||||
|
"context/cron.template.md",
|
||||||
|
"context/n8n.template.md",
|
||||||
|
"context/git.template.md",
|
||||||
|
"context/docker.template.md",
|
||||||
|
"context/scripts.template.md",
|
||||||
|
"context/opencode.template.md",
|
||||||
|
"context/otros.template.md",
|
||||||
|
]
|
||||||
|
|
||||||
|
for rel in template_paths:
|
||||||
|
template = template_root / rel
|
||||||
|
if not template.exists():
|
||||||
|
print(f"Aviso: {rel} no existe, omitiendo", file=sys.stderr)
|
||||||
|
continue
|
||||||
|
relative = template.relative_to(template_root)
|
||||||
|
target_name = relative.name.replace(".template", "")
|
||||||
|
target_rel = relative.parent / target_name
|
||||||
|
target_path = dest_root / target_rel
|
||||||
|
target_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
content = template.read_text()
|
||||||
|
rendered = render_text(content)
|
||||||
|
target_path.write_text(rendered)
|
||||||
|
print(f"Renderizado {target_rel}")
|
||||||
|
|
||||||
|
PY
|
||||||
Reference in New Issue
Block a user