Claude-skill-registry jj-workflow
Jujutsu (jj) version control, load skill when hook output shows vcs=jj-colocated or vcs=jj in the system-reminder.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/jj-workflow" ~/.claude/skills/majiayu000-claude-skill-registry-jj-workflow && rm -rf "$T"
manifest:
skills/data/jj-workflow/SKILL.mdsource content
jj Workflow
CRITICAL: Avoid Interactive Mode
Always use
flag to prevent jj from opening an editor:-m
# WRONG - opens editor, blocks AI jj new jj describe jj squash # CORRECT - non-interactive jj new -m "message" jj describe -m "message" jj squash -m "message"
Never use these interactive commands:
- inherently interactive, no non-interactive modejj split
Mental Model
No staging area. Your working directory is always a commit. Every save is tracked.
= your current change (the working copy)@
= parent of current change@-- Changes are mutable until pushed
When to Use What
| Situation | Do This |
|---|---|
| Starting new work | |
| Forgot to start with jj new | (do this immediately) |
| Work is done, move on | |
| Annotate what you did | |
| Broke something | → |
| Undo one file | |
| Combine messy commits | |
| Try something risky | , then if it fails |
AI Coding Pattern
Always have a description. The working copy should never stay "(no description set)".
# BEFORE starting work - declare intent jj new -m "feat: add user logout button" # Now implement... jj tracks everything automatically # FORGOT to start with jj new? Describe immediately jj describe -m "feat: what I'm working on"
Why this matters:
shows meaningful history while workingjj log- Easier to understand what each change does
- Simpler to curate/squash later
- Teammates can follow progress
# Checkpoint before risky changes jj describe -m "checkpoint: auth works" jj new -m "trying OAuth integration" # If it breaks jj op log # Find good state jj op restore <id> # Go back # When done, curate history jj squash -m "feat: OAuth support"
Push to GitHub
Pushed commits are immutable. You can't squash into or modify them. The safe pattern:
# 1. Abandon empty checkpoint commits cluttering history jj log -r '::@' # Find checkpoints jj abandon <change-ids> # Remove empty ones # 2. Describe your work (don't try to squash into immutable parent) jj describe -m "feat: what you did" # 3. Move bookmark to your commit and push jj bookmark set master -r @ jj git push
For feature branches (new):
jj bookmark create feature-x -r @ jj git push --bookmark feature-x # If refused, configure auto-tracking once: jj config set --user 'remotes.origin.auto-track-bookmarks' 'glob:*' # Then retry: jj git push --bookmark feature-x
For feature branches (updating):
jj bookmark set feature-x -r @ jj git push
Teammates see clean git. They don't know you used jj.
Recovery
The oplog records every operation. Nothing is lost.
jj op log # See all operations jj undo # Undo last operation jj op restore <id> # Jump to any past state
Bail Out
rm -rf .jj # Delete jj, keep git unchanged