dsh-github-hub — a GitHub plugin hub for DeepSeek Harness
A native DSH panel (host half + browser half) that signs in to your GitHub account, keeps a
sign-in history, searches GitHub / npm for deepseek-harness (dsh-plugin) plugins, and installs
them into the current profile with one click — through exactly the same path as
Settings → Plugins and dsh plugin add.
Chinese documentation: README.zh.md
What it adds
- Discover — search GitHub repositories (
topic:dsh-plugin,topic:deepseek-harness,dsh-plugin in:name,description,readme, …) or npm packages (keywords:dsh-plugin). Inspect reads the repository'spackage.jsonand tells you whether it really is an installable DSH plugin (does it declaredsh.bundle.patch? does it ship adsh.clienthalf?). Install runs the profile's own pnpm path with a live log, cancel support, and an "allow the blocked build scripts and retry" button when pnpm withholds lifecycle scripts. - Installed — the profile's bundles and plugin rows, with enable / disable / remove, load errors and read-only reasons.
- Account — sign in with a Personal Access Token or OAuth Device Flow
(bring your own OAuth App
client_id; no client secret needed). Sign-in / sign-out history is persisted and can be cleared. - Diagnostics — a connectivity report for the GitHub API, npm, DNS, the hosts file,
gitandpnpm, plus which rung of the TLS trust ladder the current requests use.
Install
dsh plugin --profile desktop add dsh-github-hub
# local development
dsh plugin --profile desktop add link:/absolute/path/to/dsh-github-hub
Then restart the desktop app — reloading the page is not enough, because DSH collects its boot
injection table once per host start, and a new plugin's client bundle only enters that manifest on
the next start (the web profile needs its dsh web process restarted for the same reason).
A git-branch icon then appears in the left sidebar and opens the panel in the central area.
Read-only endpoints
Beyond the panel, the host half exposes a few read-only endpoints for troubleshooting (all require the browser session cookie):
| Endpoint | Purpose |
|---|---|
GET /dsh-github/state |
account, settings, sign-in history, trust ladder, client-bundle graph state |
GET /dsh-github/health |
GitHub API, npm, DNS, hosts, git, pnpm checks plus plain-language notes |
GET /dsh-github/client |
the graph rev and real URL of the client bundle, next to the rev computed from the file on disk (a mismatch means edits are not loaded yet) |
GET /dsh-github/search?source=github|npm&q=… |
search |
POST /dsh-github/repo/package |
read a repository's package.json and judge it |
POST /dsh-github/inspect |
pre-flight one spec through the real plugin manager (performs the GitHub connection check, installs nothing) |
Verified on this machine
- the GitHub API is reachable through the local accelerator at
tls=default(144 system roots were merged into the process default chain at startup), so no insecure rung was needed; pnpm add github:<owner>/<repo>andpnpm add git+https://github.com/<owner>/<repo>.gitboth fetch and link a real package (37s and 19s, peer dependencies included);- the official pipeline
pluginManager.installBundlecompleted end to end for alink:spec (pnpm log events → progress polling → bundle activation); POST /inspectongithub:<owner>/<repo>returns{status:'accepted', kind:'git', host:'github.com'};- the fences hold: authenticated 200, no cookie 401,
sec-fetch-site: cross-site403.
Signing in
- Token (recommended) — create one at https://github.com/settings/tokens with
read:user(addrepofor private repositories) and paste it into the panel. It is stored in the DSH credential service as the recorddsh-github-hub/github(kindgrant) and is never sent to the page; the UI only shows login, avatar, scopes and the last four characters. - Device flow — create an OAuth App (no client secret required), paste its
client_id, start the flow, enter the one-time code at https://github.com/login/device.
Data
| Item | Location |
|---|---|
| GitHub token | DSH credential service (record dsh-github-hub/github) |
| Settings + sign-in history | $DSH_HOME/.dsh-github-hub.json (no token, max 200 entries) |
| Install logs | $DSH_PROFILE_DIR/.plugin-manager/logs/operation-*/pnpm.log |
All endpoints live under ctx.webServer at /dsh-github/* behind three fences: loopback (or
explicitly trusted) Host, no cross-site requests, and write requests accepted only from the
local machine.
GitHub behind a local interceptor
Accelerators such as Watt Toolkit / Steam++ rewrite github.com, api.github.com and
raw.githubusercontent.com to 127.0.0.1 and re-serve them through a local reverse proxy with
its own CA, which Node does not trust by default (unable to verify the first certificate).
This plugin walks a trust ladder instead of failing:
- default trust chain;
- default roots plus the operating system root store (equivalent to
node --use-system-ca); - trust the local interceptor — only when the peer genuinely resolves to loopback and the
setting is enabled, and the UI always reports
tls: local-interceptorwhen it happens.
Installing from GitHub uses pnpm's github:owner/repo (git) transport, so git must be on
PATH; the plugin manager performs a bounded connection check before pnpm starts.
Known limits
- A freshly installed plugin usually still needs an app restart (or page reload) before its sidebar icon appears — DSH collects the index injection table once at startup.
- Installing a third-party plugin executes third-party host code inside your DSH process.
The panel shows repository metadata and the
package.jsonverdict, but does not audit code. - Removing a bundle does not delete data files the third-party plugin wrote under
$DSH_HOME.
License
MIT — see LICENSE.
No comments yet. Be the first to write one.