dsh-github-publisher:把本地 DSH 插件一次發佈到 GitHub 和 npm

前言

手工發佈一個 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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜