Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

wt

Git worktree manager for coding-agent workflows. Create isolated worktrees per feature, work with Codex or Claude, merge PRs, and clean up — all in one tool.

Setup with Codex

The easiest way to get started. This assumes you keep all your git repos in a single parent directory (e.g. ~/Code, ~/Projects, ~/dev, etc.).

  1. Clone the repo and paste this prompt into Codex:

    I just cloned https://github.com/sameerr03/wt.git to ~/.wt. Set it up for me:
    1. Add `source ~/.wt/wt.sh` to my shell rc file (.zshrc) if it's not already there
    2. Copy ~/.wt/config.template.sh to ~/.wt/config.sh
    3. Look at my git repos in ~/Code (replace with wherever I keep my projects).
    For each repo found, add an entry to the WT_PROJECTS array in ~/.wt/config.sh
    mapping the folder name to its absolute path
    4. Set WORKTREE_BASE to a "worktrees" directory alongside my projects
    5. Check each repo for bun.lockb or pnpm-lock.yaml — if found, add an override
    to WT_PKG_MANAGER with "bun" or "pnpm" respectively
    6. Tell me to run `source ~/.zshrc` when done
    

    Note: Replace ~/Code in the prompt with the actual path to the directory where you keep your projects.

Manual Setup

If you prefer to set things up yourself:

  1. Clone the repo:

    git clone https://github.com/sameerr03/wt.git ~/.wt
  2. Add to your .zshrc:

    source~/.wt/wt.sh
  3. Copy the template and edit your config:

    cp ~/.wt/config.template.sh ~/.wt/config.sh
  4. Edit config.sh to register your projects:

    declare -A WT_PROJECTS=(
    [myapp]="/path/to/myapp"
    )

Auto-detection

When you're inside a worktree or main repo directory, wt automatically detects the project and feature from your current path. This means you can skip typing them:

# Inside ~/Code/worktrees/carousel/fix-slider/
wt merge # auto-detects carousel + fix-slider
wt rm # auto-detects carousel + fix-slider
wt cd other-feature # auto-detects carousel, switches to other-feature
wt new other-feature # auto-detects carousel, creates new feature# Inside ~/Code/carousel/ (main repo)
wt new fix-slider # auto-detects carousel
wt ls # shows only carousel worktrees

Explicit arguments always override auto-detected values — the old wt merge carousel fix-slider syntax still works everywhere.

Commands

wt new [--manual] [--base <branch>] [--agent codex|claude]

By default, drops into an interactive TUI (requires gum) where you pick the base branch and type your prompt directly. The agent generates the branch name from your prompt, the worktree is created, deps are installed, and the agent launches with your prompt preloaded.

--manual (or -m) keeps the old flow: asks for a feature name, no prompt, no auto-branch-naming.

The default agent comes from WT_CLI_AGENT in config.sh (set it to "claude" if you want Claude as the default). Override per-invocation with --agent codex or --agent claude.

wt new # interactive TUI
wt new --manual # old feature-name prompt flow
wt new --base dev # TUI, default base branch = dev
wt new --manual --agent claude # manual flow, Claude instead of Codex

wt issue [project] <issue#> [--base <branch>] [--agent codex|claude]

Creates a worktree from a GitHub issue. Fetches the issue title and body, slugifies the title into a branch name, creates the worktree, and launches your chosen agent with the issue context pre-loaded for a discuss-then-plan workflow.

wt issue carousel 123
wt issue 123 # project auto-detected from current directory
wt issue carousel 123 --base dev
wt issue carousel 123 --agent claude

wt cd [project] [feature] [--agent codex|claude]

Jumps into a worktree and continues the most recent session for the selected agent.

wt cd carousel fix-slider
wt cd fix-slider # project auto-detected
wt cd --agent claude

wt merge [project] [feature] [--squash|--rebase|--merge]

Merges the PR, removes the worktree, deletes the branch (local + remote), and pulls main. Defaults to --merge (merge commit).

wt merge # both auto-detected from current worktree
wt merge carousel fix-slider
wt merge carousel fix-slider --squash
wt merge carousel fix-slider --rebase

wt rm [project] [feature] [--delete-branch]

Removes a worktree without merging. Optionally deletes the branch.

wt rm # both auto-detected from current worktree
wt rm carousel fix-slider
wt rm carousel fix-slider --delete-branch

wt ls [project]

Lists active worktrees with PR status. Auto-filters to the current project when inside a worktree or repo.

carousel:
fix-slider (/Users/sameer/Code/worktrees/carousel/fix-slider)
PR #42 — ✓ approved, ✓ CHECKS PASS

wt stash / wt pop

Park the current worktree so you can free up your terminal workspace for other work, then resume later. stash records the worktree path and agent name to ~/.wt_stash and cds you out. pop (from any shell, any workspace) cds back in and resumes the agent's most recent session (claude --continue or codex resume --last). Only one slot — stashing again prompts before overwriting.

The stash doesn't preserve the live process — close your agent session before stashing. The point is to remember which worktree you were in without having to re-pick via fzf.

wt stash # from inside a worktree
wt pop # from anywhere, resumes the stashed session

wt help

Shows usage and examples.

Configuration

All config lives in config.sh:

VariablePurposeDefault
WT_PROJECTSMap of project name → repo path
WT_PKG_MANAGERPer-project package manager overridenpm
WORKTREE_BASEWhere worktrees are created$HOME/Code/worktrees
DEFAULT_BASE_BRANCHBranch to base new worktrees onmain
DEFAULT_INSTALL_CMDDefault install commandnpm install
WT_CLI_AGENTDefault coding CLI to launchcodex
WT_ISSUE_PROMPTPrompt template for wt issuediscuss-then-plan template

Requirements

  • zsh
  • git
  • gh (GitHub CLI) — for merge and ls PR status
  • jq — for parsing PR status
  • fzf — for interactive project/worktree pickers
  • gum — for the wt new TUI (optional; without it, use wt new --manual)
  • codex or Claude Code — launched automatically on wt new

About

Worktree management tool for Claude Code workflows

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages