deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:baom1ng/dsh-local-plugin-source
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
English | 中文
Turn a local folder (default %USERPROFILE%\.dsh\local-plugins) into an in-app plugin source: it lists the plugin packages in
that folder inside Settings → Plugins → Local plugins and lets you install / reinstall / enable / disable / remove them.
It exists so locally developed plugins can be installed back at any time without copying absolute paths around or asking the Agent.
Requirements: the DeepSeek Harness Desktop app, or any Harness profile with a web UI. The bundle row carries no disabled gate — it activates
in every profile, and the page simply stays quiet where no webserver runs.
A local plugin such as dsh-desktop-archive-manager used to be installable
only by pasting its absolute path into Plugins → Add plugin. This plugin turns that folder into a list on a page:
It is a bundle itself, so it installs like any other local plugin — through the profile's own Plugin Manager:
# Agent side
plugin_manager: install_bundle(target: "C:\\Users\\<you>\\.dsh\\local-plugins\\dsh-local-plugin-source")
# Or the app: sidebar Plugins → Add plugin, paste the same absolute path
Afterwards Settings → Plugins has an extra Local plugins tab.
Every action is forwarded to the profile's own Plugin Manager (ctx.pluginManager), so manifest writes, bundle selection,
pnpm calls and Loader recomposition behave exactly like the official install path — this plugin contributes a source, not a second installer.
| Action | Host call | Notes |
|---|---|---|
| Install / Reinstall | pluginManager.installBundle(<absolute path>, { enabled: true }) |
installs and enables; on an installed bundle it is a reinstall (use it after editing local source) |
| Enable / Disable | pluginManager.setBundleEnabled(name, enabled) |
toggles the bundle layer only, keeping dependencies and files |
| Remove | pluginManager.removeBundle(name) |
runs pnpm remove; a bundle the manager protects reports its own error |
Card state comes from pluginManager.listBundles() — installed / enabled / disabled / not installed, plus the manager's
readOnlyReason and the activation error when a bundle fails to load. The pnpm output of an install is shown at the bottom of the page
(last 4 KB; the full log stays in the profile's .plugin-manager/logs).
Safety boundaries:
/local-plugin-source/api with a same-origin check (Origin header + a custom request header);| Key | Default | Meaning |
|---|---|---|
directory |
%DSH_HOME%\local-plugins |
the folder that gets scanned |
Change it from a profile patch layer:
- id: local-plugin-source
config:
directory: D:\\my-dsh-plugins
dsh-local-plugin-source/
├── package.json # dsh.bundle.patch + dsh.client
├── cordis.patch.yml # bundle patch: the local-plugin-source row (patch-relative to lib/manager.js)
├── lib/manager.js # host half: /local-plugin-source/api → ctx.pluginManager
├── lib/scan.js # dependency-free scanning/classification (unit-tested)
├── lib/client.js # browser half: the Settings → Plugins → Local plugins tab
├── test/*.test.mjs # node --test suite (25 tests)
├── LICENSE
└── README.md / README.zh.md
node --test "test/*.test.mjs"
25 tests cover manifest reading and classification (bundle / browser half / not a package / broken JSON / hidden directories),
merging installed state, a missing directory, the endpoint gates (method / cross-origin / bad JSON / unknown op),
"only scanned packages are installable", structured reporting of manager failures, both listBundles() return shapes,
and the browser half (tab registration, the inject-face flattening contract, the button set of each of the four states,
empty state, failure notice, and that the English dictionary covers every key the page uses).
plugin_manager tool.CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。