import os import sys import subprocess from dotenv import load_dotenv from interpreter import OpenInterpreter load_dotenv() # Load environment variables from .env def get_git_credentials(): """Retrieve Git credentials and project path from command-line arguments.""" if len(sys.argv) != 5: print( "Usage: python gen_commit.py " ) sys.exit(1) return sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4] def run_command(command, cwd=None): """Run a shell command and return the output.""" try: result = subprocess.run( command, cwd=cwd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f"Command failed: {command}\n{e.stderr}") return "" def gen_commit(project_path): """Use OpenInterpreter to generate a commit message based on git diff.""" agent = OpenInterpreter() agent.auto_run = True with open( "/root/dev/Bifrost/registry/scripts/interpreter/commit_convention.txt", "r" ) as f: file_content = f.read() agent.system_message = f""" Your name is Bifrost. You are a helpful assistant that generates commit messages based on uncommitted code. Follow these rules: 1. Use English. 2. Be concise and follow this format: {file_content} 3. Only return the commit message. Do not add explanation or extra output. """ prompt = f""" Generate a commit message based on the following changes in the project directory: First, change directory: cd {project_path} Then run: git diff --name-status Then generate a commit message according to the changes. """ response = agent.chat(prompt) # Extract just the content from the response if isinstance(response, list) and len(response) > 0: if isinstance(response[-1], dict) and "content" in response[-1]: return response[-1]["content"].strip() return str(response).strip() def push_code(): """Pull, commit, and push code with AI-generated message.""" git_user, git_pass, git_repo, project_path = get_git_credentials() # Change to project path os.chdir(project_path) # Generate commit message commit_msg = gen_commit(project_path) print(f"Generated commit message:\n{commit_msg}\n") # Pull, add, commit, and push remote_url = f"https://{git_user}:{git_pass}@{git_repo}" run_command(f"git pull {remote_url} || true") run_command("git add .") run_command(f'git commit -m "{commit_msg}" || true') run_command(f"git push {remote_url} || true") if __name__ == "__main__": push_code()