#!/usr/bin/env python3 """ GitHub Repository Manager for ArtifaX Automatically creates and manages GitHub repository using GitHub API """ import os import json import base64 from github import Github # Removed version import - using static version info class GitHubManager: def __init__(self, token=None): self.token = token or self.load_token() self.github = Github(self.token) if self.token else None def load_token(self): """Load GitHub token from config or environment""" try: config_path = os.path.join('config', 'github_config.json') if os.path.exists(config_path): with open(config_path, 'r') as f: config = json.load(f) return config.get('token') except: pass return os.environ.get('GITHUB_TOKEN') def create_repository(self, repo_name="ArtifaX", description=None, private=True): """Create a new GitHub repository""" if not self.github: return False, "GitHub token not configured" try: user = self.github.get_user() # Check if repo already exists try: existing_repo = user.get_repo(repo_name) return True, f"Repository already exists: {existing_repo.html_url}" except: pass # Create new repository repo_description = description or "ArtifaX - BA Automation Assistant - v1.2.0" repo = user.create_repo( name=repo_name, description=repo_description, private=private, auto_init=False ) return True, f"Repository created: {repo.html_url}" except Exception as e: return False, f"Failed to create repository: {str(e)}" def upload_files(self, repo_name="ArtifaX"): """Upload all project files to GitHub repository""" if not self.github: return False, "GitHub token not configured" try: user = self.github.get_user() repo = user.get_repo(repo_name) # Files to upload files_to_upload = [ 'web_server.py', 'server.py', 'ai_client.py', 'jira_client.py', 'document_generator.py', 'content_filter.py', 'version.py', 'requirements.txt', 'README.md', 'CHANGELOG.md', '.gitignore', 'agents/mapping_agent.py', 'agents/testcase_agent.py', 'agents/sequence_agent.py', 'agents/conversation_agent.py', 'templates/chat.html', 'config/ui_config.json', 'config/content_filter_config.json' ] uploaded_files = [] for file_path in files_to_upload: if os.path.exists(file_path): try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() repo.create_file( path=file_path, message=f"Add {file_path}", content=content ) uploaded_files.append(file_path) except Exception as e: print(f"Failed to upload {file_path}: {e}") return True, f"Uploaded {len(uploaded_files)} files successfully" except Exception as e: return False, f"Failed to upload files: {str(e)}" def create_release(self, repo_name="ArtifaX", tag_name=None, release_name=None): """Create a GitHub release""" if not self.github: return False, "GitHub token not configured" try: user = self.github.get_user() repo = user.get_repo(repo_name) tag = tag_name or "v1.2.0" name = release_name or "ArtifaX 1.2.0" # Read changelog for release notes release_notes = "Initial release of ArtifaX - BA Automation Assistant" try: with open('CHANGELOG.md', 'r') as f: changelog = f.read() # Extract current version notes lines = changelog.split('\n') in_current_version = False notes = [] for line in lines: if line.startswith('## [') and '1.2.0' in line: in_current_version = True continue elif line.startswith('## [') and in_current_version: break elif in_current_version: notes.append(line) if notes: release_notes = '\n'.join(notes).strip() except: pass release = repo.create_git_release( tag=tag, name=name, message=release_notes, draft=False, prerelease=False ) return True, f"Release created: {release.html_url}" except Exception as e: return False, f"Failed to create release: {str(e)}" def main(): """Interactive GitHub setup""" print("šŸš€ ArtifaX GitHub Manager") print("=" * 40) # Get GitHub token token = input("Enter your GitHub Personal Access Token: ").strip() if not token: print("āŒ GitHub token is required") return # Save token to config os.makedirs('config', exist_ok=True) config_path = os.path.join('config', 'github_config.json') with open(config_path, 'w') as f: json.dump({"token": token}, f, indent=2) manager = GitHubManager(token) # Create repository print("\nšŸ“ Creating GitHub repository...") success, message = manager.create_repository() print(f"{'āœ…' if success else 'āŒ'} {message}") if success: # Upload files print("\nšŸ“¤ Uploading project files...") success, message = manager.upload_files() print(f"{'āœ…' if success else 'āŒ'} {message}") if success: # Create release print("\nšŸ·ļø Creating release...") success, message = manager.create_release() print(f"{'āœ…' if success else 'āŒ'} {message}") print("\nšŸŽ‰ GitHub setup complete!") print("\nNext steps:") print("1. Visit your repository on GitHub") print("2. Clone locally: git clone ") print("3. Make changes and push updates") if __name__ == "__main__": main()