diff --git a/agents/report_generator.py b/agents/report_generator.py
new file mode 100644
index 0000000..f48297a
--- /dev/null
+++ b/agents/report_generator.py
@@ -0,0 +1,39 @@
+import json, os, markdown, weasyprint
+
+def cargar_resultados(ruta_json: str) -> dict:
+ with open(ruta_json, 'r', encoding='utf-8') as f:
+ return json.load(f)
+
+def renderizar_markdown(md_text: str) -> str:
+ return markdown.markdown(md_text, extensions=['fenced_code', 'tables'])
+
+def generar_html(datos: dict) -> str:
+ secciones = []
+ secciones.append(f"
{datos.get('problema','Problema')}
")
+ secciones.append(f"Resumen de búsqueda
{renderizar_markdown(datos.get('busqueda',''))}")
+ secciones.append(f"Candidatos evaluados
{renderizar_markdown(datos.get('candidatos',''))}")
+ secciones.append(f"Recomendación y verificación
{renderizar_markdown(datos.get('recomendacion',''))}")
+ return "\n".join(secciones)
+
+def guardar_html(html: str, salida: str):
+ with open(salida, 'w', encoding='utf-8') as f:
+ f.write(html)
+
+def generar_pdf(html: str, salida_pdf: str):
+ weasyprint.HTML(string=html).write_pdf(salida_pdf)
+
+def main(ruta_json: str, salida_html: str = 'reporte.html', salida_pdf: str = 'reporte.pdf'):
+ datos = cargar_resultados(ruta_json)
+ html = generar_html(datos)
+ guardar_html(html, salida_html)
+ generar_pdf(html, salida_pdf)
+ print(f"Informe generado: {os.path.abspath(salida_html)} y {os.path.abspath(salida_pdf)}")
+
+if __name__ == '__main__':
+ import argparse
+ parser = argparse.ArgumentParser(description='Genera informe de evidencia para github-solution-research')
+ parser.add_argument('json', help='Archivo JSON con los resultados de la investigación')
+ parser.add_argument('--html', default='reporte.html')
+ parser.add_argument('--pdf', default='reporte.pdf')
+ args = parser.parse_args()
+ main(args.json, args.html, args.pdf)
\ No newline at end of file