Skip to content

feat(agents): add dsh as the 8th agent - #559

Merged
lroolle merged 4 commits into
mainfrom
feat/dsh-agent-556
Aug 14, 2026
Merged

feat(agents): add dsh as the 8th agent#559
lroolle merged 4 commits into
mainfrom
feat/dsh-agent-556

Conversation

@lroolle

Copy link
Copy Markdown
Member

Wraps dsh (deepseek-ai/deepseek-harness, npm @deepseek-ai/dsh, launched 2026-08-13) as deva.sh dsh.

Close#556

Contract, verified against the repo source and a local install (not the issue text where it drifted):

  • DSH_HOME defaults to ~/.dsh (the issue's ~/n worry was a docs misread). deva pins DSH_HOME=/home/deva/.dsh anyway -- developer preview, defaults can move.
  • Auth: default credentials mounts ~/.dsh rw (.credentials.yaml, settings.yaml, profiles/ with container-built pnpm trees, skills/). --auth-with api-key passes DEEPSEEK_API_KEY as env, mounts nothing. dsh resolves inherited env BEFORE .credentials.yaml -- the reverse of pi -- so the injected key always decides billing, no blank overlay is needed, and a host DEEPSEEK_API_KEY is scrubbed from credentials-mode runs where it would silently outrank the mounted credentials.
  • YOLO: DSH_PERMISSION_MODE=danger-full-access (sandbox off, approval never). Env is the only switch; dsh scrubs DSH_* from project-discovered env (.env, BASH_ENV), so only deva's -e injection counts -- which is exactly the posture we want.
  • No auto-updater exists (plain npm, no phone-home): nothing to neutralize.
  • Pin: DSH_VERSION=0.1.0-rc.6 through versions.env / Dockerfiles / Makefile / pin scripts / CI / nightly / release. Pinned hard on purpose; nightly-images tracks drift.
  • Skills interop: dsh reads ~/.agents/skills + /.agents/skills, the dirs deva already wires for claude. One skills dir, two agents.
  • Held back on purpose: plugins/marketplace surface (manifest format broke pre-launch); --trace (no cctrace dsh profile).

Test plan (from #556):

  • scripts/test-dsh-auth.sh: 13 hermetic dry-run asserts (credentials mount, api-key env travel + redaction + no-mount, host-key scrub, --trace reject + passthrough, missing-key error) -- 13/13 local
  • existing agent auth tests stay green (pi/kimi/opencode/help/mount-shape/version-targets all pass locally)
  • CI smoke deva.sh dsh -Q -- --version wired
  • skills interop smoke: manual, post-merge image build

🤖 Generated with Claude Code

lroolleand others added 2 commits August 13, 2026 21:56
- go 1.26.5 -> 1.26.6
- claude-code 2.1.226 -> 2.1.232
- cctrace 0.38.1 -> 0.40.0
- gemini-cli 0.54.4 -> 0.55.1
- grok-cli 1.0.0 -> 1.0.3
- kimi-code 0.34.0 -> 0.36.0
- opencode 1.18.15 -> 1.18.18
- ccx v0.14.0 -> v0.15.0
- cloakbrowser 0.5.6 -> 0.5.7
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- agents/dsh.sh: default credentials mounts ~/.dsh rw; api-key passes
DEEPSEEK_API_KEY as env, mounts nothing -- dsh resolves env BEFORE
.credentials.yaml (reverse of pi), so no blank overlay and the host
key is scrubbed from credentials mode where it would outrank the
mounted credentials
- unattended posture: DSH_PERMISSION_MODE=danger-full-access (env is
the only switch; dsh scrubs DSH_* from project-discovered env, so
only deva's injection counts); DSH_HOME pinned to /home/deva/.dsh
(developer preview, defaults can move; the issue's ~/n worry was a
docs misread -- real default is ~/.dsh)
- deva.sh registration: auth tag, dsh_version label, canonical .dsh
mounts, autolink, status walk, env scrub, config-home scaffolding
- pin DSH_VERSION=0.1.0-rc.6 (@deepseek-ai/dsh) through versions.env,
Dockerfiles, Makefile, install/pin/resolve/upgrade scripts, CI,
nightly-images, release workflows; no updater exists, nothing to
neutralize
- scripts/test-dsh-auth.sh: 13 hermetic dry-run asserts, wired into CI
- skills interop: dsh reads ~/.agents/skills + <project>/.agents/skills
(already wired for claude); plugins surface held back on purpose
(manifest format in flux)
Close#556
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CopilotAI lite review requested due to automatic review settings August 14, 2026 05:11

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:2612f86677

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment threaddeva.sh
[ -d "$CONFIG_HOME/.pi" ] || mkdir -p "$CONFIG_HOME/.pi"
;;
dsh)
[ -d "$CONFIG_HOME/.dsh" ] || mkdir -p "$CONFIG_HOME/.dsh"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Autolink the legacy dsh home before scaffolding

On a first normal deva.sh dsh run where ~/.dsh already contains credentials but ~/.config/deva/dsh does not exist, this creates ~/.config/deva/dsh/.dsh before autolink_legacy_into_deva_root runs. The later autolink therefore refuses to replace it with a symlink, and the centralized mount walker mounts the new empty directory instead of the existing credentials, forcing the user to authenticate again. Skip this scaffold when the legacy home exists or perform it after autolinking.

Useful? React with 👍 / 👎.

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds DeepSeek Harness (@deepseek-ai/dsh) as a first-class deva.sh agent (deva.sh dsh), wiring its auth/mount/permission model into deva’s existing container-as-sandbox contract and pinning the CLI version across build/release automation.

Changes:

  • Register dsh as a new agent with credentials (mount ~/.dsh) and api-key (env-only DEEPSEEK_API_KEY) auth flows, plus DSH_PERMISSION_MODE + pinned DSH_HOME.
  • Pin DSH_VERSION end-to-end (versions/env, Dockerfiles, Makefile, pin/upgrade scripts, CI, nightly, release).
  • Add docs + a dedicated auth wiring smoke test (scripts/test-dsh-auth.sh) and update public-facing agent lists.

Reviewed changes

Copilot reviewed 32 out of 32 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
versions.envAdds DSH_VERSION and bumps multiple pinned tool versions.
scripts/version-upgrade.shAdds dsh to upgrade tooling selection and build-arg propagation.
scripts/version-pins.shIncludes DSH_VERSION in pin variable set and emitted pin output.
scripts/update-version-pins.shAdds npm pin resolution for @deepseek-ai/dsh.
scripts/test-install-agent-tooling.shExtends fake-bin install test to include dsh and DSH_VERSION.
scripts/test-dsh-auth.shNew hermetic dry-run test validating dsh auth/mount/env/trace behavior.
scripts/resolve-tool-versions.shAdds dsh to resolved version outputs.
scripts/release-utils.shRegisters dsh in the tool registry metadata used by release tooling.
scripts/install-agent-tooling.shInstalls @deepseek-ai/dsh in images and verifies dsh --version.
README.zh-CN.mdUpdates marketing copy + examples to include dsh.
README.mdUpdates marketing copy + examples to include dsh.
MakefileAdds DSH_VERSION, build args, and help output integration.
llms.txtUpdates agent list to include dsh (but contains a now-stale “six agents” line).
install.shInstalls the new agents/dsh.sh wrapper.
docs/troubleshooting.mdAdds .dsh to “empty home dir” troubleshooting list.
docs/quick-start.mdIncludes agents/dsh.sh and adds quick-start for DEEPSEEK_API_KEY mode.
docs/philosophy.mdUpdates agent list to include dsh.
docs/index.mdUpdates overview agent list to include dsh.
docs/how-it-works.mdDocuments dsh home layout + auth behavior (env precedence, no overlay).
docs/authentication.mdAdds full dsh auth docs for credentials vs api-key modes.
docs/advanced-usage.mdUpdates --trace rejection docs to include dsh.
Dockerfile.rustAdds ARG/LABEL for DSH_VERSION.
DockerfileAdds ARG/LABEL for DSH_VERSION.
deva.shRegisters dsh across help, tagging, env filtering, mount canonicalization, autolink, status output, and fallback mounts.
DEV-LOGS.mdAdds a dev log entry documenting the dsh integration decisions.
CHANGELOG.mdAdds release notes entry for the new dsh agent and its auth/mount contract.
agents/shared_auth.shAdds dsh supported auth methods and default (credentials).
agents/dsh.shNew agent wrapper implementing dsh-specific auth, env, mount, and trace handling.
.github/workflows/release.ymlPropagates dsh_version through release build/notes and build args.
.github/workflows/nightly-images.ymlAdds dsh_version to nightly image resolution + build args.
.github/workflows/ci.ymlAdds DSH_VERSION build arg, dsh --version smoke, and dsh auth test step.
.deva.exampleUpdates hybrid agent setup docs to include dsh.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadllms.txt
Comment on lines +3 to 5
> Docker-first launcher for AI coding agents — Claude Code, Codex, Gemini, Grok, Kimi, opencode, pi, and dsh.
> The container is the sandbox, mounts are the explicit contract, and one warm
> project container serves all six agents. A bash script, not a framework. MIT.
@lroollelroolle mentioned this pull request Aug 14, 2026
4 tasks
Missed in the dsh commit: tests/test_release_utils.sh pins the registry
tool lists; 70/70 again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CopilotAI review requested due to automatic review settings August 14, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 33 out of 33 changed files in this pull request and generated no new comments.

Suppressed comments (1)

llms.txt:5

  • The llms.txt tagline still says the warm container “serves all six agents”, but the PR adds dsh as the 8th agent. This should be updated to avoid misleading downstream consumers of llms.txt.
> Docker-first launcher for AI coding agents — Claude Code, Codex, Gemini, Grok, Kimi, opencode, pi, and dsh.
> The container is the sandbox, mounts are the explicit contract, and one warm
> project container serves all six agents. A bash script, not a framework. MIT.

The hermetic fake registry hard-errors on unknown URLs by design; dsh
needed dist-tags + packument fixtures, an image-label current for the
outage fallback, and its pin in the written-pins assert.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CopilotAI review requested due to automatic review settings August 14, 2026 05:32

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 34 out of 34 changed files in this pull request and generated no new comments.

Suppressed comments (2)

llms.txt:5

  • This description still says the warm project container serves "all six agents", but the doc now lists 8 agents (including dsh). This is now internally inconsistent.
> Docker-first launcher for AI coding agents — Claude Code, Codex, Gemini, Grok, Kimi, opencode, pi, and dsh.
> The container is the sandbox, mounts are the explicit contract, and one warm
> project container serves all six agents. A bash script, not a framework. MIT.

scripts/test-dsh-auth.sh:67

  • The mount-absence assertions include a trailing quote in the needle (":/home/deva/.dsh"") but deva.sh --dry-run prints docker args without quoting. This can let the test pass even if a ~/.dsh mount regresses into api-key mode.
want_absent "no ~/.dsh mount in api-key mode" ":/home/deva/.dsh\"" "$apikey_out"
echo "=== dsh api-key: no mount on the hybrid config-root path either ==="
hybrid_apikey_out="$(DEEPSEEK_API_KEY=sk-ds-test-1234 run_dry dsh --auth-with api-key --dry-run || true)"
want_absent "hybrid layout: no ~/.dsh mount in api-key mode" ":/home/deva/.dsh\"" "$hybrid_apikey_out"

@lroolle
lroolle merged commit 8313619 into mainAug 14, 2026
6 checks passed
@lroolle
lroolle deleted the feat/dsh-agent-556 branch August 14, 2026 05:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add dsh (@deepseek-ai/dsh, DeepSeek Harness) as an agent

2 participants

@lroolle