Mob is a console tool to work in a remote mob (or pair) with git.
- Handover code fast between drivers
- Remembers order of drivers
- Keeps track of state (working, waiting for next, stopped) to eliminate risk of conflicts and lost work
- Use any branch as base
Installing
Cargo
Install rust and run:
cargo install remotemob
Manually
Download the latest release and unpack it to somewhere in your PATH.
Usage
Note: It's safe to try mob! It prints all git commands it runs and if you decide that it's not for you can remove all traces.
-
mob start
creates a new feature branch or syncs the branch from the previous driver. -
mob next
commits all changes to the feature branch and hands over to the next driver. -
mob done
stages all changes on the feature branch for commit on the base branch (normally main).
Run mob
for help on more commands.
FAQ
mob
from a repo?
How do I remove all traces of - Run
mob done
to remove the mob branch. Either commit the changes or rungit reset HEAD --hard
to discard changes. - Run
mob clean
to remove themob-meta
branch. - Delete
~/.mob
if you don't want to usemob
anymore
Where is the configuration stored?
Configuration local to you is stored in ~/.mob
. Configuration
for a repository is stored in an orphan branch named mob-meta
.
mob start
creates all configuration needed to run. It is always
safe to run mob clean
to remove the repository config and start
fresh.
How do I show current status?
Run mob status
Work duration is set to 15 but we must stop for a meeting in 7 minutes
Run mob start 7
Hooks
You can add hooks to your configuration in ~/.mob
to notify you
when your turn is over or to take over screen sharing when you
start.
...
[hooks]
after_start="take_screen.sh"
after_timer="say 'mob next NEXT_DRIVER'"
Hooks are executed by a sh
and can contain two
variables:
-
CURRENT_DRIVER
: Always the name you configured in~/.mob
-
NEXT_DRIVER
: Next driver oranyone
if you are the first in a session. It is empty on allbefore_*
hooks.
The available hooks are:
-
before_start
: Run as soon as possible when you runmob start
, before checking that it's your turn or that your working directory is clean. -
after_start
: Right after you've started a session withmob start
but before the timer started. This is a good hook for taking over the screen. -
after_timer
: Run when your turn ended. The first time you runmob start
it tries to find commands to play a sound and show a desktop notification to populate this hook. -
before_next
: Before running mob next,NEXT_DRIVER
is not available. -
after_next
: Before running mob next,NEXT_DRIVER
is either a name oranyone
. -
before_done
: Before the squashing and deleting branches. -
after_done
: After done has been run,NEXT_DRIVER
is not available.
How it works
mob
uses an orphan branch called mob-meta
to save session
state and settings. You can view the session content with mob status [-r]
and delete it with mob clean
.
Session {
drivers: Drivers(
[
"Paul",
"Leo",
"Ella",
],
),
branches: Branches {
branch: "mob-session",
base_branch: "main",
},
settings: Some(
Settings {
commit_message: "mob sync [skip ci]",
work_duration: 10,
},
),
state: Working {
driver: "Ella",
},
}
The session can be in 3 different states:
Inspiration and other tools
Inspiration for this tool comes from Remote mob programming and their tool mob written in Go.
I did this rewrite to:
- remember the order of drivers
- use any branch as base branch, not only master or main
- know about the state so we get nice warnings instead of git conflicts and lost refs.
- and of course... rust ;)
To find other tools look at the mob programming timer tag on github