dsh-plugin-gomoku

by intelligent-guoxin

0 工具与能力github收录于 08-23

Gomoku (五子棋) with LAN online play , vs-AI, AI-vs-AI and hot-seat modes — a client + host plugin for the DeepSeek Harness web UI.

安装

dsh plugin --profile web add github:intelligent-guoxin/dsh-plugin-gomoku

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

English | 简体中文

五子棋,支持局域网联机、人机对战、巅峰对决(AI 对战)与本机双人 —— DeepSeek Harness Web UI 的客户端 + 宿主端插件。

功能

  • 在聊天界面右下角添加一个悬浮的 「五」按钮,点击可开关一个可拖拽的五子棋窗口; 同时向侧边栏底部操作区注册第二个入口。
  • 联机对战:宿主端(lib/index.js)启动一个自包含的 WebSocket 中继服务器 (RFC 6455,零依赖),默认端口 34567(可配置)。同一局域网(或同一台机器)的 两个浏览器可以互相匹配:一方创建房间获得 4 位房间码,另一方凭房间码加入。中继 服务器是权威方——校验回合与落子、判定五连与和棋,并支持认输、再来一局(每局换先)、 断线处理与简单聊天。
  • 人机对战:贪心模式评分 AI(进攻 + 防守)。
  • 巅峰对决:观看两个 AI 一步步对弈,可调速(慢 / 中 / 快)与暂停/继续,方便 按自己的节奏研究开局与战术。AI 对得分相近的走法加入少量随机扰动,因此每局棋谱都 不一样——但绝不会放弃必胜或必挡的走法。
  • 本机双人:一台电脑两人对战。
  • 棋盘为木纹画布,带星位、最后一手标记、五连高亮与悬停落子预览;窗口可拖拽,Esc 关闭。
  • 面板与输入框使用固定"深底浅字"配色(与宿主主题无关),文字始终清晰可见。

局域网联机玩法

DSH Web 界面出于安全原因刻意拒绝 --host 0.0.0.0("会把远程代码执行暴露到网络"), 因此 Web 界面保持在本机回环。局域网联机改由中继服务器在 34567 端口托管的独立对局页 承担——伙伴无需安装 DSH,也不会暴露 Web 界面:

  1. 正常启动服务器(dsh web)。中继监听 0.0.0.0:34567(安装时会添加 Windows 防火墙 规则 dsh-gomoku-34567 / dsh-gomoku-3080;若缺失请在管理员终端重新添加)。
  2. A 机(主机):打开 DSH 界面 → 点「五」→ 联机对战 → 连接 → 创建房间, 记下房间号(例如 K7QX)。
  3. 告诉伙伴两样东西:局域网地址 http://192.168.x.x:34567/(可通过中继的 /info 或面板连接后的聊天记录查看)和房间号。
  4. B 机:任意浏览器打开 http://<服务器局域网IP>:34567/(这是中继托管的独立对局页, 无需 DSH 界面、无需安装),输入昵称 → 连接 → 输入房间号 → 加入房间。
  5. 黑方先行(房间创建者)。认输可投降;一局结束后再来一局发起重赛——双方都同意后 新的一局开始并交换先后手。

同一台机器也能双人玩:一个标签页创建房间,另一个标签页(或另一个浏览器)凭房间号加入。

可选:如果你接受把整个 DSH Web 界面暴露给局域网,也可以改用 dsh web --host 192.168.x.x 绑定到具体局域网网卡,让伙伴使用完整界面 http://192.168.x.x:3080。

中继服务器

  • 默认监听 0.0.0.0:34567,局域网客户端可直接访问。可通过 cordis.patch.yml 中的 loader config 修改端口:
    - insert:
        - id: gomoku
          name: 'dsh-plugin-gomoku'
          config:
            port: 34568
    
  • http://<局域网IP>:34567/(以及 /play)提供独立对局页;http://<局域网IP>:34567/info 返回 JSON 状态(host、port、在线房间数 / 玩家数)。
  • 房间仅存于内存:等待房间 60 分钟后过期;对局进行中若一方断开,另一方获胜。
  • 连接长期保持:服务器每 30 秒发送一次保活 ping(浏览器自动回 pong),空闲连接可持续 数小时;只有 90 分钟无任何响应的连接才会被回收。
  • 无鉴权——这是局域网游戏中继,请勿将 34567 端口暴露到不受信任的网络。

包结构

package.json    dsh.client { platform: "web", inject: [@deepseek-ai/dsh-client-runtime] }
lib/index.js    宿主端 — WebSocket 中继服务器(node:http + node:crypto,零依赖)
lib/client.js   浏览器端 — 手写 bundle(无需构建),游戏本体
standalone/     gomoku.html — 由中继在 /play 托管的局域网对局页
test/           引擎 + 冒烟 + 中继测试(`npm test` 一键运行)

客户端 bundle 通过 window.__ModuleLoader__.load 注册工厂,只使用平台种子模块 (react、react/jsx-runtime、react-dom/client)与 slots 服务,无需打包器。

安装

其他 DeepSeek Harness 用户

本插件是一个零运行时依赖的普通 npm 包(宿主端只用 Node 内置模块;浏览器端使用 DSH 平台的 react 种子模块)。两种安装方式:

方式 A —— 从 npm 源安装(发布后可用):

dsh plugin --profile web add dsh-plugin-gomoku

方式 B —— 直接从 GitHub 安装(无需 npm 发布,仓库需为公开):

dsh plugin --profile web add github:Intelligent-GuoXin/dsh-plugin-gomoku

然后在 profile 的补丁层注册 loader 条目(~/.dsh/profiles/web/cordis.patch.yml):

- insert:
    - id: gomoku
      name: 'dsh-plugin-gomoku'

最后重启服务器(dsh web)并刷新浏览器页面,聊天界面右下角会出现「五」按钮。 局域网联机需要在防火墙放行中继端口 34567(独立对局页由中继托管在 http://<局域网IP>:34567/)。

如果 fork 或改名,请同步修改条目的 name,并保持 package.json 中的 dsh.client 与 exports["./client"] 不变(浏览器端依赖它们加载)。

本机开发安装

  1. node_modules\dsh-plugin-gomoku 是指向 <profile>/dsh-plugin-gomoku 的 junction; profile 的 package.json 以 "dsh-plugin-gomoku": "file:./dsh-plugin-gomoku" 固定 依赖,避免被 pnpm 清理。
  2. cordis.patch.yml 插入 loader 条目:
    - insert:
        - id: gomoku
          name: 'dsh-plugin-gomoku'
    
  3. 宿主图(含中继)在服务器启动时加载——安装后重启一次服务器(dsh --profile web / dsh web),再刷新浏览器页面使启动清单包含新条目。(补丁热重载并不可靠:当前实例下 运行中的服务器不会实时应用 cordis.patch.yml 的变更。)
  4. 之后修改 lib/client.js 可通过客户端 HMR 链热更新;宿主端改动仍需重启。

测试

npm test                             # 或单独运行:
node test/gomoku-engine.test.mjs     # 纯引擎:胜负判定、和棋、AI
node test/gomoku-smoke.mjs           # 客户端 bundle:挂载、插槽、清理
node test/gomoku-relay.test.mjs      # 宿主中继端到端:房间、落子、胜局、
                                     # 重赛、认输、离开、断线、销毁

已知限制

  • 输入框为非受控组件,输入(含中文输入法)不会被重渲染重置;也不会被抢焦点。
  • 在合成器/任意输入框中输入时,键盘事件会被忽略。
  • 中继为纯 WebSocket(ws://);若页面以 https:// 提供,则需要 wss:// (内置中继不支持)——局域网内请用 http 提供 DSH。
  • 修改 lib/index.js、standalone/ 或 profile 接线后需重启服务器; lib/client.js 的修改在下次刷新页面时生效。

原始 README: https://github.com/Intelligent-GuoXin/dsh-plugin-gomoku/blob/main/README.zh.md ↗