dsh-1024-game:給 DeepSeek Harness 加一個 1024 遊戲面板

前言

DSH 的 Web GUI 本身只提供會話和一個「插件」面板,工作間隙想摸個魚沒有順手的入口;把遊戲做成覆蓋整個客戶端的彈層,又會影響看日誌和跑命令。下面介紹的 dsh-1024-game 走的是面板路線:入口放在左側欄,和「插件」並排,點進去是一個獨立的主面板頁面,棋盤、計分和按鍵說明都在同一個頁面裏。

這個插件由 akiwu 維護,是一個純前端的客戶端插件,不需要聯網,也不參與 agent 的對話與計費。目標是讓 DSH 裏也能像在網頁上一樣玩 1024:方向鍵、WASD、觸摸滑動都支持,最高分和殘局存在本機,切面板或刷新都不丟。

這是什麼

一句話定位:在 DeepSeek Harness Web GUI 裏直接玩 1024(2048 的 4×4 變體,合成出 1024 即達成)的客戶端插件。

插件分兩半:

  • 宿主半包 lib/index.js,apply 是空的,只爲讓瀏覽器半包被 client-modules 發現。
  • 瀏覽器半包 lib/client.js,包含 __ModuleLoader__ 工廠式 bundle、遊戲邏輯和兩個 slot 掛載。

不發佈 npm 也能被安裝:DSH 的插件管理器直接從 GitHub 裝,Release 裏還有預打包 tarball;lib/ 是提交進倉庫的預構建產物,從 git 安裝不需要任何構建步驟。

核心功能

玩法規則:

  • 兩個同值方塊相撞合併成它們的和並計分;一次移動裏每塊只合並一次。
  • 每走一步隨機多出一個 2 或 4;棋盤塞滿且沒有可合併的相鄰方塊時本局結束。
  • 合成出 1024 即達成,可以繼續挑戰。

操作方式:

按鍵 作用
← ↑ → ↓、W A S D 讓所有方塊朝該方向滑到底
R 重新開局
⌘ / Ctrl + Z 撤銷一步,最多回退 32 步
在棋盤上拖動(觸屏/觸控板) 滑動移動

持久化方面,最高分與殘局寫入 localStorage,鍵名分別是 dsh-1024-game/best 和 dsh-1024-game/state:切到別的面板再回來、刷新頁面都不丟局。

鍵盤監聽只在面板掛載時存在。這一點值得留意:遊戲面板的「返回會話」調用 ctx.layout.selectPanel(null),回到會話後不會搶輸入框的按鍵。

安裝與啓用

先確認前提:DSH 0.2.x(桌面版或 dsh web 都行),裝完需要重啓一次 DSH——宿主 Loader 的包解析在啓動時定型。

三種裝法按省事程度排。

方式 1,一行 spec,粘到 DSH 插件頁的安裝入口 / dsh plugin add / agent 的 plugin_manager.install_bundle:

github:akiwu/dsh-1024-game

等價的長寫法也可以,想鎖版本時在後面加 #v0.1.2 之類的 ref:

git+https://github.com/akiwu/dsh-1024-game.git

方式 2,預打包 tarball。不拉倉庫、不需要構建授權,適合網絡不穩:

https://github.com/akiwu/dsh-1024-game/releases/latest/download/dsh-1024-game.tgz

在安裝入口粘貼這個 URL,或者下載後粘貼文件的絕對路徑。

方式 3,市場一鍵安裝(收錄之後):在 dsh-market 或 DSH 的 Discover 裏搜「1024」,點安裝。DSH 沒有內置的官方市場,Discover 頁讀的是自己添加的索引 URL。

命令行等價操作:

dsh plugin add "github:akiwu/dsh-1024-game"

如果只對某個 profile 裝:

dsh plugin --profile web add "github:akiwu/dsh-1024-game"

注意桌面版的 profile 由 App 自己管理,不要在終端裏對 web profile 安裝,那裏裝了桌面版看不到。

本機開發用本地路徑安裝,DSH 會 link: 到項目目錄,改完代碼重新加載即生效:

plugin_manager install_bundle { target: "/path/to/DeepSeek1024" }

裝完重啓 DSH,左側欄「插件」下面會出現「1024 小遊戲」。卸載時在插件頁停用並移除 dsh-1024-game,或從 profile 的 package.json 刪掉該依賴與 dsh.profile.bundles 裏的條目。

裝完沒看到入口,常見原因是沒重啓,或者插件頁裏 dsh-1024-game 不是啓用狀態;頁面仍是舊界面時刷新一次。

典型用法

不裝 DSH 也可以先本地點着玩,確認遊戲本身的行爲:

npm test                     # 22 個用例:合併規則、四方向、勝負、撤銷、持久化、包契約
node preview/build.mjs       # 生成 preview/bundle.js(借用同級項目的 esbuild + react)
open preview/index.html      # 本地預覽樁,直接跑真實 bundle

preview/ 與 scripts/ 只服務本地開發,不發佈。插件本身零運行時依賴,只 require("react"),react 來自 DSH 平臺基座模塊表。

如果想改行爲,遊戲邏輯都在純函數里:slideLine / moveBoard / spawnTile / canPlay / applyMove / undoMove,全部有單測;組件只負責渲染與事件。改完跑 npm test 就能驗證。

實現要點

兩個掛載點是理解這個插件的關鍵:

  • main(keyed,key = "1024-game")——主面板本體,只有被選中時才掛載,鍵盤/觸摸監聽隨掛載存亡。
  • sidebar.panellist(list,id = "1024-game")——左側欄面板列表裏的圖標入口,與「插件」並列;點擊由側邊欄調用 ctx.layout.selectPanel(id)。

樣式通過 ctx.effect 注入 <style>,並在卸載時移除;配色讀 --dsw-alias-* 主題變量,淺色/深色主題都跟隨。狀態用模塊內單例 store 配合 useSyncExternalStore 訂閱。組件兼容 React 18/19,只用 createElement 和 18 起可用的 hooks。

適用場景與注意

適合想把 DSH 當單一入口、偶爾在工作間隙玩一局的用戶,尤其是已經用桌面版 Web GUI 的人。它也適合想看客戶端插件怎麼拆分宿主半包和瀏覽器半包的開發者——目錄結構簡單,兩個 slot 的掛載方式有參考價值。

需要留意的限制:

  • 只面向 Web 平臺(Desktop 內置的也是 Web GUI),終端 TUI 不顯示。
  • 無聯網、無宿主工具,純前端小遊戲;不參與 agent 的對話與計費。
  • 打開遊戲面板會替換中間欄的會話視圖(和「插件」頁一樣),會話本身不受影響。

安全方面要注意兩點。第一,插件運行時擁有當前 DSH 進程的權限,所以安裝前應檢查源碼與許可證——本插件是 MIT 許可,源碼在 GitHub 上可直接讀。第二,DSH 的社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係,不是官方應用商店,從第三方索引安裝前同樣建議確認來源。

結尾

這個插件的價值在於把遊戲收進面板體系而不是彈層:入口和「插件」並列,鍵盤監聽隨掛載存在,不會干擾會話輸入;最高分和殘局本地保存,零運行時依賴、免構建。想直接用的話,一行 github:akiwu/dsh-1024-game 粘進插件頁的安裝入口,重啓 DSH 就能在側邊欄找到它。

目錄頁:https://www.skillhub.cn/plugins/akiwu/dsh-1024-game
GitHub:https://github.com/akiwu/dsh-1024-game

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

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

小夜