jj/skills/git-to-jj/SKILL.md
This skill should be used when the user is in a Jujutsu (jj) repository and uses Git-specific terminology — such as "commit", "branch", "checkout", "stash", "cherry-pick", "rebase -i", "reset", "push", "pull", "merge", "add", "stage", "log", "diff", "amend", "revert", "tag", "fetch", or "clone". Focuses on explaining conceptual differences between Git and jj, not just command mapping. Translates Git mental models into correct jj equivalents. Do NOT use when the user is already using jj terminology correctly — use jj-workflow instead. Detects .jj directory presence combined with git vocabulary.
npx skillsauth add musingfox/cc-plugins git-to-jjInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When a user thinks in Git terminology inside a jj repository, translate their intent into the correct jj workflow.
Use when ALL of these conditions are met:
.jj directory exists in the project root (verify with ls -d .jj 2>/dev/null)Do NOT use when:
.jj directory (use actual git commands)| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git add + git commit | jj describe -m "msg" | jj auto-tracks all files. No staging area. The working copy IS the change — just describe it. |
| git commit --amend | jj describe -m "new msg" | In jj, the working copy is always being amended. Just re-describe. |
| git add -p / git add <file> | jj split | Use split to selectively choose what goes into the current change |
| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git branch <name> | jj bookmark set <name> | Bookmarks are jj's branches. They're just labels on changes. |
| git branch -d <name> | jj bookmark delete <name> | |
| git checkout <branch> | jj new <bookmark> or jj edit <rev> | jj new starts fresh work on top; jj edit modifies existing change |
| git checkout -b <name> | jj new then jj bookmark set <name> | Create change, then label it |
| git switch <branch> | jj new <bookmark> or jj edit <rev> | Same as checkout |
| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git stash | jj new | Just start a new change! Your work stays in the parent change. No special stash mechanism needed. |
| git stash pop | jj squash --from <stashed-change> | Squash the "stashed" work into current change |
| git stash list | jj log | All changes are visible in the log — no hidden stash stack |
| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git cherry-pick <commit> | jj duplicate <rev> | Creates a copy of the change |
| git rebase -i (squash) | jj squash | Squash current into parent |
| git rebase -i (reorder) | jj rebase -r <rev> -d <dest> | Move changes around freely |
| git rebase -i (edit) | jj edit <rev> | Go back and modify any change |
| git rebase -i (split) | jj split | Split a change into pieces |
| git rebase <branch> | jj rebase -d <rev> | Rebase onto a destination |
| git reset --soft HEAD~1 | jj unsquash | Moves diff from parent into current change (un-commits parent's work into your working copy) |
| git reset --hard | jj restore | Discard working copy changes |
| git revert <commit> | jj backout -r <rev> | Create an inverse change |
| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git push | jj git push | Only pushes bookmarked changes |
| git pull | jj git fetch + jj rebase -d 'trunk()' | Fetch and rebase are separate steps |
| git fetch | jj git fetch --all-remotes | |
| git clone | jj git clone <url> | Creates colocated repo by default |
| Git Command / Concept | jj Equivalent | Key Difference |
|---|---|---|
| git log | jj log | Shows change graph with revisions |
| git log --oneline | jj log --limit N | |
| git diff | jj diff | Shows current change diff |
| git diff --staged | jj diff | No staging area — jj diff shows all |
| git show <commit> | jj diff -r <rev> | Show diff for any change |
| git blame | jj file annotate <path> | Line-by-line annotation |
When a user uses Git terminology in a jj repo:
.jj exists. Note if colocated (.git also exists).git add + commit, you just jj describe to add a message."When translating, highlight these fundamental differences:
Git's add → commit workflow doesn't exist in jj. All file changes are automatically part of the current change. Just describe when ready.
In Git, uncommitted work is "dirty state." In jj, the working copy IS a first-class change that's always being recorded. jj describe names it; jj new starts the next one.
Git has immutable commits. jj has mutable changes that can be freely edited, squashed, split, and rebased without special "interactive" modes.
Git branches are pointers that advance with commits. jj bookmarks are labels you explicitly set on changes. They don't auto-advance.
In jj, you're always working on a change. There's no "detached HEAD" state. jj new <any-rev> just works.
data-ai
Unified entry point for Obsidian daily-note captures and long-form notes. Triggers on "記一下 / log / 紀錄 / capture this / 寫到 journal" (→ cap mode) and "建立筆記 / new note / 寫一份筆記 / create a note on" (→ note mode). Also via `/obw:cap` and `/obw:note`. Requires `.obsidian.yaml`.
tools
Use the `gog` CLI to operate Google Workspace — Gmail (read/search/send/labels/drafts), Calendar (events/RSVP/freebusy/focus-time/out-of-office), and Drive (list/search/upload/ download/share/move). Triggers on any Gmail, inbox, email, calendar, agenda, meeting, schedule, RSVP, Drive, Google Doc/Sheet/Slides, file share, or upload/download request.
documentation
Interactively create .obsidian.yaml for a project and install starter templates (task / doc / adr) into the vault's Templates folder. Skips templates that already exist; never overwrites.
tools
Manage project hook-guard installation — set up, diagnose, or update Claude Code hooks, git pre-commit, and commit-msg scripts with security checks, code-quality gates, and CLAUDECODE skip logic. Triggers on "set up hooks", "configure pre-commit", "add linting hooks", "initialize hook-guard", "check hooks", "hook doctor", "verify hook setup", "troubleshoot hooks", "update hooks", "regenerate hooks", "sync hooks with current tools", or similar requests.