DSH 游戏商店 English

DSH 游戏商店规范

版本 1。English

游戏商店是 DeepSeek Harness(DSH)的一个插件,包名 dsh-game-store。这份规范讲五件事:一个游戏包长什么样,商店能做什么,游戏怎么上架和下架,留言板这些社区功能怎么放在 GitHub 上,商店怎么保护玩家。

想直接动手,看怎么发布你的游戏。

1. 几个词

词意思
游戏包一个 npm 包,里面是一个游戏的全部文件
游戏清单游戏包里的 game.json,写游戏的名字、介绍、入口、图片等
目录dsh-game-store 仓库里的 catalog/games/,每个游戏一个小文件
目录条目目录里的一个文件,指向一个游戏包的一个确切版本
校验值npm 给每个版本算出的 sha512-…,文件变一个字节它就变
商店装在 DSH 里的 dsh-game-store 插件

2. 游戏包

一个游戏就是一个 npm 包,建议命名 dsh-game-<名字>。它同时是一个 DSH 插件,所以 DSH 的插件管理器能安装、更新、卸载它。

游戏是本地网页游戏:HTML、JavaScript、图片、声音这些文件,打开入口页就能玩。

2.1 目录结构

dsh-game-<名字>/
├── package.json        npm 包清单
├── game.json           游戏清单
├── cordis.patch.yml    标准文件,原样照抄
├── LICENSE             许可证
├── game/               游戏本体,入口在这里面
│   └── index.html
├── store/              商店里展示的内容
│   ├── icon.png        图标
│   ├── cover.png       封面
│   ├── shot-1.png      截图
│   ├── trailer.mp4     视频(可选)
│   ├── about.en.md     游戏说明(英文)
│   └── about.zh.md     游戏说明(中文)
└── manual/             手册(可选)
    └── index.html

只有 game/、manual/、store/ 三个文件夹里的文件会被商店打开。

2.2 package.json

{
  "name": "dsh-game-my-game",
  "version": "0.1.0",
  "license": "MIT",
  "repository": { "type": "git", "url": "git+https://github.com/you/dsh-game-my-game.git" },
  "icon": "./store/icon.png",
  "files": ["game", "store", "game.json", "cordis.patch.yml", "README.md", "LICENSE"],
  "dsh": { "bundle": { "patch": "./cordis.patch.yml" } },
  "dshGame": "./game.json"
}

必须有:

不能有:

2.3 cordis.patch.yml

所有游戏包用同一个文件,一个字都不改:

# dsh-game-store spec 1: a game adds no plugin rows.
[]

它告诉 DSH:这个包不往 DSH 里加任何插件代码。

2.4 游戏清单 game.json

{
  "spec": 1,
  "id": "my-game",
  "name": { "en": "My Game", "zh": "我的游戏" },
  "tagline": { "en": "A short line under the name.", "zh": "名字下面的一句话。" },
  "summary": { "en": "One sentence about the game.", "zh": "一句话介绍。" },
  "author": { "name": "Your Name", "url": "https://github.com/you" },
  "entry": "game/index.html",
  "icon": "store/icon.png",
  "cover": "store/cover.png",
  "screenshots": [
    { "src": "store/shot-1.png", "caption": { "en": "In play", "zh": "游戏画面" } }
  ],
  "about": { "en": "store/about.en.md", "zh": "store/about.zh.md" },
  "manual": { "zh": "manual/index.html" },
  "languages": ["en", "zh-CN"],
  "controls": ["keyboard", "mouse", "touch"],
  "players": { "min": 1, "max": 1 },
  "content": { "rating": "everyone" }
}
字段必填说明
spec是固定写 1
id是游戏在商店里的名字:小写字母、数字、连字符,最多 40 个字符。上架后固定
name是游戏名,最多 40 个字符
tagline否标语,最多 80 个字符
summary是一句话介绍,最多 80 个字符
author.name是作者
author.url否作者主页,https:// 开头
entry是入口页,game/ 里的一个 HTML 文件
icon是图标:正方形,至少 128×128,最大 256 KB
cover是封面:16:9,至少 1280×720,最大 2 MB
screenshots是1 到 8 张截图,每张至少 960×540,最大 2 MB;caption 可选
videos否最多 3 段视频,放在 store/ 里,MP4 或 WebM,每段最大 40 MB。写法:[{ "src": "store/trailer.mp4", "poster": "store/trailer.jpg", "caption": { "en": "Trailer", "zh": "预告片" } }]。poster(视频封面图)和 caption 可选
about是游戏说明,每种语言一个 Markdown 文件,每个最大 64 KB
manual否手册,每种语言一个 manual/ 里的 HTML 文件
languages是游戏本身支持的语言,如 ["en", "zh-CN", "ja"]
controls是操作方式,从 keyboard、mouse、touch、gamepad 里选
players是人数,{ "min": 1, "max": 4 }
content.rating是内容分级:everyone(所有人)、teen(13 岁以上)、mature(18 岁以上)
content.notes看情况内容提示,最多 200 个字符。分级是 teen 或 mature 时必填,写清有什么内容

版本和许可证写在 package.json 里,清单里不再写一遍。

多语言文字:name、tagline、summary、caption、content.notes 可以写成一个字符串,也可以按语言写:{ "en": "…", "zh": "…", "ja": "…" }。语言代号用小写,en 必须有。商店按 DSH 的界面语言显示,找不到就用英文。

图片:PNG、JPEG 或 WebP。

2.5 游戏说明

每个游戏包自带说明,商店直接读它来展示。说明分三部分:

2.6 入口和运行方式

玩家点“开始游戏”,商店在本机给这个游戏开一个地址(http://127.0.0.1:<端口>/),把 entry 指的页面显示出来。游戏占满整个 DSH 窗口,同时进入系统全屏。

对游戏的要求:

2.7 大小

解压后最大 300 MB。

3. 商店能做什么

功能说明
浏览目录第一屏是最新上架的游戏:封面、名字、一句话介绍、安装按钮。下面是全部游戏
看游戏页每个游戏有自己的页面:视频、封面和截图、游戏说明、留言板、版本、作者、许可证、大小、语言、操作方式、人数、内容分级、npm 包、源码仓库、校验值
安装一键安装目录里登记的那个版本
启动游戏占满窗口并进入全屏。鼠标移到窗口顶边,出现一个小条:重新开始、全屏、退出游戏
看手册游戏包带手册时,游戏页有“手册”按钮
更新目录里的版本比已装的新,按钮变成“更新到 x.y.z”
卸载删掉游戏文件,存档保留
我的游戏列出已安装的游戏
在网页上玩网站 dsh-game-store.com 的每个游戏页有“在网页上玩”,不装 DSH 也能玩。游戏在自己的子域名 <id>.play.dsh-game-store.com 里运行,文件和游戏包里的一样

商店每天读一次目录,地址是 https://dsh-game-store.com/catalog.json。读不到时用上次保存的那份;一次都没读到过,就用插件自带的那份。

手动安装的游戏包(dsh plugin add …)也会出现在“我的游戏”里,带一条提示:目录里没有它,商店没有检查过它。

4. 上架:用 GitHub

目录放在 dsh-game-store 仓库的 catalog/games/ 里,每个游戏一个文件 <id>.json:

{
  "id": "my-game",
  "package": "dsh-game-my-game",
  "version": "0.1.0",
  "integrity": "sha512-…",
  "repository": "https://github.com/you/dsh-game-my-game",
  "addedAt": "2026-11-13"
}
字段说明
id和文件名、游戏清单里的 id 一样
packagenpm 包名
version一个确切的版本
integrity这个版本的校验值:npm view <包名>@<版本> dist.integrity
repository游戏的 GitHub 仓库
addedAt上架日期
status、reason下架时由维护者填,见第 6 节

上架和更新都走同一条路:

  1. 开发者把游戏包发布到 npm。
  2. 开发者向 dsh-game-store 仓库提一个 Pull Request,新增或修改自己游戏的那个文件。
  3. CI 自动检查(第 5.1 节)。
  4. 维护者审核(第 5.2 节),合并。
  5. 合并后网站自动重新生成,目录随之更新。玩家的商店最晚一天后看到,点“刷新目录”马上看到。

每个版本都要过一次 Pull Request。 目录登记的是确切的版本和校验值,商店只装这一个。开发者在 npm 上发了新版本,目录没改,玩家那边就什么都不会变。

为什么这样设计:

5. 审核标准

5.1 自动检查

CI 对每个条目做这些事,全部通过才能合并:

  1. 条目格式正确,id 和包名在目录里没有重复。
  2. npm 上有这个版本,校验值和条目里的一样。
  3. 下载游戏包(只下载,不运行其中任何东西),逐项对照第 2 节:package.json 的必须项和禁止项、标准的 cordis.patch.yml、游戏清单的每个字段、入口文件存在、图片的格式尺寸大小、英文说明存在、有许可证文件、总大小在限制内、没有符号链接、没有可执行程序和脚本文件(.exe、.sh、.node 等)。
  4. 把包装进一个空文件夹(关掉安装脚本),确认装得上、没有带进别的包。

游戏文件里出现从网上加载的地址时,CI 给出警告:商店会拦住这些请求,游戏在玩家那里会缺东西。

开发者在自己电脑上能跑同样的检查:npx dsh-game-store check <文件夹或包名@版本>。

5.2 人工审核

维护者会装上玩一下,确认:

更新已上架的游戏,重点看这次改了什么。

6. 下架规则

下架由维护者改目录条目,同样走 Pull Request,留下记录。有两级:

状态什么时候用玩家那边
delisted 下架作者要求;作者联系不上且游戏已经不能运行;版权方有合理的投诉;说明和实际内容不符且作者不改商店里搜不到,不能再安装或更新。已经装了的还能玩,游戏页会显示下架原因
blocked 封禁发现恶意行为:试图联网偷数据、绕开限制、攻击玩家的电脑商店拒绝启动,游戏页显示原因并提示卸载

条目写成:

{ "…": "…", "status": "delisted", "reason": "作者要求下架" }

7. 社区:都放在 GitHub 上

商店没有自己的服务器。网站是静态页面,目录是仓库里的文件,游戏包在 npm 上。玩家之间的内容也照这个办法:账号就是 GitHub 账号,内容存在 GitHub 仓库里。

7.1 游戏页

每个游戏有自己的页面,网站上是 https://dsh-game-store.com/games/<id>/,商店里点游戏就能打开。页面内容全部来自游戏包:视频、截图、游戏说明、手册、各项信息。开发者改页面,发一个新版本就行。

7.2 留言板

7.3 计划中(还没有实现)

下面这些沿用同一个办法,写在这里是为了定下方向。实现以后会补进规范。

8. 安全

安装别人的游戏,就是在自己电脑上运行别人写的代码。商店做了下面这些限制,也有做不到的地方,都写在这里。

8.1 商店做到的

装什么

在哪里运行

让玩家看得见

留言板

8.2 商店做不到的

9. 版本

这是规范的第 1 版,游戏清单里写 "spec": 1。以后有不兼容的改动,会出第 2 版;商店会同时认新旧两版,给开发者留出改的时间。

对规范有意见,在 dsh-game-store 仓库开 issue。