One sidebar tree for your git worktrees and the Claude Code sessions in each. For every worktree of your repo — or every repo in a folder of projects — it lists the Claude Code sessions that ran there, flags which are still running right now, and resumes any past one in a single click. The same tree drives the whole worktree lifecycle: create, inline diff, pull / push / fetch, open a PR, and finish (merge → remove worktree → delete branch).
If you juggle several Claude Code sessions across branches, this is the one place
to see what's running where and pick any of it back up — without git stash or
losing track of which terminal was which.
Cross-platform (Windows / macOS / Linux). Inspired by Scape, reimagined as a native VS Code extension that lives where you already work.
Status: Pre-alpha. Daily-driver-ready for the Claude Code workflow, but rough edges remain. Bug reports and feature requests are very welcome at github.com/vana123/vswt/issues.
- Real parallelism, not tab-switching. A git worktree is a separate
checkout of the same repo on a different branch — Claude in worktree A
cannot break the build in worktree B, and you never have to
git stashto context-switch. - One pane of glass. Status, dirty count, ahead/behind, changed files, existing Claude sessions, push, PR, and merge-and-cleanup all hang off one worktree row in a single tree.
- No new tool to learn. It's a tree in the sidebar. The Claude CLI runs in a normal VS Code terminal you can detach, reattach, or kill.
A single tree: repository → worktrees → the Claude sessions that ran in them. Worktree actions live in the right-click menu; sessions resume on click.
Worktree Sessions
└─ my-project
├─ ⎇ main ~/dev/my-project ●3 ↑1
│ ├─ ⊟ Changes (3)
│ │ └─ src/auth.ts
│ ├─ 💬 Refactor auth 2h ago
│ └─ 💬 Fix payments allocation yesterday
├─ ⎇ feature-ksef ~/dev/my-project-worktrees/feature-ksef
│ └─ 💬 Plan KSeF integration 3d ago
└─ ⎇ hotfix-csv ~/dev/… —
The worktree matching the open folder is highlighted; pinned worktrees sort to
the top; a worktree with no sessions shows —. Worktrees created by
claude --worktree (those under <repo>/.claude/worktrees/) get a ✦ sparkle
icon to set them apart from regular ones.
Open a folder of projects. If the folder you open isn't itself a git repo,
it scans its subfolders for repositories and lists each as its own top-level
node — so a ~/dev containing many projects shows them all, each expandable into
its worktrees and sessions. Scan depth is configurable (vswt.repoScanDepth,
default 1); linked worktree folders fold into their main repo, not duplicated.
- Create — pick branch name, base ref (any local/remote), opt-in copy of
.env*and.claude/**. Sibling layout../{repo}-worktrees/{branch}. - Rename — right-click → Rename…. Handles submodules (falls back to
fs.rename+git worktree repair). - Remove — confirms with file count if dirty; auto-retries with
--forceon submodule errors; cleans orphan dirs viafs.rmwhen git refuses. - Pin — right-click → Pin to Top / Unpin.
- Lists the existing Claude sessions found in
~/.claude/projects, grouped under the worktree they ran in — matched by the working directory recorded in each transcript, so sessions started outside this extension (a plain terminal, another tool) show up too. - Click to resume — opens a terminal in the worktree and runs
claude --resume <id>. - Rename a session to a custom label — stored as an overlay in the extension (Claude's transcript is never modified); empty input resets it to Claude's title.
- Reveal transcript opens the raw
.jsonl; Copy session id copies it. - Start in a fresh worktree — right-click a repository → New Claude Session
(new worktree) runs
claude --worktree, which creates an isolated git worktree for the session; it then shows up in the tree like any other. - Clicking a session reuses its terminal if one is still open, instead of spawning a duplicate.
- Sessions outside the current repo can be shown under an optional Other node
(
vswt.sessions.showUnmatched). - Running vs historical — a session whose process is actually alive gets a
green ● and sorts to the top; this reads Claude's live-session registry
(
~/.claude/sessions/<pid>.json, created on start and removed on exit), so it reflects real running sessions — even ones started elsewhere — and clears the moment you exit, regardless of how long it's been idle. Everything else is historical, filtered to the lastvswt.sessions.maxAgeDaysdays and capped atvswt.sessions.maxPerWorktreeper worktree, with the rest under a Show N older… node. - Live refresh — a file watcher on the projects directory updates the tree within ~1s as sessions are created or change.
- New Claude / New Shell / Term here — open a terminal in the worktree. The shell picker offers Git Bash / CMD / PowerShell on Windows, or Zsh / Fish on Linux/macOS, detected at activation time.
- On Windows,
Ctrl+Vin a terminal opened from the tree pastes a clipboard image as a PNG@<path>reference for Claude.
- Status badges on each worktree row:
●Ndirty count,↑Nahead,↓Nbehind; full path, HEAD, flags and fork-point in the tooltip. - Changes — expand a worktree's Changes node and click a file to open VS Code's diff editor against HEAD.
- Pull / Push / Fetch. Pull recovers automatically by setting upstream when
origin/<branch>exists; push auto-sets upstream on first push. - Create PR via
gh pr create --web— auto-pushes the branch first if needed. - Finish — full lifecycle close-out: push feature → checkout target → pull
→ merge (
--no-ffor--squash) → push → remove worktree → delete branch. Pre-flight check refuses to run if main repo has uncommitted changes. - Base branch tracking — it remembers what you forked from and pre-selects it in the Finish merge picker.
- VS Code 1.95 or newer.
- git on
PATH. - claude CLI on
PATHfor Claude sessions (install instructions). - gh CLI on
PATHfor the Create PR button (optional).
| Setting | Default | Description |
|---|---|---|
vswt.repoScanDepth |
1 |
Levels below each workspace folder to scan for repos. 0 = the folder itself; 1 = direct subfolders. |
vswt.worktree.parentDir |
"" |
Parent dir for worktrees. Empty = sibling ../{repo}-worktrees. Supports ~. |
vswt.worktree.copyFiles |
[".env", ".env.*", ".claude/**"] |
Glob patterns copied into a new worktree (opt-in per session). |
vswt.worktree.postCreateCommand |
"" |
Shell command run inside a fresh worktree (e.g. pnpm i). |
vswt.worktree.runPrismaGenerate |
true |
Run npx prisma generate if prisma/schema.prisma exists. |
vswt.shell.windows |
"" |
Windows shell override for Shell sessions. Empty = auto. |
vswt.claude.path |
"claude" |
Path to the Claude Code CLI. |
vswt.extraShells |
null |
Extra shell options. null = platform defaults; [] = none. |
vswt.sessions.showUnmatched |
false |
Show sessions outside the current repo under an Other node. |
vswt.sessions.maxAgeDays |
30 |
Hide historical sessions with no activity in this many days. 0 = no limit. |
vswt.sessions.maxPerWorktree |
15 |
Max historical sessions per worktree before a Show N older… node. 0 = unlimited. |
vswt.sessions.projectsDir |
"" |
Claude transcripts dir. Empty = ~/.claude/projects. Supports ~. |
vswt.sessions.resumeCommand |
"" |
Resume command; session id is appended. Empty = <claude.path> --resume. |
vswt.sessions.label |
"name" |
Session label source: name (AI title) or firstMessage. |
MIT — see LICENSE.
Not affiliated with Anthropic. "Claude" and "Claude Code" are trademarks of Anthropic; this is an independent tool that works with the Claude Code CLI.