- Home
- Plugins
- Git & Code Review
- dsh-jj-panel
dsh-jj-panel
wzciczw/dsh-jj-panel
Jujutsu (jj) version-control panel in the DSH web GUI: a Jujutsu tab renders the jj log change graph with change details, changed files and file diffs, a revset input, and jj-native history edits (drag-to-rebase, split by file, describe, squash, abandon, undo, push); it reads jj directly rather than through git, and every command runs as an argv array through a whitelisted host service with confirmations, timeouts and output caps.
Install
dsh plugin --profile web add github:wzciczw/dsh-jj-panelREADME
dsh-jj-panel
English | 简体中文
A Jujutsu history panel for the DeepSeek Harness web GUI. It reads jj directly — no git translation — and shows the change graph, change details, changed files and diffs in its own Jujutsu tab, and shapes history through the same jj-native workflow.
Features
- Change tree —
jj logrendered as lanes: change IDs, commit IDs, bookmarks, tags,empty/conflict/divergentmarkers, the@working-copy commit, and themain(ormaster) trunk lane highlighted. - Change details — full description, author and timestamp, changed files with their status (
M/A/D/R). - Diffs — click a changed file to load its
jj diff --gitoutput with+/-colouring. - Revset box — the panel loads
all()by default (switch to::@to focus the current stack); type any revset (all(),bookmarks(),description("…")) and press Enter. - Structural editing — right-click (or the
⋯button) for new change here, edit, describe, squash into parent, abandon (or the whole subtree), duplicate, revert before@, split by file, copy change id, and push a bookmark. - Drag to rebase — drag one row onto another to rebase it; hold Alt to insert the change before the target (reorder a stack). Drops onto the change itself or its descendants are ignored.
- Split by file — toggle split mode in the change details, tick files, then "Split into new change": the ticked files move into a new child of the current
@change, and the original keeps its description. - Undo / Fetch — toolbar actions; destructive operations (abandon, subtree abandon, revert, undo, push) open an inline confirmation naming the action and target change before any write.
- Keyboard —
j/kmove the selection,Enteredits,ncreates a new change on the selection,uasks to undo,/focuses the revset box.
Requirements
- DSH
0.2.1-rc.2or newer within the0.2.xline (web profile). jj0.44+ onPATH, or configurejjPath.- The workspace must be a Jujutsu repository (
jj git init --colocatein an existing git repo works).
Install
dsh plugin --profile web add dsh-jj-panel
Or from a checkout:
dsh plugin --profile web add file:D:\path\to\dsh-jj-panel
After installing, open the Jujutsu tab next to the other conversation views. Host-side changes need a DSH restart; the browser half hot-reloads.
Plugin market source
This repository ships a format-1 market index at market/index.json. Add this URL as a market source under Plugins → Discover to install the pinned version:
https://raw.githubusercontent.com/wzciczw/dsh-jj-panel/master/market/index.json
The index is validated against @deepseek-ai/dsh-plugin-market-index in the test suite.
Configuration
The plugin accepts an optional config block (profile cordis.patch.yml or the plugin settings page):
- id: jj-panel
name: "dsh-jj-panel"
config:
jjPath: 'C:\path\to\jj.exe' # default: PATH, then the winget install location
timeoutMs: 8000 # per jj command
maxBytes: 4194304 # stdout cap
defaultLimit: 120 # commits per load (1..500)
How it works
- Host half: a Cordis plugin registering a
TypertRemoteServicenamedjjPanelwith five Remote methods —snapshot,log,show,diffandop. Every command is spawned as an argv array, never through a shell. - Browser half: a React panel registered on
conversation.view, talking to the host throughconnection.rpc.call(rpc, "/api", "jjPanel", …). - Data comes from a
jj log --no-graph -T …template (change id, commit id, parents, bookmarks, tags, flags, description first line); details usejj show --no-patch -T 'json(self)'. - Every structural edit goes through
jjPanel/opwith an action plus params; the host builds the argv and returns stdout, which the panel shows in its status line.
Safety
- Writes are limited to the allowlisted
opactions; the browser half never constructs jj commands. - Abandon, subtree abandon, revert, undo and push require
confirm: true; the panel asks first and the host rejects unconfirmed calls. - Revsets are validated (no
--/ global flags); paths must stay inside the repository. - Output is capped and commands time out; failures surface verbatim in the panel, and
Undo(jj undo) is always one toolbar click away.
Development
npm install
npm run build # tsc (host) + tsc (client) + bundle lib/client.js
npm test # build + unit/integration tests (real jj when available)
The integration tests use JJ_TEST_REPO when set, otherwise D:\agent-research.
License
MIT
Related plugins
dsh-web (dsh-git-graph)
zhu1090093659/dsh-web
dsh-web-ui (dsh-git-graph)
zhu1090093659/dsh-web-ui
codex-guard (dsh)
akimiya-z/codex-guard
dsh-file-review
left0ver/dsh-file-review