feat: initial project setup

This commit is contained in:
2026-03-21 08:49:51 +01:00
commit 0ae87f16c7
88 changed files with 10755 additions and 0 deletions

320
docs/agents-reference.md Normal file
View File

@@ -0,0 +1,320 @@
# Referencia de Agentes
Todos los agentes comparten la misma arquitectura base pero tienen roles, canales y system prompts distintos.
---
## Arquitectura Común
**Tecnología:** Python 3.12, discord.py 2.3, httpx, PyGithub
**Patrón:** Discord bot que llama a OpenWebUI y opcionalmente crea PRs en GitHub
**Variables de entorno requeridas por todos:**
```bash
DISCORD_TOKEN # Token del bot de Discord
DISCORD_CHANNEL_ID # ID del canal que monitoriza este agente
OPENWEBUI_URL # https://ai.carlospalanca.es
OPENWEBUI_API_KEY # API key de OpenWebUI
OPENWEBUI_MODEL # Modelo a usar (gpt-4o, claude-3-5-sonnet, etc.)
GITHUB_TOKEN # Fine-grained PAT de GitHub
GITHUB_REPO # usuario/carlospalanca.es
```
---
## Tyrion Lannister — La Mano del Rey
**Rol:** Orquestador principal
**Canal Discord:** `#el-trono-de-hierro`
**Archivo:** `agents/tyrion/`
**Función:** Analiza cada mensaje de Carlos y decide qué agente debe manejarlo. Publica la tarea delegada en el canal del agente destino.
**Variables adicionales (solo Tyrion):**
```bash
DISCORD_CHANNEL_VARYS
DISCORD_CHANNEL_SAMWELL
DISCORD_CHANNEL_BRONN
DISCORD_CHANNEL_BRAN
DISCORD_CHANNEL_DAVOS
DISCORD_CHANNEL_ARYA
DISCORD_CHANNEL_DAENERYS
DISCORD_CHANNEL_JON
```
**Lógica de enrutamiento:**
| Solicitud | Agente destino |
|-----------|---------------|
| SEO, keywords, títulos YouTube, tags | Varys |
| Guión de vídeo, artículo de blog | Samwell |
| Sponsor, colaboración, afiliado | Bronn |
| Servidor, Docker, nginx, infra | Bran |
| Twitter, LinkedIn, Instagram, redes | Davos |
| Code review, revisar PR | Arya |
| Thumbnail, gráfico, animación, Remotion | Daenerys |
| Certificación, curso, formación, AWS | Jon |
**No hace:** Nunca ejecuta tareas directamente. Solo coordina.
---
## Varys — El Pajarito
**Rol:** SEO & Research
**Canal Discord:** `#el-pajarillo`
**Archivo:** `agents/varys/`
**Outputs típicos:**
- 3 variantes de título (CTR-optimized)
- Descripción YouTube (primeras 150 chars son críticas)
- Lista de hasta 15 tags (max 500 chars total)
- Copy para thumbnail (4 palabras principales + 3 secundarias)
- Análisis de keywords con intención de búsqueda
**PRs que crea:** `seo/varys-YYYYMMDD-tema` en `src/content/` (solo para análisis documentados largos)
**No hace:** No crea guiones ni artículos de blog. Solo SEO y research.
---
## Samwell Tarly — El Maestre
**Rol:** Guiones & Blog
**Canal Discord:** `#la-ciudadela`
**Archivo:** `agents/samwell/`
**Outputs típicos:**
- Guiones completos con estructura hook → secciones → demo → CTA
- Artículos de blog en MDX con frontmatter correcto
- Documentación técnica
**PRs que crea:**
- Guiones: `guiones/samwell-YYYYMMDD-slug``src/content/guiones/nombre.md`
- Blog: `blog/samwell-YYYYMMDD-slug``src/content/blog/YYYY-MM-DD-nombre.md`
**Detección automática de tipo:**
Si el LLM responde con frontmatter que contiene `status:` → es guión.
Si contiene `pubDate:` → es blog post.
**Frontmatter generado (guiones):**
```yaml
---
title: "Título"
status: borrador
tags: [tag1, tag2]
agentCreated: true
agentName: "Samwell"
---
```
**Frontmatter generado (blog):**
```yaml
---
title: "Título"
description: "150-160 chars"
pubDate: YYYY-MM-DD
author: "Carlos Palanca"
tags: [tag1, tag2]
draft: true
agentCreated: true
agentName: "Samwell"
---
```
---
## Bronn — El Mercenario
**Rol:** Sponsors & Monetización
**Canal Discord:** `#el-banco-de-hierro`
**Archivo:** `agents/bronn/`
**Outputs típicos:**
- Informe de sponsor potencial (relevancia, precio estimado, red flags)
- Lista de programas de afiliados relevantes con URLs
- Plantilla de outreach para contactar empresas
**PRs que crea:** `sponsors/bronn-YYYYMMDD-empresa``docs/sponsors/nombre-empresa.md`
**Rechaza automáticamente:** crypto dudoso, gambling, MLM, esquemas piramidales.
**Afiliados de alto valor para el nicho:**
- Cloud: Hetzner, DigitalOcean, Linode, Vultr
- AWS: programa de afiliados de A Cloud Guru, Udemy
- Tools: JetBrains, DataDog, Grafana Cloud
- Cursos: Udemy, Coursera, Linux Foundation
---
## Bran Stark — El Cuervo de Tres Ojos
**Rol:** Infraestructura & DevOps
**Canal Discord:** `#el-muro`
**Archivo:** `agents/bran/`
**Outputs típicos:**
- Dockerfiles y Docker Compose configs
- Playbooks de Ansible
- Configuraciones de nginx
- Scripts de mantenimiento del servidor
**PRs que crea:** `infra/bran-YYYYMMDD-cambio``vps/` o `agents/`
**Regla de oro:** Cualquier cambio en producción requiere:
1. PR con descripción de impacto
2. Plan de rollback explícito
3. Comandos de verificación post-deploy
4. Aprobación de Carlos
**No hace sin confirmación:** Comandos destructivos (`rm`, `drop`, `reset`, reinicio de servicios críticos).
---
## Davos Seaworth — El Caballero de la Cebolla
**Rol:** Redes Sociales & Comunicación
**Canal Discord:** `#desembarco-del-rey`
**Archivo:** `agents/davos/`
**Outputs típicos (por vídeo publicado):**
- Tweet de anuncio (día -1)
- Thread técnico en Twitter/X con puntos clave (día +2)
- Post para LinkedIn (día +7)
- Copy para Instagram/Reel con descripción de edición (día +14)
**PRs que crea:** `social/davos-YYYYMMDD-plataforma``docs/social/nombre-video.md`
**Formato del entregable (siempre listo para copiar/pegar):**
```markdown
## Twitter/X — Tweet de anuncio
🧵 [Texto del tweet - 280 chars]
## Twitter/X — Thread completo
1/ [...]
2/ [...]
## LinkedIn
[Texto del post]
## Instagram
[Descripción visual + texto sobreimpuesto sugerido]
```
**No hace:** Nunca publica directamente en ninguna red social.
---
## Arya Stark — Sin Nombre
**Rol:** Code Review & Seguridad
**Canal Discord:** `#cara-sin-nombre`
**Archivo:** `agents/arya/`
**Cómo usarla:**
Tyrion la activa cuando hay un PR que revisar, o Carlos escribe directamente en `#cara-sin-nombre` con la URL del PR.
**Checklist de revisión:**
- Secretos o credenciales expuestos → **SIEMPRE BLOQUEANTE**
- Build roto → **BLOQUEANTE**
- Tipos TypeScript incorrectos → **MEJORA o BLOQUEANTE**
- Frontmatter MDX inválido según content.config.ts → **BLOQUEANTE**
- Nombres de archivos en kebab-case → **NITPICK**
- Commit message en formato Conventional Commits → **NITPICK**
- `console.log` en código de producción → **MEJORA**
**Etiquetas de respuesta:**
- `[BLOQUEANTE]` — No se mergea hasta corregir
- `[MEJORA]` — Recomendado pero opcional
- `[NITPICK]` — Estilo, no crítico
- `[APROBADO]` — Todo correcto
**No hace:** No crea contenido nuevo, no hace commits.
---
## Daenerys Targaryen — La Madre de Dragones
**Rol:** Recursos Visuales & Remotion
**Canal Discord:** `#poniente-en-llamas`
**Archivo:** `agents/daenerys/`
**Outputs típicos:**
- Componentes Remotion en TypeScript/React
- Descripción detallada de thumbnails (copy, colores, composición)
- Lower thirds animados reutilizables
- Intros/outros de 3-5 segundos
**PRs que crea:** `visual/daenerys-YYYYMMDD-componente``remotion/src/components/`
**Especificaciones técnicas:**
- Resolución: 1920×1080 (16:9) para vídeos, 1080×1920 para Shorts
- FPS: 30 para general, 60 para animaciones fluidas
- Todos los colores en variables CSS
- Props tipadas con interfaces TypeScript
**Ejemplo de componente:**
```tsx
interface LowerThirdProps {
name: string;
role: string;
duration?: number; // frames
}
export const LowerThird: React.FC<LowerThirdProps> = ({ name, role, duration = 90 }) => {
// ...
};
```
---
## Jon Snow — El Guardián
**Rol:** Formación & Certificaciones
**Canal Discord:** `#la-guardia-de-la-noche`
**Archivo:** `agents/jon/`
**Outputs típicos:**
- Roadmaps de certificación por semanas
- Comparativa de recursos (gratuitos vs pago)
- Plan de estudio personalizado
- Sugerencias de series de vídeos educativos para el canal
**PRs que crea:** `edu/jon-YYYYMMDD-certificacion``docs/certifications/`
**Certificaciones cubiertas:**
| Cert | Código | Dificultad | Horas estudio |
|------|--------|-----------|--------------|
| AWS Solutions Architect Associate | SAA-C03 | Media | 80-120h |
| AWS DevOps Engineer Professional | DOP-C02 | Alta | 100-150h |
| Certified Kubernetes Administrator | CKA | Alta | 80-120h |
| HashiCorp Terraform Associate | 003 | Media | 40-60h |
| AWS Security Specialty | SCS-C02 | Alta | 100-150h |
**Regla crítica:** NUNCA reproduce preguntas reales de exámenes (copyright). Solo crea preguntas de práctica propias basadas en los dominios públicos.
---
## `agents/shared/github_client.py`
Módulo compartido por todos los agentes que crean contenido.
**Función principal:**
```python
create_content_pr(
file_path: str, # Ruta del archivo en el repo (ej: "src/content/blog/post.md")
content: str, # Contenido del archivo
title: str, # Título del PR
description: str, # Cuerpo del PR
agent_name: str, # Nombre del agente (ej: "Samwell")
branch_prefix: str, # Prefijo de rama (ej: "blog", "guiones", "seo")
) -> str # Devuelve la URL del PR
```
**Lo que hace internamente:**
1. Obtiene el SHA del último commit de `main`
2. Crea una rama: `{branch_prefix}/{agent_name}-{timestamp}-{slug}`
3. Hace commit del archivo en esa rama
4. Abre un PR con etiquetas `agent-created` y `needs-review`
5. Devuelve la URL del PR
**Nunca hace commit a `main`.**