원클릭으로
weekly-newsletter
// Genera la newsletter semanal de DevExpert recopilando contenido de X, YouTube, PostFlow y bookmarks. Crea borrador en Listmonk para revisión.
// Genera la newsletter semanal de DevExpert recopilando contenido de X, YouTube, PostFlow y bookmarks. Crea borrador en Listmonk para revisión.
Process invoice PDFs/emails: extract vendor + date, generate normalized filename, optionally archive to Drive, and email the PDF to the right Holded inbox.
Use the private LearnWorlds CLI to inspect DevExpert Academy users, find students by email, list their enrolled courses/products, look up products, and perform safe enrollment workflows. Trigger when Antonio asks what courses a student has in LearnWorlds or academia.devexpert.io, whether someone belongs to the current or next AI Expert edition, or to use the LearnWorlds/academy CLI.
End-to-end YouTube publishing workflow using ordered scripts: prepare/concat video, upload draft, transcribe with Parakeet, generate copy with the calling model, optionally prepare English dubbing assets, render thumbnails, update YouTube metadata, then schedule socials (PostFlow) 15 minutes after publish.
Enforce Antonio's real Spanish social voice when drafting or rewriting X, LinkedIn, article teaser, and newsletter intro copy. Use whenever copy must sound like Antonio and avoid obvious AI writing.
Converts a Markdown file to a styled PDF with DevExpert branding (logo in bottom-right corner). Use when asked to generate a PDF from a Markdown document, or when any DevExpert proposal/document needs to be exported as PDF.
Manage inbox email. Uses the inbox script and stores metadata (ids) to open or archive messages later.
| name | weekly-newsletter |
| description | Genera la newsletter semanal de DevExpert recopilando contenido de X, YouTube, PostFlow y bookmarks. Crea borrador en Listmonk para revisión. |
Genera la newsletter semanal recopilando todo el contenido publicado y programado de la semana.
Para cualquier operación de Listmonk (listas, suscriptores, campañas, schedule, archive), usar como referencia principal la skill listmonk-cli.
Esta skill (weekly-newsletter) define el flujo editorial y el contenido; listmonk-cli es la referencia operativa del CLI.
Newsletter anterior (contexto obligatorio):
Antes de decidir tema, estructura, asunto o intro, leer la newsletter semanal anterior para evitar repetir enfoque, asunto y framing.
Prioridad de fuentes:
Newsletter semanal en ~/Documents/aipal/10-areas/contenido/learnings.md.listmonk campaigns list
listmonk campaigns get <id>
Usar esa lectura para:
X/Twitter (bird CLI):
bird user-tweets antonioleivag -n 50 --json
Filtrar por fechas del rango.
PostFlow (posts programados):
postflow --json schedule list --from YYYY-MM-DDTHH:MM:SSZ --to YYYY-MM-DDTHH:MM:SSZ
YouTube (vídeos publicados o programados):
/Users/antonio/.venvs/youtube-publish/bin/python /Users/antonio/Projects/antoniolg/agent-kit/skills/youtube-publish/scripts/list_videos.py --limit 10 --json
Usa el script list_videos.py incluido en la skill youtube-publish (carpeta scripts/) con el venv dedicado ~/.venvs/youtube-publish, que incluye google-api-python-client, google-auth-oauthlib y google-auth-httplib2.
El flag --json devuelve título, descripción, fecha, estado y URL. La descripción indica quién ha grabado el vídeo (Antonio o Nino) y de qué trata exactamente.
Bookmarks de X (lecturas recomendadas):
bird bookmarks -n 100
Usar 100 bookmarks para asegurar cobertura del rango completo. Filtrar por fechas.
Antes de redactar texto final firmado por Antonio, aplicar la skill social-copy-guardrails a toda la newsletter, no solo a la intro. La newsletter debe sonar como Antonio, no como un informe editorial de IA.
Primero, analizar si hay un tema dominante en la semana:
Presentar el contenido en DOS bloques:
BLOQUE 1: Contenido recomendado para la newsletter Organizado por secciones (ver estructura más abajo):
BLOQUE 2: Lo que queda fuera Listar el contenido dentro del rango que no se ha incluido en el bloque 1, para que el usuario pueda decidir si añadir algo.
El usuario revisa y ajusta antes de generar el borrador.
Antes de ejecutar comandos de Listmonk, consultar listmonk-cli si hay dudas de flags, formatos o troubleshooting.
Preflight obligatorio de idempotencia:
Antes de recopilar fuentes o crear una campaña, calcular la fecha objetivo de envío. Si no hay otra indicada, usar el próximo sábado a las 10:30 Europe/Madrid.
Comprobar si ya existe una newsletter para esa fecha:
python3 /Users/antonio/Projects/antoniolg/agent-kit/skills/weekly-newsletter/scripts/check_existing_newsletter.py \
--target-date YYYY-MM-DD \
--json
Si exists es true, no crear otra campaña ni seguir redactando. Informar a Antonio con el id/link de la campaña existente y parar. Esto evita duplicados cuando la newsletter se prepara manualmente antes de que se lance la automatización semanal.
Escribir el contenido en un archivo temporal:
/tmp/newsletter-YYYY-MM-DD.md
Crear la campaña:
listmonk campaigns create \
--name "Newsletter semanal - DD mes YYYY" \
--subject "<subject atractivo>" \
--lists 3 \
--template-id 1 \
--content-type markdown \
--body-file /tmp/newsletter-YYYY-MM-DD.md
Habilitar el archivo público de la campaña:
listmonk campaigns archive <id> --enable
Tras crear el borrador, abrir la campaña en el navegador con:
open "<LISTMONK_BASE_URL>/admin/campaigns/<id>"
La URL base de Listmonk está en ~/.config/skills/config.json bajo listmonk.base_url.
Para actualizar tras cambios:
listmonk campaigns update <id> \
--body-file /tmp/newsletter-YYYY-MM-DD.md \
--lists 3
Regla: No programar nunca sin confirmación explícita del usuario.
Por defecto, programar según el horario que indique el usuario. Si no indica hora, usar una propuesta explícita y pedir confirmación.
listmonk campaigns schedule <id> \
--send-at "YYYY-MM-DDTHH:MM:SS+01:00"
Usar cuando hay un tema claro que ha dominado la semana. El bloque "El tema de la semana" se escribe de forma narrativa, con los enlaces integrados en el texto (no al final de cada párrafo).
En esta estructura, no añadir una sección separada de "Lo que ha pasado esta semana" salvo que haya contenido propio relevante que no encaje dentro del tema dominante. Si Codex, un vídeo, una reflexión, un artículo o un lanzamiento forman parte de la misma narrativa, integrarlos dentro de "El tema de la semana" para evitar solapes.
El texto debe evitar muletillas de reencuadre repetidas (no es X, sino Y, lo relevante no es..., la pelea interesante...) y frases que inventen una sospecha que Antonio no planteó (no es una demo de juguete, no solo mirarlo desde el titular). Si hace falta explicar un tradeoff, hacerlo desde la prueba concreta y la consecuencia operativa.
¡Hola DevExpert!
[Intro 2-3 líneas contextualizando la semana y adelantando el tema principal]
**TL;DR de esta semana:**
- **Vídeo:** [Título del vídeo](URL) - Descripción corta
- **Tema de la semana:** Título del tema - Resumen en una línea
- **Nuevos modelos:** [Modelo 1](enlace) (qué hace) · [Modelo 2](enlace)
---
## El tema de la semana: [Título del tema]
[Texto narrativo que va contando la historia del tema, integrando enlaces en el propio texto. Por ejemplo:]
[Herramienta X](enlace) ha revolucionado la forma de trabajar esta semana. La idea es simple: [explicación].
El hype ha sido brutal. [Fulano contaba](enlace) cómo logró X. [Otro usuario](enlace) hizo Y.
Por mi parte, escribí [un artículo sobre Z](enlace). En [el podcast de esta semana](enlace) profundizamos en todo esto.
[El texto fluye como una narrativa, no como una lista de items separados]
---
## El vídeo de la semana: [Título]
[Descripción breve del vídeo principal]
[Ver el vídeo en YouTube](URL)
---
## Novedades de modelos (opcional)
**[Modelo 1](enlace)** - [Descripción breve]
**[Modelo 2](enlace)** - [Descripción breve]
---
## Próxima edición de AI Expert
[CTA fijo hacia devexpert.io]
[Toda la información aquí](https://devexpert.io/cursos/expert/ai)
---
Un abrazo,
Antonio.
Usar cuando no hay un tema claro y el contenido es variado.
¡Hola DevExpert!
[Intro 2-3 líneas contextualizando la semana]
**TL;DR de esta semana:**
- **Vídeo:** [Título del vídeo](URL) - Descripción corta
- **Destacado:** Tema principal - Resumen en una línea
- **Nuevos modelos:** [Modelo 1](enlace) (qué hace) · [Modelo 2](enlace)
---
## El vídeo de la semana: [Título]
[Descripción breve del vídeo principal]
[Ver el vídeo en YouTube](URL)
---
## Lo que ha pasado esta semana
**[Tema 1]**
[Descripción + opinión]
[Enlace]
**[Tema 2]**
[...]
---
## Lecturas recomendadas
**[Título de tercero 1]**
[Por qué es interesante, puntos clave]
[Enlace]
**[Título de tercero 2]**
[...]
---
## Reflexión de la semana: [Título] (opcional)
[Reflexión personal más extensa]
[Enlace]
---
## Novedades de modelos (opcional)
**[Modelo 1](enlace)** - [Descripción breve]
**[Modelo 2](enlace)** - [...]
---
## Próxima edición de AI Expert
[CTA fijo hacia devexpert.io]
[Toda la información aquí](https://devexpert.io/cursos/expert/ai)
---
Un abrazo,
Antonio.
Después de programar la newsletter en Listmonk, ofrece a Antonio generar una versión HTML adaptada para publicar como artículo en X.
Si acepta:
<h1> al inicio del HTML.<h1>, <h2>, <p>, <a>, <strong>, <blockquote>, <hr>x.com), muestra la URL en texto claro dentro del contenido (no solo ancla), para poder copiar/pegar e integrar el post fácilmente en X Articles.~/Documents/aipal/newsletter-html/YYYY-MM-DD.html~/Documents/aipal/newsletter-html/YYYY-MM-DD-cover.pngAl finalizar (después de crear el borrador en Listmonk), añadir una entrada al fichero ~/Documents/aipal/10-areas/contenido/learnings.md. Si el fichero no existe, crearlo.
Formato del bloque a añadir (append, nunca truncar):
## YYYY-MM-DD — Newsletter semanal
- **Tema central**: [título o descripción del tema dominante, o "variada" si no hubo uno]
- **Estructura usada**: A (con tema dominante) / B (variada)
- **Secciones incluidas**: [lista: vídeo semana, tema semana, lo que pasó, lecturas recomendadas, novedades modelos, reflexión…]
- **Contenido propio destacado**: [títulos de posts propios más relevantes de la semana]
- **Bookmarks incluidos**: [número y temáticas]
- **Campana Listmonk ID**: [id]
Este registro permite que futuras sesiones conozcan el historial de newsletters sin necesidad de consultarlo manualmente.
draft hasta que Antonio la revise y programe