前言¶
手工发布一个 DSH 插件,通常要重复十几步:新建仓库、补 README 徽章和安装说明、挑许可证、写 .gitignore、把 repository/homepage/keywords 填进 package.json、git init、配身份、commit、切分支、建 remote、push、打 tag、建 Release,回来再补 topics。要上 npm 还得另开一套流程:确认版本号没被占用、npm publish、回查 registry、检查 README 是否正常。发新版更麻烦——版本号要 bump,GitHub 和 npm 两边都得重来一遍。
下面介绍的 wodaimnd/dsh-github-publisher 就是针对这个痛点做的。它是 DSH 的 Web 插件,在左侧栏提供一个「多平台发布台」,把上面那些步骤收进一个页面:发布要素只填一次,勾选目标平台,点一个按钮按顺序跑完,进度按平台分组可见、可取消。
这是什么¶
插件名称 dsh-github-publisher,由 wodaimnd 维护,社区目录里归类为「工作流」,当前 1 个星标。定位一句话:把本机上的 DSH 插件一次发布到多个平台(GitHub / npm)。
它不替代平台本身,依赖的是本机 git、Node 自带的 npm 和各平台的 REST API。插件形态是 Web 插件,无构建步骤,左侧栏新增「多平台发布台」入口,界面主题跟随宿主(浅色/深色自动切换)。
现在 package.json 里的版本是 0.3.4,许可证为 MIT。
核心功能¶
插件发现。 扫描 profile 的 link:/file: 依赖、已注册工作区、当前目录和自定义扫描目录,识别带 dsh.bundle / dsh.client 的包,显示版本、描述、README/LICENSE 状态、git 状态与已发布平台。
一套发布要素 + 平台勾选矩阵。 name / version / description / descriptionZh / topics / license / README / releaseNotes 统一填一次;每个平台一行 checkbox,带状态徽章(未启用 / 未配凭据 / token 掩码)。勾选 npm 后展开它自己的 access、dist-tag、2FA OTP;不勾 GitHub 时仓库字段只读且不参与校验,也就是说只发 npm 不需要 GitHub 账号。
平台配置页。 逐平台配凭据与默认值。GitHub 侧是账号状态、启用开关、验证凭据(Enterprise 地址在设置弹窗里);npm 侧是 Registry、Access Token(保存时向 registry 校验一次,带掩码显示与清除)、access、dist-tag、provenance 开关、已验账号。
一个按钮发所有平台。 按钮文案随勾选变化(如 发布到 GitHub + npm registry)。任务步骤按平台分组执行:GitHub 是校验账号 → 建仓/复用 → topics → commit → push → tag + Release;npm 是校验凭据 → 版本守卫 → npm publish → 回查 registry。单个平台失败不会中断其他平台,结果卡给每个平台独立的链接与失败原因。
npm 版本守卫。 发布前对比 registry 上的 latest,版本相同或更低直接判为阻塞项并提示先 bump,而不是等你跑到 publish 才吃 EPUBLISHCONFLICT。
版本同步矩阵。 插件 × 平台 × 本地版本 × 远端版本 × 状态(已同步 / 落后 / 未发布 / 本地更新 / 未知)。GitHub 读最新 Release 的 tag,npm 读 registry 的 latest。落后行可一键「发布到落后平台」,也可先「只提升版本」做 patch/minor/major bump。
AI 补全发布信息。 右上角「AI 补全信息」用 DSH 里已配置的 DeepSeek 模型读取 package.json / README / 文件列表,生成英文描述、中文简介、topics 与 Release 说明,填入表单后可继续手改。这一步只花 DSH 的模型额度,不涉及任何平台、不会自动发布。
仓库文件自动完善(先预览后写入)。 README.md 生成双语完整模板;LICENSE 支持 MIT / Apache-2.0 / BSD-3-Clause / GPL-3.0 标准全文并自动填年份与作者;.gitignore 用 Node/DSH 插件通用模板;package.json 只补缺失的 repository / homepage / bugs / keywords / license / author / description,不覆盖手写字段。
预检与演练。 预检覆盖平台选择、git/npm CLI 可用性、token 有效性、包名与远端版本占用、仓库是否存在、提交身份、将写入的文件、工作区脏状态、remote 将被改写等,阻塞项标红并定位到对应位置。勾「演练」后只做本地准备与提交,不建仓、不推送、不创建 Release、npm 用 --dry-run,不需要任何凭据也能完整走一遍流程。
数据与安全。 设置、平台凭据、每个插件的表单草稿、最近 50 条发布记录保存在 ~/.dsh/github-publisher/(沿用历史目录);token 只存本机 config.json(0600),响应与日志只回掩码。GitHub 推送用临时 GIT_ASKPASS(0700,用完即删),npm token 只通过子进程环境变量传递,不进 argv、不写 .npmrc。若本机已有 GITHUB_TOKEN/GH_TOKEN、gh auth token 或 git credential 里的 github.com 凭证,发布时会自动检测并直接使用;npm 也支持 NPM_TOKEN 兜底(只在内存,不落盘)。
嵌套插件安全。 若插件目录位于某个父 git 仓库内(monorepo/工作区很常见),发布台会在插件目录里建立独立 git 仓库,不会牵连父仓库;预检会明确提示父仓库会看到这些文件改动。
Agent 工具与 HTTP API。 同一套操作也暴露成 Agent 工具 github_publisher(state / scan / preflight / publish / job / cancel / settings / token / history / suggest),与 UI 共用同一个 Publisher 服务,form.platforms 决定本次发到哪些平台。对外 HTTP API 为 /dsh-github-publisher/api/*,新增了 platforms、platforms/verify、platforms/npm-token、version/bump、sync/plan 等接口,完整接口见仓库里的 CONTRACT.md。
安装与启用¶
插件以本地 bundle 链接的方式安装(即装即用,不走远程包名拉取)。在 DSH 中执行:
plugin_manager action=install_bundle target=/absolute/path/to/dsh-github-publisher
target 换成你本机上插件目录的绝对路径。安装后刷新 DSH Web 页面(或重启 Desktop),左侧栏出现「多平台发布台」图标。
卸载有两种入口,按需要选:
plugin_manager action=remove_bundle
或在界面里走 设置 → 插件 → GitHub Publisher → 移除。
典型用法¶
以一个本地插件为例,走一遍从配置到发布的流程。
1. 首次配置:绑定 GitHub 令牌。 打开发布台,最上面的「上手向导」卡片把所有需要的链接和按钮排好了。在第一步点「申请经典 PAT」或「申请细粒度 PAT」:
- Classic token:勾选
repo;如需写入 workflow 文件再加workflow。 - Fine-grained token:仓库权限
Contents: Read and write、Administration: Read and write、Metadata: Read-only。
授权页会自动带上 scope,创建后复制 token,粘到输入框点「保存并验证」。成功后显示 @你的用户名、token 掩码与来源。不想手填也可以点「自动检测」,依次尝试 GITHUB_TOKEN / GH_TOKEN 环境变量、gh auth token、git credential 里已保存的 github.com 凭证;检测到的 token 默认只放内存,点「保存」才落盘。
2. 绑定 npm token(可选)。 向导第三步点「申请 npm Token」,建议选 Automation 类型,回到「平台配置」页签的 npm 卡片,勾「启用这个平台」,填 Registry(默认 https://registry.npmjs.org)与 Access Token,点「保存并验证」。只发 npm 时,这一步就是必需的,GitHub 那行不勾即可。
用自建 registry(Verdaccio / 内网 Nexus)时没有 /settings/tokens 网页路由,插件会换一套路线:先点「复制 npm login 命令」在终端执行(如 npm login --registry=http://127.0.0.1:4873),再点「复制 .npmrc 键名」拿到 //127.0.0.1:4873/:_authToken=,从 ~/.npmrc 里复制等号后面的值粘回去验证。
3. 选中插件、补全信息、预检。 在左侧插件列表选择目标插件,必要时先「重新扫描」或在设置里添加扫描目录。发布信息卡片已自动带出仓库名/简介/topics/许可等,缺什么补什么;也可以点右上角「AI 补全信息」让 DSH 里的 DeepSeek 模型生成描述、中文简介、topics 与 Release 说明。勾了 npm 的话,那一行会展开 access / dist-tag / 2FA OTP。第一次建议先勾「演练」跑一遍。
4. 发布。 在「发布选项」按需勾选生成 README/LICENSE/.gitignore、完善 package.json、创建 Release、提交信息模板、作者身份,然后:
# 在界面操作等价流程:预检 → 发布到所选平台
点「预检」查看两个平台各自的目标与阻塞项,以及将要写入的文件(README 可预览)。确认后点按钮,观察按平台分组的步骤进度与日志。完成后结果卡给出仓库、Release、commit、npm registry 的独立链接与失败原因。
发新版时不必重来一遍:打开「版本同步」页签,看到哪些平台落后,直接点「发布到落后平台」,或先「只提升版本」做 patch/minor/major bump。
适用场景与注意¶
适合自己维护 DSH 插件、需要在 GitHub 和 npm 两个渠道同步发布的开发者,尤其是已经在 monorepo/工作区里管理插件、受够了两边手工同步的人。
两点需要留意:
- 插件以当前 DSH 进程权限运行,安装前应检查其源码与许可证(MIT)。颁发的 token 权限是真实的,插件建议只在本机使用、按最小 scope 申请;token 虽然只落盘到 0600 的
config.json并只回掩码,授权页面本身仍是 GitHub/npm 的官方页面。GitHub 与 npm 的鉴权互相独立,DeepSeek token 只用于 AI 补全,不能当 GitHub / npm 凭证用,也不能互换。 - 它处理的是发布流程,不替你决定版本号。npm 不接受同名版本重发,发新版前记得 bump。
结尾¶
这个插件解决的是一个具体而重复的问题:把本地 DSH 插件的多平台发布从十几步手工操作收敛成一次填写、一次预检、一个按钮。它没有引入新的发布标准,只是把 GitHub 与 npm 各自的流程编排进同一个界面,并用版本同步矩阵兜住后续发版。
目录页:https://www.skillhub.cn/plugins/wodaimnd/dsh-github-publisher
仓库:https://github.com/wodaimnd/dsh-github-publisher