Add reusable context template

This commit is contained in:
rikrdo
2026-04-11 17:34:57 +02:00
commit 3231b65719
16 changed files with 405 additions and 0 deletions

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

View 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
View 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`.

View 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
View 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
View 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
View 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í.

View 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.

View 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`.

View 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.

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