@66rpg/cgmaker 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,4 +22,4 @@ Agent 调用请加 `--agent --json`(缺参退出 11、新版本退出 10、未
22
22
 
23
23
  试玩是独立游戏。模板引用只要字符串 `template_id`。`publish-template` 的 `--version`(缺省 `package.json.version`)须 1–16 位,仅小写字母、数字、`.`、`-`;须以字母或数字开头和结尾,不能有连续符号。`publish-template` 默认不带数据包;该 `data_ver` 尚无包且本地有 `assets/` 则自动上传。再带包用 `--with-assets`。`--assets` 指定绝对路径(zip 内仍为 `assets/`),在 `publish-template` 上出现即视为要上传。只改资源、不发新代码版本用 `publish-template-data`(须已有 origin;未传 `--data-ver` 则读 `package.json`,不写回)。config 不随包:放到 `~/.cgmaker/config.json`。
24
24
 
25
- 流程给人看:仓库 `docs/users.md`。给 Agent:本包 `skill/cgmaker/SKILL.md`(怎么发)、`skill/cgmaker-identity/SKILL.md`(参数与配置指南)。
25
+ 流程给人看:仓库 `docs/users.md`、`docs/play-sdk.md`。给 Agent:本包 `skill/cgmaker/SKILL.md`(怎么发)、`skill/cgmaker-identity/SKILL.md`(参数与配置指南)、`skill/cgmaker-play-sdk/SKILL.md`(宿主 SDK)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@66rpg/cgmaker",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "橙光 cgmaker 平台工具:validate-template(TS);login / publish 等转发 cgmaker",
5
5
  "type": "module",
6
6
  "bin": {
@@ -33,7 +33,7 @@
33
33
  "picocolors": "^1.1.1"
34
34
  },
35
35
  "optionalDependencies": {
36
- "@66rpg/cgmaker-win32-x64": "0.1.16"
36
+ "@66rpg/cgmaker-win32-x64": "0.1.18"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.15.0",
@@ -29,7 +29,7 @@ description: 登录橙光托管平台,发布静态游戏、模板或开源工
29
29
 
30
30
  ## 何时启用
31
31
 
32
- 登录、发游戏 `dist/`、发模板、发开源工程、货架改名。改目录 / 指纹用 `cgmaker-template-spec`,不要用本 skill 改规范。查阅模板短名、版本号、素材版本号及发布参数搭配,看 `cgmaker-identity`。
32
+ 登录、发游戏 `dist/`、发模板、发开源工程、货架改名。改目录 / 指纹用 `cgmaker-template-spec`,不要用本 skill 改规范。查阅模板短名、版本号、素材版本号及发布参数搭配,看 `cgmaker-identity`。游戏里调宿主登录 / 查用户 / 跳转 / 全屏,看 `cgmaker-play-sdk`(SDK 由发布时注入,不要把文件打进工程)。
33
33
 
34
34
  ## 不要做
35
35
 
@@ -39,6 +39,11 @@ description: 登录橙光托管平台,发布静态游戏、模板或开源工
39
39
  - `--from-dir` 的 origin 为 `local`,不能 `publish-template`。
40
40
  - 不要把试玩当成同一 `game_id` 的第二个通道。首发可以只发试玩;后补正式版会自动挂接。
41
41
 
42
+ ## 发布前请确认
43
+
44
+ - **发模板或开源工程**:上传的是源码,**不含** `node_modules`。别人从平台拿到工程后,必须能按 `package.json` 把依赖装上。依赖须是公开可装的包、版本号真实存在(不要写只有你电脑上才有的包、未发布的私有包、或装不到的版本)。装不上就先改依赖再发。
45
+ - **发模板、游戏或开源工程**:运行时**不能用在线资源**(CDN 图片、远程字体、外链脚本/样式、热链网上的音视频等)。图、音、字体、文案、数据都用工程里的本地文件:模板和开源工程放在 `assets/` 或源码内;游戏须打进 `dist/`。发现外链,先改成本地再发。
46
+
42
47
  ## 按业务选命令
43
48
 
44
49
  从模板开工程(用户还没有目录):
@@ -7,7 +7,7 @@ description: 模板与游戏的参数与标识配置指南。帮助用户理解
7
7
 
8
8
  本文档面向真实用户(模板作者与游戏创作者),详细说明在开发、发布模板与游戏时涉及的各类**配置字段**与**命令行参数**。
9
9
 
10
- 具体操作命令的使用方式请参考 `cgmaker` 说明(须 `--agent --json`)。工程目录结构是否合规请参考 `cgmaker-template-spec`。见到退出码 10 / 11 / 12 先问用户,不要猜、不要擅自 `--skip-update`。
10
+ 具体操作命令的使用方式请参考 `cgmaker` 说明。工程目录结构是否合规请参考 `cgmaker-template-spec`。游戏内调宿主登录 / 查用户 / 跳转 / 全屏,请参考 `cgmaker-play-sdk`(SDK 由发布时注入,你不用管文件)。
11
11
 
12
12
  ## 核心原则
13
13
 
@@ -41,3 +41,5 @@ description: 模板与游戏的参数与标识配置指南。帮助用户理解
41
41
  - 模板工程一旦发布并在实际项目中使用,请勿更改 `package.json` 中的 `slug`。
42
42
  - 模板 `--version` / `package.json.version`(接口 `version_name`)须 1–16 位,仅小写字母、数字、`.`、`-`;须以字母或数字开头和结尾,不能有连续符号。不合法则拒绝发布。游戏 / 开源工程 / `--data-ver` 不套此规则。细则见 [references/fields.md](references/fields.md)。
43
43
  - 素材版本号(`--data-ver`)不会由平台自动加 1,每次更新素材时请根据规划显式指定。
44
+ - **发模板或开源工程前**:上传的是源码、不含 `node_modules`。请确认 `package.json` 里的依赖都能在常规 npm 源装到,版本号真实可用;不要写只有本机才有的包或装不到的版本。
45
+ - **发模板、游戏或开源工程前**:运行时请只用本地资源(图、音、字体、文案、数据放在工程内;游戏打进 `dist/`),不要用 CDN 或其它在线地址。
@@ -2,6 +2,11 @@
2
2
 
3
3
  本文档面向真实用户,详细介绍不同业务场景下命令行功能参数的选择与搭配规则,以及各参数值如何影响发布和构建流程。
4
4
 
5
+ 发布前请先确认两件事:
6
+
7
+ - **模板、开源工程**:上传不含 `node_modules`,`package.json` 里的依赖须能公开安装、版本真实可用。
8
+ - **模板、游戏、开源工程**:运行时只用本地资源,不要用 CDN 或其它在线地址。
9
+
5
10
  ---
6
11
 
7
12
  ## 1. 模板发布业务场景
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: cgmaker-play-sdk
3
+ description: 社区播放页(宿主 H5)给游戏提供的 CgMakerSdk。在用户写游戏内登录、查当前用户/游戏、安全跳转、全屏,或问要不要把 SDK 文件打进工程时使用。
4
+ ---
5
+
6
+ # 游戏宿主 SDK(给作者)
7
+
8
+ 游戏发布后跑在社区**播放页**里的 iframe。播放页是宿主 H5,通过 `window.CgMakerSdk` 给你登录、查用户/游戏、回社区、全屏等能力。SDK **不管玩法渲染**,画面和关卡逻辑仍由你自己的代码来画。
9
+
10
+ **不要管 SDK 文件本身。** 发布游戏时,平台会自动把脚本注入到玩法 HTML。不要下载、不要拷进 `dist/`、不要自己写 `<script src="…cgmaker-game.js">`。本地 `npm run dev` 没有宿主,`ready()` 失败是正常的。
11
+
12
+ 登录、发版命令用 `cgmaker`。目录规范用 `cgmaker-template-spec`。接口明细见 [references/api.md](references/api.md)。
13
+
14
+ ## 这些情况会用到
15
+
16
+ - 游戏里要登录、显示昵称头像、按是否已购做章节锁
17
+ - 要回社区首页 / 作者页 / 上一页,或进全屏播放
18
+ - 要弄清 SDK 文件放哪、要不要 npm 安装、要不要打进 zip
19
+
20
+ ## 怎么用
21
+
22
+ 只调 `window.CgMakerSdk`。不要自己 `postMessage`,不要读 token,不要自己请求社区登录或下单接口。
23
+
24
+ ```js
25
+ const sdk = window.CgMakerSdk
26
+ if (!sdk) {
27
+ // 本地预览、或尚未发布到播放页
28
+ return
29
+ }
30
+
31
+ const { ready, context, error } = await sdk.ready()
32
+ if (!ready) {
33
+ // 约 5 秒内没等到宿主。本地开发常见,不要当成崩溃
34
+ console.debug(error)
35
+ return
36
+ }
37
+
38
+ // context.gameId / lang / user / variant(1 正式 · 2 试玩 · 3 衍生)
39
+ if (!sdk.isLoggedIn()) {
40
+ try {
41
+ await sdk.requireLogin() // 已登录会立刻成功;用户取消会失败
42
+ } catch (e) {
43
+ if (e && e.code === 'LOGIN_CANCELLED') return
44
+ throw e
45
+ }
46
+ }
47
+
48
+ const game = await sdk.queryGame()
49
+ // game.can_play / game.purchased:用来画你自己的关卡锁等。不要在游戏里复刻社区购买墙。
50
+ // 不要用 game.play_url 做跳转。
51
+
52
+ const stop = sdk.onChange((ctx) => {
53
+ // 语言或登录变化时,自己刷新 UI
54
+ })
55
+ // 离开页面时 stop()
56
+
57
+ sdk.navigateHome()
58
+ sdk.navigateAuthorPage()
59
+ sdk.navigateBack()
60
+ sdk.requestFullscreen()
61
+ ```
62
+
63
+ TypeScript 可自行声明:
64
+
65
+ ```ts
66
+ interface Window {
67
+ CgMakerSdk?: {
68
+ ready(): Promise<{ ready: boolean; context: unknown; error?: string }>
69
+ isLoggedIn(): boolean
70
+ requireLogin(): Promise<void>
71
+ queryGame(): Promise<{ can_play: boolean; purchased: boolean; play_url: string }>
72
+ navigateHome(): void
73
+ requestFullscreen(): Promise<void>
74
+ }
75
+ }
76
+ ```
77
+
78
+ 完整字段与错误码见 [references/api.md](references/api.md)。
79
+
80
+ ## 请确认
81
+
82
+ - 发布后才有宿主。本地预览不要造假登录、不要 mock 用户。
83
+ - 未登录时试玩仍可玩离线内容;`queryGame` / `queryUser` 在未登录时会失败(`NOT_LOGGED_IN`)。
84
+ - 正式版未获权时,播放页自己盖购买遮罩、**不会加载**游戏 iframe。游戏内只需处理「已经能玩」之后的自制 UI。
85
+ - 图、音、字体仍用工程本地资源,不要靠 SDK 去拉 CDN 素材。
86
+
87
+ ## 不要做
88
+
89
+ - 不要把 `cgmaker-game.js` 放进工程或 `dist/`
90
+ - 不要自己写 SDK 的 `<script>`(发布时平台会注入)
91
+ - 不要 `postMessage`、不要读或打印 token
92
+ - 不要 `window.top.location`,也不要往 `navigateHome` / `navigateAuthorPage` / `navigateBack` 里塞 URL
93
+ - 不要让游戏去调登录、签发 token、下单、支付
94
+ - 不要用 `queryGame()` 返回的 `play_url` 跳转
@@ -0,0 +1,81 @@
1
+ # CgMakerSdk 接口
2
+
3
+ 全局对象:`window.CgMakerSdk`。发布游戏时由平台注入到玩法 HTML,页面加载后即可使用。当前版本见 `version`(如 `0.1.0`)。
4
+
5
+ ## 生命周期
6
+
7
+ | 方法 / 属性 | 说明 |
8
+ | --- | --- |
9
+ | `version` | SDK 版本字符串 |
10
+ | `ready()` | 与宿主握手。返回 `{ ready, context, error? }`。超时**不抛错**(约 5 秒,`error` 为「等待主站数据超时」) |
11
+ | `isReady()` | 是否已拿到 context |
12
+ | `getError()` | 最近一次握手失败文案 |
13
+ | `getContext()` | 见下方。没有 token |
14
+ | `onChange(fn)` | context / 登录变化时回调,用来自己刷新 UI。必须用返回值取消监听 |
15
+ | `isLoggedIn()` | 是否已有用户 |
16
+ | `getGameId()` / `getUser()` | 便捷读取 |
17
+
18
+ `getContext()`:
19
+
20
+ | 字段 | 含义 |
21
+ | --- | --- |
22
+ | `gameId` | 对外游戏 id |
23
+ | `lang` | 握手时播放页语言 |
24
+ | `user` | `{ username, nickname, avatar }` 或 `null`。`username` 来自社区用户 id |
25
+ | `variant` | `1` 正式 / `2` 试玩 / `3` 衍生 |
26
+ | `parentOrigin` | 仅 SDK 内部校验消息来源,不要当业务字段 |
27
+
28
+ ## 登录
29
+
30
+ | 方法 | 说明 |
31
+ | --- | --- |
32
+ | `requireLogin()` | 已登录立刻成功。否则请宿主弹出社区登录。用户取消 → 错误码 `LOGIN_CANCELLED` |
33
+
34
+ 未登录时试玩 iframe 仍可玩离线内容。`queryGame` / `queryUser` 无登录态时得到 `NOT_LOGGED_IN`。
35
+
36
+ ## 查游戏 / 用户
37
+
38
+ 需已登录。未登录时 `queryGame` / `queryUser` 会失败(`NOT_LOGGED_IN`)。不要自己带 Cookie 去调社区接口。
39
+
40
+ | 方法 | 说明 |
41
+ | --- | --- |
42
+ | `queryGame()` | 当前游戏货架信息 |
43
+ | `queryUser()` | 当前用户:`username`、`nickname`、`avatar` |
44
+
45
+ `queryGame()` 常用字段:
46
+
47
+ - `game_id`、`owner`、`name`、`summary`、`cover_url`
48
+ - `variant`、`parent_game_id`
49
+ - `price_flower` / `price_cny` / `price_usd`
50
+ - `status`:货架 `1` 启用 / `2` 禁用
51
+ - `purchased`:对该可售主体是否已支付(作者未下单为 `false`)
52
+ - `can_play`:当前能否玩
53
+ - **不要用 `play_url` 做跳转**
54
+
55
+ 章节锁、试玩结束等自制 UI 读 `can_play` / `purchased`。不要在 iframe 里复刻社区购买墙。
56
+
57
+ ## 跳转与全屏
58
+
59
+ 只用下面这些无参方法。不要 `window.top.location`,不要往方法里塞 URL;路径由宿主自己改。
60
+
61
+ | 方法 | 说明 |
62
+ | --- | --- |
63
+ | `navigateHome()` | 回社区首页 |
64
+ | `navigateAuthorPage()` | 打开作者页 |
65
+ | `navigateBack()` | 上一页(没有历史则回帖) |
66
+ | `requestFullscreen()` | 全屏**播放器壳**,不是游戏自己改 `top` |
67
+ | `exitFullscreen()` | 退出全屏壳 |
68
+
69
+ 没有公开的 `toggleFullscreen()`。
70
+
71
+ ## 错误码
72
+
73
+ 失败时抛出的错误带 `code`(`CgMakerError`):
74
+
75
+ | 码 | 何时 |
76
+ | --- | --- |
77
+ | `NOT_LOGGED_IN` | 未登录,或查询接口鉴权失败 |
78
+ | `LOGIN_CANCELLED` | 用户关掉登录 |
79
+ | `TIMEOUT` | 握手或桥接超时(`ready()` 超时不抛错,只给 `ready: false`) |
80
+ | `FULLSCREEN_DENIED` | 浏览器拒绝全屏 |
81
+ | `FAILED` | 其它失败 |
@@ -5,7 +5,7 @@ description: 橙光 cgmaker 模板工程规范。在用户改目录或脚本名
5
5
 
6
6
  # cgmaker 模板工程规范
7
7
 
8
- 这是**模板工程规范**,不是平台全部规范,也不是某个玩法模板自己的 skill。玩法说明在工程根 `skill/SKILL.md`(若有)。登录、怎么敲命令用 `cgmaker`。模板短名、版本号、素材版本号及发布参数搭配,用 `cgmaker-identity`。不要在本 skill 里做发布决策。
8
+ 这是**模板工程规范**,不是平台全部规范,也不是某个玩法模板自己的 skill。玩法说明在工程根 `skill/SKILL.md`(若有)。登录、怎么敲命令用 `cgmaker`。模板短名、版本号、素材版本号及发布参数搭配,用 `cgmaker-identity`。游戏内调宿主 SDK 用 `cgmaker-play-sdk`(文件由发布时注入,不要打进工程)。不要在本 skill 里做发布决策。
9
9
 
10
10
  ## 何时启用
11
11
 
@@ -52,3 +52,5 @@ npx cgmaker publish-template-data --data-ver 2 --assets C:\path\to\assets
52
52
  ```
53
53
 
54
54
  过不过关只认 `cgmaker validate-template`。发布游戏用 `npx cgmaker publish`(只认 `dist/`);试玩用 `npx cgmaker publish --demo`(先 `build:demo`,可无正式版首发)。命令怎么敲见 `cgmaker`;功能参数与场景搭配见 `cgmaker-identity`。上传素材时没写 `--data-ver` 会问你(可沿用 `package.json` 里的号,不会自动 +1);没法提问时必须自己写上或保证 `package.json` 已有 `data_ver`。`--data-summary` 可选,空则不写接口。`publish-template` 与 `publish-template-data` 都可用 `--assets` 指定素材目录的完整路径(传上去以后包里仍然叫 `assets/`)。
55
+
56
+ 发布模板或开源工程前:zip 不含 `node_modules`,`package.json` 里的依赖必须能装、版本必须真实可用。发布模板、游戏或开源工程前:运行时只用本地资源,不要热链 CDN 或其它在线地址。
@@ -4,9 +4,9 @@
4
4
 
5
5
  正式版与试玩都打进**同一个** `dist/`(试玩会覆盖正式产物,发完再 `build` 另一份)。不要 `dist-demo/`。试玩由 `scripts.build:demo` 从 `assets/` 切片产出。见 [layout.md](layout.md)。
6
6
 
7
- `npx cgmaker publish` 上传正式版;`npx cgmaker publish --demo` 上传试玩。两次都只认当前 `dist/`。
7
+ `npx cgmaker publish` 上传正式版;`npx cgmaker publish --demo` 上传试玩。两次都只认当前 `dist/`。发布时平台会向玩法 HTML **自动注入**宿主 SDK,不要把 `cgmaker-game.js` 拷进 `dist/`,也不要自己写 SDK 的 `<script>`。游戏里只调 `window.CgMakerSdk`,见 `cgmaker-play-sdk`。
8
8
 
9
- 入口按 **通用首页 → 启动页 / 方向首页 → 游戏页** 拆 HTML。所有 HTML 的脚本/样式必须是相对路径(Vite `base: './'`),禁止 `src="/assets/..."`(那是站点根路径,不是源码里的内容目录 `assets/`)。打包器必须 `base: './'`。目录只能叫 `dist/`,不要 `build/` / `out/` / `www/`。Vite 可用 `publicDir: "assets"`,避免和 hashed 文件抢 `dist/assets/`。
9
+ 入口按 **通用首页 → 启动页 / 方向首页 → 游戏页** 拆 HTML。所有 HTML 的脚本/样式必须是相对路径(Vite `base: './'`),禁止 `src="/assets/..."`(那是站点根路径,不是源码里的内容目录 `assets/`)。打包器必须 `base: './'`。脚本、样式、字体、图片一律打进 `dist/` 的本地文件,禁止运行时再去拉 CDN 或其它在线地址。目录只能叫 `dist/`,不要 `build/` / `out/` / `www/`。Vite 可用 `publicDir: "assets"`,避免和 hashed 文件抢 `dist/assets/`。
10
10
 
11
11
  ✅ 必有 · ⭕ 可选。
12
12
 
@@ -51,12 +51,12 @@
51
51
  - 根目录 `data/`、`theme/`(进 `assets/`)
52
52
  - `template.yaml` / `template.yml`(身份在 `package.json` 的 `slug`)
53
53
  - 产物目录叫 `build/`、`out/`、`www/`(要发静态站只能是 `dist/`)
54
- - 运行时热链远程素材(除非 skill 写明 CDN 例外)
54
+ - 运行时热链远程素材(CDN 图、远程字体、外链脚本/样式、网上音视频等);图、音、字体、文案、数据一律用本地 `assets/` 或打进 `dist/` 的文件
55
55
  - 模板根目录 `scripts/` 文件夹(和 npm scripts、`skill/scripts/` 撞车)
56
56
  - `package.json` 设置 `bin`、写 `"packageManager"`
57
57
  - 作者工程依赖 `@66rpg/cgmaker-template-*`(create 只拷源码)
58
58
 
59
- `devDependencies` 必须有 `@66rpg/cgmaker`(脚手架写入;模板 zip 也应带上)。本仓库 `templates/` 下的样板永久 `private`,不是 npm 商品。
59
+ `devDependencies` 必须有 `@66rpg/cgmaker`(脚手架写入;模板 zip 也应带上)。本仓库 `templates/` 下的样板永久 `private`,不是 npm 商品。模板 zip **不含** `node_modules`:`dependencies` / `devDependencies` 必须是别人按 `package.json` 能装到的公开包,版本号须真实存在。
60
60
 
61
61
  ## package.json
62
62
 
@@ -120,7 +120,7 @@ npx cgmaker publish-template-data --data-ver 2 --assets C:\path\to\assets
120
120
 
121
121
  **不要打进代码 zip:** `assets/`、`node_modules/`、`dist/`、`.git/`、`.cgmaker/`(包内一律丢弃,防伪造 origin / game.json)、`.agents/` `.cursor/` `.claude/` 等 `skill-targets`、`preview/`、`tests/`、根目录 `scripts/`、`build/` `out/` `www/`。资源 zip 只含 `assets/`(`publish-template` / `publish-template-data` 的 `--assets` 可指定其它绝对路径,zip 内仍为 `assets/`)。
122
122
 
123
- 平台 skill(`cgmaker`、`cgmaker-template-spec`、`cgmaker-identity`)来自 `@66rpg/cgmaker` 包,不来自模板 zip。zip 里的 `skill/` 只可能是玩法 skill。
123
+ 平台 skill(`cgmaker`、`cgmaker-template-spec`、`cgmaker-identity`、`cgmaker-play-sdk`)来自 `@66rpg/cgmaker` 包,不来自模板 zip。zip 里的 `skill/` 只可能是玩法 skill。
124
124
 
125
125
  ## 改哪里
126
126