VS Code

The VS Code extension lives in clients/vscode/ and is the most feature-complete client today.

Requirements

  • VS Code (any recent version)
  • badjuju server binary on your PATH (see Getting Started)

Installation

From the marketplace

(Coming soon.) For now, build and install a local VSIX.

Build a local VSIX

# From the repo root:
redo clients/vscode/install

This builds the VSIX for your platform and installs it via code --install-extension --force. The code CLI must be on your PATH — in VS Code, run Shell Command: Install 'code' command in PATH from the Command Palette.

For other platforms or a packaged set of VSIXs:

# Single non-host VSIX
TARGET=x86_64-unknown-linux-gnu redo clients/vscode/all

# All platforms at once (requires zig + cargo-zigbuild)
redo clients/vscode/pack

Commands

Open the Command Palette (Ctrl+Shift+P / Cmd+Shift+P) and type jj to filter.

Command IDPalette nameDescription
badjuju.status.openjj: StatusOpen status / change stack
badjuju.log.openjj: Open logOpen the revision log
badjuju.describe.openjj: Describe working copyEdit the current commit message
badjuju.new.openjj: New commitCreate a new empty change
badjuju.next.openjj: Move forward (jj next)Move @ to next child
badjuju.next.editjj: Edit next in placeEdit next change in place
badjuju.prev.openjj: Move back (jj prev)Move @ to previous parent
badjuju.prev.editjj: Edit previous in placeEdit previous change in place
badjuju.refresh.openjj: RefreshRe-run the current buffer's command
badjuju.undo.openjj: Undo last operationUndo last jj op
badjuju.fetch.runjj: Git fetchRun jj git fetch
badjuju.push.normaljj: Git pushRun jj git push
badjuju.push.forceWithLeasejj: Git push --force-with-leaseForce push with lease
badjuju.edit.cursorjj: Edit commit at cursorMove @ to commit under cursor
badjuju.abandon.cursorjj: Abandon commit at cursorAbandon commit under cursor
badjuju.diff.cursorjj: Show diff for commit at cursorDiff for commit under cursor
badjuju.describe.finalizejj: Finalize commit descriptionSave and close describe buffer
badjuju.squash.filejj: Squash file at cursorMove file under cursor into parent
badjuju.unsquash.filejj: Unsquash file at cursorPull file back from parent
badjuju.rebase.source.cursorjj: Mark rebase sourceMark source + mode for two-step rebase
badjuju.rebase.commit.cursorjj: Execute pending rebaseExecute rebase to commit at cursor
badjuju.cancel.runjj: Cancel pending operationCancel pending squash or rebase
badjuju.bookmark.promptjj: BookmarkInteractive bookmark manager
badjuju.log.applyShortcutjj: Apply revset shortcutFollow revset link in log
badjuju.help.openjj: Show hotkey helpCheat sheet for current buffer
badjuju.version.openjj: Show versionServer and jj versions
badjuju.restartLanguageServerjj: Restart Language ServerRestart the LSP

Keymap profiles

Set badjuju.keymapProfile to choose:

  • "magit" (default) — single-key bindings
  • "vim" — two-letter verb chords
  • "none" — no built-in keymaps

magit profile — selected bindings

status.jujutsu / log.jujutsu

KeyAction
RRefresh
nNew commit
LOpen log
Ctrl+N / Ctrl+PMove forward / back (jj next / jj prev)
Ctrl+Shift+N / Ctrl+Shift+PEdit next / previous in place
f / p / PFetch / push / force push
eEdit commit at cursor
bBookmark
r s / r r / r bMark rebase source (--source / --revisions / --branch)
r o / r A / r BExecute rebase (onto / insert-after / insert-before)
dDiff (change)
DDiff (commit, pinned)
c wCommit transient → reword (describe) commit at cursor
c nCommit transient → new child commit
sSelect squash source or destination (two-step)
SSquash file at cursor into parent
xCancel pending operation (squash or rebase)
u, Ctrl+K uUnsquash file at cursor
aAbandon
UUndo
=Diff (alias for d)
qClose
?Help

Squash window (.jj/badjuju/squash/*.jujutsu)

KeyAction
sToggle hunk / file between SELECTED and REMAINING
eEdit hunk before squashing
aSelect all changes
ADeselect all changes
uUndo
TabToggle fold
qClose

describe.jujutsu

KeyAction
Ctrl+EnterFinalize commit (save and close)
Escape EscapeAbort (close without saving)
?Help

vim profile

Doubled letters: nn, ll, dd, ss, SS, uu, UU, aa, ee, bb, ff, pp, PP. Rebase chords use a three-key sequence: r r s / r r r / r r b for source, r r o / r r A / r r B for destination. x cancels any pending operation. Single-key bindings: D, =, q, ?. See the in-repo clients/vscode/README.md for the complete table.

Settings

SettingPurpose
badjuju.binaryPathPath to the jj binary; blank uses PATH
badjuju.defaultLogRevsetDefault revset for badjuju.log.open
badjuju.keymapProfilemagit, vim, or none

Auto-refresh

Open status, log, and diff buffers auto-refresh when jj operations happen — including ones triggered from a terminal outside VS Code.