evomeme-dev 0.1.7

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.
Files changed (101) hide show
  1. package/README.md +247 -0
  2. package/bin/evomeme +28 -0
  3. package/dist/canvas-public/app.js +5857 -0
  4. package/dist/canvas-public/cycle-detect.js +166 -0
  5. package/dist/canvas-public/index.html +395 -0
  6. package/dist/canvas-public/sequence-sheet.js +59 -0
  7. package/dist/canvas-public/smart-split.js +185 -0
  8. package/dist/canvas-public/styles.css +2276 -0
  9. package/dist/canvas-public/vendor/painterro.min.js +3 -0
  10. package/dist/index.js +25586 -0
  11. package/package.json +69 -0
  12. package/skills/evomeme-cloud-fs/SKILL.md +176 -0
  13. package/skills/evomeme-cloud-fs/agents/openai.yaml +7 -0
  14. package/skills/evomeme-cover/SKILL.md +132 -0
  15. package/skills/evomeme-cover/agents/openai.yaml +7 -0
  16. package/skills/evomeme-game-maker/SKILL.md +214 -0
  17. package/skills/evomeme-game-maker/agents/openai.yaml +4 -0
  18. package/skills/evomeme-login/SKILL.md +92 -0
  19. package/skills/evomeme-login/agents/openai.yaml +7 -0
  20. package/skills/evomeme-native-bridge-sdk/SKILL.md +286 -0
  21. package/skills/evomeme-native-bridge-sdk/agents/openai.yaml +7 -0
  22. package/skills/evomeme-tos-upload/SKILL.md +46 -0
  23. package/skills/evomeme-tos-upload/agents/openai.yaml +4 -0
  24. package/skills/game-art/SKILL.md +121 -0
  25. package/skills/game-art/agents/openai.yaml +7 -0
  26. package/skills/game-asset-image-generator/SKILL.md +104 -0
  27. package/skills/game-asset-image-generator/agents/openai.yaml +7 -0
  28. package/skills/game-asset-image-generator/references/background.md +32 -0
  29. package/skills/game-asset-image-generator/references/static-game-assets.md +38 -0
  30. package/skills/game-audio/SKILL.md +82 -0
  31. package/skills/game-audio/agents/openai.yaml +4 -0
  32. package/skills/game-audio/references/bgm-cdn.md +127 -0
  33. package/skills/game-audio/references/sfx-cdn.md +77 -0
  34. package/skills/game-demo/SKILL.md +103 -0
  35. package/skills/game-demo/agents/openai.yaml +7 -0
  36. package/skills/game-maker/SKILL.md +111 -0
  37. package/skills/game-maker/agents/openai.yaml +4 -0
  38. package/skills/game-test/SKILL.md +58 -0
  39. package/skills/game-test/agents/openai.yaml +7 -0
  40. package/skills/game-test/references/checklists/playtest-qa.md +12 -0
  41. package/skills/game-ui/SKILL.md +169 -0
  42. package/skills/game-ui/agents/openai.yaml +4 -0
  43. package/skills/game-ui/references/checklists/game-ui-quality.md +14 -0
  44. package/skills/game-ui/references/checklists/hud-readability.md +12 -0
  45. package/skills/game-ui/references/checklists/mobile-input.md +12 -0
  46. package/skills/game-ui/references/checklists/responsive-ui-fit.md +12 -0
  47. package/skills/game-ui/references/ui-patterns.md +140 -0
  48. package/skills/game-ui/references/ui-prompt-templates.md +63 -0
  49. package/skills/phaser-2d-game/SKILL.md +127 -0
  50. package/skills/phaser-2d-game/agents/openai.yaml +7 -0
  51. package/skills/phaser-2d-game/references/engine-performance.md +64 -0
  52. package/skills/phaser-2d-game/references/engine-physics.md +139 -0
  53. package/skills/phaser-2d-game/references/engine-runtime.md +129 -0
  54. package/skills/phaser-2d-game/references/engine-spritesheets.md +99 -0
  55. package/skills/phaser-2d-game/references/engine-tilemaps.md +80 -0
  56. package/skills/phaser-2d-game/references/file-structure.md +94 -0
  57. package/skills/phaser-2d-graphics-builder/SKILL.md +68 -0
  58. package/skills/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
  59. package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  60. package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  61. package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  62. package/skills/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
  63. package/skills/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
  64. package/skills/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
  65. package/skills/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
  66. package/skills/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
  67. package/skills/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
  68. package/skills/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
  69. package/skills/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
  70. package/skills/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
  71. package/skills/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
  72. package/skills/phaser-2d-graphics-builder/references/technical-art.md +67 -0
  73. package/skills/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
  74. package/skills/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
  75. package/skills/threejs-3d-game/SKILL.md +113 -0
  76. package/skills/threejs-3d-game/agents/openai.yaml +7 -0
  77. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +116 -0
  78. package/skills/threejs-3d-game/references/engine-audio.md +70 -0
  79. package/skills/threejs-3d-game/references/engine-input-camera.md +84 -0
  80. package/skills/threejs-3d-game/references/engine-performance.md +96 -0
  81. package/skills/threejs-3d-game/references/engine-physics.md +142 -0
  82. package/skills/threejs-3d-game/references/engine-runtime.md +199 -0
  83. package/skills/threejs-3d-game/references/file-structure.md +353 -0
  84. package/skills/threejs-aaa-graphics-builder/SKILL.md +62 -0
  85. package/skills/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
  86. package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  87. package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  88. package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  89. package/skills/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
  90. package/skills/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
  91. package/skills/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
  92. package/skills/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
  93. package/skills/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
  94. package/skills/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
  95. package/skills/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
  96. package/skills/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
  97. package/skills/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
  98. package/skills/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
  99. package/skills/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
  100. package/skills/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
  101. package/skills/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: evomeme-login
3
+ description: 在 evomeme_* MCP 或 init 出现登录 / token 错误后恢复 evomeme鉴权。仅在已经发生鉴权失败时使用;不要在调用业务工具前预防性加载。
4
+ ---
5
+
6
+ # evomeme登录恢复
7
+
8
+ ## 何时使用(门控)
9
+
10
+ **仅在已经出现登录 / 鉴权相关失败之后**再加载本技能并执行下方流程。
11
+
12
+ 典型触发(工具返回 `isError` 或错误正文含下列语义时):
13
+
14
+ - token 无效或已过期(业务错误码 **40100**,文案如「token 无效」「请重新登录」)
15
+ - 登录会话超时或被拒绝(**40010**,文案如「登录会话已过期或已被拒绝」)
16
+ - MCP / init 明确提示未登录、凭证失效、需要重新登录
17
+ - `evomeme_login` 本身失败(超时、用户未在浏览器完成登录等)
18
+
19
+ **不要**在下列情况加载本技能或主动调用登录工具:
20
+
21
+ - 正常开工、生图、上传、提交、做模型之前「预防性检查登录」
22
+ - 用户未遇到任何鉴权报错时主动跑一遍登录
23
+ - 把登录当成创建游戏流程的常规步骤
24
+
25
+ 正常业务请直接调用 `evomeme_*` 工具;客户端会在需要时自行处理凭证。只有报错了才走本技能。
26
+
27
+ ## 目标
28
+
29
+ 引导用户在系统浏览器中完成 evomeme重新登录,使后续 `evomeme_*` 工具可继续使用,然后**回到原来失败的业务操作**重试一次。
30
+
31
+ ## 引导用户重新登录(按序执行)
32
+
33
+ ### 1. 向用户说明情况(先说再动)
34
+
35
+ 用简短自然语言告知,例如:
36
+
37
+ > 刚才的 evomeme云端操作因为登录凭证失效失败了。接下来需要重新登录:系统会打开浏览器,请在页面完成登录后回到这里,我会继续刚才的操作。
38
+
39
+ 必须说明三点:
40
+
41
+ 1. **为什么**:刚才的操作因登录/鉴权失败中断
42
+ 2. **会怎样**:将打开**系统默认浏览器**,需要用户在页面里完成登录
43
+ 3. **之后做什么**:登录成功后会重试刚才失败的那一步
44
+
45
+ 未完成上述告知前,不要调用 `evomeme_login`。
46
+
47
+ ### 2. (可选)确认当前状态
48
+
49
+ 若错误信息不够明确,可先调用只读工具 **`evomeme_check_login`**(**不会**打开浏览器):
50
+
51
+ - 返回「已登录」→ 可能是瞬时/其它错误;把原错误原文告诉用户,不要强行再开浏览器;可直接重试原业务工具一次
52
+ - 返回「未登录」或「凭证已失效」→ 继续第 3 步
53
+
54
+ ### 3. 发起重新登录
55
+
56
+ 调用 **`evomeme_login`**(无参数)。
57
+
58
+ - 会强制走完整浏览器登录,并覆盖写入 `~/.evomeme/auth.json`
59
+ - 请用户在打开的页面完成登录;Agent 等待工具返回
60
+
61
+ ### 4. 根据结果分支
62
+
63
+ **登录成功**
64
+
65
+ 1. 简短确认:「登录已完成。」
66
+ 2. **立即重试**刚才失败的业务 MCP(生图 / 上传 / 提交 / 模型等),不要只停在「已登录」。
67
+ 3. 若原流程要求交付收尾,重试成功后继续原流程,并按 `../evomeme-cloud-fs/SKILL.md` 完成必要的 `evomeme_submit_game_code`。
68
+
69
+ **登录失败**(超时、拒绝、网络错误等)
70
+
71
+ 1. 把工具返回的**错误原文**展示给用户
72
+ 2. 请用户确认是否方便再次尝试(例如浏览器是否被拦截、是否点了拒绝)
73
+ 3. 用户同意后再告知「将再次打开浏览器」,然后再次调用 `evomeme_login`
74
+ 4. **不要**在未告知、未获用户确认的情况下循环弹浏览器
75
+
76
+ ## 工具说明
77
+
78
+ | 工具 | 作用 | 是否弹浏览器 |
79
+ | --- | --- | --- |
80
+ | `evomeme_check_login` | 只读检查本机凭证是否仍有效 | 否 |
81
+ | `evomeme_login` | 强制浏览器登录并写入 `~/.evomeme/auth.json` | 是(调用前必须先告知用户) |
82
+
83
+ ## 非目标
84
+
85
+ - 不替代 `npx -y evomeme@latest init`(工作区忽略规则 / 复制 skills 等仍按 `../evomeme-cloud-fs/SKILL.md`)
86
+ - 不在本技能里展开游戏策划、生图或提交流程;登录恢复后回到原任务技能继续
87
+ - 不把「网络连接失败」一律当成登录问题;仅在错误明确指向鉴权 / 登录时使用本技能
88
+
89
+ ## References
90
+
91
+ - 主入口:`../game-director/SKILL.md`
92
+ - 云端文件系统(init / 提交 / 上传):`../evomeme-cloud-fs/SKILL.md`
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "evomemeLogin"
3
+ short_description: "在云端操作出现登录或凭证错误后,引导重新登录并继续原任务"
4
+ default_prompt: "请使用 $evomeme-login 帮我恢复刚才失败的登录状态,并在登录完成后继续原来的云端操作。"
5
+
6
+ policy:
7
+ allow_implicit_invocation: false
@@ -0,0 +1,286 @@
1
+ ---
2
+ name: evomeme-native-bridge-sdk
3
+ description: 在 evomeme平台宿主内通过 NativeBridge SDK 接入摄像头、麦克风、陀螺仪、震动等原生能力。禁止 Web API 兜底;须在游戏刚载入时同步发起 SDK 调用与权限请求。在 H5 游戏需要上述原生能力、文件访问、客户端身份,或从旧桥接迁移时使用。
4
+ ---
5
+
6
+ # evomeme-native-bridge-sdk
7
+
8
+ ## NativeBridge 原生能力规则(硬性)
9
+
10
+ 凡游戏涉及摄像头、麦克风、陀螺仪、震动能力,必须使用 `evomeme-native-bridge-sdk` 完成接入。
11
+
12
+ 1. 摄像头能力必须通过 `camera.pickImage`、`camera.takePhoto`、`camera.preview.start`、`camera.preview.stop`、`camera.microphone.start`、`camera.microphone.stop` 等 NativeBridge 方法调用。
13
+ 2. 麦克风音量或录音相关输入必须通过 `microphone.startMeter`、`microphone.stopMeter` 与 `microphone.level` 事件完成。
14
+ 3. 陀螺仪输入必须通过 `gyro.start`、`gyro.stop` 与 `gyro.data` 事件完成。
15
+ 4. 震动反馈必须通过 `vibrate` 方法完成。
16
+
17
+ ### 禁止 Web 能力兜底
18
+
19
+ **摄像头、麦克风、陀螺仪、震动一律只走 NativeBridge SDK,禁止用浏览器 Web API 做任何兜底或并行实现。**
20
+
21
+ 禁止包括但不限于:
22
+
23
+ - `navigator.mediaDevices.getUserMedia` / `enumerateDevices`(相机、麦克风)
24
+ - `DeviceOrientationEvent` / `DeviceMotionEvent` / `deviceorientation`(陀螺仪)
25
+ - `navigator.vibrate`(震动)
26
+ - 自行封装「SDK 失败再回退到 Web」的双路径逻辑
27
+ - 依赖 SDK 内部 `web-media-stream` / `web-media-stream-fallback` 之类的浏览器模拟结果作为正常玩法路径
28
+
29
+ SDK 不可用、`invoke` 失败或权限被拒时:明确提示用户需在 **evomeme平台宿主**内游玩 / 授权,**不要**静默切到 Web 实现假装能力可用。
30
+
31
+ ### 必须保证实时性(载入即请求)
32
+
33
+ 使用 NativeBridgeSDK 时,**必须在游戏刚被载入、仍处于前台可交互时**就发起所需的 SDK 调用与权限相关请求,保证授权流程发生在用户可见的当前会话中。
34
+
35
+ **禁止**把权限申请推迟到:
36
+
37
+ - 游戏已进入后台、切页、弹层盖住主界面之后;
38
+ - 某段长时间异步逻辑(加载资源、网络请求、关卡生成)完成之后再「补申请」;
39
+ - 用户已离开当前游戏上下文后的延迟回调里。
40
+
41
+ 否则会出现:**游戏已在后台,宿主才弹出异步权限授权**,用户会严重误解(不知道是哪个应用在要权限、为何突然弹窗)。
42
+
43
+ 推荐做法:
44
+
45
+ 1. 启动最早阶段获取 bridge(见下方「第一步」)。
46
+ 2. 若玩法依赖相机 / 麦克风 / 陀螺仪 / 震动,在首屏可交互后**立即**调用对应 `invoke`(或宿主约定的权限预检方法),不要等玩家点到某关再首次申请。
47
+ 3. 权限弹窗期间保持游戏前台;未获授权前不要假定能力已可用。
48
+
49
+ ## 概述
50
+
51
+ 将此技能用于 **evomeme平台宿主**(通常为 RN WebView)内 H5 游戏需要调用原生能力时。业务代码必须只依赖统一 SDK:
52
+
53
+ ```js
54
+ const bridge = window.NativeBridge || window.NativeBridgeSDK;
55
+ ```
56
+
57
+ 不要在游戏业务代码中直接调用 `window.ReactNativeWebView`、`postMessage` 或宿主私有对象。
58
+ 对摄像头、麦克风、陀螺仪、震动:**只认 SDK,不认浏览器 Web API。**
59
+
60
+ 若仓库中存在 `html/native-bridge-sdk.js` 或等价 SDK 实现文件,先阅读该实现并以实现为准;若实现文件不存在,以本技能中的协议约定为接入基线,不得凭空重写宿主侧 bridge,也不得用 Web API 冒充 bridge。
61
+
62
+ ## 何时使用此技能
63
+
64
+ 出现以下任一需求时必须使用本技能:
65
+
66
+ - 游戏需要相机、麦克风、陀螺仪、震动、文件读写、用户名、客户端信息等原生能力。
67
+ - 代码中出现 `NativeBridge`、`NativeBridgeSDK`、`ReactNativeWebView`、`rn-webview`、`bridge.invoke`、`gyro.start` 等关键词。
68
+ - 需要把旧的直连宿主调用或旧的 Web API 设备调用迁移为统一 `NativeBridge` SDK 调用。
69
+
70
+ 本技能**不面向**「纯浏览器可完整使用上述四类设备能力」的目标;目标运行环境是 evomeme平台宿主。
71
+
72
+ ## 稳定 API
73
+
74
+ 只使用以下公共 API:
75
+
76
+ ```ts
77
+ interface NativeBridge {
78
+ version: string;
79
+ invoke<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
80
+ on(eventName: string, handler: (payload: unknown) => void): () => void;
81
+ off(eventName: string, handler: (payload: unknown) => void): void;
82
+ isAvailable(method: string): boolean;
83
+ getRuntime(): { host: "rn-webview" | "browser"; version: string };
84
+ reportReady(payload?: Record<string, unknown>): Record<string, unknown>;
85
+ dispose(): void;
86
+ }
87
+ ```
88
+
89
+ 接入时先获取 bridge:
90
+
91
+ ```js
92
+ function getNativeBridge() {
93
+ return window.NativeBridge || window.NativeBridgeSDK || null;
94
+ }
95
+ ```
96
+
97
+ 若 `getNativeBridge()` 为 `null`:不得改用 Web API 实现相机/麦克风/陀螺仪/震动;应提示环境不支持并禁用依赖这些能力的玩法分支。
98
+
99
+ ## 方法清单
100
+
101
+ 方法名必须逐字匹配,不得改写为驼峰或旧名称。
102
+
103
+ | 类型 | 方法 |
104
+ | --- | --- |
105
+ | 通用能力 | `bridge.ping`, `ping`, `vibrate`, `getUsername`, `getClientInfo` |
106
+ | 相机与麦克风 | `camera.pickImage`, `camera.takePhoto`, `camera.preview.start`, `camera.preview.stop`, `camera.microphone.start`, `camera.microphone.stop`, `microphone.startMeter`, `microphone.stopMeter` |
107
+ | 文件能力 | `fs.readText`, `fs.writeText`, `fs.list` |
108
+ | 传感器能力 | `gyro.start`, `gyro.stop` |
109
+
110
+ 重要参数与返回:
111
+
112
+ - `vibrate({ style })`:`style` 可选 `light | medium | heavy`。
113
+ - `gyro.start({ interval })`:`interval` 默认 `100`,单位 ms;通过 `gyro.data` 推送 `{ x, y, z, ts }`。
114
+ - `microphone.startMeter()`:返回 `{ started: true }`;通过 `microphone.level` 推送 `{ level, ts }`。
115
+ - `camera.preview.start()` / `camera.microphone.start()`:以宿主 SDK 返回为准;**不要**按浏览器 `MediaStream` 假设实现玩法,也**不要**走 Web 媒体流兜底。
116
+ - `fs.readText({ path }) -> { path, text }`。
117
+ - `fs.writeText({ path, text }) -> { path, bytes }`。
118
+ - `fs.list() -> { files: string[] }`。
119
+
120
+ ## 事件清单
121
+
122
+ 只订阅当前 SDK 支持的事件:
123
+
124
+ | 事件 | payload |
125
+ | --- | --- |
126
+ | `camera.state` | `{ state: "started" | "stopped", ts, source? }` |
127
+ | `camera.microphone.state` | `{ state: "started" | "stopped", ts }` |
128
+ | `microphone.level` | `{ level, ts }` |
129
+ | `gyro.data` | `{ x, y, z, ts }` |
130
+
131
+ 当前 SDK 没有 `microphone.state` 事件。不要订阅或触发这个事件名。
132
+
133
+ ## 运行时差异
134
+
135
+ ### rn-webview(目标环境)
136
+
137
+ - `invoke` 由 SDK 通过 `ReactNativeWebView.postMessage(JSON.stringify(message))` 发送 `{ id, type: "invoke", method, params }`。
138
+ - 宿主返回 `{ id, ok: true, result }` 或 `{ id, ok: false, error }`。
139
+ - SDK 接收宿主事件 `{ type: "event", event, payload }`。
140
+ - `invoke` 超时阈值是 `15000ms`,超时抛出 `TIMEOUT`。
141
+ - `isAvailable(method)` 在 RN 运行时恒为 `true`,不能代表宿主一定实现了该能力;仍必须处理 `invoke` 失败。
142
+
143
+ ### browser(非目标完整环境)
144
+
145
+ - **不得**用 Web API 为摄像头、麦克风、陀螺仪、震动提供可用实现。
146
+ - 若检测到 `getRuntime().host === "browser"` 或 bridge 缺失:禁用上述四类能力相关玩法,并提示用户在 evomeme平台内打开。
147
+ - `fs.*` 若宿主未注入,可提示不可用;不要为了「能玩」去伪造设备传感器数据。
148
+
149
+ ## 接入工作流
150
+
151
+ ### 第一步:初始化 bridge,并在载入时发起权限相关调用(实时性)
152
+
153
+ 游戏启动、仍在前台时立即获取 bridge 与 runtime,并对玩法所需能力**尽早** `invoke`(触发宿主权限弹窗),避免后台异步授权。
154
+
155
+ ```js
156
+ const bridge = getNativeBridge();
157
+ const runtime = bridge?.getRuntime?.();
158
+
159
+ if (!bridge || runtime?.host === "browser") {
160
+ // 禁用相机/麦克风/陀螺仪/震动相关玩法;提示在 evomeme平台内游玩
161
+ } else {
162
+ // 玩法需要哪些能力,就在此阶段(或紧随其后的首屏可交互瞬间)发起对应 invoke
163
+ // 例如:await bridge.invoke("gyro.start", { interval: 100 });
164
+ // 例如:await bridge.invoke("microphone.startMeter");
165
+ // 禁止放到长时间异步任务完成后再首次申请权限
166
+ }
167
+
168
+ bridge?.reportReady?.({ scene: "game-main", host: runtime?.host || "unknown" });
169
+ ```
170
+
171
+ `reportReady` 用于通知宿主「游戏可交互」。应在核心资源加载完成、首屏可操作后调用一次;**权限相关 `invoke` 不得刻意排在用户已离开前台之后。**
172
+
173
+ ### 第二步:封装安全调用(无 Web 回退)
174
+
175
+ 所有 `invoke` 必须 `try/catch`,并按 `error.code` 分支处理。禁止裸调用。失败时返回明确「不可用」状态,**禁止**内部改调 Web API。
176
+
177
+ ```js
178
+ async function invokeNative(method, params) {
179
+ const bridge = getNativeBridge();
180
+ if (!bridge) {
181
+ return { ok: false, reason: "NO_BRIDGE" };
182
+ }
183
+
184
+ try {
185
+ const result = await bridge.invoke(method, params);
186
+ return { ok: true, result };
187
+ } catch (error) {
188
+ switch (error?.code) {
189
+ case "UNAVAILABLE":
190
+ case "PERMISSION_DENIED":
191
+ case "TIMEOUT":
192
+ case "CANCELLED":
193
+ return { ok: false, reason: error.code, error };
194
+ default:
195
+ console.warn("[NativeBridge]", method, error);
196
+ return { ok: false, reason: error?.code || "UNKNOWN", error };
197
+ }
198
+ }
199
+ }
200
+ ```
201
+
202
+ 必须识别的错误码:
203
+
204
+ - `UNAVAILABLE`
205
+ - `PERMISSION_DENIED`
206
+ - `INVALID_PARAMS`
207
+ - `INTERNAL_ERROR`
208
+ - `TIMEOUT`
209
+ - `CANCELLED`
210
+ - `NOT_FOUND`
211
+
212
+ ### 第三步:订阅事件并保存反注册函数
213
+
214
+ 所有 `on` 返回的取消订阅函数必须保存,并在 React unmount、场景 shutdown 或页面销毁时调用。
215
+
216
+ ```js
217
+ const nativeDisposers = [];
218
+
219
+ function subscribeGyro(onData) {
220
+ const bridge = getNativeBridge();
221
+ if (!bridge) return;
222
+ nativeDisposers.push(bridge.on("gyro.data", onData));
223
+ }
224
+
225
+ function cleanupNativeBridge() {
226
+ while (nativeDisposers.length) {
227
+ const off = nativeDisposers.pop();
228
+ try { off && off(); } catch (_) {}
229
+ }
230
+ }
231
+ ```
232
+
233
+ ### 第四步:能力不可用时的产品行为(不是 Web 兜底)
234
+
235
+ SDK / 权限失败时:
236
+
237
+ - 明确 UI 文案说明需要平台授权或需在 evomeme内打开。
238
+ - 可提供**不依赖设备传感器**的替代玩法(如纯触控关卡),但这不是「用 Web API 模拟陀螺仪/相机」。
239
+ - 不得用 `getUserMedia` / `deviceorientation` / `navigator.vibrate` 填补空缺。
240
+
241
+ ### 第五步:销毁时停止已启动能力
242
+
243
+ 页面或游戏场景销毁时,先停止已开启能力,再取消事件订阅,最后调用 `dispose`。
244
+
245
+ ```js
246
+ async function destroyNativeBridgeFeatures() {
247
+ const bridge = getNativeBridge();
248
+ if (!bridge) return;
249
+
250
+ await bridge.invoke("gyro.stop").catch(() => {});
251
+ await bridge.invoke("microphone.stopMeter").catch(() => {});
252
+ await bridge.invoke("camera.preview.stop").catch(() => {});
253
+ await bridge.invoke("camera.microphone.stop").catch(() => {});
254
+
255
+ cleanupNativeBridge();
256
+ bridge.dispose?.();
257
+ }
258
+ ```
259
+
260
+ ## 配置集成约束
261
+
262
+ - `/public/config.json` 仍然是游戏素材、颜色、数值、文案和可调参数的配置来源(2D 见 `../phaser-2d-game/references/file-structure.md`;3D 见 `../threejs-3d-game/references/file-structure.md`);NativeBridge 只提供运行时能力,不替代 config。
263
+ - 不要把原生能力返回的临时对象写进 `config.json`(例如媒体流对象)。
264
+ - 不得为了接入 bridge 破坏手机触屏操作。
265
+ - 代码中不得出现直接依赖 `window.ReactNativeWebView` 的业务逻辑。若必须探测宿主,只通过 `bridge.getRuntime()`。
266
+ - 代码中不得出现对相机/麦克风/陀螺仪/震动的 Web API 直接调用。
267
+
268
+ ## 验收清单
269
+
270
+ 完成 NativeBridge 接入后逐项检查:
271
+
272
+ - H5 业务代码只调用 `window.NativeBridge || window.NativeBridgeSDK`。
273
+ - 方法名和事件名与本技能清单完全一致。
274
+ - **载入即请求**:依赖原生能力的权限 / 启动类 `invoke` 发生在游戏前台载入阶段,无「后台才弹权限」路径。
275
+ - **无 Web 兜底**:工程中无 `getUserMedia` / `deviceorientation` / `navigator.vibrate` 等用于替代上述四类能力的实现。
276
+ - 每个 `invoke` 都有显式错误处理,并能处理 `UNAVAILABLE`、`PERMISSION_DENIED`、`TIMEOUT`。
277
+ - 每个事件订阅都有反注册逻辑。
278
+ - 已启动的 `gyro`、麦克风、相机预览在销毁时停止。
279
+ - bridge 缺失或非平台宿主时,禁用相关能力并提示,而不是改用浏览器 API。
280
+
281
+ ## 示例触发需求
282
+
283
+ - "让这个 H5 游戏在 evomeme/ RN WebView 里调用陀螺仪控制角色。"
284
+ - "接入 NativeBridge 的相机预览和麦克风音量事件;载入时就要申请权限。"
285
+ - "把旧的 ReactNativeWebView.postMessage 或 getUserMedia 调用迁移到 SDK,不要 Web 兜底。"
286
+ - "给游戏增加震动反馈,只走 NativeBridge。"
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "evomemeNative Bridge SDK"
3
+ short_description: "通过原生桥接为平台游戏接入摄像头、麦克风、陀螺仪与震动"
4
+ default_prompt: "请使用 $evomeme-native-bridge-sdk 为我的平台游戏接入所需的手机原生能力,并处理权限、异常和销毁流程。"
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: evomeme-tos-upload
3
+ description: 通过 evomeme_upload_game_asset 将受支持的本地图片、音频或视频上传到 evomemeTOS,内容审核通过后获取公开 asset_url。
4
+ ---
5
+
6
+ # evomeme-tos-upload
7
+
8
+ ## Purpose
9
+
10
+ 将受支持的本地图片、音频或视频上传到 evomemeTOS,拿到公开可访问的 `asset_url`。
11
+
12
+ - 调用主 MCP(`evomeme`)工具 **`evomeme_upload_game_asset`**;plugin_client 按后缀选择图片同步接口或统一音视频接口并提交原始字节,由服务端上传 TOS。只有通过内容安全审核后才会返回链接。
13
+ - 不要手写 AK/SK,不要伪造 CDN 地址,不要把二进制直接塞进源码仓库。
14
+
15
+ 允许的后缀只有:
16
+
17
+ - 图片:PNG、JPG、JPEG、BMP、WEBP、TIFF、SVG、GIF、ICO、HEIC
18
+ - 音频:MP3、WAV、AAC、WMA、OGG、M4A、AMR
19
+ - 视频:AVI、FLV、MP4、MPG、ASF、WMV、MOV、WMA、RMVB、RM、FLASH、TS、M3U8
20
+
21
+ 模型、字体、压缩包和其他未列出的类型禁止上传。WMA 按音频处理。
22
+
23
+ ## Upload Workflow
24
+
25
+ 需已登录 EvoMeme。上传与提交规则见 `../evomeme-cloud-fs/SKILL.md`;鉴权失败后再按 `../evomeme-login/SKILL.md`。
26
+
27
+ | Field | Required | Notes |
28
+ | --- | --- | --- |
29
+ | `local_path` | yes | 本地文件绝对路径或相对 MCP cwd 的路径 |
30
+ | `folder` | no | TOS 目录前缀 |
31
+ | `extension` | no | 后缀覆盖 |
32
+
33
+ 成功时工具返回公开可访问的 `asset_url`。
34
+
35
+ 本地媒体素材需要公开 URL 时走本上传流程;非媒体文件不支持。
36
+
37
+ ## Non-Negotiables
38
+
39
+ - 优先 `evomeme_upload_game_asset`,不要用 ad-hoc 凭证脚本上传。
40
+ - 不要把 TOS/AK/SK 或 bearer token 写进 skill 报告。
41
+ - evomemeMCP 工具名一律以 `evomeme_` 为前缀;提交见 `../evomeme-cloud-fs/SKILL.md`,生成类摘要见 `../game-director/SKILL.md`。
42
+
43
+ ## References
44
+
45
+ - 云端文件系统:`../evomeme-cloud-fs/SKILL.md`
46
+ - evomeme入口:`../game-director/SKILL.md`
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "evomemeTOS Upload"
3
+ short_description: "将本地游戏素材上传到对象存储,并返回可公开访问的素材链接"
4
+ default_prompt: "请使用 $evomeme-tos-upload 上传这个本地游戏素材,并把返回的公开链接提供给我。"
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: game-art
3
+ description: 分阶段确定并生产游戏美术:第一阶段确认整体风格并交付游戏原型概念图和元素设定集;第二阶段根据策划案与设定图交付简短的素材需求列表;第三阶段为 2D 或 3D 游戏交付渲染、光影、动效、材质、特效和性能表现等技术美术需求列表;第四阶段按开发者选择调用可用工具逐项生成游戏素材。当需要确定游戏美术方向、制作概念图或设定图、盘点素材、规划技术美术需求,或生成正式游戏素材时使用。
4
+ ---
5
+
6
+ # Game Art
7
+
8
+ ## Goal
9
+
10
+ 分阶段交付游戏美术成果:先确定视觉方向,再整理素材需求与技术美术需求,最后根据开发者选择生成正式素材。
11
+
12
+ ## 建立上下文
13
+
14
+ 读取开发者提供的游戏构想、游戏策划案、已有美术资料和参考图。理解游戏玩法、世界观、目标平台、画面比例、镜头视角、主要界面、游戏元素以及素材在游戏中的实际用途。
15
+
16
+ 将已经确认的信息作为设计依据,并与开发者确认会影响整体视觉方向的关键选择。
17
+
18
+ ## 生图确认
19
+
20
+ 生成游戏原型概念图、元素设定图、正式素材或任何其他图片前,先向用户说明本轮拟生成的图片、数量和视觉方向,获得用户明确同意后再调用生图工具。生成范围发生变化时重新确认。
21
+
22
+ 每轮游戏原型概念图或元素设定图生成并展示后,必须立即停止当前流程并等待用户反馈。后续调整、下一轮图片以及素材需求列表、技术美术需求列表或正式素材生成,均在收到用户明确反馈或确认后开始。
23
+
24
+ ### 并行生成原则
25
+
26
+ 获得用户对本轮生成范围的明确同意后,尽可能使用异步 MCP 调用并行生成同一批互不依赖的图片素材,不要等待一张完成后再发起下一张。先为每个调用固定素材编号、提示词、参考图和输出要求,再同时发起任务,并在结果返回后按素材编号归档和展示,以缩短整批素材的等待时间。
27
+
28
+ 只有存在真实依赖时才串行执行,例如后一项必须引用前一项的生成结果、抠图必须等待原图、或下一轮必须先取得用户对当前结果的反馈。并行不得绕过本节的生图确认要求,也不得混淆素材与返回结果的对应关系。
29
+
30
+ ## 第一阶段:美术风格与概念设定
31
+
32
+ ### 1. 确定整体美术风格
33
+
34
+ 与开发者共同确定游戏的整体视觉方向,包括:
35
+
36
+ - 美术风格与题材;
37
+ - 色彩、光照和画面氛围;
38
+ - 造型、线条、材质和细节密度;
39
+ - 角色与环境的比例关系;
40
+ - 镜头视角、透视方式和画面构图;
41
+ - 贯穿不同界面与游戏元素的统一视觉语言。
42
+
43
+ 当视觉方向仍有多种可能时,整理少量具有明确差异的候选方向,说明各自的视觉特征,并交由开发者选择。
44
+
45
+ ### 2. 生成游戏原型概念图
46
+
47
+ 选择能够代表主要体验和画面变化的游戏界面,例如开始界面、核心游玩界面、关键场景、暂停或结算界面。获得用户明确同意后,调用当前环境中可用的生图工具,为不同界面生成游戏原型概念图并向开发者展示。
48
+
49
+ 概念图表现接近游戏成品的整体画面,用于确定构图、色彩、光照、场景、角色、UI 与氛围之间的关系。根据开发者反馈调整概念图,直到整体美术方向得到确认。
50
+
51
+ ### 3. 生成游戏元素设定图
52
+
53
+ 根据策划案和已确认的概念图识别游戏中的角色、敌人、道具、建筑、载具、机关、环境物件及其他游戏元素。获得用户明确同意后,调用可用的生图工具,为每个元素生成正面、侧面和背面的三视图设定图。
54
+
55
+ 设定图使用清晰、统一的展示背景,准确表现元素的轮廓、比例、结构、颜色、材质和关键细节。具有不同形态、装备或成长阶段的元素分别表现对应变体。
56
+
57
+ 在后续设定图中持续引用已确认的概念图和设定图,使不同元素保持同一美术风格。将开发者确认的图片作为正式素材生成时的视觉参考。
58
+
59
+ 本阶段交付已确认的游戏原型概念图、游戏元素设定集和整体美术方向。
60
+
61
+ ## 第二阶段:素材需求列表
62
+
63
+ 在生成正式素材前,根据游戏策划案、原型概念图和元素设定图,列出能够识别到的全部素材需求。素材清单应覆盖游戏实际使用的画面内容,并根据玩法扩展具体类型,例如:
64
+
65
+ - 游戏背景图;
66
+ - 可独立移动的多层视差背景图;
67
+ - 游戏地图;
68
+ - 瓦片地图使用的瓦片;
69
+ - 角色、物件、道具和环境装饰等静态游戏元素图;
70
+ - 角色、敌人和机关等动态元素的序列帧动画;
71
+ - 玩法需要的特效、图标及其他视觉素材;
72
+ - 静态 3D 模型;
73
+ - 带骨骼和动画的动态 3D 模型。
74
+
75
+ 为动态元素分别列出待机、移动、攻击、受击、死亡或玩法实际需要的其他运动状态。每种状态作为独立素材项。
76
+
77
+ 素材列表只保留识别素材所需的信息。为每项素材分配稳定编号,写明类型和名称;动作状态、方向或变体仅在需要区分素材时补充。
78
+
79
+ ```markdown
80
+ # 游戏素材列表
81
+
82
+ - [ ] ART001 [<类型>] <素材名称>
83
+ - [ ] ART002 [<类型>] <素材名称>(<动作状态、方向或变体>)
84
+ ```
85
+
86
+ 本阶段交付素材列表,并由开发者确认需要生成的素材。
87
+
88
+ ## 第三阶段:技术美术需求列表
89
+
90
+ 根据目标引擎、技术栈、运行平台、画面目标以及已经确认的概念图和设定图,整理 2D 或 3D 游戏实现目标美术效果所需的技术美术需求。
91
+
92
+ 需求列表根据游戏实际表现确定,可以包括:
93
+
94
+ - 序列帧、骨骼动画、界面过渡和反馈动效;
95
+ - 图层、遮罩、混合模式、摄像机和视差表现;
96
+ - 渲染管线、色彩空间、分辨率、像素密度和抗锯齿;
97
+ - 实时光照、烘焙光照、阴影、环境光、反射和雾效;
98
+ - 材质系统、着色器、表面表现和特殊材质效果;
99
+ - 色调映射、泛光、景深、环境光遮蔽和其他后处理效果;
100
+ - 粒子、拖尾、贴花和其他实时视觉特效;
101
+ - 模型面数、纹理尺寸、纹理通道、压缩、LOD 和光照贴图;
102
+ - 目标平台上的帧率、显存、批次和画面质量分级。
103
+
104
+ 技术美术列表只保留编号、类型、需求名称和目标效果。关键引擎、平台或性能约束仅在会影响实现方式时补充。
105
+
106
+ 使用以下格式输出需求列表:
107
+
108
+ ```markdown
109
+ # 技术美术需求列表
110
+
111
+ - TA001 [<动效 / 渲染 / 光影 / 材质 / 后处理 / 特效 / 性能>] <需求名称>:<目标效果>
112
+ - TA002 [<类型>] <需求名称>:<目标效果>(<必要约束>)
113
+ ```
114
+
115
+ 为技术美术需求分配稳定编号。本阶段交付技术美术需求列表,并由开发者确认。
116
+
117
+ ## 第四阶段:逐项生成素材
118
+
119
+ 根据开发者从素材列表中选择的项目,在获得用户明确同意后调用当前环境中适合的生成或图像编辑工具生成素材。同一批互不依赖的项目优先通过异步 MCP 并行调用;存在参考图、抠图或确认依赖的项目按依赖顺序执行。生成时引用已确认的概念图、元素设定图和相关技术美术需求,并根据素材在游戏中的用途确定画幅、尺寸、透明背景、视角、分层方式和帧布局。
120
+
121
+ 每完成一项素材,直接展示生成结果,标明对应素材编号,并根据开发者反馈继续调整或生成下一项。已完成的素材在素材列表中使用 `[x]` 标记。
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Game Art"
3
+ short_description: "分阶段确定游戏美术风格,整理素材与技术美术需求并生成正式素材"
4
+ default_prompt: "请使用 $game-art 帮我确定游戏的整体美术方向,先向我确认生图方案,并在每轮概念图或设定图生成后停下来等待我的反馈。"
5
+
6
+ policy:
7
+ allow_implicit_invocation: true