🔍 SEO Blog v2 (visual editorial — sin programar)
Archivo: /Users/user/rifai-agents/agentes/content/seo-blog-v2.ts · Plist: ninguno encontrado en cron/ · Horario: el código se autolimita a Mar/Jue/Sáb, pero NO hay plist → hoy NO corre solo (solo manual / FORCE_BLOG=1)
> No existe com.rifai.seo-blog-v2.plist. El motor SEO en producción es seo-blog.ts (com.rifai.seo-engine, 8:00). Este v2 es una evolución visual no desplegada.
Qué hace
Generador de blog editorial más visual que v1: incrusta el TÍTULO dentro de la imagen hero (con Sharp), inserta 6-8 imágenes inline temáticas (personas, emoción, contexto urbano, nunca fondo blanco) y da una imagen propia a cada H2. Genera el artículo (1500-2000 palabras) con el LLM y lo publica en el blog "news" de Shopify. Solo modo BLOG (no toca SEO de productos).
Cómo funciona
1. Carga .env, calcula día Madrid, lee estado (data/seo-engine-state.json, compartido con v1). Solo actúa Mar/Jue/Sáb o con FORCE_BLOG=1.
2. Elige topic de BLOG_TOPICS (cada topic trae su bgPrompt para el hero) evitando los 5 últimos.
3. Busca productos relevantes vía GraphQL Shopify.
4. Genera 7 imágenes en paralelo con fal.ai (flux/schnell, landscape_16_9): 1 hero + 6 inline, todas con estilo editorial anti-fondo-blanco y anti-moto.
5. composeHero(): con Sharp incrusta título + subtítulo + etiqueta dorada + gradiente sobre la imagen hero; la sube a fal storage.
6. Pide a gemini-cli (sonnet, timeout 300s) el artículo HTML (sin H1, con placeholders {{IMG_2..6}} y {{PRODUCT_CARDS}}), inyectando contexto Brain (identidad + productos relacionados).
7. Sustituye imágenes inline + product cards, envuelve con hero + CSS embebido, publica POST /blogs/{BLOG_ID}/articles.json.
8. Notifica vía router (seo_audit).
Datos/APIs
- Shopify Admin REST + GraphQL (
/admin/api/2024-10,BLOG_ID=75567464627). Vars:SHOPIFY_STORE,SHOPIFY_ACCESS_TOKEN. - fal.ai (
flux/schnell+ storage). Var:FAL_API_KEY. - LLM local
tools/gemini-cli(sonnet). - Brain
brain/tools/brain.js(identidad +getRelatedProducts). - Notificaciones:
tools/notify-router.ts(a diferencia de v1, aquí sí usa router, eventoseo_audit).
Cómo probarlo
cd /Users/user/rifai-agents && FORCE_BLOG=1 npx tsx agentes/content/seo-blog-v2.ts
Espera: topic, productos, "7 imágenes editoriales", hero compuesto con título, artículo y ✅ Publicado: <url>. Publica de verdad en Shopify. Sin FORCE_BLOG y fuera de Mar/Jue/Sáb solo imprime "sin blog programado".
Si se rompe / recuperar
No tiene plist que recargar. Para desplegarlo habría que crear com.rifai.*.plist apuntando a este archivo (cuidando de no chocar con seo-engine a las 8:00) y launchctl load. Sin programación no tiene log dedicado (stdout en manual). Estado compartido data/seo-engine-state.json.
Cómo replicarlo
- Igual base que v1 (
.env,BLOG_TOPICS, GraphQL productos, LLM, Shopify article POST). - Añade Sharp
composeHeropara incrustar título sobre la imagen hero. - 7 imágenes fal.ai (hero + 6 inline) con prompts editoriales anti-fondo-blanco.
- Brain (
getRelatedProducts) para citar catálogo. - notify-router evento
seo_audit.