Resumen de Boletín
Agrega contenido de fuentes RSS, sintetiza las historias principales de la semana con Gemini y publica un resumen en Ghost CMS. Admite formatos de resúmenes semanales, de inmersión en temas y de selecciones curadas.
Estilo de Redacción
Aplicar a todo el contenido generado del resumen:
- Solo voz activa
- Frases cortas, una idea por frase
- Sin guiones largos — usa un punto o una coma en su lugar
- Sin punto y coma
- Sin markdown ni asteriscos en el cuerpo final del boletín
- Sin hashtags
Palabras prohibidas — no usar ninguna de estas en el resumen: increíble, asombroso, apalancamiento, sinergizar, innovador, cambio de juego, adentrarse, aprovechar, desbloquear, innovador, de vanguardia, notable, paradigma, revolucionar, disruptivo, transformador, emocionado, emocionado de compartir, potente, innovador, integral, procesable, crucial, vital, fundamental, dilucidar, utilizar, sumergirse, tapiz, iluminar, revolucionar
REGLA CRÍTICA
Cada afirmación, estadística y resumen en el boletín debe provenir de los artículos obtenidos. Nunca inventes puntos de datos, citas o hechos. Si un artículo de origen no tiene contenido significativo, omítelo.
Paso 1: Verificar Configuración
1a. Verificar que los feeds estén configurados
Comprueba si feeds.json existe en el directorio de la habilidad:
ls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/feeds.json 2>/dev/null
Si falta, pregunta al usuario: "¿Qué feeds RSS debo monitorear? Comparte una lista de URLs y crearé feeds.json."
El formato es:
[
{ "url": "https://ejemplo.com/feed", "name": "Nombre de la Fuente" },
{ "url": "https://otro.com/rss", "name": "Otra Fuente" }
]
1b. Verificar las variables de entorno requeridas
Comprueba que estén configuradas:
GEMINI_API_KEY(obligatoria): para la síntesisGHOST_URLyGHOST_ADMIN_KEY(obligatorias para publicar en Ghost, opcionales si solo se genera la salida)
Si falta GEMINI_API_KEY, detente y pide al usuario que la configure.
La configuración de GHOST es opcional. Si no está configurada, la habilidad genera Markdown formateado en lugar de publicar.
1c. Verificar las dependencias del script
ls /Users/ksd/Desktop/Varnan_skills/newsletter-digest/node_modules 2>/dev/null | head -1
Si faltan:
cd /Users/ksd/Desktop/Varnan_skills/newsletter-digest && npm install
Paso 2: Obtener y Analizar Feeds
Ejecuta el script de obtención:
node /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/fetch-feeds.js
El script:
- Lee
feeds.jsonpara la lista de feeds - Obtiene cada feed usando
rss-parser - Filtra los elementos publicados en los últimos 7 días
- Elimina duplicados por URL
- Ordena por fecha de publicación, del más nuevo al más antiguo
- Guarda los resultados en
/tmp/newsletter-digest-articles.json
Si el script da error en un feed específico, registra una advertencia y continúa. Un feed defectuoso no detiene la ejecución.
Después de que el script se complete, verifica la salida:
node -e "
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('/tmp/newsletter-digest-articles.json', 'utf8'));
console.log('Total de artículos:', data.articles.length);
console.log('De los feeds:', data.feedsSummary.map(f => f.name + ': ' + f.count).join(', '));
console.log('Rango de fechas:', data.dateRange.from, 'hasta', data.dateRange.to);
"
Si se encuentran menos de 3 artículos, advierte al usuario y pregúntale si desea extender el rango de fechas a 14 días. Pasa --days=14 al script para ampliar la ventana.
Paso 3: Leer las Reglas de Formato
Lee references/digest-format.md en su totalidad antes de generar cualquier contenido. Internaliza:
- Tres formatos de resumen (Resumen Semanal, Inmersión en un Tema, Selecciones Curadas) y cuándo usar cada uno
- Estructura de las secciones y requisitos de extensión por formato
- Reglas de atribución (cada afirmación enlaza a una fuente)
- Pautas de tono y voz
Lee references/output-template.md y selecciona la plantilla que coincida con el formato solicitado.
Si el usuario no especificó un formato, usa por defecto Resumen Semanal.
Paso 4: Sintetizar con Gemini
Lee /tmp/newsletter-digest-articles.json y construye un prompt de síntesis.
Estructura del prompt:
Eres un editor de boletines que escribe un resumen de las historias principales de esta semana.
Fuentes (usa SOLO estas — no inventes hechos):
[Para cada artículo: Título | Fuente | Fecha | Resumen]
Tarea:
Escribe un resumen [FORMATO] siguiendo esta estructura:
[Pega la plantilla seleccionada de references/output-template.md]
Reglas:
- Cada afirmación, estadística y cita debe provenir de las fuentes anteriores
- Escribe en voz activa, frases cortas, se permiten contracciones
- No uses: increíble, asombroso, apalancamiento, innovador, adentrarse, de vanguardia, revolucionar
- Sin guiones largos, sin punto y coma, sin hashtags
- Incluye [Fuente: Nombre](URL) como atribución después de cada afirmación principal
- Genera texto plano solo con etiquetas HTML de encabezado (sin asteriscos de markdown)
Llama a Gemini con este prompt. Modelo objetivo: gemini-2.0-flash o el último disponible.
Si la respuesta contiene palabras prohibidas o estadísticas inventadas que no están en los artículos de origen, vuelve a generar con un prompt más estricto.
Paso 5: Autoverificación
Ejecuta cada verificación antes de presentar. Corrige las infracciones primero.
- Cada afirmación, estadística y cita se remonta a un artículo de origen
- No hay palabras prohibidas en ninguna sección
- Sin guiones largos en el texto
- Sin punto y coma en el texto
- Cada sección tiene al menos una atribución de fuente con URL
- El recuento de palabras está dentro del rango objetivo del formato (ver references/digest-format.md)
- Ninguna sección repite la misma historia dos veces
- El título es específico (incluye el rango de fechas o el número de edición, no solo "Resumen Semanal")
- La salida HTML es válida (sin etiquetas no cerradas si se publica en Ghost)
Corrige todas las infracciones antes de presentar al usuario.
Paso 6: Formatear y Vista Previa
Presenta el resumen al usuario en este orden:
- Título — Rango de fechas de la edición o tema
- Contenido del resumen — Texto completo formateado
- Lista de fuentes — Todos los artículos utilizados, con URLs
- Recuento de palabras y de artículos
Pregunta: "¿Listo para publicar en Ghost como borrador, o prefieres editar primero?"
Paso 7: Publicar en Ghost o Generar Salida
Si GHOST_URL y GHOST_ADMIN_KEY están configurados y el usuario confirma:
Ejecuta el script de publicación:
node /Users/ksd/Desktop/Varnan_skills/newsletter-digest/scripts/ghost-publish.js \
--title "TITULO_DEL_RESUMEN" \
--status "draft"
El script lee /tmp/newsletter-digest-output.json (escrito por el agente en el Paso 6) y lo publica en Ghost.
Después de publicar, el script devuelve la URL de administración de Ghost para el borrador. Preséntala al usuario: "Borrador guardado en: [URL]. Revisa y publica desde tu panel de Ghost."
Si el usuario quiere publicar inmediatamente, pasa --status "published" al script.
Si Ghost no está configurado o el usuario dice "solo salida":
Genera el resumen en tres formatos:
- HTML — listo para pegar en cualquier CMS
- Markdown — para Substack, Notion o Hashnode
- Texto plano — para clientes de correo
Agrega: "Substack no ofrece una API pública. Copia la versión Markdown directamente en tu editor de Substack."
Notas sobre Substack
Substack no tiene una API pública. La publicación programática no es posible sin ingeniería inversa de endpoints internos, lo que viola sus términos. La habilidad genera un resumen en Markdown formateado listo para pegar en el editor de Substack. Este es el enfoque correcto.