From 1ef7ddc3bebee78cd30b905825054b20955d8651 Mon Sep 17 00:00:00 2001 From: Nubenetes Bot Date: Fri, 8 May 2026 18:56:00 +0200 Subject: [PATCH] docs: mejorar transparencia del PR con listas detalladas de enlaces y rango temporal --- src/gitops_manager.py | 26 ++++++++++++++++++++------ src/main.py | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/gitops_manager.py b/src/gitops_manager.py index 4bc8183c..bd7bd4f0 100644 --- a/src/gitops_manager.py +++ b/src/gitops_manager.py @@ -36,22 +36,36 @@ class RepositoryController: # Informe Visual en el PR categories_str = ", ".join([f"`{c}`" for c in metrics.get('categories', [])]) + # Detalle de enlaces añadidos + added_md = "" + if metrics.get('added_list'): + added_md = "### ➕ Enlaces Añadidos\n| Recurso | Categoría | URL |\n| :--- | :--- | :--- |\n" + for item in metrics['added_list']: + added_md += f"| {item['title']} | `{item['category']}` | {item['url']} |\n" + + # Detalle de curación/borrado + removed_md = "" + if metrics.get('removed_list'): + removed_md = "### 🧹 Curación y Limpieza (Duplicados)\n| Categoría | Acción |\n| :--- | :--- |\n" + for item in metrics['removed_list']: + removed_md += f"| `{item['category']}` | {item['reason']} |\n" + pr_narrative = ( f"## 💎 Actualización de Conocimiento: Kubernetes & Cloud Native\n\n" f"Este PR añade **{metrics.get('total_new', 0)}** nuevos recursos y optimiza los existentes.\n\n" - f"### ✅ Mejoras realizadas:\n" - f"- **Inyección de Novedades**: Nuevos recursos filtrados desde X y Trending.\n" - f"- **Optimización de Duplicados**: Se han detectado URLs repetidas y el bot ha elegido mantener la versión con **más estrellas (🌟)** y **mejor descripción**, eliminando las versiones redundantes más pobres.\n\n" - f"### 📊 Resumen de Ingesta:\n" + f"**Rango Temporal Analizado:** `{metrics.get('start_date')}` ➔ `{metrics.get('end_date')}`\n\n" + f"### ✅ Resumen de Ingesta:\n" f"```mermaid\n" - f"pie title Origen de los Nuevos Recursos\n" + f"pie title Origen de los Recursos\n" f" \"X (@nubenetes)\" : {metrics.get('social_injections', 0)}\n" f" \"GitHub Trending\" : {metrics.get('trending_injections', 0)}\n" f"```\n\n" + f"{added_md}\n" + f"{removed_md}\n" f"### 📂 Categorías Impactadas:\n" f"{categories_str}\n\n" f"---\n" - f"**Nota del Bot:** El bot ya no borra enlaces por falta de respuesta del servidor (salud), solo optimiza el contenido duplicado basándose en la calidad del texto y las menciones destacadas." + f"**Nota del Bot:** El bot utiliza heurísticas de calidad para decidir qué duplicados mantener (estrellas 🌟 y longitud de descripción)." ) self.repository.create_pull( diff --git a/src/main.py b/src/main.py index dbee6bb4..467900f0 100644 --- a/src/main.py +++ b/src/main.py @@ -50,7 +50,14 @@ async def master_orchestrator(): # 4. Inyección en Markdowns file_updates = {} - stats = {"new_links": 0, "categories_updated": set()} + stats = { + "new_links": 0, + "categories_updated": set(), + "added_details": [], # Lista de {title, url, category} + "removed_details": [], # Lista de {url, category, reason} + "time_horizon": time_horizon.isoformat(), + "end_date": datetime.now(MADRID_TZ).isoformat() + } for category in NUBENETES_CATEGORIES: file_path = f"docs/{category}.md" @@ -59,15 +66,31 @@ async def master_orchestrator(): content = repo_file.decoded_content.decode("utf-8") # Limpiamos solo duplicados existentes para mantener higiene - final_content, _ = await markdown_sanitizer.sanitize_document(content) + final_content, doc_stats = await markdown_sanitizer.sanitize_document(content) + # Registrar duplicados eliminados (curación) + if doc_stats.get("duplicates", 0) > 0: + # Nota: markdown_sanitizer no devuelve qué URLs borró exactamente, + # pero podemos inferir que hubo limpieza de calidad. + stats["removed_details"].append({ + "category": category, + "reason": "Optimización de duplicados (mejor calidad mantenida)" + }) + # Inyectar novedades original_content = final_content for asset in all_new_assets: if asset["category"] == category: + prev_len = len(final_content) final_content = markdown_sanitizer.inject_curated_link( final_content, category, asset["title"], asset["url"], asset["description"] ) + if len(final_content) > prev_len: + stats["added_details"].append({ + "title": asset["title"], + "url": asset["url"], + "category": category + }) if final_content.strip() != original_content.strip(): file_updates[file_path] = final_content @@ -76,13 +99,17 @@ async def master_orchestrator(): except Exception: continue - # 5. GitOps - Generar Informe Mermaid en el PR + # 5. GitOps - Generar Informe Detallado en el PR if file_updates: metrics = { "social_injections": len(curated), "trending_injections": len(trending), "total_new": stats["new_links"], - "categories": list(stats["categories_updated"]) + "categories": list(stats["categories_updated"]), + "added_list": stats["added_details"], + "removed_list": stats["removed_details"], + "start_date": stats["time_horizon"], + "end_date": stats["end_date"] } print(f"[+] Éxito. Preparando PR con {stats['new_links']} nuevos recursos.")