🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
← 全部攻略

dsh-dpharness 工程实录:一个 dsh 插件市场工具的 L5 实装验证全过程

市场 / 管理类文章2026/10/9 发布1 次阅读

先说结论

dsh-dpharness(中文名「严选插件」)是本站自己写的 dsh 插件,做的事很窄:在 DeepSeek Harness 会话里浏览、搜索 dpharness.com 的插件目录,并一键安装。

它的实装验证结论是:L5 通过,验证环境 dsh 0.2.0-rc.2,冒烟结果「boot + 插件注册 + 前端资产」三条判据全过,验证时间 2026-10-02。

这篇不是推荐文,是工程实录 —— 记录我们为什么给它做到 L5、每条判据实际测了什么、以及几处刻意为之、却最容易被当成 bug 的设计取舍。

两个视图:回答的是两个不同问题

插件面板顶部可以在两个视图间切换,默认都停在「严选推荐」。

  • 严选推荐:数据来自站点全量目录(/api/plugins)。回答的是「我知道要什么,帮我找」—— 可以搜索,可以按 Star 排序。
  • 分类精选:数据来自站点每月重算的策展结果(/api/best,与站内 /best 是同一份数据)。回答的是「我该装哪几个」—— 按大类分到小类,每个小类只留 2 到 3 个。

分类精选刻意保留了两项元数据:小类内名次与上榜理由(形如「小类第 1 · 实装验证通过 · 周下载 12.8 万」)。

这两项不是装饰。去掉它们,这份清单就只是又一个插件列表;留着它们,「为什么是它」才是可复核的。入榜门槛是站点侧的硬规则:通过静态安装检查或 CI 实装验证,且汉化完成;每月 1 日重算,并公开淘汰原因。

三个入口,以及浮窗为什么必须能关

插件提供三种进入方式:

  • 页签「严选插件」:挂在会话视图区,功能最全(视图切换 + 搜索 + 排序 + 批量浏览)。
  • 侧边栏底部入口:点击展开全站浮窗;浮窗被关掉时,它同时充当恢复入口。
  • 全站浮窗:固定在右下角,跨路由常驻(含首页),用于随手查、随手装。

浮窗是跨路由常驻的,意味着它在任何页面都在。此前它只能展开或收起 —— 用户没有把这块东西从屏幕上拿掉的手段。v0.4.4 补上了三条关闭路径:悬浮胶囊右端的 ×、展开状态下面板页脚的「隐藏浮窗」、以及页签页脚的「显示右下角浮窗」开关。

关闭状态会以 dph-hub-hidden 写进 localStorage,下次进来仍然是关的。

这里有一条我们写死在代码里的纪律:关闭必须配恢复入口,否则「关掉」就等于「找不回来」。 所以恢复了两个途径:侧边栏底部的「严选插件」按钮(隐藏状态下点击会先取消隐藏再展开面板),以及页签页脚的那个开关(只取消隐藏,不强行弹面板)。

一键安装:为什么优先走 dshmarket 而不是自己装

安装有两条路径,优先级是刻意排的,安全优先。

第一条是复用 dshmarket 的同源 HTTP 路由(POST /dsh-market/install)。好处很实在:免重启热挂载、可回滚、且带供应链校验。代价也明确 —— 它只接受自己那份 curated registry(awesome 目录)里的 URL,不在目录里的插件走不了。

第二条是降级到插件自己的子进程:直接执行 dsh plugin --profile web add。这条路改的是 profile,装完需要重启 dsh 才生效。

降级不是无条件发生的。遇到 dshmarket 返回 409(说明有 agent 正在运行)时我们直接报错,不做降级 —— 因为那时候去装插件会和正在工作的 agent 抢插件文件。

什么情况下我们刻意不给安装按钮

这是最容易被误读成 bug 的一处设计。

安装按钮只在该条目通过站点静态安装检查(installCheck.status === "pass")时才出现。校验没过的条目,我们只给一段可复制的安装命令,不给按钮。

理由不是保守,是正确性:npm 上的包名是公开注册的,如果站点的归属校验没通过,那么 npm 上那个同名包可能属于别人。这时候给一个「一键安装」按钮,等于把一个可能装错东西的动作包装成安全操作。

命令本身的来源也与站点同口径:只有校验通过才用 npm 包名,否则退回 owner/repo 走 GitHub 源安装,并在卡片上标明来源 —— 与站点详情页用词一致。任何情况下都不会出现「什么都不给」。

另外三道细节:安装前有二次确认并展示将要执行的包名;目标包名要过字符白名单;子进程环境里会剥掉宿主注入的 safe-delete shim(不剥的话,pnpm 清理临时文件时会被拦下)。失败时只展示 pnpm 的错误码行(形如 [ERR_PNPM_FETCH_404]),而不是一屏进度日志 —— 后者对判断原因没有帮助。

汉化优先,以及一条被上游坑了两年的规则

卡片信息按「汉化优先」组织,缺汉化时明确标注「未汉化」,不假装有内容。

顺序是:中文名 → 中文分类与可信度徽章 → 卖点行 → 中文正文 → 安装按钮。其中卖点行(tagline)最容易出问题。

实测下来,上游 tagline 大约有一半不可用 —— 可能是纯英文原文、被截断的半句、甚至直接是 安装  或 README 的目录导航。所以插件里写了 pickZh() 做过滤:切段逐段找中文、要求中文字符数不少于 6、段长不少于 8、并丢弃以英文导航词开头的段。不合格就这一行不显示,而不是硬塞一句废话。

安装漏斗:10 个事件,各自回答一个问题

一次安装从「看见」到「真的生效」要跨 7 个环节。如果只统计一个「安装成功」的总数,那么「没成功」永远只是一个数字,看不出卡在哪一步。

所以每一步都有独立事件,共 10 个:

  • hello —— 插件被加载(用于区分「老版本发不出新事件」与「根本没人做」)
  • open / search / best_open —— 入口到底有没有人用
  • hide / show —— 有多少人嫌浮窗碍事
  • install_ask —— 弹出确认框的次数(有人真的动了安装念头)
  • install_cancel —— 被确认框劝退的人(这是文案与门槛的优化对象)
  • install / install_failed —— 真正发起、以及失败卡在哪一步
  • installed_market / installed_local —— 装成了,以及是热挂载还是需要重启
  • restart_click / post_install —— 需要重启的那批里,有多少人真的重启了、重启后包有没有进加载清单

失败原因写的是一个闭集枚举(busy / market_http / local_rejected / poll_unreachable / cli_exit / timeout / restart_http),而不是错误原文。原因很直接:原文里含本地路径与包名,既不可聚合,也不该外发。

实测数据与验证结论

  • 本周下载量:358
  • GitHub Stars:1(插件主体在站点侧,仓库只有壳,Star 少是正常的)
  • 静态安装检查:通过。npm 包 dsh-dpharness 0.4.4,要求 Node >=22、dsh >=0.1.0-rc.5
  • 本站实装验证:L5 · 安装并运行,dsh 0.2.0-rc.2,2026-10-02
  • 自动安全扫描:中风险。扫描结论标注的原话是「可执行固定命令 / 写入剪贴板(不计风险)/ 外部网络」

最后那条值得说清楚:一个能装插件的插件,本身必然要执行命令、访问网络。「中风险」在这里反映的是能力面,不是存在具体缺陷 —— 这两件事在阅读时不该混为一谈。

一个还没解决的问题

分类精选视图依赖站点每月重算的策展结果。策展重算与插件面板之间没有推送:面板是拉取式的,重算完成后面板不会自动刷新,要等下一次打开。

对一个每月才更新一次的数据源来说,这个代价可以接受,但它是已知的粗糙处,不是设计优点。

快速上手

安装命令:

npx @deepseek-ai/dsh plugin add zhanghao3693/dsh-dpharness

或者装完之后,直接在会话里用页签、侧边栏入口或右下角浮窗打开面板。

本文所有数据取自本站静态安装检查与实装验证记录,验证环境为 dsh 0.2.0-rc.2。具体行为以插件最新版本为准。

回到顶部