Git development workbench for DeepSeek Harness: captures branch, status, worktrees, stashes and recent commits, with commands, tools and a settings UI.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-git-workbench
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:kaixinbaba/dsh-git-workbench
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A git development workbench for DeepSeek Harness: not a git-status display plugin — it drives the branch/worktree workflow. It captures the repository state (branch, ahead/behind, worktree status, worktrees, stashes, recent commits) into every session, asks which branch or worktree to develop in at new-session start, and switches branches / creates and manages worktrees through /git commands, the git_workbench agent tool, and a Settings page.
Features
- Automatic git context (read-only, always on) — every session in a git repository gets a compact context block injected at the first step (and refreshed after git-workbench writes): current branch, ahead/behind vs upstream, working-tree status (staged / modified / untracked / conflicts), worktree list, stash list, recent commits. Non-git directories stay silent.
- New-session environment choice (skippable) — with
autoAskon, the agent asks once per session which environment to develop in: stay on the current branch, switch to another branch, create a new branch, open an existing worktree, or create a new worktree. The user can skip (stay where they are). /gitslash commands/git status— inject the current git context snapshot/git switch <branch> [--stash|--force]— switch branch/git merge <target>— merge the current branch into/git branch <name> [--from <base>]— create a branch and switch to it/git log [N]— recent commits/git stash [push|list|pop|drop]— stash management/git worktree list·add <branch> [--from <base>] [--dir <path>]·remove <path|branch> [--force] [--delete-branch]
git_workbenchagent tool — the same guarded operations, callable by the agent (e.g. from the auto-ask flow). Agent-driven switching goes through exactly the same guardrails as the command.- Sidebar Git panel (Web) — a "Git" button in the sidebar footer opens a workbench overlay: pick any registered DSH workspace, see its branch / ahead-behind / working-tree status / worktrees / stashes / recent commits live, and run guarded actions (switch branch, new branch, new worktree, remove worktree, stash push/pop/drop) with one click. Dirty-tree decisions surface inline (stash first / force / cancel).
- Composer git strip (Web) — the input card's top row (new-session hero and every session) shows the current workspace's branch and clean/dirty state plus an environment dropdown, left-aligned on the same row as right-aligned model shortcuts. Narrow composers wrap the git controls onto their own row instead of clipping them. The choices are use the current branch (default) / create a new branch / create a new worktree. The strip stays hidden outside a git repository. Create options are disabled while the tree has uncommitted changes (with a "stash now" shortcut); creating a worktree registers the new directory as a workspace and offers "open a session in the new worktree".
- Merge & cleanup policy (agent rule) — when the current branch is not the main branch (auto-detected: main → master → develop), the agent follows a persistent rule: if you ask to merge to main / ship / release / go live, it merges the current branch into main with
git_workbench(actionmerge, which also handles the target being checked out in another worktree, dirty-tree guards, and already-merged detection), then asks you whether to delete the branch/worktree after the merge or keep it, and only deletes with your explicit choice. - Guardrails
- Switching branches over a dirty tree is blocked; the tool returns
needsDecisionwith options (stash first / force / cancel). Force is gated byallowForceSwitch(default off). - Removing a worktree never targets the main worktree or this session's working directory; dirty worktrees need
--force, gated byallowForceWorktreeRemove(default off). Optionally deletes the branch after removal (--delete-branch, only when merged). - All git execution uses
execFilewith an argument array — no shell, so names cannot inject commands. Branch names are sanitized.
- Switching branches over a dirty tree is blocked; the tool returns
- Settings → Plugins → Git Workbench —
autoAsk, ask threshold, worktree directory template ({parent}/{repo}-{branch}), recent-commit count, and the two force toggles. Persisted to$DSH_HOME/git-workbench.json.
Quick start
dsh plugin --profile web add dsh-git-workbench
Slow npm registry?
dsh plugin --profile web add dsh-git-workbench --registry=https://registry.npmmirror.com
Install from a local checkout (development):
dsh plugin --profile web add file:/path/to/dsh-git-workbench
Use the
file:prefix (copies the package intonode_modules). A bareadd .oradd link:…makes pnpm symlink the package, in which case the plugin'sschemasterydependency resolves from the source checkout and is not found — a general pnpm symlink-install gotcha, not a bug in the plugin.
Restart dsh web, then:
- Open a session in a git repository → you should see the git context injected, and (with ≥2 branches/worktrees) the environment question at the start (skippable);
- Or type
/gitfor the command menu.
Worktree workflow
Worktrees are separate directories, so in DSH each worktree is its own workspace/session. /git worktree add <branch> creates the worktree at <parent>/<repo>-<branch> (configurable via worktreeDirTemplate) and tells you to open a new DSH session in that directory — that is the intended way to "develop in a worktree". The worktree is immediately visible in the worktree list of every other session of the same repository.
Implementation notes (for plugin authors)
- Do not import
@deepseek-ai/*from an out-of-tree host plugin. Declaring@deepseek-ai/dsh-llm/dsh-tools(or any@deepseek-ai/*) as dependencies installs second copies into the profile'snode_modules; the resulting duplicate module instances break host module identity (empirically: the tools scheduler'sTOOL_RUNTIME_SCHEDULERsymbol mismatch makes every tool dispatch fail withCannot read properties of undefined (reading 'prepare')). This plugin therefore hand-builds its pre-step context message (thecreateUserMessageshape:id+role:'user'+content+source:{kind:'plugin',plugin,form:'snapshot',sections}, deep-frozen) and registers its agent tool as a plain compiled definition (parameters as an object-rooted JSON Schema with a rootrequiredarray; output as a strictJsonSchemaNode). - The injected context uses the
dsh-time-contextpre-step pattern:ctx.on('agent/pre-step', …, { prepend: true }), fresh capture on step 1, memoized between steps, re-injected when the fingerprint changes or after our own writes. git status --porcelain=v2does not emit# branch.*header lines unless--branchis passed.
Test
npm test # client regression, unit, and real-git integration tests (temp repos)
Links
More in this category
zhu1090093659/dsh-web#packages/dsh-git-graph★ 6885
Git branch selector and Git graph for the dsh web GUI: switch branches and explore branch-lane and commit history from the conversation header.
Akimiya-z/codex-guard#dsh★ 136
Pre-submit pull-request hygiene checks inside DeepSeek Harness: scans the current diff for TODO leftovers, hardcoded secrets, and non-conventional commit subjects.
lehhair/dsh-diff-viewer★ 26
PiUI-style diff viewer replacing the stock DiffBlock for write/edit tool calls.
DietCokewithSugar/dsh-user-experience★ 19
Finds potential UX issues in your project: automatically reviews React/TypeScript code, pinpoints each problem, and gives concrete suggestions.
cirelir/dsh-change-review★ 14
Session change-review plugin for DeepSeek Harness: tracks write/edit tool calls per session and renders line-level diffs with customizable colors, with session isolation, subagent aggregation, and SSE live updates.
zoahdev/dsh-github-intelligence★ 13
The most complete GitHub integration for dsh: repo overview, releases, issues, pull requests, contributors, search, and a deep repo report with TTL caching — no API key needed.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.