UNPKG

ghswap

Version:

Easy GitHub account switching - manage multiple GitHub accounts with seamless context switching for Git config, SSH keys, and GitHub CLI

400 lines (283 loc) 9.56 kB
# ghswap A command-line tool for managing multiple GitHub accounts on the same machine. Seamlessly switch between different Git configurations, SSH keys, and GitHub CLI authentication contexts. ## Table of Contents - [Installation](#installation) - [Quick Start](#quick-start) - [Features](#features) - [Usage](#usage) - [Configuration](#configuration) - [SSH Setup](#ssh-setup) - [Auto-Switching](#auto-switching) - [Troubleshooting](#troubleshooting) - [Requirements](#requirements) - [License](#license) ## Installation Install globally via npm: ```bash npm install -g ghswap ``` ## Quick Start Get started in less than 2 minutes: ```bash # 1. Install npm install -g ghswap # 2. Add your first account ghswap add # 3. Switch accounts anytime ghswap work ghswap personal # 4. Clone and work normally git clone git@github.com:username/repo.git git commit -m "your changes" git push ``` That's it! The tool handles: - ✅ Git config (user.name, user.email) - ✅ SSH key management - ✅ GitHub CLI authentication (optional) **Optional:** Enable auto-switching based on directory: ```bash ghswap setup # Add output to ~/.zshrc or ~/.bashrc ``` ## Features - **Git Configuration Management** - Automatically sets `user.name` and `user.email` - **SSH Key Switching** - Manages SSH keys in ssh-agent - **GitHub CLI Integration** - Authenticates `gh` CLI when tokens are provided - **Directory-Based Auto-Detection** - Automatically switches accounts based on current directory - **Interactive Account Selection** - User-friendly menu for account switching - **Shell Integration** - Optional auto-switching on directory change - **Safe SSH Config Management** - Non-destructive updates to `~/.ssh/config` ## Usage ### Available Commands ```bash ghswap # Interactive account selection menu ghswap <account> # Switch to a specific account ghswap add # Add a new account with guided setup ghswap auto # Auto-detect account based on current directory ghswap list # List all configured accounts ghswap setup # Display shell hook setup instructions ghswap ssh-config # Generate SSH configuration automatically ghswap ssh-init # Check SSH keys and display generation commands ghswap help # Display help information ghswap --version # Show version number ``` ### Interactive Account Addition When you run `ghswap add`, you'll be prompted for: 1. **Account name** (e.g., "work", "personal") 2. **Git username** (e.g., "John Doe") 3. **Git email** (e.g., "you@company.com") 4. **GitHub username** (e.g., "johndoe") 5. **Project directory** (e.g., "~/projects/work") The tool will then: - Generate an SSH keypair automatically - Add the account to your configuration - Update your SSH config with the host alias - Create directory mapping for auto-switching - Display the public key for adding to GitHub - (macOS only) Copy the public key to clipboard ### Example Session ```bash $ ghswap add Add New GitHub Account Account name: work Git username: John Doe Git email: john@company.com GitHub username: johndoe Project directory: ~/projects/work Setting up account... Generating SSH key... SSH key generated Added to configuration SSH config updated Copy this SSH public key to GitHub: ──────────────────────────────────────────────────────── ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... john@company.com ──────────────────────────────────────────────────────── Next steps: 1. Go to: https://github.com/settings/ssh/new 2. Title: "work - MacBook" 3. Paste the key above 4. Click "Add SSH key" Test the connection: ssh -T git@github.com Auto-switch enabled for: ~/projects/work Switch to this account and start working: ghswap work git clone git@github.com:johndoe/repo.git # Work normally - ghswap has configured everything! ``` ## Configuration Configuration is stored in `~/.ghswap.json`: ```json { "accounts": [ { "name": "personal", "gitName": "John Doe", "gitEmail": "john@personal.com", "sshKey": "~/.ssh/id_rsa_personal", "ghToken": "ghp_xxxxxxxxxxxx" }, { "name": "work", "gitName": "John Doe", "gitEmail": "john@company.com", "sshKey": "~/.ssh/id_rsa_work" } ], "directoryMappings": { "~/projects/personal": "personal", "~/projects/work": "work" }, "defaultAccount": "personal" } ``` ### Configuration Fields - **accounts** - Array of GitHub account configurations - **name** - Unique identifier for the account - **gitName** - Git user.name value - **gitEmail** - Git user.email value - **sshKey** - Path to SSH private key - **ghToken** - (Optional) GitHub CLI authentication token - **directoryMappings** - Maps directories to accounts for auto-switching - **defaultAccount** - Account to use when no directory mapping matches ## SSH Setup ### Automated SSH Configuration Generate SSH configuration entries for all accounts: ```bash ghswap ssh-config ``` This command will: - Generate SSH config entries for each account - Back up your existing `~/.ssh/config` - Add a managed block to your SSH config - Display clone URLs for each account The generated SSH config uses host aliases: ``` # BEGIN GHSWAP MANAGED BLOCK Host github.com-personal HostName github.com User git IdentityFile ~/.ssh/id_rsa_personal IdentitiesOnly yes Host github.com-work HostName github.com User git IdentityFile ~/.ssh/id_rsa_work IdentitiesOnly yes # END GHSWAP MANAGED BLOCK ``` This approach is safe to run multiple times - only the managed block is replaced, preserving your other SSH configurations. ### SSH Key Generation Check which SSH keys are missing: ```bash ghswap ssh-init ``` Or generate keys manually: ```bash ssh-keygen -t ed25519 -C "your@email.com" -f ~/.ssh/id_rsa_personal ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_rsa_work ``` Add the public keys to their respective GitHub accounts: ```bash cat ~/.ssh/id_rsa_personal.pub cat ~/.ssh/id_rsa_work.pub ``` ### Cloning Repositories **Simple Method (Recommended):** Just switch to your account first, then use normal GitHub URLs: ```bash ghswap work git clone git@github.com:username/repo.git ``` **Advanced: Using Host Aliases (Optional)** If you prefer, you can use host aliases to specify the account in the clone URL: ```bash git clone git@github.com-personal:username/repo.git git clone git@github.com-work:username/repo.git ``` This is useful if you want to clone repos for multiple accounts without switching, but most users won't need this. ## Auto-Switching ### Manual Auto-Detection Switch accounts based on the current directory: ```bash cd ~/projects/work ghswap auto ``` ### Automatic Directory-Based Switching For automatic switching when changing directories: 1. Generate the shell hook: ```bash ghswap setup ``` 2. Add the output to your shell configuration: ```bash # For zsh echo "$(ghswap setup)" >> ~/.zshrc # For bash echo "$(ghswap setup)" >> ~/.bashrc ``` 3. Reload your shell: ```bash source ~/.zshrc # or source ~/.bashrc ``` Now accounts will switch automatically: ```bash cd ~/projects/personal # Automatically switches to personal account cd ~/projects/work # Automatically switches to work account ``` ## Troubleshooting ### SSH Key Issues **Problem:** SSH key not working **Solution:** ```bash # List currently loaded keys ssh-add -l # Manually add a key ssh-add ~/.ssh/id_rsa_work # Test the connection ssh -T git@github.com-work ``` ### Git Configuration Issues **Problem:** Git config not switching **Solutions:** - Verify you're in a git repository for local config changes - Check current settings: `git config --list` - Try switching with global scope explicitly ### Auto-Switch Not Working **Problem:** Directory-based auto-switching not working **Solutions:** - Ensure directory mappings use absolute paths or `~` prefix - Verify shell hooks are properly installed - Reload your shell after adding hooks: `source ~/.zshrc` - Check that directory mappings in `~/.ghswap.json` match your project paths ### Permission Errors **Problem:** Permission denied when accessing SSH keys **Solution:** ```bash # Fix SSH key permissions chmod 600 ~/.ssh/id_rsa_* chmod 644 ~/.ssh/id_rsa_*.pub ``` ## Requirements - **Node.js** >= 14.0.0 - **Git** - For git configuration management - **SSH** - For SSH key management - **GitHub CLI** (optional) - For `gh` authentication ## Security Best Practices 1. **Protect your configuration file:** ```bash echo ".ghswap.json" >> ~/.gitignore_global ``` 2. **Never commit tokens** - The `ghToken` field is optional and should be used with caution 3. **Use strong SSH keys** - The tool generates ed25519 keys by default, which are secure and modern 4. **Regular key rotation** - Periodically update your SSH keys and remove old ones from GitHub ## Contributing Issues and pull requests are welcome at [github.com/shubhamV123/ghswap](https://github.com/shubhamV123/ghswap). ## License MIT License - see [LICENSE](LICENSE) file for details. ## Author Shubham Verma ## Support - Report issues: [GitHub Issues](https://github.com/shubhamV123/ghswap/issues) - Documentation: [GitHub Repository](https://github.com/shubhamV123/ghswap)