dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
为 DeepSeek Harness 管理 git worktree —— 让并行工作各自隔离在自己的目录与分支里。自带快速模式(Fast mode)。
Git worktree management for DeepSeek Harness — isolate parallel work in its own directory and branch. It also ships Fast mode (快速模式) as an agent preset and an opt-in patch that lets read-only tool calls run concurrently. A lightweight task attention tray keeps running and unseen chats within reach.
worktree_list, worktree_create, worktree_status, worktree_remove, worktree_prune,
worktree_relocate) or from Settings → Worktrees.bash, glob and grep, so a step that
batches reads overlaps them instead of running them one after another.checkout-service, or checkout-service · ed466e1a for a worktree of it) with the branch of its
below.uiSession.sessionStatus (checked on 0.2.0-rc.2);
hosts without that capability do not show the tray.

Keep an eye on parallel chats without opening each one. The blue button sits below the conversation's right-hand turn index; hover to expand the list and move away to close it. With no tasks to show, it hides.
| Indicator | Meaning |
|---|---|
| Main number | Chats currently included in the tray |
| Small badge | Waiting chats plus ended-but-unseen chats |
| Needs attention | A chat is waiting for input or approval |
| Ended, unseen | A run has stopped and you have not viewed it; this does not indicate success |
| Running | A background chat is working |
Click a row to open its existing chat. A reminder disappears only after navigation succeeds; viewing a chat through the sidebar also acknowledges it. A later completion, new run or new request can appear again. Drag the button to save a position on this device; ↺ returns it below the turn index. On a crowded screen, it moves beside the index and keeps clear of the message composer.
The tray reuses native status subscriptions: no polling, chat-log loading or animated effects. Closed
panels do not render rows; open panels show at most 20 rows per page. These choices keep background work
small, but do not constitute a measured memory benchmark. Reminders reflect the current window's native
status; they are not a persistent or cross-window notification inbox. Requires uiSession.sessionStatus
(checked on 0.2.0-rc.2); older hosts without this capability keep the other plugin features.
The images below render the actual plugin component with simulated sessions, rather than a live DSH session. The first shows the button and badge; the second shows the expanded task list.


New worktrees get an independent worktree/<code> branch from HEAD, including detached HEAD.
Branches checked out elsewhere are refused. Existing shared-branch worktrees are left untouched; switch
each to its own branch before parallel development. Deletion safety includes ignored files such as
.env, which require explicit consent to discard.
A worktree is created inside its own project, at <project>/.dsh/worktrees/<code>: the directory really
being inside the project is what lets each sidebar nest it under that project. It still never pollutes the
project's git status or its diffs, because the plugin adds /.dsh/worktrees/ to that repository's own
.git/info/exclude. A different parent can be configured (defaultParent).
Worktrees made by an earlier release, which lived in the shared $DSH_HOME/worktree/, keep working: Move
into project in Settings → Worktrees, or worktree_relocate from the agent, moves them in and leaves a
symlink at each old path so anything pointed there still resolves.
Both shells fold a worktree under its project. dsh web gets there through the patch this plugin puts into
the browser bundle, which it re-applies on load (or by hand: npm run patch:sidebar). The desktop app has
that nesting natively in its workspace tree grouping, and the Worktrees page offers that switch wherever
the client store has one. The desktop cannot be patched — its shell lives inside the signed app bundle — so
that switch, not a patch, is how its sidebar nests.
A tree also draws a folder line for the worktree itself, which the patched web sidebar does not. The
matching checkbox, Hide worktree rows (sessions stay), is on by default and removes exactly those lines:
their sessions move out to the project's own indent, and a worktree with no live session keeps its row,
because that row is the only way to reach its own + and … actions. It is display only — the workspace
itself is untouched, and unchecking the box brings every line back.
dsh plugin --profile web add gord-dsh-worktree@0.6.0
Or install from GitHub:
dsh plugin --profile web add github:nightosong/gord-dsh-worktree
Then restart dsh web (a reload is enough once the bundle is on the layer stack) and open
Settings → Worktrees. Nothing else needs editing: the package declares dsh.bundle.patch, so the CLI
adds it to the profile's bundle stack itself.
Fast mode arrives with it — the same patch declares the fast agent preset, so the preset picker has
快速模式 without a profile file being edited. If the profile's own cordis.patch.yml already declares a
preset-fast row (the hand-written way), delete that row: the bundle layer merges first, and two rows with
the same id mount the preset twice, which the loader does not refuse. Which preset new sessions start in
stays a user choice (agent-preset-registry in the profile patch); the bundle never sets it. The flip side
of that split: this bundle is what declares Fast mode, so if you uninstall the plugin, change or remove that
default: fast row as well — otherwise it names a preset that no longer exists.
The concurrency patch is the one opt-in step, because it edits core tool packages rather than the plugin's own composition:
cd /path/to/gord-dsh-worktree
npm run patch:concurrency # --check to inspect first, --revert to undo
It needs a dsh web restart, it is idempotent, and it stays manual by design: it touches dsh-tool-bash and
dsh-tool-fs-search, which the desktop app can never carry, so leaving it out keeps both hosts scheduling
read-only calls the same way. A DSH upgrade restores those files — re-run it after one, and use
npm run check:concurrency to see where it stands: patched, original, outdated for an older
classifier, or unknown when the build moved on. Rerun the patch to update an older classifier; unknown
builds are refused without writes.
For a remote hostname or a reverse proxy, configure exact public origins in
allowedOrigins: ["https://dsh.example.com"]. Direct IP access validates the request host and port.
The declared range covers stable 0.1.x releases from 0.1.5 and stable 0.2.x, plus explicit prerelease
opt-ins for 0.1.5 from rc.1, 0.1.6, 0.1.7 and 0.2.0, including desktop 0.2.0-rc.2. Other
prerelease bases and 0.3.x are excluded. Earlier tested builds include 0.1.5-rc.1, 0.1.6-alpha.2 and
0.1.7-rc.2; widening metadata does not mean every later build has been fully tested. Glyph export
names, session navigation and plugin settings changed across the earlier builds, with these fallbacks:
| Interface | 0.1.5 / 0.1.6 | 0.1.7 on | What the plugin does |
|---|---|---|---|
| Glyph export names | IconTrashOutline16 and friends, size-suffixed | IconTrashOutlineRegular and friends, weight-suffixed | Tries both names, draws nothing if neither exists, and never hands React an undefined element type |
| Session navigation | sessions.open(id) | uiWorkspace.openSession(id); sessions.open is gone | Reveals through the workspace view, falls back to the old call when there is none |
| Plugin settings namespace | settings.register(ns, schema) | no such method; the profile's own form model replaces it | Registers a namespace only where that method exists, and reads the entry's config directly otherwise |
Both uiWorkspace and settings are read optionally (ctx.get), so a profile composed without a workspace
view, or without settings, loses one feature rather than failing to apply.
Two features added in 0.3.0 need more than the floor does, so the minimum is per feature rather than per
package: Fast mode needs 0.1.7 (a preset is an @deepseek-ai/dsh-agent-preset composition row, and
0.1.7 replaced the $DSH_HOME/.agent-presets discovery), and the concurrency patch needs 0.1.7,
because it matches those core files exactly.
docs/internals.md covers the design: the worktree lifecycle, the patch contracts, the archive and its storage, and the configuration keys — 中文版.
MIT