Use when working with version control. jj (Jujutsu) is the preferred VCS - never use git commands directly when jj can do the job. Covers mental model, workflows, and Nix integration.
npx claudepluginhub ohare93/claude-setup --plugin jmo-development-toolsThis skill uses the workspace's default tool permissions.
**CRITICAL**: Always use jj instead of git. Never run git commands directly when a jj command will do.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
CRITICAL: Always use jj instead of git. Never run git commands directly when a jj command will do.
Understanding these concepts prevents most jj mistakes:
git add needed.gitignore)jj splitjj new Creates Empty Commitsjj new creates a new empty commit ON TOP of the current onegit rebase needed for most casesProblem: Nix flakes only see files tracked in git HEAD. New files are invisible to Nix until snapshotted.
Symptoms:
nix build fails with "file not found" for newly created filesnix flake check doesn't see your changes.nix filesSolution: Snapshot working copy before Nix commands:
# Option 1: Create new commit (moves your work to parent)
jj new
# Option 2: Commit with message (same effect)
jj commit -m "wip"
# Then run nix
nix build
nix flake check
Why this works: jj new or jj commit snapshots the working copy, which updates git HEAD (jj's colocated git repo), making files visible to Nix.
| Task | Git | jj |
|---|---|---|
| Start work | git checkout -b feat | jj new -m "feat" |
| Stage + commit | git add . && git commit | jj commit -m "msg" |
| Amend | git commit --amend | Just edit files (auto-amended) or jj describe |
| Partial commit | git add -p | jj split |
| Interactive rebase | git rebase -i | jj rebase (auto-rebases descendants) |
| Undo | git reset/reflog | jj undo or jj op restore |
| Status | git status | jj st |
| Log | git log | jj log |
| Diff | git diff | jj diff |
| Create branch | git branch foo | jj bookmark create foo |
| Switch branch | git checkout foo | jj edit foo (or jj new foo) |
| Push | git push | jj git push |
| Pull | git pull | jj git fetch && jj rebase -d main |
| Merge | git merge | jj new commit1 commit2 (creates merge commit) |
| Stash | git stash | Not needed - just jj new and come back |
jj new main -m "feat: add user authentication"
# Now working on a new commit based on main
jj log # Find the change-id (e.g., xyz)
jj edit xyz # Switch to that commit
# Make your edits - they're automatically part of that commit
jj new # When done, go back to a new commit
jj squash # Squash current into parent
jj squash --into @- # Same thing, explicit
jj squash --from xyz # Squash specific commit into parent
jj split # Interactive split of current commit
# Select which changes go in the first commit
# Remaining changes stay in a second commit
# Conflicts are stored IN commits (not blocking)
jj log # See which commits have conflicts
jj resolve # Interactive conflict resolution
jj resolve --tool meld # Use specific merge tool
jj bookmark create feat-auth # Create bookmark at current commit
jj bookmark move feat-auth # Move bookmark to current commit
jj bookmark list # List all bookmarks
jj git push -b feat-auth # Push specific bookmark
jj undo # Undo last operation
jj op log # See operation history
jj op restore <op-id> # Restore to specific operation
Just keep editing - it's auto-saved in the working copy commit. Use jj describe to update the message.
jj new # Your work is safe in parent
# Experiment here
jj abandon # Discard experiment
jj edit @- # Go back to previous work
jj new # Snapshot current work
jj new other-commit # Start from different point
# Do other work
jj new previous-work # Return to original work
jj undo # Just undo
Always run unit tests after making logic changes to code. This applies regardless of version control system.