Files
carlospalanca.es/agents/shared/github_client.py

67 lines
1.7 KiB
Python

import os
from datetime import datetime
from github import Github
def get_github_client():
token = os.environ["GITHUB_TOKEN"]
repo_name = os.environ["GITHUB_REPO"]
g = Github(token)
return g.get_repo(repo_name)
def create_content_pr(
file_path: str,
content: str,
title: str,
description: str,
agent_name: str,
branch_prefix: str,
) -> str:
"""
Crea una rama, hace commit de un archivo y abre un PR.
Devuelve la URL del PR.
NUNCA hace commit directo a main.
"""
repo = get_github_client()
main_branch = repo.get_branch("main")
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
slug = title.lower().replace(" ", "-")[:40]
branch_name = f"{branch_prefix}/{agent_name.lower()}-{timestamp}-{slug}"
# Crear rama desde main
repo.create_git_ref(
ref=f"refs/heads/{branch_name}",
sha=main_branch.commit.sha,
)
# Crear archivo en la nueva rama
repo.create_file(
path=file_path,
message=f"content({branch_prefix}): {title}",
content=content.encode("utf-8"),
branch=branch_name,
)
# Abrir Pull Request
pr = repo.create_pull(
title=f"[{agent_name}] {title}",
body=(
f"**Creado por el agente {agent_name}**\n\n"
f"{description}\n\n"
f"---\n*Este PR requiere revisión humana antes de mergear.*"
),
head=branch_name,
base="main",
)
# Añadir etiquetas (las crea si no existen)
for label_name in ["agent-created", "needs-review"]:
try:
pr.add_to_labels(label_name)
except Exception:
pass
return pr.html_url