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 agent.system_message = """ 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: - feat: add a new feature - fix: fix a bug - refactor: refactor the code - chore: update the code - perf: improve the performance - test: add a test - docs: update the docs - update: update the code - remove: remove the code - style: style the code - revert: revert the code - merge: merge the code - conflict: resolve the conflict - other: other 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()