aboutsummaryrefslogtreecommitdiff
path: root/cli.py
diff options
context:
space:
mode:
authorGravatar SwiftyOS <craigswift13@gmail.com> 2023-09-15 19:44:37 +0200
committerGravatar SwiftyOS <craigswift13@gmail.com> 2023-09-15 19:44:37 +0200
commitcd589e98919d0a2f2cf719340200bb93933db2e1 (patch)
tree34b5b6e3854611fa1d985186e6c887fe8cc658e9 /cli.py
parentAdd agbenchmark serve to run command (#5222) (diff)
downloadAuto-GPT-cd589e98919d0a2f2cf719340200bb93933db2e1.tar.gz
Auto-GPT-cd589e98919d0a2f2cf719340200bb93933db2e1.tar.bz2
Auto-GPT-cd589e98919d0a2f2cf719340200bb93933db2e1.zip
added git commands workflow to cli
Diffstat (limited to 'cli.py')
-rw-r--r--cli.py255
1 files changed, 253 insertions, 2 deletions
diff --git a/cli.py b/cli.py
index 8b2453499..c3a418148 100644
--- a/cli.py
+++ b/cli.py
@@ -1,8 +1,10 @@
try:
import click
+ import github
except ImportError:
import os
os.system('pip3 install click')
+ os.system('pip3 install PyGithub')
import click
@@ -19,9 +21,99 @@ def setup():
setup_script = os.path.join(script_dir, 'setup.sh')
if os.path.exists(setup_script):
subprocess.Popen([setup_script], cwd=script_dir)
- click.echo("Setup initiated")
+ click.echo(click.style("🚀 Setup initiated", fg='green'))
else:
- click.echo("Error: setup.sh does not exist in the current directory.")
+ click.echo(click.style("❌ Error: setup.sh does not exist in the current directory.", fg='red'))
+
+ try:
+ # Check if GitHub user name is configured
+ user_name = subprocess.check_output(['git', 'config', 'user.name']).decode('utf-8').strip()
+ user_email = subprocess.check_output(['git', 'config', 'user.email']).decode('utf-8').strip()
+
+ if user_name and user_email:
+ click.echo(click.style(f"✅ GitHub account is configured with username: {user_name} and email: {user_email}", fg='green'))
+ else:
+ raise subprocess.CalledProcessError(returncode=1, cmd='git config user.name or user.email')
+
+ except subprocess.CalledProcessError:
+ # If the GitHub account is not configured, print instructions on how to set it up
+ click.echo(click.style("❌ GitHub account is not configured.", fg='red'))
+ click.echo(click.style("To configure your GitHub account, use the following commands:", fg='red'))
+ click.echo(click.style(" git config --global user.name \"Your GitHub Username\"", fg='red'))
+ click.echo(click.style(" git config --global user.email \"Your GitHub Email\"", fg='red'))
+
+ # Check for the existence of the .github_access_token file
+ if os.path.exists('.github_access_token'):
+ with open('.github_access_token', 'r') as file:
+ github_access_token = file.read().strip()
+ if github_access_token:
+ click.echo(click.style("✅ GitHub access token loaded successfully.", fg='green'))
+ # Check if the token has the required permissions
+ import requests
+ headers = {'Authorization': f'token {github_access_token}'}
+ response = requests.get('https://api.github.com/user', headers=headers)
+ if response.status_code == 200:
+ scopes = response.headers.get('X-OAuth-Scopes')
+ if 'public_repo' in scopes or 'repo' in scopes:
+ click.echo(click.style("✅ GitHub access token has the required permissions.", fg='green'))
+ else:
+ click.echo(click.style("❌ GitHub access token does not have the required permissions. Please ensure it has 'public_repo' or 'repo' scope.", fg='red'))
+ else:
+ click.echo(click.style("❌ Failed to validate GitHub access token. Please ensure it is correct.", fg='red'))
+ else:
+ click.echo(click.style("❌ GitHub access token file is empty. Please follow the instructions below to set up your GitHub access token.", fg='red'))
+ else:
+ # Create the .github_access_token file if it doesn't exist
+ with open('.github_access_token', 'w') as file:
+ file.write('')
+
+ # Instructions to set up GitHub access token
+ click.echo(click.style("❌ To configure your GitHub access token, follow these steps:", fg='red'))
+ click.echo(click.style("\t1. Ensure you are logged into your GitHub account", fg='red'))
+ click.echo(click.style("\t2. Navigate to https://github.com/settings/tokens", fg='red'))
+ click.echo(click.style("\t6. Click on 'Generate new token'.", fg='red'))
+ click.echo(click.style("\t7. Fill out the form to generate a new token. Ensure you select the 'repo' scope.", fg='red'))
+ click.echo(click.style("\t8. Open the '.github_access_token' file in the same directory as this script and paste the token into this file.", fg='red'))
+ click.echo(click.style("\t9. Save the file and run the setup command again.", fg='red'))
+
+@cli.command()
+@click.option('--branch', default='master', help='Branch to sync with the parent repository')
+def sync(branch):
+ import subprocess
+
+ try:
+ # Get GitHub repository URL
+ github_repo_url = subprocess.check_output(['git', 'config', '--get', 'remote.origin.url']).decode('utf-8').strip()
+
+ # Initialize GitHub API client
+ with open('.github_access_token', 'r') as file:
+ github_access_token = file.read().strip()
+ g = github.Github(github_access_token)
+ repo = g.get_repo(github_repo_url.split(':')[-1].split('.git')[0])
+
+ # Get parent repository URL
+ parent_repo = repo.parent
+ if parent_repo:
+ parent_repo_url = parent_repo.clone_url
+ else:
+ click.echo(click.style("❌ This repository does not have a parent repository to sync with.", fg='red'))
+ return
+
+ # Add the parent repository as a remote named 'upstream' (if not already added)
+ remotes = subprocess.check_output(['git', 'remote']).decode('utf-8').strip().split('\n')
+ if 'upstream' not in remotes:
+ subprocess.check_call(['git', 'remote', 'add', 'upstream', parent_repo_url])
+
+ # Fetch the updates from the parent repository
+ subprocess.check_call(['git', 'fetch', 'upstream'])
+
+ # Merge the updates into the local master branch (or another specified branch)
+ subprocess.check_call(['git', 'merge', f'upstream/{branch}', branch])
+
+ click.echo(click.style(f"✅ Synced local {branch} branch with upstream {branch} branch.", fg='green'))
+
+ except Exception as e:
+ click.echo(click.style(f"❌ An error occurred: {e}", fg='red'))
@cli.group()
def agents():
@@ -276,5 +368,164 @@ def frontend():
else:
click.echo("Error: Frontend directory or run file does not exist.")
+
+
+@cli.group()
+def arena():
+ """Commands to enter the arena"""
+ pass
+
+@arena.command()
+@click.argument('agent_name')
+@click.option('--branch', default='master', help='Branch to use instead of master')
+def enter(agent_name, branch):
+ import subprocess
+ from github import Github
+ from datetime import datetime
+ import os
+ import json
+ # Check if the agent_name directory exists in the autogpts directory
+ agent_dir = f'./autogpts/{agent_name}'
+ if not os.path.exists(agent_dir):
+ click.echo(click.style(f"❌ The directory for agent '{agent_name}' does not exist in the autogpts directory.", fg='red'))
+ click.echo(click.style(f"🚀 Run './run agents create {agent_name}' to create the agent.", fg='yellow'))
+
+
+ return
+ else:
+ click.echo(click.style(f"✅ The directory for agent '{agent_name}' exists in the autogpts directory.", fg='green'))
+
+ try:
+ # Load GitHub access token from file
+ with open('.github_access_token', 'r') as file:
+ github_access_token = file.read().strip()
+
+ # Get GitHub repository URL
+ github_repo_url = subprocess.check_output(['git', 'config', '--get', 'remote.origin.url']).decode('utf-8').strip()
+
+ # If --branch is passed, use it instead of master
+ if branch:
+ branch_to_use = branch
+ else:
+ branch_to_use = "master"
+
+ # Get the commit hash of HEAD of the branch_to_use
+ commit_hash_to_benchmark = subprocess.check_output(['git', 'rev-parse', branch_to_use]).decode('utf-8').strip()
+
+ # Create a new branch called arena_submission
+ subprocess.check_call(['git', 'checkout', '-b', 'arena_submission'])
+
+ # Create a dictionary with the necessary fields
+ data = {
+ "github_repo_url": github_repo_url,
+ "timestamp": datetime.utcnow().isoformat(),
+ "commit_hash_to_benchmark": commit_hash_to_benchmark,
+ }
+
+ # If --branch was passed, add branch_to_benchmark to the JSON file
+ if branch:
+ data["branch_to_benchmark"] = branch
+
+ # Create agent directory if it does not exist
+ subprocess.check_call(['mkdir', '-p', 'agent'])
+
+ # Create a JSON file with the data
+ with open(f'agent/{agent_name}.json', 'w') as json_file:
+ json.dump(data, json_file, indent=4)
+
+ # Create a commit with the specified message
+ subprocess.check_call(['git', 'add', f'agent/{agent_name}.json'])
+ subprocess.check_call(['git', 'commit', '-m', f'{agent_name} entering the arena'])
+
+ # Push the commit
+ subprocess.check_call(['git', 'push', 'origin', 'arena_submission'])
+
+ # Create a PR into the parent repository
+ g = Github(github_access_token)
+ repo = g.get_repo(github_repo_url.split(':')[-1].split('.git')[0])
+ parent_repo = repo.parent
+ if parent_repo:
+ parent_repo.create_pull(
+ title=f'{agent_name} entering the arena',
+ body='',
+ head='arena_submission',
+ base=branch_to_use,
+ )
+ click.echo(click.style(f"🚀 {agent_name} has entered the arena!", fg='green'))
+ else:
+ click.echo(click.style("❌ This repository does not have a parent repository to sync with.", fg='red'))
+ return
+
+ # Switch back to the master branch
+ subprocess.check_call(['git', 'checkout', branch_to_use])
+
+ except Exception as e:
+ click.echo(click.style(f"❌ An error occurred: {e}", fg='red'))
+
+@arena.command()
+@click.argument('agent_name')
+@click.option('--branch', default='master', help='Branch to get the git hash from')
+def submit(agent_name, branch):
+ import subprocess
+ from github import Github
+ from datetime import datetime
+ import json
+ try:
+ # Load GitHub access token from file
+ with open('.github_access_token', 'r') as file:
+ github_access_token = file.read().strip()
+
+ # Get GitHub repository URL
+ github_repo_url = subprocess.check_output(['git', 'config', '--get', 'remote.origin.url']).decode('utf-8').strip()
+
+ # Get the git hash of the head of master or the provided branch
+ commit_hash_to_benchmark = subprocess.check_output(['git', 'rev-parse', branch]).decode('utf-8').strip()
+
+ # Stash any uncommitted changes
+ subprocess.check_call(['git', 'stash'])
+
+ # Switch to the arena_submission branch
+ subprocess.check_call(['git', 'checkout', 'arena_submission'])
+
+ # Update the agent_name.json file in the arena folder with the new hash and timestamp
+ json_file_path = f'agent/{agent_name}.json'
+ with open(json_file_path, 'r') as json_file:
+ data = json.load(json_file)
+
+ data['commit_hash_to_benchmark'] = commit_hash_to_benchmark
+ data['timestamp'] = datetime.utcnow().isoformat()
+
+ with open(json_file_path, 'w') as json_file:
+ json.dump(data, json_file, indent=4)
+
+ # Commit and push the changes
+ subprocess.check_call(['git', 'add', json_file_path])
+ subprocess.check_call(['git', 'commit', '-m', f'{agent_name} submitting to the arena'])
+ subprocess.check_call(['git', 'push', 'origin', 'arena_submission'])
+
+ # Create a new PR onto the fork's parent repo
+ g = Github(github_access_token)
+ repo = g.get_repo(github_repo_url.split(':')[-1].split('.git')[0])
+ parent_repo = repo.parent
+ if parent_repo:
+ parent_repo.create_pull(
+ title=f'{agent_name} submitting to the arena',
+ body='',
+ head='arena_submission',
+ base=branch,
+ )
+ click.echo(click.style(f"🚀 {agent_name} has been submitted to the arena!", fg='green'))
+ else:
+ click.echo(click.style("❌ This repository does not have a parent repository to sync with.", fg='red'))
+ return
+
+ # Switch back to the original branch and pop the stashed changes
+ subprocess.check_call(['git', 'checkout', branch])
+ subprocess.check_call(['git', 'stash', 'pop'])
+
+ except Exception as e:
+ click.echo(click.style(f"❌ An error occurred: {e}", fg='red'))
+
+
if __name__ == '__main__':
cli()