如何安装 DeepSeek-Harness 插件(2026 指南)
dsh plugin add 的精确命令格式、npm/GitHub/本地路径三种安装来源、allowBuilds 安全提示,以及如何更新或卸载插件。
安装一个 DeepSeek-Harness(dsh)插件,命令是:
dsh plugin --profile <profile名> add <包说明符>
举个例子,把 FindHarness 人工审核(awesome 收录集合)索引里 star 数最高的插件之一 modlens 装进你的 web profile:
dsh plugin --profile web add github:liustack/modlens
命令就这么简单。本文剩下的部分讲清楚 <包说明符> 能写什么、这条命令背后到底发生了什么,以及那个真正值得你认真读一遍再确认的安全提示。
这条命令到底在做什么
dsh plugin --profile <name> <参数...> 首先会确保这个 profile 存在(不存在就先初始化——web 和 headless 是硬编码的初始模板,其他任何名字则只会用基础 bundle @deepseek-ai/dsh-base 引导)。然后它会把 profile 参数之后的所有内容原样转发给 pnpm,并以该 profile 目录为工作目录执行。也就是说 add、remove、update、why 都不是 dsh 自己定义的命令——它们本质就是 pnpm 的子命令,所以你的 PATH 里必须有 pnpm。
如果你安装的包在 package.json 里声明了 dsh.bundle 字段,dsh 会自动把它注册进这个 profile 当前生效的 bundle 列表。如果没有声明这个字段,它依然会作为一个普通依赖被装进去,但 dsh 会打印警告、且不会激活任何配置层——这在你只是想装一个插件依赖的普通库、而不希望 dsh 把它当成插件本身对待时很有用。
三种支持的安装来源
因为安装本质上就是 pnpm,所以 <包说明符> 支持一切 pnpm 支持的写法。实际使用中,三种形式覆盖了几乎所有场景。
1. npm registry(有的话优先用这个)
dsh plugin --profile demo add your-package
这是官方推荐的路径——插件作者把构建产物直接发布到 npm,安装时不需要任何构建步骤,也就不会触发构建权限提示。不过截至撰稿时,FindHarness 索引里的插件无一例外都是直接从各自的 GitHub 仓库分发的,还没有发布成 npm 包——这是一个非常年轻、快速演进中的生态,大部分作者还没走到发布 npm 这一步。所以实际操作中,你更常用到的会是下面的 GitHub 安装方式。
2. GitHub 仓库
dsh plugin --profile tui add github:owner/repo
几个可以直接照抄运行的真实例子,全部来自 FindHarness 索引:
# 面向纯文本模型的视觉桥接插件(1308 star)—— 详见 /plugins/liustack-modlens
dsh plugin --profile web add github:liustack/modlens
# 多智能体团队编排插件(250 star)—— 详见 /plugins/nanmicoder-dsh-agent-teams
dsh plugin --profile web add github:nanmicoder/dsh-agent-teams
# 跨会话记忆存储插件(16 star)—— 详见 /plugins/omdsh-dev-dsh-mnemon
dsh plugin --profile web add github:omdsh-dev/dsh-mnemon
你可以用 #<sha> 锁定到具体某次提交——写作 github:owner/repo#a1b2c3d。对任何非你自己维护的插件,都建议这么做:不锁定 commit 的话,上游对同一分支后续的一次推送,会在你下次重装或更新时悄悄改变实际运行的代码,而你毫无察觉。
3. 本地路径或 tarball(用于你正在开发的插件)
# 磁盘上的一个目录,相对路径以你执行命令时所在的目录为锚点(而不是 profile 目录)
dsh plugin --profile demo add ./hello-plugin
# 由 `pnpm pack` 产出的 tarball
dsh plugin --profile demo add ./hello-plugin-0.1.0.tgz
有个坑值得单独强调:本地相对路径是以你执行 add 命令时所在的目录为锚点解析的,不是以 profile 目录为锚点。如果你在错误的目录下执行,轻则得到一个莫名其妙的路径解析错误,重则装错目录。
什么时候会碰到 allowBuilds 提示——以及它为什么重要
从 GitHub 安装拉取的是源码,而不是构建产物。如果这个插件是 TypeScript 写的,且仓库里没有直接带上编译好的 lib/ 目录,它就需要在安装后自己跑一次构建,插件作者通常用 package.json 里的 prepare 脚本来处理这件事。
问题在于:pnpm 10 及以上版本默认会拦截 git 依赖的 prepare 脚本执行。你第一次 add 一个需要构建的 GitHub 来源插件时,安装会失败,pnpm 会提示你去 profile 的 pnpm-workspace.yaml 里显式放行:
allowBuilds:
dsh-hello-plugin: true
在你把这段配置粘贴进去之前,先搞清楚自己到底同意了什么。dsh 官方文档对此说得非常直接,原文值得完整引用:
这个放行等价于:允许该包的代码在你机器上、于安装期执行,且脱离 agent 运行时的任何沙箱保护。只应该允许你信任其源码的包,并且要锁定到具体的 commit。
这不是套话式的免责声明,而是对 allowBuilds 实际行为的准确描述。它会在 pnpm install 期间执行该包里的任意代码,早在 dsh 自身运行时沙箱能覆盖到任何东西之前就已经执行完了。两条实操建议:
- 只对你真正看过源码、或来自你已经信任的作者/组织的插件放行
allowBuilds: true。 - 配合锁定 commit(
github:owner/repo#<sha>)一起使用,这样上游仓库后续的推送就无法在你下次重装时悄悄改变实际被构建和执行的代码。
如果你想完全绕开这个提示,那就是一个信号:优先选择已经发布到 npm、自带编译好的 lib/ 的插件——不需要 prepare 脚本,也就不需要做这个构建权限的决策。
更新与卸载插件
插件的版本管理完全复用 pnpm/npm 的语义——没有一套独立的 dsh 版本系统:
# 更新某个 profile 下的全部依赖
dsh plugin --profile demo update
# 只更新某一个插件
dsh plugin --profile demo update dsh-hello-plugin
# 查看某个包为什么被安装(pnpm why 语义,作用域限定在该 profile)
dsh plugin --profile demo why dsh-hello-plugin
# 卸载一个插件
dsh plugin --profile demo remove dsh-hello-plugin
每次执行完 dsh plugin 命令,dsh 都会重新核对该 profile 下实际安装的依赖,并据此同步 bundle 列表——被移除的包会自动从生效配置里摘除,新安装且声明了 dsh.bundle 的包会自动被激活。你不需要手动编辑 profile 的 package.json 里的 bundle 列表。
常见问题
- 提示 "command not found: pnpm"——
dsh plugin会直接调用 pnpm,先把它装好并确认在PATH里。 - 从 GitHub add 之后安装立刻失败——几乎总是上面说的
allowBuilds提示。去看看 profile 目录下的pnpm-workspace.yaml。 - 从 GitHub 安装后提示 "Cannot find module"——大概率是插件需要的构建步骤没有跑起来;确认它是否带
prepare脚本、以及构建权限是否已经放行。 - 本地路径安装找不到你的插件——记住路径是相对于你当前 shell 所在目录解析的,不是 profile 目录。
现在就去试试
到 /plugins 浏览完整的可搜索目录——每一条都展示真实的 star 数、许可证和 README,以及针对这个插件的精确安装命令。或者从我们精选的《2026 年 10 款最佳 DeepSeek-Harness 插件》开始。