{"id":45204079,"url":"https://github.com/wadackel/ofsht","last_synced_at":"2026-03-08T05:10:58.395Z","repository":{"id":325750697,"uuid":"1102239245","full_name":"wadackel/ofsht","owner":"wadackel","description":"A command-line tool for managing Git worktrees with automation features.","archived":false,"fork":false,"pushed_at":"2026-03-04T21:44:27.000Z","size":3166,"stargazers_count":7,"open_issues_count":4,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-05T03:35:03.121Z","etag":null,"topics":["cli","git","rust","rust-crate","worktree"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/ofsht","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wadackel.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"wadackel"}},"created_at":"2025-11-23T04:30:05.000Z","updated_at":"2026-02-24T02:05:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wadackel/ofsht","commit_stats":null,"previous_names":["wadackel/ofsht"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/wadackel/ofsht","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Fofsht","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Fofsht/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Fofsht/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Fofsht/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wadackel","download_url":"https://codeload.github.com/wadackel/ofsht/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wadackel%2Fofsht/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30244558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-08T00:58:18.660Z","status":"online","status_checked_at":"2026-03-08T02:00:06.215Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","git","rust","rust-crate","worktree"],"created_at":"2026-02-20T15:01:00.630Z","updated_at":"2026-03-08T05:10:58.383Z","avatar_url":"https://github.com/wadackel.png","language":"Rust","readme":"# ofsht\n\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/wadackel/ofsht/ci.yaml?branch=main\u0026style=flat-square)](https://github.com/wadackel/ofsht/actions/workflows/ci.yaml?query=branch%3Amain)\n[![Crates.io Version](https://img.shields.io/crates/v/ofsht?style=flat-square)](https://crates.io/crates/ofsht)\n[![Crates.io License](https://img.shields.io/crates/l/ofsht?style=flat-square)](https://github.com/wadackel/ofsht/blob/main/LICENSE)\n\nA command-line tool for managing Git worktrees with automation features.\n\n## Demo\n\n![ofsht Quick Start Demo](./docs/assets/vhs/quick-start.gif)\n\n**Demonstrated features:**\n- Creating worktrees with the `add` command\n- Listing all worktrees with `ls`\n- Configuring and executing hooks for automation\n- Removing multiple worktrees with `rm`\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Usage](#usage)\n  - [Basic Operations](#basic-operations)\n  - [Sync Hook Operations](#sync-hook-operations)\n  - [GitHub Integration](#github-integration)\n  - [Shell Integration](#shell-integration)\n  - [Configuration](#configuration)\n  - [zoxide Integration](#zoxide-integration)\n  - [tmux Integration](#tmux-integration)\n  - [Shell Completion](#shell-completion)\n- [Common Workflows](#common-workflows)\n- [FAQ](#faq)\n- [Documentation](#documentation)\n- [License](#license)\n\n## Features\n\n🌳 **Worktree Management**\n- Create worktrees from branches, tags, or commits\n- List all worktrees with status information\n- Navigate to worktrees by branch name\n- Remove worktrees with automatic branch cleanup\n- Interactive worktree selection with fzf integration\n\n⚙️ **Automation \u0026 Hooks**\n- Run commands after worktree creation (e.g., `npm install`)\n- Copy files from main repository (e.g., `.env`, `.nvmrc`)\n- Create symlinks for shared directories (e.g., `.vscode`)\n- Execute cleanup commands before worktree deletion\n- Sync hook operations to all existing worktrees with `ofsht sync`\n- Customize worktree paths with `{repo}` and `{branch}` variables\n\n💻 **Shell Integration**\n- Automatic directory changing for `add` and `cd` commands\n- Shell completion for Bash, Zsh, and Fish\n- Automatic zoxide integration for quick navigation\n\n📝 **Configuration**\n- Local configuration (`.ofsht.toml` in project root)\n- Global configuration (`~/.config/ofsht/config.toml`)\n- XDG Base Directory specification support\n\n## Installation\n\n### From crates.io\n\n```bash\ncargo install ofsht\n```\n\n### From Homebrew\n\n```bash\nbrew install wadackel/tap/ofsht\n```\n\n### Using mise\n\nIf you're using [mise](https://mise.jdx.dev/) for development tool management:\n\n```bash\n# Install latest version\nmise use -g ubi:wadackel/ofsht\n\n# Or install specific version\nmise install ubi:wadackel/ofsht@0.1.7\n\n# Or add to mise.toml\n[tools]\n\"ubi:wadackel/ofsht\" = \"latest\"\n```\n\nThis method works via mise's ubi backend, which automatically:\n- Detects your platform and downloads the appropriate binary\n- Manages versions alongside your other development tools\n- Works without requiring ofsht to be in the mise registry\n\n**Supported platforms**: Linux (x86_64), macOS (Intel/Apple Silicon)\n\n### From Binary Releases\n\nDownload pre-built binaries from the [releases page](https://github.com/wadackel/ofsht/releases).\n\n```bash\n# macOS (Apple Silicon)\ncurl -L https://github.com/wadackel/ofsht/releases/latest/download/ofsht-aarch64-apple-darwin.tar.gz | tar xz\nsudo mv ofsht /usr/local/bin/\n\n# macOS (Intel)\ncurl -L https://github.com/wadackel/ofsht/releases/latest/download/ofsht-x86_64-apple-darwin.tar.gz | tar xz\nsudo mv ofsht /usr/local/bin/\n\n# Linux (x86_64)\ncurl -L https://github.com/wadackel/ofsht/releases/latest/download/ofsht-x86_64-unknown-linux-gnu.tar.gz | tar xz\nsudo mv ofsht /usr/local/bin/\n```\n\n### From Source\n\nRequires [Rust](https://www.rust-lang.org/tools/install) 1.70+:\n\n```bash\ngit clone https://github.com/wadackel/ofsht.git\ncd ofsht\ncargo build --release\nsudo mv target/release/ofsht /usr/local/bin/\n```\n\n## Quick Start\n\n```bash\n# Create a new worktree and navigate to it (with shell integration)\nofsht add feature-awesome\n\n# Create a worktree based on a specific branch\nofsht add feature-awesome develop\n\n# Create from a remote branch\nofsht add hotfix-123 origin/main\n\n# Create from a tag\nofsht add release-prep v1.2.0\n\n# List all worktrees\nofsht ls\n\n# Navigate to a worktree (with shell integration)\nofsht cd feature-awesome\n\n# Remove a worktree\nofsht rm feature-awesome\n```\n\n\u003e [!TIP]\n\u003e The `add` command automatically navigates to the new worktree when shell integration is enabled. Use `create` instead if you want to stay in the current directory. See [Shell Integration](#shell-integration) for setup.\n\n## Usage\n\n### Basic Operations\n\n#### Create a Worktree\n\n`ofsht` provides two commands for creating worktrees:\n\n- **`add`**: Creates a worktree and prints its path to stdout (for shell integration to navigate automatically)\n- **`create`**: Creates a worktree but stays in the current directory (no path output)\n\n```bash\n# Create and navigate to worktree (with shell integration)\nofsht add feature-awesome\n# /absolute/path/to/worktrees/my-project/feature-awesome\n\n# Create a new worktree (stays in current directory)\nofsht create feature-awesome\n# Created worktree at: ../worktrees/my-project/feature-awesome\n\n# Create from a specific start point\nofsht add feature-awesome develop     # From branch\nofsht add hotfix-123 origin/main      # From remote branch\nofsht add release-prep v1.2.0         # From tag\n\n# Create with tmux integration (requires running inside tmux)\nofsht add feature-awesome --tmux      # Creates worktree and opens new tmux window\n```\n\n#### List Worktrees\n\n```bash\n# List all worktrees\nofsht ls\n# /path/to/my-project                                d070cdf [main]\n# /path/to/worktrees/my-project/feature-awesome      d070cdf [feature-awesome]\n\n# Show only paths (useful for scripting)\nofsht ls --show-path\n# /path/to/my-project\n# /path/to/worktrees/my-project/feature-awesome\n```\n\n#### Navigate to a Worktree\n\n```bash\n# With shell integration (automatic cd)\nofsht cd feature-awesome\n\n# Without shell integration\ncd $(ofsht cd feature-awesome)\n\n# Interactive selection with fzf (when no branch name provided)\nofsht cd\n```\n\n#### Remove a Worktree\n\n```bash\n# Remove by path\nofsht rm /path/to/worktrees/my-project/feature-awesome\n\n# Remove by branch name\nofsht rm feature-awesome\n\n# Remove current worktree\nofsht rm .\n\n# Remove multiple worktrees\nofsht rm feature-a feature-b feature-c\n\n# Interactive selection with fzf (when no target provided)\nofsht rm\n\n# Remove prunable worktrees (those whose directories have been manually deleted)\n# Works with branch names, absolute paths, or relative paths\nofsht rm feature-deleted\n```\n\n\u003e [!NOTE]\n\u003e `ofsht rm` can remove worktrees even if their directories have been manually deleted. Git marks such worktrees as \"prunable\" (still registered in Git but directory missing), and `ofsht` handles them gracefully by cleaning up the Git registration.\n\n### Shell Integration\n\n`ofsht` provides shell integration for automatic directory changing with `cd` and `add` commands.\n\n**Setup** (one-time):\n\n```bash\n# Bash - Add to ~/.bashrc\neval \"$(ofsht shell-init bash)\"\n\n# Zsh - Add to ~/.zshrc\neval \"$(ofsht shell-init zsh)\"\n\n# Fish - Add to ~/.config/fish/config.fish\nofsht shell-init fish | source\n```\n\nAfter setup, reload your shell configuration:\n```bash\nsource ~/.bashrc  # or ~/.zshrc for Zsh\n```\n\n**Usage** (after shell integration):\n\n```bash\n# Create and automatically navigate to the new worktree\nofsht add feature-awesome\n# You're now in the new worktree directory!\n\n# Navigate to an existing worktree\nofsht cd another-feature\n# You're now in the another-feature worktree!\n\n# Remove current worktree and return to main repository\nofsht rm .\n# You're now back in the main repository!\n\n# If you want to create without navigation, use:\nofsht create feature-awesome\n```\n\n**How it works**: The `shell-init` command generates a wrapper function that intercepts `cd`, `add`, and `rm` subcommands, automatically executing `cd` after the operation completes.\n\n\u003e [!CAUTION]\n\u003e The shell wrapper only works in interactive shells. You must add the `eval \"$(ofsht shell-init \u003cshell\u003e)\"` line to your shell's rc file (`~/.bashrc`, `~/.zshrc`, or `~/.config/fish/config.fish`) and reload it. The wrapper will not work in non-interactive scripts.\n\n### Configuration\n\n`ofsht` uses a two-tier configuration system with clear inheritance rules:\n\n**Configuration Priority:**\n1. **Local config** (`.ofsht.toml` in project root): Only `[worktree]` and `[hooks.*]` settings\n2. **Global config** (`~/.config/ofsht/config.toml`): All settings, including integrations\n3. **Built-in defaults**: Fallback values if no config files exist\n\n\u003e [!IMPORTANT]\n\u003e Integration settings (`[integration.zoxide]`, `[integration.fzf]`, `[integration.tmux]`, `[integration.gh]`) are ONLY read from global config, never from local config. Placing them in `.ofsht.toml` will silently have no effect.\n\n#### Local Configuration\n\nCreate `.ofsht.toml` in your project root:\n\n```toml\n[worktree]\n# Customize worktree directory template\ndir = \"../worktrees/{repo}/{branch}\"\n\n[hooks.create]\n# Run commands after worktree creation\nrun = [\"pnpm install\", \"echo Setup complete!\"]\n\n# Copy files from main repository\ncopy = [\".env\", \".nvmrc\"]\n\n# Create symlinks (source in repo -\u003e destination in worktree)\nlink = { \".vscode\" = \".vscode\" }\n\n[hooks.delete]\n# Run commands before worktree deletion\nrun = [\"echo Cleaning up...\"]\n```\n\n#### Generating Configuration Files\n\nUse `ofsht init` to generate configuration files with default settings:\n\n```bash\n# Generate both global and local config files\nofsht init\n\n# Generate only global config\nofsht init --global\n\n# Generate only local config (in current project)\nofsht init --local\n\n# Overwrite existing config files\nofsht init --force\n```\n\n\u003e [!WARNING]\n\u003e `ofsht init --force` will overwrite both global and local config files if they exist. This will destroy any existing hook configurations or custom settings. Use with caution.\n\n#### Global Configuration\n\nCreate `~/.config/ofsht/config.toml` for global settings (or use `ofsht init --global`):\n\n```toml\n[worktree]\n# Default directory template for all projects\ndir = \"../{repo}-worktrees/{branch}\"\n\n[integration.zoxide]\n# Enable/disable zoxide integration\nenabled = true  # Default: true\n\n[integration.fzf]\n# Enable/disable fzf integration\nenabled = true  # Default: true\n\n# Additional fzf command-line options\noptions = [\"--height=50%\", \"--border\"]\n\n[integration.tmux]\n# Configure tmux integration behavior\nbehavior = \"auto\"   # \"auto\" (default, flag-based), \"always\", \"never\"\ncreate = \"window\"   # \"window\" (default) or \"pane\"\n\n[integration.gh]\n# Enable/disable GitHub integration\nenabled = true  # Default: true\n```\n\n### Sync Hook Operations\n\nAfter adding new shared files to your hook configuration, use `sync` to apply them to all existing worktrees:\n\n```bash\n# Sync all hook actions (run + copy + link) to all existing worktrees\nofsht sync\n\n# Only sync symlinks\nofsht sync --link\n\n# Only sync file copies\nofsht sync --copy\n\n# Combine flags\nofsht sync --run --copy\n```\n\n\u003e [!TIP]\n\u003e `ofsht sync` is idempotent. Existing symlinks pointing to the correct target are left unchanged, and files are overwritten safely. You can run it repeatedly without side effects.\n\n\u003e [!NOTE]\n\u003e `ofsht sync` re-applies `hooks.create` actions only. It does not execute `hooks.delete` actions. If a worktree directory is missing, it is skipped with a warning.\n\n### GitHub Integration\n\nWhen the `gh` CLI is installed and authenticated, you can create worktrees directly from GitHub issues or pull requests:\n\n```bash\n# Create worktree from GitHub issue\nofsht add #123\n# Creates a worktree with branch name from the issue\n\n# Create worktree from GitHub pull request\nofsht add #456\n# Creates a worktree from the PR's head branch\n```\n\n\u003e [!IMPORTANT]\n\u003e **Requirements for GitHub Integration:**\n\u003e - `gh` CLI must be installed (https://cli.github.com/)\n\u003e - You must be authenticated with GitHub (run `gh auth login`)\n\u003e - Command must be run inside a repository connected to GitHub\n\u003e\n\u003e Without these requirements, `ofsht add #123` will fail with \"gh: command not found\" or authentication errors.\n\nThe GitHub integration automatically:\n- Fetches issue/PR information using `gh` CLI\n- Generates appropriate branch names\n- Creates the worktree with the correct base branch\n\nTo disable GitHub integration, set `enabled = false` in global config:\n\n```toml\n[integration.gh]\nenabled = false\n```\n\n### zoxide Integration\n\nWhen `zoxide` is installed and enabled (default), created worktrees are automatically registered with zoxide for quick navigation:\n\n```bash\n# After creating a worktree\nofsht add feature-awesome\n# or\nofsht create feature-awesome\n\n# You can now jump to it using zoxide\nz feature-awesome\n\n# Disable zoxide integration in global config (~/.config/ofsht/config.toml)\n[integration.zoxide]\nenabled = false\n```\n\n### tmux Integration\n\n`ofsht` can automatically create tmux windows or panes when creating worktrees.\n\n**Configuration Options:**\n\n```toml\n# In ~/.config/ofsht/config.toml\n[integration.tmux]\nbehavior = \"auto\"   # or \"always\", \"never\"\ncreate = \"window\"   # or \"pane\"\n```\n\n- **`behavior`**:\n  - `\"auto\"` (default): Only use tmux when `--tmux` flag is specified\n  - `\"always\"`: Automatically create tmux window/pane for every worktree\n  - `\"never\"`: Disable tmux integration entirely\n\n- **`create`**:\n  - `\"window\"` (default): Create a new tmux window\n  - `\"pane\"`: Split current window horizontally\n\n**CLI Overrides:**\n\n```bash\n# Temporarily enable tmux (overrides config)\nofsht add feature-awesome --tmux\n\n# Temporarily disable tmux (overrides config, even with behavior=\"always\")\nofsht add feature-awesome --no-tmux\n\n# With behavior=\"always\" in config, tmux is used by default\nofsht add feature-awesome  # Creates tmux window/pane automatically\n```\n\n\u003e [!CAUTION]\n\u003e tmux integration requires running `ofsht add` inside an active tmux session. Using `--tmux` flag or `behavior = \"always\"` outside of tmux will fail with an error. Remote sessions via SSH must preserve the `$TMUX` environment variable.\n\n**Window/Pane Behavior:**\n- New windows are automatically focused and set to the worktree directory\n- Window names are sanitized from branch names (e.g., `\"feature/login\"` → `\"feature·login\"`)\n- Panes are created with horizontal split in the current window\n\n**Requirements:**\n- Must be running inside a tmux session when tmux integration is active\n- tmux binary must be available in PATH\n\n### Shell Completion\n\n`ofsht` provides dynamic shell completion with smart branch and worktree name suggestions.\n\nTo see setup instructions for your shell:\n\n```bash\n# Display setup instructions\nofsht completion bash    # For Bash\nofsht completion zsh     # For Zsh\nofsht completion fish    # For Fish\n```\n\n**Quick setup**:\n\n```bash\n# Bash - Add to ~/.bashrc\nsource \u003c(COMPLETE=bash ofsht)\n\n# Zsh - Add to ~/.zshrc\nsource \u003c(COMPLETE=zsh ofsht)\n\n# Fish - Add to ~/.config/fish/config.fish\nsource (COMPLETE=fish ofsht | psub)\n```\n\nAfter setup, you'll get intelligent completions:\n- `ofsht add feature \u003cTAB\u003e` - When specifying a start point, lists branches, remote refs, and tags\n- `ofsht rm \u003cTAB\u003e` - Lists worktree names (and flags, following standard CLI conventions)\n- `ofsht cd \u003cTAB\u003e` - Lists worktree names\n\n## Common Workflows\n\n### Working on Multiple Features Simultaneously\n\n```bash\n# Create worktrees for different features\nofsht add feature-authentication\nofsht add feature-dashboard\nofsht add bugfix-login-issue\n\n# Switch between them easily\nofsht cd feature-authentication  # Work on authentication\nofsht cd feature-dashboard        # Switch to dashboard\nofsht cd bugfix-login-issue       # Fix the bug\n\n# Or use zoxide for quick navigation\nz authentication\nz dashboard\nz login\n```\n\n### Code Review Workflow with GitHub PR Integration\n\n```bash\n# Review a pull request\nofsht add #123                    # Create worktree from PR #123\n# Review code, run tests, etc.\nofsht rm .                        # Remove and return to main repo\n\n# Work on an issue\nofsht add #456                    # Create worktree from issue #456\n# Implement the feature\ngit push                          # Push changes\nofsht cd main                     # Return to main branch\nofsht rm 456                      # Clean up the worktree\n```\n\n### Maintenance Cycle: Create → Test → Cleanup\n\n```bash\n# Create a new feature branch\nofsht add feature-new-api\n\n# Run setup hooks automatically (defined in .ofsht.toml)\n# - npm install / pnpm install\n# - Copy .env and other config files\n# - Link shared directories\n\n# Do your work, test, commit\ngit add .\ngit commit -m \"feat: add new API endpoint\"\ngit push\n\n# Return to main and clean up\nofsht cd main\nofsht rm feature-new-api          # Hooks run cleanup commands\n\n# Or clean up from within the worktree\nofsht rm .                        # Automatically returns to main repo\n```\n\n### Adding Shared Files to Existing Worktrees\n\n```bash\n# You realize you need a shared .prettierrc across all worktrees\n# 1. Add it to your config\necho 'link = [\".prettierrc\"]' \u003e\u003e .ofsht.toml\n\n# 2. Sync to all existing worktrees at once\nofsht sync --link\n# Creates symlinks in all worktrees without re-running install commands\n```\n\n### Managing Multiple Projects\n\n```bash\n# Configure global worktree directory template\n# in ~/.config/ofsht/config.toml:\n# [worktree]\n# dir = \"~/worktrees/{repo}/{branch}\"\n\n# Now all projects use consistent structure:\n# ~/worktrees/project-a/feature-x\n# ~/worktrees/project-b/feature-y\n# ~/worktrees/project-c/bugfix-z\n```\n\n## FAQ\n\n### What's the difference between `add` and `create`?\n\n- **`add`**: Creates a worktree and prints its path to stdout, enabling shell integration to automatically navigate to it\n- **`create`**: Creates a worktree but stays in the current directory, useful for scripting or when you don't want to navigate\n\nWith shell integration enabled (`eval \"$(ofsht shell-init bash)\"`), `add` will automatically `cd` to the new worktree.\n\n### Do I need to install zoxide, fzf, or tmux?\n\nNo, all integrations are optional:\n- **zoxide**: If not installed, worktrees are created normally without zoxide registration\n- **fzf**: If not installed, interactive selection commands (`ofsht cd` / `ofsht rm` without arguments) will show an error\n- **tmux**: Only required if you use the `--tmux` flag or set `behavior = \"always\"` in config\n\n\u003e [!TIP]\n\u003e All integrations gracefully degrade if the tools are not available. You can install them later and they'll automatically work without any configuration changes. Start using `ofsht` right away and add integrations as needed.\n\n### Can I use ofsht with GitHub Desktop or other Git GUIs?\n\nYes! `ofsht` uses standard `git worktree` commands under the hood, so all worktrees are visible to Git GUIs. However, features like hooks and integrations are specific to the `ofsht` CLI.\n\n### What happens if I manually delete a worktree directory?\n\nGit marks manually deleted worktrees as \"prunable\". You can still remove them with `ofsht rm \u003cbranch-name\u003e`, which will clean up the Git registration. The deletion hooks won't run since the directory is already gone.\n\n### Why use ofsht instead of plain `git worktree`?\n\n`ofsht` enhances `git worktree` with:\n- **Automation**: Hooks for running commands, copying files, and creating symlinks\n- **Better UX**: Interactive selection with fzf, shell integration for auto-navigation\n- **Integrations**: Automatic zoxide registration, tmux window creation, GitHub issue/PR support\n- **Configuration**: Project-specific and global settings for consistent workflows\n\nThink of it as `git worktree` with quality-of-life improvements for daily development workflows.\n\n### How do I migrate from using plain `git worktree`?\n\nYour existing worktrees created with `git worktree add` are fully compatible with `ofsht`:\n- `ofsht ls` will show all worktrees\n- `ofsht cd \u003cbranch\u003e` can navigate to existing worktrees\n- `ofsht rm \u003cbranch\u003e` can remove worktrees created with `git worktree add`\n\nSimply start using `ofsht add` for new worktrees to take advantage of hooks and integrations.\n\n## Documentation\n\n- [CONTRIBUTING.md](./CONTRIBUTING.md) - Development guide and architecture details\n- [CHANGELOG.md](./CHANGELOG.md) - Version history\n- [TEST.md](./docs/TEST.md) - Manual testing procedures\n\n## License\n\n[MIT © wadackel](./LICENSE)\n","funding_links":["https://github.com/sponsors/wadackel"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwadackel%2Fofsht","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwadackel%2Fofsht","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwadackel%2Fofsht/lists"}