DSH Plugin Share
English | 中文
把「我这套装了哪些插件」变成一段可粘贴的离线分享码,别人贴进去就能逐个安装。

安装
dsh plugin --profile web add 'github:HGT158/dsh-plugin-share#main'
dsh --profile web
打开 Harness Web → 设置 → 内置插件 → 插件分享。
这个包是纯 JS、零依赖、没有构建脚本,所以安装时不会要求你批准任何 build script,装完即用。分享方和接收方都需要装它——码本身只是文本,导出和粘贴导入的界面由它提供。
已验证环境:dsh 0.2.0-rc.2 + Web profile(@deepseek-ai/dsh-base / @deepseek-ai/dsh-web-app)。桌面 profile 由桌面 App 自行管理,CLI 装不进去。
怎么用
① 导出:把你这套插件变成码
点「从当前 profile 导出」→ 文本框出现 D1... 开头的码 → 点「复制」,发给对方。
② 导入:把别人的码装到本机
把码粘进文本框,点「解析组合码」,下面会逐行列出每个插件的名称、来源、完整安装规格和将要执行的动作。每一行右侧都有自己的按钮:
| 按钮 | 含义 |
|---|---|
安装 |
本机没有 → 安装 |
升级 |
已装旧版本 → 升到码里的版本 |
启用 / 停用 |
已装但启用状态不一致 → 只改状态,不重装 |
已是当前版本 |
无需操作(灰色不可点) |
也可以点顶部「全部安装」一次装完;装完重启 dsh 生效,浏览器按 Ctrl+F5。
它能做什么
- 离线自包含的码 — 不需要服务器、账号或落地页。码就是文本,能发微信、Slack、论坛、贴进 issue。组合码以
D1开头,内部是 NP1 风格的二进制记录,末尾带 CRC32。 - 只带清单,不带配置 — 码里只有三样:插件来源、版本、启用状态。
config、settings、patch、apiKey、token等字段在编码阶段就被拒绝,不存在「过滤后继续导出」的路径。 - 逐条预览,绝不静默安装 — 解析只做解码和校验,不碰 profile;要装什么、从哪来(
npm/github.com/builtin)、会做什么动作,全部先摆出来给你看。 - 每个插件单独操作 — 一行一个按钮。可以只装其中两个,也可以全部安装;单个装完会自动重新解析,刷新那一行的状态。
- 构建脚本默认拒绝 — 需要跑安装脚本的包会单独提示并等你显式批准,批准只对本次生效,不随码传播。
- 失败即停并回滚 — 中途失败不会继续往下装,本次新装的会被撤销,本次改过的 builtin 启用状态会被恢复;已存在的升级不会被破坏性回滚。
- 状态永远有解释 — 按钮为什么灰、现在在做什么、解析出来几条待处理,界面上一行文字直说,不会让你对着一个没有理由的禁用按钮发呆。
- 短码优先 — 短清单直接用原始二进制;8 条以上才尝试
deflate-raw,且只在压缩结果更短时才采用。实测 5 个插件的混合样本(含 GitHub 来源)是 218 个字符,纯 npm / builtin 的清单更短(149 字符),微信、Slack、X 都能直接发。 - DSH 原生外观 — 控件用官方
@deepseek-ai/dsh-client-ui-primitives的Button/Tag,配色走--dsw-*主题 token,跟设置里其它页面同一套视觉。 - 完全离线 — 编码、解码、校验都在本机完成,不访问任何第三方服务;只有你点安装时才会去 npm / GitHub 下载插件。
更新到最新版
锁文件会把 #main 钉在某个具体提交上,所以升级要显式执行:
dsh plugin --profile web update dsh-plugin-share
dsh --profile web
想固定版本(可复现),改用 tag:
dsh plugin --profile web add 'github:HGT158/dsh-plugin-share#v0.1.0'
安全
- 码不是签名 — CRC32 只用来发现复制/截断造成的损坏,不能防篡改,也不证明来源。请核对预览里的每个来源再装。
- 来源白名单 — 只接受 npm 包、
github:owner/repo[#ref]、DSH 官方可选 builtin。本地路径、file:、link:、portal:、workspace:、任意 HTTP(S) tarball、git+…/git@/ssh://一律拒绝。 - 来源全程可见 — 每行都标明来源(
npm/github.com/builtin)并列出完整安装规格(如github:owner/repo#v1.2.3),GitHub 来源显示域名,方便你确认是不是官方仓库。 - 默认不执行脚本 — 需要构建脚本的包会中断安装并单独询问;批准只对本次、本包生效,不会随码传播给下一个人。
- 安装前请自问 — 码是你信任的人给的吗?预览里的包名和仓库眼熟吗?第三方插件在安装或加载时都能执行代码。
常见问题
接收方也要装这个插件吗?
要。码只是文本,导入界面由插件提供。如果对方不想装,也可以把仓库 clone 下来用命令行解码:node src/cli.mjs decode D1...。
会不会把我的 API key / 配置发出去?
不会。码里没有配置字段,编码器遇到 config、apiKey、token 这类字段直接报错;本机路径也在采集阶段就被剔除。
为什么装完没反应? Host 半的改动要重启 dsh 生效;客户端 bundle 有版本缓存,浏览器按 Ctrl+F5 强制刷新。
为什么按钮是灰的? 按钮下面那行灰字会直接说明原因:还没粘贴码 / 还没解析 / 码改动过需要重新解析 / 正在处理中。
能分享插件配置吗? 不能,这是 v1 的有意选择:只搬「装了哪些」,不搬「怎么配的」。接收方装完是素装,各插件设置要自己配。
码会有多长? 实测 5 个插件的混合样本 218 字符,纯 npm / builtin 的 5 条清单 149 字符;8 条以上才会考虑压缩。插件名极长或条目极多时仍可能超过某些渠道限制。
开发
npm test # 编解码 + 采集 + 导入事务,共 20 项
pnpm pack --dry-run # 检查发布内容
npm run encode:example # 用 examples/plugins.json 生成一个码
node src/cli.mjs decode D1... # 命令行解码
把本地工作树装进一个临时 profile:
$profile = 'plugin-share-test'
dsh --profile $profile --from-default-profile web --dump-config
dsh plugin --profile $profile add (Get-Location).Path
dsh --profile $profile
| 文件 | 作用 |
|---|---|
package.json |
DSH bundle 清单:dsh.bundle.patch + dsh.client |
cordis.patch.yml |
插入本插件的那一行 patch |
src/index.mjs |
Host 半入口(编解码、采集、预览、导入) |
src/client.js |
Web Client 半(设置页里的标签页) |
src/shared/ |
D1/NP1 编解码与条目校验 |
src/host/ |
采集、预览、事务导入、HTTP 路由 |
PLAN.md |
完整实现契约:帧格式、字段模型、事务语义、验证清单 |
CI 在每次 push / PR 时运行 npm test 与 pnpm pack --dry-run。
相关
- DSH 官方:打包与安装插件 — bundle / profile / patch 层的官方说明
- dsh-market — 生态里的插件市场,本插件的界面风格参考了它
License
MIT
No comments yet. Be the first to write one.