← Back to home@Wisdoverse

dsh-git-auth-plugin

GitHub and GitLab CLI authentication through DSH credentials or environment tokens, with workspace-local SSH deploy keys and plugin settings.

Stars
0
Language
JavaScript
Created
Sep 4, 2026
Updated
Oct 5, 2026
GitHub repo

Introduction

🔐 dsh-git-auth

GitHub, GitLab, and SSH authentication tools for DeepSeek Harness.

English · 简体中文

License GitHub source Token handling

🚀 Quick install

git clone https://github.com/Wisdoverse/dsh-git-auth-plugin.git
dsh plugin --profile web add ./dsh-git-auth-plugin

Restart the Web profile after installation. See the detailed installation instructions.

🚀 Installation · ✨ Features · ⚙️ Configuration · 🐛 Feedback

Contents

Check authentication                 →  auth_status
Sign in with GH_TOKEN / GITLAB_TOKEN →  client_auth
Manage this workspace's deploy key   →  ssh_key

Features

IconFeatureDescription
🔎Unified statusReports gh, glab, SSH-agent, and public-key status in one call.
🔑Non-interactive loginAuthenticates gh or glab with a token from plugin settings or the DSH host environment.
🗝️Workspace deploy keysGenerates, configures, lists, and displays Ed25519 keys under each workspace's .ssh directory.
🛡️Approval-aware writesKeeps key changes inside workspace access and requests host approval for shared CLI/agent changes.
⚙️Settings UIExposes hosts, timeout, key path, comment, and ssh-add defaults under Settings → Plugins.

[!IMPORTANT] Access tokens are not accepted as tool arguments. Save them in the plugin settings or DSH host environment so they do not enter model context or tool-call logs.

[!WARNING] This release is for a single user or mutually trusted users. Hosts, tokens, gh/glab profiles, and the SSH agent are shared by the DSH instance. Workspace-local key paths are routing, not a multi-user security boundary.

Tools

ToolPurposeWrites state
auth_statusShow GitHub CLI, GitLab CLI, SSH-agent, and public-key status.No
client_authLog gh or glab in or out.Yes; requests escalation if host access is not already granted
ssh_keyGenerate, configure, list, or display the current workspace's Ed25519 deploy key.Generation/configuration use workspace access; ssh-add requests host access

Example requests:

Check my GitHub, GitLab, and SSH authentication status.
Use the configured GH_TOKEN to sign in to GitHub.
Generate this workspace's deploy key and show its public key.
Configure this repository to use the existing workspace deploy key.

Installation

From source

  1. Clone the plugin into a path visible to the DSH host:

    git clone https://github.com/Wisdoverse/dsh-git-auth-plugin.git \
      /path/to/local-plugins/dsh-git-auth
    
  2. Add it to the target profile:

    dsh plugin --profile web add /path/to/local-plugins/dsh-git-auth
    
  3. Restart the profile.

The package declares its DSH bundle in package.json, and cordis.patch.yml mounts the tool plugin in the host's global tool layer.

Configuration

Open Settings → Plugins → Plugin configuration, or edit the git-auth section in the DSH settings document (normally $DSH_HOME/settings.yaml).

SettingDefaultAccepted value
ghHostgithub.comBare GitHub hostname, optionally with a port
glabHostgitlab.comBare GitLab hostname, optionally with a port
commandTimeoutMs60000Integer greater than or equal to 1
sshPathEmptyDirect child of <workspace>/.ssh; empty means <workspace>/.ssh/id_ed25519
sshCommentEmptyDefault comment passed to ssh-keygen
sshAddAgentfalseWhether generated keys are loaded with ssh-add by default
git-auth:
  glabHost: gitlab.example.com
  commandTimeoutMs: 60000
  sshPath: id_ed25519
  sshComment: developer@example.com
  sshAddAgent: true

Settings are resolved at tool-call time, so host-side settings-file updates do not require a plugin reinstall. DSH may restrict settings writes from remote browsers; edit the host settings file if the UI is read-only.

sshPath is a shared default name resolved separately inside every session workspace. ssh_key generate also writes that repository's local core.sshCommand; use action: configure to bind an existing key. That command uses <workspace>/.ssh/known_hosts, so it also works when the DSH process has no HOME.

Key names ending in .pub, .gitignore, and known_hosts are reserved. Public-key output validates a complete OpenSSH public key and omits its comment; the on-disk comment is preserved, and showing a public-only file remains supported.

Token handling

The plugin configuration card includes write-only GitHub Token and GitLab Token fields. They store GH_TOKEN and GITLAB_TOKEN through the DSH credentials service. The client requests only credential metadata, never saved values; backend authorization, storage, and readback protection are owned by the DSH credentials service.

The login tool resolves credential references in this order:

ClientPrecedence
ghGH_TOKEN → GITHUB_TOKEN
glabGITLAB_TOKEN → GLAB_TOKEN → GITLAB_ACCESS_TOKEN

Existing deployment environment variables remain supported. When the DSH credentials service is present, it owns environment/store precedence and write permissions; otherwise the plugin reads the environment directly. Do not paste tokens into chat or commit them to this repository.

Tokens are instance-global in the current DSH credential model and therefore shared by all workspaces. Use a separate DSH instance for another user or trust domain.

An environment token can be sent only to that client's configured host. To use a different host, update ghHost or glabHost first, then restart DSH if the host process also needs a new environment token.

Security

This plugin manages host credentials, so its boundary is deliberately narrow:

  • Tokens are resolved per login through the DSH credentials service (or host environment fallback) and passed to the CLI over stdin, not tool arguments or command strings. Host stdin logging and CLI output masking require separate deployment verification; status results include account and workspace metadata.
  • Authentication hosts are validated as bare hostnames and encoded as single shell arguments.
  • SSH key paths must resolve to direct children of the current workspace's .ssh directory; existing symlinks at the directory, private-key, or public-key path are rejected.
  • Repository-local core.sshCommand pins Git to the workspace key with IdentitiesOnly=yes and a workspace-local known_hosts; a missing host is accepted on first use (accept-new) and later key changes are rejected.
  • Before generating or configuring keys, the plugin appends an effective * rule to .ssh/.gitignore, preserving existing rules. This also protects keys created before git init. Already tracked .ssh files cause the operation to stop without changing the index. Untrack them explicitly and rotate any key previously published; ignore rules cannot protect against git add -f or remove secrets from history.
  • Read operations and workspace key writes keep the calling session's sandbox boundary. Read-only sessions request workspace-write approval.
  • Shared CLI credential mutations request DSH escalation when the session does not already have the required host access.
  • Generated keys use Ed25519 and an empty passphrase for non-interactive agent use. Protect the DSH host and its credential directory accordingly.

Development

Commands

CommandPurpose
node test/compose.test.jsRun command/token/path assertions and SSH disclosure/Git exclusion regressions; requires Node, Git, OpenSSH and Bash.
node test/tools.test.jsExercise registered SSH tool handlers after installing peer dependencies.
node --check lib/index.jsSyntax-check the host plugin.
node --check lib/client.jsSyntax-check the settings client.

Project structure

PathResponsibility
lib/index.jsTool registration, approvals, settings, and shell execution.
lib/compose.jsPure host, token, shell-argument, and SSH-path helpers.
lib/client.jsBrowser-side settings card.
cordis.patch.ymlDSH bundle mounting.
test/compose.test.jsDependency-free regression checks.

The running Web profile loads the plugin at startup. Restart it after changing the source files.

License

Released under the MIT License.