packages/dsh-git-graph
zhu1090093659/dsh-web输入框上方提供 Git 分支选择器,并把分支泳道与提交历史画成图谱,沿着时间线找到任意变更。
DSH Web GUI 里的 Jujutsu(jj)版本控制面板:「Jujutsu」标签页把 jj log 渲染成 change 图,含 change 详情、改动文件与文件差异、revset 输入框,以及 jj 原生历史改写(拖拽 rebase、按文件拆分、修改描述、压缩、放弃、撤销、推送);直接读 jj 而不经过 git 转译,所有命令以 argv 数组经白名单化的宿主服务执行,带确认、超时与输出上限。
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.
jj log rendered as lanes: change IDs, commit IDs, bookmarks, tags, empty / conflict / divergent markers, the @ working-copy commit, and the main (or master) trunk lane highlighted.M/A/D/R).jj diff --git output with +/- colouring.all() by default (switch to ::@ to focus the current stack); type any revset (all(), bookmarks(), description("…")) and press Enter.⋯ 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.@ change, and the original keeps its description.j/k move the selection, Enter edits, n creates a new change on the selection, u asks to undo, / focuses the revset box.0.2.1-rc.2 or newer within the 0.2.x line (web profile).jj 0.44+ on PATH, or configure jjPath.jj git init --colocate in an existing git repo works).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.
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.
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)
TypertRemoteService named jjPanel with five Remote methods — snapshot, log, show, diff and op. Every command is spawned as an argv array, never through a shell.conversation.view, talking to the host through connection.rpc.call(rpc, "/api", "jjPanel", …).jj log --no-graph -T … template (change id, commit id, parents, bookmarks, tags, flags, description first line); details use jj show --no-patch -T 'json(self)'.jjPanel/op with an action plus params; the host builds the argv and returns stdout, which the panel shows in its status line.op actions; the browser half never constructs jj commands.confirm: true; the panel asks first and the host rejects unconfirmed calls.-- / global flags); paths must stay inside the repository.Undo (jj undo) is always one toolbar click away.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.
MIT