A TUI workspace manager for jj (Jujutsu VCS) and git.
dwm creates, lists, and deletes workspaces stored under ~/.dwm/<repo>/, with a shell wrapper that auto-cds into the selected workspace. It works with both jj and git repositories.
Homebrew:
brew install drivasperez/tap/dwmCargo:
cargo install dwmPre-built binaries and a shell installer are available on the latest GitHub release.
Run dwm setup interactively and it will offer to add the wrapper to your shell config and set up agent hooks automatically:
dwm setupOr add it manually:
Bash / Zsh — add to .bashrc or .zshrc:
eval "$(dwm shell-setup)"Fish — add to ~/.config/fish/config.fish:
dwm shell-setup --fish | sourceThis wraps the dwm binary so that selecting a workspace automatically cds into it.
dwm new [name] # create a workspace (name auto-generated if omitted)
dwm new --at <rev> # create a workspace starting from a specific revision
dwm new --from <ws> # fork from an existing workspace's current change
dwm list # interactive TUI picker to switch workspaces
dwm list --all # multi-repo dashboard across all repos
dwm status # non-interactive workspace summary
dwm switch <name> # switch to a workspace by name
dwm rename <old> <new> # rename a workspace
dwm delete [name] # delete a workspace (current one if omitted)
dwm setup # interactive shell and agent setup
dwm version # print the current version
dwm --version # same, as a flagdwm can show the status of Claude Code agents running in your workspaces. The TUI's "Agent" column displays per-workspace counts like 2 waiting, 1 working.
To set it up, run:
dwm setupThis installs Claude Code hooks into ~/.claude/settings.json that report agent status to dwm via the dwm hook-handler command.
Statuses:
- waiting (yellow) — agent needs user input or permission approval
- working (green) — agent is actively executing
- idle (gray) — agent finished its turn, waiting for the next prompt
Status is tracked per session, so multiple agents in the same workspace are counted independently.
cargo build
cargo t # run tests (uses cargo-nextest)
cargo clippy # lint