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

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

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

小夜