From jj
Use jj (Jujutsu) instead of git for all version control operations — commits, history, branching, pushing. Use for any git or jj repository. Prefer jj commands over git equivalents at all times.
npx claudepluginhub cameri/claude-skills --plugin jjThis skill is limited to using the following tools:
**Jujutsu (jj)** - Git-compatible VCS with:
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Guides TDD-style skill creation: pressure scenarios as tests, baseline agent failures, write docs to enforce compliance, verify with RED-GREEN-REFACTOR.
Guides idea refinement into designs: explores context, asks questions one-by-one, proposes approaches, presents sections for approval, writes/review specs before coding.
Jujutsu (jj) - Git-compatible VCS with:
jj op log, use jj op restore to time travelvs Git: No staging area, edit any commit (jj edit), conflicts stored in commits
@)Current commit is always @:
jj log -r @ - Current commitjj log -r @- - Parent commitjj log -r 'ancestors(@, 5)' - Recent stackState:
jj new@ (new files tracked automatically via /jj:commit)jj describe -m "message" or /jj:commitjj newWhy stack: Individual review, easy reordering, incremental shipping, clean history
/jj:commitTodoWrite: One commit per major todo, jj new between todos
Every jj command auto-snapshots the working copy into an unnamed commit. The operation log records every action ever taken:
jj op log # Full operation history with timestamps
jj op show <op-id> # What changed in a specific operation
jj undo # Undo last operation
jj op restore <op-id> # Time-travel to any point in history
Unlike git reflog, the operation log captures everything: rebases, merges, edits, conflict resolutions — not just branch pointer movements.
jj stores conflicts inside commits rather than blocking operations. A conflicted state is just another commit you can describe, stack on, or resolve later.
jj rebase -s <source> -d <dest> # May produce a conflicted commit — doesn't block
jj log -r 'conflicts()' # List all commits with unresolved conflicts
jj resolve <file> # Resolve a conflict interactively
jj diff -r <rev> # Inspect a conflicted commit's content
In practice: after a rebase that produces conflicts, work continues normally. You can create new commits on top of the conflicted one and resolve it whenever convenient — there is no forced stop like git merge.
Create independent lines of work from the same base and rebase them together later:
jj new main -m "feature A" # New change branching from main
jj new main -m "feature B" # Another change from same base (parallel)
jj rebase -s <change-b> -d <change-a> # Stack B on top of A
This is the jj equivalent of working in multiple branches simultaneously, without needing separate worktrees. Conflicts from the rebase are recorded in the commit, not blocking.
Viewing state: jj status, jj log, jj show, jj diff
Creating commits:
/jj:commit (not jj describe directly)Organizing commits:
/jj:split <pattern> when mixing concerns (tests+code)/jj:squash for multiple WIP commitsUndoing: jj undo, jj op restore, jj abandon
/jj:commit [message] - Stack commit with message generation/jj:split <pattern> - Split by pattern (test, docs, config)/jj:squash [revision] - Merge commits/jj:cleanup - Remove empty workspacesjj does not support git submodules. When working inside a git submodule or managing submodule operations, use git directly:
git submodule add <url> — add a submodulegit submodule update --init --recursive — initialize/update submodulesgit -C <submodule-path> <command> — run git commands inside a submoduleUse jj only for the parent repository (non-submodule paths).
Repository blocks git write commands via hook. Prefer jj equivalents:
git status → jj statusgit commit → /jj:commitgit log → jj loggit checkout → jj newjj restore — Use With Carejj restore --from <rev> -- <path> replaces the target path's content with the state from <rev>. Any file present in --to but absent in --from will be deleted. This has caused accidental mass-deletions when the source revision didn't include recently added files.
Before running jj restore:
jj diff -r <rev> -- <path>jj diff --from <rev> -- <path> (dry-run view)jj diff --summary to verify no unexpected deletionsDo: Stack commits, describe clearly (what/why), use plan-driven workflow, leverage jj op log, split mixed concerns
Don't: Mix git/jj (except for submodules), leave work undescribed, create monolithic commits, forget everything is undoable