CLI for managing Claude Code sessions in git worktrees and repositories
Project description
fujimoto
A terminal UI for managing Claude Code sessions across git worktrees and repositories. Spin up isolated worktree sessions or launch Claude directly in an existing repo — all from an interactive TUI with tmux-powered detachable sessions.
Why "Fujimoto"?
Named after Fujimoto from Hayao Miyazaki's Ponyo — a former human turned fastidious caretaker of the sea. Fujimoto is obsessed with order and control, meticulously tending to the balance of his domain while managing his many daughters and their chaotic tendencies.
Like his namesake, this tool is a caretaker and orchestrator — keeping your worktrees organised, your sessions tracked, and your branches tidy. It manages the lifecycle from creation through to cleanup, fretting over unpushed commits and unmerged branches so you don't have to. And like Fujimoto learning to accept that Ponyo must live her own life, it knows when to let go — spinning off background Claude sessions to handle their own PRs and gracefully cleaning up when the work is done.
He carries himself with dignity, even in defeat. Your worktrees should too.
Prerequisites
- Python 3.11+
- git
- tmux (the tool will offer to install it via brew on macOS, or print the install command for your distro on Linux)
- uv package manager
Installation
Install directly from GitHub:
uv tool install git+https://github.com/jongracecox/fujimoto.git
Or install from a local clone:
uv tool install --force --reinstall /path/to/this/repo
Re-run with --force --reinstall after local code changes to pick up updates.
Configuration
All environment variables are optional:
export FUJIMOTO_WORKTREE_ROOT=~/git/worktrees/ # Where worktrees are created
export FUJIMOTO_GIT_ROOT=~/git/ # Enables project switching
export FUJIMOTO_TERMINAL="alacritty --working-directory {dir}" # Linux-only: terminal command
If FUJIMOTO_WORKTREE_ROOT is unset, worktrees are created inside the current
project at <repo>/.fujimoto/worktrees/ (the .fujimoto/ directory is
auto-gitignored). If FUJIMOTO_GIT_ROOT is unset, the project switcher is
hidden. Add these to your shell profile (~/.zshrc, ~/.bashrc, etc.) to
persist them.
Platform support
Fujimoto runs on macOS and Linux.
- macOS: "Open terminal" uses iTerm2 if installed, otherwise Terminal.app. tmux is auto-installable via brew.
- Linux: "Open terminal" uses
FUJIMOTO_TERMINALif set, otherwise auto-detects a common terminal emulator (gnome-terminal, konsole, kitty, alacritty, wezterm, foot, xfce4-terminal, tilix, terminator, xterm).FUJIMOTO_TERMINALaccepts a{dir}placeholder for the working directory; if absent, the directory is appended as the final argument. tmux must be installed manually — fujimoto will print the right command for your distro (apt-get / dnf / pacman / zypper / apk).
Usage
Run from inside any git repository:
fujimoto
Home Screen
+ New worktree session
+ New session in <project>
+ Ad hoc session
───── active sessions ─────
🟢 20260309-cleanup-ui (worktree)
🟢 direct-1 (direct @ main)
───── inactive worktrees ─────
⚫ 20260308-old-experiment (worktree)
─────
Switch project
Three Session Types
Worktree sessions create an isolated git worktree with its own branch. Useful for standalone tasks that become PRs, or investigations where you want to fork off and explore.
Direct sessions launch Claude in an existing repo directory on its current branch. Quick and lightweight — no worktree overhead.
Ad hoc sessions launch Claude in a temporary directory outside any git project. For quick questions, investigations, and one-off tasks that don't need a repository.
Session Actions
Select any session to see contextual options:
| Session State | Options |
|---|---|
| Active worktree | Connect, Terminate, Finish |
| Inactive worktree | Launch, Finish |
| Active direct | Connect, Terminate |
Finish Flow
When you're done with a worktree, the Finish flow checks the branch state and offers:
- Push & Create PR — pushes the branch and spins up a background Claude session to create the PR
- Cherry-pick to base — applies your commits back to the original branch, then cleans up
- Discard & Delete — throws away the work (with confirmation if there are unpushed commits)
For already-merged branches: Delete or Delete + remove remote branch.
Naming Conventions
| Thing | Pattern | Example |
|---|---|---|
| Worktree directory | {YYYYMMDD}-{slug} |
20260309-fix-unit-tests |
| Git branch | worktree/{dir-name} |
worktree/20260309-fix-unit-tests |
| tmux session (worktree) | {project}/{dir-name} |
qsic-data/20260309-fix-unit-tests |
| tmux session (direct) | {project}/direct-{N} |
qsic-data/direct-1 |
tmux Session Controls
Each session remaps the prefix key to Ctrl+A:
| Shortcut | Action |
|---|---|
Ctrl+A D |
Detach (leave running) |
Ctrl+A [ |
Scroll/copy mode |
Ctrl+A X |
Kill pane |
These are set per-session and don't affect your global tmux config.
Keyboard Shortcuts
| Key | Action |
|---|---|
Enter |
Select |
Escape |
Back (or quit from home) |
q |
Quit |
| Arrow keys | Navigate |
Development
uv sync
uv run fujimoto # Run locally
uv run pytest # Run tests with coverage
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fujimoto-0.2.0.tar.gz.
File metadata
- Download URL: fujimoto-0.2.0.tar.gz
- Upload date:
- Size: 80.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55b324afb8be09f770b3dcfa0630c941301e3c46c1f37a4f1741a29975705fb7
|
|
| MD5 |
5ba04b887dda764a603c9641a23351cd
|
|
| BLAKE2b-256 |
6f465a4ec2863c37af7e3f62858470cbc1989fe668c08df21637550b389a7c2c
|
Provenance
The following attestation bundles were made for fujimoto-0.2.0.tar.gz:
Publisher:
release.yml on jongracecox/fujimoto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fujimoto-0.2.0.tar.gz -
Subject digest:
55b324afb8be09f770b3dcfa0630c941301e3c46c1f37a4f1741a29975705fb7 - Sigstore transparency entry: 1423529623
- Sigstore integration time:
-
Permalink:
jongracecox/fujimoto@df10f516905db3b048b7d0b8f784c190598afcc7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jongracecox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@df10f516905db3b048b7d0b8f784c190598afcc7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fujimoto-0.2.0-py3-none-any.whl.
File metadata
- Download URL: fujimoto-0.2.0-py3-none-any.whl
- Upload date:
- Size: 30.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
347a7c3f3d4794d2b007a76a337248730855db8b4b8ba75d6b2698ef8c3abb8a
|
|
| MD5 |
db65c137adc5c65794d48dbbe98dc56d
|
|
| BLAKE2b-256 |
58fc2930df2f106cd44d220ae5c6f38c5fda891ec4623e1bd1524679e89a8f4a
|
Provenance
The following attestation bundles were made for fujimoto-0.2.0-py3-none-any.whl:
Publisher:
release.yml on jongracecox/fujimoto
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fujimoto-0.2.0-py3-none-any.whl -
Subject digest:
347a7c3f3d4794d2b007a76a337248730855db8b4b8ba75d6b2698ef8c3abb8a - Sigstore transparency entry: 1423529732
- Sigstore integration time:
-
Permalink:
jongracecox/fujimoto@df10f516905db3b048b7d0b8f784c190598afcc7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/jongracecox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@df10f516905db3b048b7d0b8f784c190598afcc7 -
Trigger Event:
push
-
Statement type: