Maga222006
MultiagentPersonalAssistant
c7eea5d
from dotenv import load_dotenv
from github import Github
import os
load_dotenv()
def list_repos():
"""Lists all repositories owned by the authenticated GitHub user."""
try:
github = Github(os.getenv('GITHUB_TOKEN'))
user = github.get_user()
repos = user.get_repos()
repo_names = [repo.name for repo in repos]
return ', '.join(repo_names)
except Exception as e:
return None
def download_repo(project_name: str, repo_owner: str = None, branch: str = "main", private: bool = False):
"""
Downloads a GitHub repo (user/<project_name>) using PyGithub
and saves it into agents/coder/projects/{project_name}.
Args:
project_name (str): Repo name on GitHub and local folder name.
repo_owner (str): Repo owner on GitHub, by default = None (it's the user's repository).
branch (str): Branch to download (default 'main').
"""
gh = Github(os.getenv("GITHUB_TOKEN"))
user = gh.get_user()
if repo_owner:
repo = gh.get_repo(f"{repo_owner}/{project_name}")
user.create_repo(project_name, private=private)
else:
repo = user.get_repo(project_name)
dest_path = os.path.join('agents/coder/projects', project_name)
os.makedirs(dest_path, exist_ok=True)
try:
branch_ref = repo.get_branch(branch)
commit_sha = branch_ref.commit.sha
# Get the tree (recursive = True to walk full repo)
tree = repo.get_git_tree(commit_sha, recursive=True).tree
for item in tree:
file_path = os.path.join(dest_path, item.path)
if item.type == "tree":
os.makedirs(file_path, exist_ok=True)
elif item.type == "blob":
blob = repo.get_git_blob(item.sha)
file_content = blob.content
import base64
decoded = base64.b64decode(file_content)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, "wb") as f:
f.write(decoded)
except Exception as e:
return f"Error downloading repository: {str(e)}"
def initialize_project(project_name: str, repo_owner: str = None, branch: str = "main", private: bool = False):
"""Creates a project directory and GitHub repository with the given project_name."""
try:
github = Github(os.getenv('GITHUB_TOKEN'))
user = github.get_user()
repos = user.get_repos()
repo_names = [repo.name for repo in repos]
if project_name in repo_names or repo_owner:
try:
download_repo(project_name=project_name, repo_owner=repo_owner, branch=branch, private=private)
return f"Repository '{f'{repo_owner}/{project_name}' if repo_owner else project_name}' downloaded successfully!"
except Exception as e:
os.mkdir(f"agents/coder/projects/{project_name}")
user.create_repo(project_name, private=private)
return f"Repository '{project_name}' created successfully!"
else:
user.create_repo(project_name, private=private)
os.mkdir(f"agents/coder/projects/{project_name}")
return f"Repository '{project_name}' created successfully!"
except Exception as e:
return f"Error creating repository: {str(e)}"