2nd dokployH
Find a file
creatixchu 6184ba35ca fix(web): address the review round on the one-route add flow
- lifecycle-chrome's second scaffold staged its workspace under the OUTER
  scaffold's temp root, coupling two supposedly independent worlds and
  leaving the aria scrub root wrong; it now uses its own workspaceCwd.
- The direct-open path now carries the same `flowBusy` gate that disables
  the equivalent menu entry, so an occupant re-registering mid-adoption
  cannot raise a second flow.
- A composition with no directory-picker no longer opens a zero-entry
  popover on the hero anchor: with nothing to pick and nothing to add,
  the gesture shows nothing. Both behaviors gain a unit test.
- Brought three partially superseded Agent Notes current (the native
  picker, the workspace UI product flow, and the sidebar browsing split),
  cross-linked to this decision, both languages re-recorded.
- Corrected this Note's own Testing section: the shared e2e helper stages
  and adopts its directory, it does not create one in-dialog — only
  workspace-management does. Named the client-seam and CLI-README residue
  in the follow-up TODO alongside the wire branch.
2026-07-31 16:23:49 +08:00
.agents fix(web): address the review round on the one-route add flow 2026-07-31 16:23:49 +08:00
.claude docs: accuracy sweep, architecture restructure, two ADRs, review skill 2026-06-13 22:05:34 +08:00
.github ci: disable session telemetry in all GitHub workflows 2026-07-31 01:34:41 +08:00
apps fix(web): address the review round on the one-route add flow 2026-07-31 16:23:49 +08:00
assets docs: make the top-level README product-first 2026-07-23 00:15:44 +08:00
bin feat(cli): launch dsh source through the tsx ESM hook 2026-07-29 13:15:24 +08:00
docs Merge pull request #1046 from deepseek-harness/worktree-infdev01 2026-07-31 14:49:00 +08:00
examples Merge remote-tracking branch 'origin/master' into feat/read-presenter 2026-07-31 11:25:44 +08:00
native docs(i18n): record proofread README pairs 2026-07-29 15:30:44 +08:00
packages fix(web): address the review round on the one-route add flow 2026-07-31 16:23:49 +08:00
patches fix(build): validate packaged spawn helpers 2026-07-29 21:49:21 +08:00
python Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config 2026-07-30 20:15:40 +08:00
scripts Merge remote-tracking branch 'origin/master' into mergebot/pr998 2026-07-31 12:23:03 +08:00
skills refactor(llm-deepseek)!: rename the provider route to deepseek-official 2026-07-29 16:36:07 +08:00
vendor fix(app-boot): preserve published loader composition 2026-07-31 03:20:20 +08:00
website docs: bilingual credentials/settings-consumer documentation, catalogs, and gates 2026-07-29 14:20:06 +08:00
.editorconfig Declare LF and final-newline conventions in .editorconfig 2026-07-15 16:09:12 +08:00
.gitattributes Pin LF working trees via .gitattributes 2026-07-15 16:09:12 +08:00
.gitignore Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
.gitlab-ci.yml python: derive release version from repository 2026-07-13 17:49:01 +08:00
.jscpd.json chore(lint): bring .tsx files into the eslint, lefthook, and jscpd lanes 2026-07-27 21:42:08 +08:00
.oxlintrc.json Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
AGENTS.md Merge branch 'worktree-config-settings-seam' into worktree-llm-dynamic-config 2026-07-30 14:33:36 +08:00
CLAUDE.md Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
eslint.format.config.mjs Merge commit 'refs/codex/pr885/master-20260730' into worktree/retarget-pr885-20260729 2026-07-30 01:18:28 +08:00
knip.json fix(ci): align Knip config with CI 2026-07-30 20:58:28 -07:00
lefthook.yml refactor: centralize Oxlint worker bounds 2026-07-29 23:39:49 +08:00
LICENSE Initialize repo with README, AGENTS.md, and CLAUDE.md symlink 2026-06-10 22:58:56 +08:00
package.json fix: ci 2026-07-31 14:08:13 +08:00
pnpm-lock.yaml feat(telemetry): anonymous user id from $DSH_HOME/.userid, reported as OTel Resource user.id 2026-07-31 14:28:03 +08:00
pnpm-workspace.yaml fix(build): stage platform-specific PTY artifacts 2026-07-29 22:44:19 +08:00
pytest.ini Merge remote-tracking branch 'origin/master' into codex/trim-ai-prose 2026-07-14 00:40:36 +08:00
README.i18n.yaml docs: address README review 2026-07-31 11:18:49 +08:00
README.md docs: address README review 2026-07-31 11:18:49 +08:00
README.zh.md docs: address README review 2026-07-31 11:18:49 +08:00
tsconfig.base.client.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsconfig.base.json Merge remote-tracking branch 'origin/master' into feat/web-diff-card 2026-07-31 12:50:58 +08:00
tsconfig.client.json Merge branch 'worktree-llm-dynamic-config' into worktree-llm-web-config 2026-07-30 15:18:26 +08:00
tsconfig.host.json Merge remote-tracking branch 'origin/master' into worktree/composer-scroll-sync 2026-07-31 13:22:52 +08:00
tsconfig.json refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
tsdown.config.ts refactor(tsconfig): single root solution graph over host/client aggregates 2026-07-23 03:59:05 +08:00
vitest.config.ts Merge branch 'master' into feat/gui-full-access-confirmation 2026-07-30 22:51:43 -04:00
vitest.e2e.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.shared.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.snapshot.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00
vitest.web.config.ts fix(test): isolate jsdom storage on Node 26 2026-07-30 21:49:33 +08:00

DeepSeek Harness

English | 中文

DeepSeek Harness (dsh) is an open-source coding agent built on the DeepSeek Harness SDK.

It uses an architecture where everything is a plugin.

Internal testing notice

Thank you for making time to try DeepSeek Harness.

This version is still in internal testing. Some features remain unfinished, and parts of the experience may feel rough.

“As one cuts and files, as one carves and polishes.” Products grow through repeated encounters with real use and candid feedback. The problems you uncover in practice may lead us to re-examine, or even discard, existing designs.

We especially want to hear about moments of failure, confusion, or friction. If DeepSeek Harness does not help—or instead makes your work harder—please leave a message in our WeCom group and tell us about your experience. Every report will help us refine it.

Install

Install dsh with one command:

curl -fsSL https://raw.githubusercontent.com/deepseek-harness/deepseek-harness/master/scripts/install.sh | sh

The installer requires git and Node ^22.19 || >=24, offers to install pnpm when it is missing, and prompts for a DeepSeek API key.

The installer keeps every checkout under ~/.dsh/source: the master clone at ~/.dsh/source/master and each install's staging checkout as a git worktree ~/.dsh/source/staging-<timestamp>. The stable symlink ~/.dsh/source/current points at the active staging worktree, and dsh in ~/.local/bin links to current/bin/dsh, so an upgrade repoints one symlink and the dsh on PATH never moves. Re-running the command adds a fresh staging worktree from an updated master and repoints current at it. See scripts/install.sh for alternate install locations and other options.

Use DeepSeek Harness

Web UI

For the recommended local interface, build the active checkout after installation and after each update, then start the Web UI:

(cd ~/.dsh/source/current && pnpm run build)
dsh web

The full build produces the library and client bundles plus the frontend dist. The path above is the installer's default. If you set DSH_SOURCE or DSH_CURRENT, or reused an existing checkout, replace ~/.dsh/source/current with that checkout path; see scripts/install.sh for details. The Web UI is served at http://127.0.0.1:3080 by default.

TUI

Start the full-screen terminal interface:

dsh

Headless

Run one task, print the final answer, and exit:

dsh -p "summarize this workspace"

Automation and SDKs

From a source checkout with DEEPSEEK_API_KEY in the environment or its root .env, start the ACP automation server:

pnpm run demo:acp

The Python SDK drives a bundled JSON-RPC runtime. The examples cover the runnable headless, ACP, JSON-RPC, Code Mode, and self-referential compositions.

Why DeepSeek Harness

Built-in capabilities cover file reading, editing, and search; shell and persistent PTY execution; reusable skills; task tracking, goals, plans, todos, and background tasks; subagents and workflows; sandboxing and approvals; settings and credentials; persistent, resumable, forkable, and queryable sessions; LSP and web access; context compaction; and telemetry. Each composition selects the subset appropriate to its surface. The TUI and Web UI both include Plan Mode.

  • Everything is a plugin. Models, tools, policies, storage, context management, and interfaces are composable Cordis plugins, so deployments can extend or replace behavior without forking the agent loop. See the architecture for the underlying design.
  • Runs are reconstructable. Anything visible to the model is logged in the authoritative session stream; persistence, resume/fork/query, replay, telemetry, and UIs derive from the same events. See the session-log architecture.
  • Code Mode (opt-in). It exposes a run_code tool and a generated TypeScript SDK; only program output re-enters model context. See Code Mode.
  • Self-referential Cordis tools are opt-in. They let the agent inspect its live runtime and mount or unmount plugins while it runs. See the Cordis tools.

Community

Follow DeepSeek Harness on Twitter for project updates.

Development

pnpm install
pnpm run test:coverage

Start with the development guide and read the architecture before changing packages.

For agents, follow AGENTS.md.

DeepSeek Harness is currently in internal testing.

License

BSD 3-Clause