DeepSeek Harness plugin

dsh-worktree

Git worktree filesystem isolation for DeepSeek Harness subagents.

Jump to install

Source facts

Repository
CSY656/dsh-worktree
Latest update
Aug 14, 2026
Category
Workflow & Automation
GitHub stars
1
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/CSY656/dsh-worktree
Plugin: dsh-worktree
Author: CSY656

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

dsh-worktree

Filesystem isolation for DeepSeek Harness subagents via git worktrees. Subagents already isolate messages, permission policy, and tool sets — this plugin isolates the filesystem: each child runs in its own worktree under <repoRoot>/.dsh/worktrees/, sharing the repository object store while keeping the working tree private.

Two entries, one package:

  • dsh-worktree — the ctx.worktree service: create/restore/list/remove git worktrees with strict slug validation, change protection, best-effort post-creation setup, and periodic sweeping of stale temporary worktrees.
  • dsh-worktree/commands — the human-facing /worktree create <slug> | list | remove <slug> [--discard] slash commands.

Install

Requires the DeepSeek Harness next line (dsh ≥ 0.1.0-rc.6). From GitHub:

dsh plugin --profile default add github:you/dsh-worktree

pnpm ≥ 10 asks you to allow the build — add the printed package key to the profile's pnpm-workspace.yaml:

allowBuilds:
  dsh-worktree: true

Then re-run the add. From npm (prebuilt):

dsh plugin --profile default add dsh-worktree

Usage

/worktree create feature/demo    → creates .dsh/worktrees/feature+demo, branch worktree-feature+demo
/worktree list                   → name/path/branch rows
/worktree remove feature/demo    → refuses while dirty; --discard forces

Service API (for plugin authors):

const lease = await ctx.worktree.acquire('agent-abc1234', cwd)  // create/restore at HEAD
// ...run an isolated child with its session header.cwd = lease.entry.path...
const { kept, path, branch } = await lease.release()            // clean → removed; dirty → kept + reported
  • Worktrees live at <repoRoot>/.dsh/worktrees/<flatSlug>/; nested slugs flatten / to + (team/aliceteam+alice), branch worktree-team+alice.
  • validateSlug enforces [a-zA-Z0-9._-] per segment, length ≤ 64, rejecting ., .., //, and leading/trailing separators.
  • Post-creation setup is best-effort: copies project .dsh config, inherits core.hooksPath, symlinks node_modules/.venv/vendor (Windows symlink failures degrade to a warning), copies .worktreeinclude-listed ignored files.
  • Change detection is fail-closed: any git failure counts as "has changes", so a broken worktree is kept rather than deleted.
  • Per-repository mutations serialize; concurrent acquires of the same slug are idempotent (fast restore, no git subprocess).

Configuration

interface Config {
  sweepIntervalMs?: number  // default 3_600_000 (1h)
  sweepMaxAgeMs?: number    // default 86_400_000 (24h); only agent-* temp worktrees are swept
}

Automatic subagent isolation

The one-line integration — subagent(..., worktree: true) creating a worktree per child run with automatic cleanup — needs a small upstream capability in dsh-subagent/dsh-tool-subagent (an optional cwd on SubagentStartRequest). See [UPSTREAM-PR.md](./UPSTREAM-PR.md) for the exact changes and their in-tree implementation; until the upstream accepts them, use ctx.worktree.acquire() in your own plugins or the /worktree commands manually.

Known limitations

  • In-process isolation only — child-session cwd overrides are stamped by in-process backends; out-of-process backends (acp, claude-code, codex, dsh-sdk) ignore them.
  • No cross-process sharing — one DSH instance owns its worktrees.
  • No merge strategy — merging kept worktrees is the delegating agent's job (git merge worktree-<flatSlug>).

Contributing to the ecosystem

  • Tagged with the dsh-plugin topic — browse other plugins.
  • Tests run with pnpm install && pnpm test (real temporary git repositories, no network).
  • The behavior ported here comes from CsyCode chapter 14's worktree isolation.

License

MIT