deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README

在 DeepSeek Harness 网页里直接管理插件:分类列表 · 标签 · 预设一键切换 · 插件市场 · 导入导出 · 余额
Manage your DeepSeek Harness plugins right inside the web UI.
dsh-plugin 主题仓库,自动识别真插件,一键安装;非插件给出可复制的安装提示词;plugin_list / plugin_enable / plugin_disable / plugin_add / plugin_remove / plugin_tag / plugin_preset_list / plugin_preset_switch / plugin_rollback / plugin_stop_self / plugin_market_inspect / plugin_market_install。# 从 GitHub 安装(推荐)
dsh plugin --profile <name> add github:kkkkkklze/dsh-plugin-manager
重启 dsh web 后:设置 → 插件 → 出现「分类 / 插件包 / 市场」三个子标签。
现在的 dsh 生态里有大量不同格式的风格包 / 美化包,互相冲突、装了 A 就坏 B。 我们想借鉴 Minecraft 模组的「前置依赖(required dependency)」 思路来统一它们。
设想:
package.json 的 dsh 清单增加 requires / provides 字段)。如果你也受风格包冲突之苦、认同这个方向,欢迎来 Issue 讨论,一起定标准。
Web 页面(client-bundle.js,浏览器)
│ ctx.remote.$mount(CONTRIBUTION) → ctx.get('remote.pluginManager')
▼ Typert 远程协议(/api,严格编解码,零额外端口)
remote.js(网关,@deepseek-ai/dsh-typert-protocol)
▼
manager.js(核心操作,agent 工具与 Web 共用同一份逻辑)
▼ engine.js(patch DSL 解析/合成)
文件系统:profile/cordis.patch.yml · ~/.dsh/plugin-manager/state.json · ~/.dsh/plugin-presets.yml
cordis.patch.yml 描述(insert 新增行 / id 目标覆盖行 / disabled 停用)。本插件把自己管理的行统一持有:状态存 state.json(inserted + overrides),每次变更经 sync() 重新合成 patch —— 先过滤掉我方行(pm-manager / pm. 前缀 / 我方 insert 块),再叠加新状态,写入前自动备份到 backups/(可回滚)。include:),管理器自动探测自身行的前缀并剥离,读写一律用裸 id。ui-settings-plugin-inventory 置为停用,并注入「分类 / 插件包 / 市场」三个子标签;自停(stopSelf)时恢复原版界面。AUTO_TAG_RULES 正则)∪ 出厂库(default-tags.yml)∪ 包声明(package.json 的 dsh.bundle.tags)∪ 用户标签(tags.yml),按优先级合并。q=topic:dsh-plugin&sort=stars&order=desc&per_page=30(分页)。未认证限 10 次/分,故结果缓存进 sessionStorage(10 分钟)。awesome-dsh-plugin/awesome-dsh-plugin 的 README,正则解析条目(支持 #fragment 与 /tree/<branch>/<dir> 子目录写法,如 zoahdev/dsh-subscribe#plugin),分页浏览 —— 覆盖「没有 dsh-plugin topic」和「package.json 在子目录」的漏网插件。identify):抓取仓库 package.json,判定 isPlugin = 存在 dsh.bundle || dsh.client。候选路径依次为 默认分支(+子目录) → HEAD(HEAD 为万能回退,实测对 748 个精选仓库全部有效)。并发限制 6(mapLimit),结果缓存 1 小时 —— 防止突发请求触发 GitHub raw 限流(限流时返回假 404,曾导致列表全空)。dsh plugin --profile <p> add github:<owner/repo>(git 安装首次可能需在 pnpm-workspace.yaml 加 allowBuilds)。已识别的插件直接确认安装;未识别的抓 contents API 检查 package.json / README,给出「复制安装提示词」或判定为 Skill/应用类。~/.dsh/plugin-presets.yml(所有 profile 共享),支持导入 / 导出(YAML,名字与介绍随包继承)。tag:标签。waitMs,默认 3s),目标插件 missing(未加载)/ failed(加载失败)/ skipped(引用不存在)→ 自动恢复切换前状态并返回失败原因;state.lastSwitch 待确认标记,正常启动 10s 后自动确认清除;若切换导致下次启动崩溃(如插件冲突),标记残留且 attempts ≥ 2 时,startupSelfCheck 自动恢复切换前状态(默认整合包),防止 boot 起不来。inspectRef):切换时对不可用引用抓取仓库 package.json 分类:plugin-missing(是插件未装,附安装命令)/ not-plugin(有包无 dsh 清单)/ no-pkg(无 package.json,Skill/应用类)/ unknown(非仓库引用或网络不可达);Web 端弹出「部分插件不可用」并支持一键复制安装提示词交给 agent。TypertRemoteService,方法用 Remote(name) 装饰器(plain JS 手工展开 __esDecorate);方法签名必须保持简单命名参数(SRC 网关按源码反射参数名)。CONTRIBUTION 描述符(带 typeSymbol + sourceLocation),ctx.remote.$mount() 后经 ctx.get('remote.pluginManager') 调用;编解码用严格模式 + 恒等 schema(无需 zod)。remove 被占用 → 改为 removeRow)。~/.dsh/.credentials.yaml 的 DEEPSEEK_API_KEY,调 api.deepseek.com/user/balance。index.js 用 defineTool 注册 12 个工具,变更类操作经 approval 服务审批(policy never 时天然拒绝)。package.json # 契约:exports(. / ./client / ./package.json)、dsh.bundle.patch、dsh.client.inject
index.js # 插件入口:agent 工具注册、approval、启动接管、startupSelfCheck
manager.js # 核心操作(op* 系列)+ 文件状态机 + inspectRef/startupSelfCheck
engine.js # patch DSL:parsePatch / composePatch / isOwnRow 系列 / FIBER_PHASE
remote.js # Typert 远程网关(REMOTE_METHODS + createGateway)
client-bundle.js # Web 客户端:三个设置子标签 + 侧边栏,全部手写 React.createElement
cordis.patch.yml # bundle 层 patch(不自插 pm-manager,防重复 id)
default-tags.yml # 出厂标签库(覆盖当前插件全集)
default-descriptions.yml # 出厂中文简介
verify.mjs # 92 项断言(契约/引擎/操作/远程/回退/压测)
verify-plugin.ps1 # 一键验收:沙箱副本 + 真实启动 + 安装副本一致性(SHA-256)
example 方法)createManager 里新增 async function opExample(args) { ... } 并加入 return 对象;'example' 加进 REMOTE_METHODS,并实现 async example(param1) { return this.manager.opExample(param1) }(参数保持简单命名);CONTRIBUTION.descriptors 加 descriptor('example', ['param1']),然后 pm.example(param1) 即可调用;pwsh -File verify-plugin.ps1;~/.dsh/profiles/node_modules/dsh-plugin-manager/,重启 dsh web。makeXxxSection(pm, t) 工厂里用 React.createElement 写组件(无 JSX);文案一律走 t('key') 并同时补充 LOCALE.zh / LOCALE.en;apply() 里 ctx.slots.inject('settings.plugins.tab', ...) 注册(参考 categories / bundles / market);mapLimit)+ 结果缓存(sessionStorage),否则会触发 GitHub raw 限流假 404。removeRow 教训);typeSymbol + sourceLocation,否则 typert 校验崩溃;exports 必须包含 "."、"./client"、"./package.json"(客户端扫描需要 require.resolve(pkg + "/package.json"));structuredClone 旧状态,任何失败路径都要恢复(见 opPresetSwitch 的双保险回退);state.json 是全局共享(所有 profile),测试/改动时注意别把别的 profile 的状态写进来;verify-plugin.ps1(含一致性检查,防漂移)。仓库自带一键验收(pwsh -File verify-plugin.ps1):92 项断言覆盖契约、引擎、操作、远程、失败回退、批量压测、真实启动与安装副本一致性(SHA-256)。
欢迎提 Issue / PR;也欢迎到 dsh-plugin topic 和 awesome 清单互相推荐。
MIT © 2026 kkkkkklze
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: plugin-manager。