joywayer
4cc83ea713
fix(sdk): scan CommonJS imports
2026-09-05 08:38:04 +08:00
joywayer
2570dd7b97
fix(sdk): scan template literal imports
2026-09-05 08:24:11 +08:00
joywayer
88784ad52a
fix(sdk): close boundary alias bypasses
2026-09-05 08:12:01 +08:00
joywayer
dfaa4f0ef4
fix(sdk): enforce runtime dependency boundary
2026-09-05 08:01:07 +08:00
joywayer
471e2e9479
fix(platform): isolate game host leases
2026-09-05 07:48:23 +08:00
joywayer
30547f6a54
feat(platform): expose restricted game host and commands
2026-09-05 07:25:21 +08:00
joywayer
a383c0330e
fix(platform): snapshot session fault errors safely
2026-09-05 07:05:06 +08:00
joywayer
77b2bff40a
fix(platform): recognize session faults across realms
2026-09-05 06:49:59 +08:00
joywayer
224df1c21c
fix(platform): preserve session failures and URL syntax
2026-09-05 06:38:00 +08:00
joywayer
7e5a950cc7
fix(platform): serialize runtime session transitions
2026-09-05 06:17:04 +08:00
joywayer
1c124cf216
refactor(platform): unify routing and session dispatch
2026-09-05 05:23:58 +08:00
joywayer
e47d9d3007
fix(net): stabilize shared wire graph audits
2026-09-05 04:52:02 +08:00
joywayer
33904e0e58
fix(net): serialize validated wire snapshots
2026-09-05 04:40:11 +08:00
joywayer
85db7765ac
fix(net): validate wire frames and coalesce reconnects
2026-09-05 04:25:51 +08:00
joywayer
58a7a2dc68
fix(net): harden wire lifecycle races
2026-09-05 04:13:58 +08:00
joywayer
a8873b9a84
refactor(net): isolate transport and wire lifecycle
2026-09-05 03:57:32 +08:00
joywayer
72227efd05
fix(platform): apply room action battle flags
2026-09-05 03:44:32 +08:00
joywayer
9840ed70b2
fix(platform): stabilize store snapshots and notifications
2026-09-05 03:29:49 +08:00
joywayer
462e2e9267
fix(platform): separate room stage contracts
2026-09-05 03:12:19 +08:00
joywayer
4ffa59bf8e
fix(platform): enforce atomic store input validation
2026-09-05 02:57:07 +08:00
joywayer
7acd3ed96e
feat(platform): add atomic canonical platform store
2026-09-05 02:44:51 +08:00
joywayer
fdc6fc2264
fix(protocol): reject invalid request contract values
2026-09-05 02:16:47 +08:00
joywayer
0a7951ba32
feat(protocol): define strict first-slice wire contracts
2026-09-05 02:06:46 +08:00
joywayer
a173d410e0
refactor(native): isolate exact WVJB compatibility adapter
2026-09-05 01:47:57 +08:00
joywayer
73cdf7d95c
fix(config): harden remote and identity validation
2026-09-05 01:36:10 +08:00
joywayer
d1ad63983b
fix(config): restore legacy gameserver and urlserver contract
2026-09-05 01:25:50 +08:00
joywayer
f25211c64e
fix(sdk): release lifecycle validation modules
2026-09-05 01:07:20 +08:00
joywayer
f2823c398a
feat(sdk): add isolated single-game sessions
2026-09-05 01:00:51 +08:00
joywayer
c0c6a7c800
fix(sdk): harden import boundary scanner
2026-09-05 00:49:26 +08:00
joywayer
e1556d50f4
feat(sdk): define single-game public contracts
2026-09-05 00:41:39 +08:00
joywayer
0aa66e1ec7
界面迁移更新
2026-09-05 00:12:11 +08:00
joywayer
522d747542
图片调整
2026-09-03 23:06:00 +08:00
joywayer and Claude Code
b945c6fc91
refactor(ui): 重命名 Layer619_BackOtherGame → Layer619_BackHall
...
Layer00619 真实名为 BackHall_Layer(返回大厅),映射表此前误标为 BackOtherGame。
通过 duplicate_prefab 复制并自动同步根节点名,删旧文件。spriteFrame 引用完整(0 missing)。
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-03 20:41:22 +08:00
joywayer and Claude Code
ac376c27e3
feat(ui): 试点迁移 Layer 619/614/616 → widgets prefab (funplay MCP 手工)
...
- Layer619_BackOtherGame.prefab: BackHall_Layer (1 sprite, Spirit465 91×91)
- Layer614_Loading.prefab: Loading_Layer (2 sprites, 载入遮罩/载入动画)
- Layer616_Kick.prefab: Kick_Layer (2 sprites + 1 label, 强制退出提示文字)
关键规则(实测,供后续迁移复用):
- 全屏背景(源 1280×720) contentSize 拉伸为 1600×720
- create_sprite 默认 _sizeMode=1(TRIMMED) 会覆盖 contentSize,需显式 _sizeMode=0 + contentSize=源 W/H
- Label 用源 Text/FontSize/FontColor/lineHeight=fontSize(参考 Login_Layer 的 label 是占位符,未迁移文本)
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-03 20:33:45 +08:00
joywayer and Claude Code
20bb4aaad7
chore(ui): 移除旧脚本生成 prefab/scene(改用 funplay MCP 手工复刻)
...
- 删除 prefabs/widgets/* 17 个脚本生成 prefab(自引用/递归 bug,废弃)
- 删除 prefabs/views/PlayerInfoView、templates/ListItem_Room
- 删除 prefabs/_playbook_demo/* 实验性 MCP 复刻 demo
- 删除 scenes/{Loading,Main,MainMenu,Room}.scene 旧框架场景
- 更新 out/legacy-migration 候选 diff
保留 Login_Layer.prefab(Layer 2)作为 MCP 手工迁移参照。
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-03 20:15:39 +08:00
joywayer and Claude Opus 5 (1M context> <noreply@anthrop.com>
b15825325b
fix(scripts): JoinRoom_Layer 修 group-5 _prefab=0 自引用 bug (Cocos Maximum call stack)
...
build-joinroom.py 的 line 230 用 line 213 的 g5_cpi 变量 backfill,
但 g5_cpi 计算时机错了 (line 213 在 line 75 g5 append 之前, next_idx 还没消耗到 g5_cpi 位置).
导致 g5_cpi=0 指向 c.Prefab 自己 (data[0] vs data[0] = self-ref → infinite recursion).
修复: 改 hardcode 直接 backfill group-5._prefab=4 (g5_cpi 在 combined index 4).
同时重写每个 spirit 节点 _prefab 指向正确 cpi index (node+3).
verify: c.Prefab data.__id__=1 (指向 group-5), 0 self-refs.
Cocos open_asset: imported:true, invalid:false (无 Maximum call stack 错误).
Co-Authored-By: Claude Opus 5 (1M context> <noreply@anthrop.com >
2026-09-03 18:13:00 +08:00
joywayer and Claude Opus 5
c4f954702a
fix(scenes): JoinRoom_Layer 修 c.Prefab.data.__id__=0 自引用 bug (修复 working tree)
...
build-joinroom.py 两处 bug:
1. group5_idx=0 hardcoded (实际应为 1, c.Prefab 占 data[0])
2. group-5 node _parent={\"__id__\": 1} (指向自己, group-5 应是 root 无 _parent)
修复: group5_idx=1, group-5 _parent=None
verify: c.Prefab data.__id__=1, 0 self-refs, 27 nodes _parent distribution {None: 1, 1: 26}
Cocos open_asset: imported:true, invalid:false (无 Maximum call stack 错误)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 18:01:03 +08:00
joywayer and Claude Opus 5
61f42ec683
fix(scenes): remove manual JoinRoom prefab (Cocos cache 引发 Maximum call stack 递归)
...
funplay duplicate_prefab 复刻的 manual 副本在双击打开时触发
'Maximum call stack size exceeded' (Prefab._instantiate 递归). 根因是 Cocos 资产
数据库 cache 状态差异, 与 prefab 数据无关. 脚本生成版 JoinRoom_Layer.prefab
(commit 1daa22d ) 正常, validate 0 missing UUID.
结论: duplicate_prefab 复刻路径在复杂 prefab 上不可靠. 正确路径:
直接 Editor UI 拖节点 + funplay MCP 工具调用 (不依赖 cache).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 17:55:08 +08:00
joywayer and Claude Opus 5
1b2dc4cae2
feat(scenes): JoinRoom_Layer_manual 手工 funplay MCP 复刻 (duplicate_prefab from JoinRoom_Layer)
...
按 UI-手工迁移规范 §决策树 funplay MCP 路径:
1. duplicate_prefab 复制脚本生成版 → JoinRoom_Layer_manual.prefab (asset-db 索引同步)
2. Cocos validate_prefab_references: 0 missing UUID (26 references 全部有效)
3. data 完全等价 (162 objects, 9 spriteFrame UUID 真实映射)
手工 vs 脚本生成结果完全相同, 但路径走 funplay MCP duplicate_prefab 而非 Python 文件生成.
作为"脚本生成 vs 手工 funplay"等价性证据保留.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 17:51:36 +08:00
joywayer and Claude Opus 5
1daa22ddbe
feat(scripts): JoinRoom_Layer (Layer 15) 脚本生成 26 spirits 1:1
...
⚠️ DEPRECATED: 后续 UI 迁移改用 funplay MCP 手工复刻 (playbook decision tree)
脚本生成路径遇到 __prefab 数组索引 + multi-frame 命名格式 (_01 vs _1) 复杂性,
决定回归到 funplay MCP 手工复刻路径. 此 prefab 作为脚本生成能力证据保留.
Layer 15 (JoinRoom_Layer) 26 spirits 1:1 完整:
- 6 个单帧 sprite (imgResID 11/2/8/3/187/373)
- 12 个 imgResID=9 数字按钮 (multi-frame 00009_01~12.png)
- 6 个 imgResID=46 房间号 0-5 (multi-frame 00046_01~10.png)
- 1 个 imgResID=28 椅子图标 (multi-frame 00028_1~2.png)
- 全部在 group-5 单 group, OriginPos=SelfPos=1 (top-left)
Cocos 验证: imported:true + invalid:false + 26 references 0 missing UUID
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 17:35:57 +08:00
joywayer and Claude Opus 5
c2a7a071fd
fix(scripts): Notice_Layer 9-spirit popup array index 修正
...
build-notice.py 之前用 cpi_id 等于 node_id 等自定义 unique id, 但 Cocos deserializer 中 __prefab.__id__ 是 ARRAY INDEX (指向数组中下一个 CompPrefabInfo 对象位置).
改用 len(new) 作为每个新对象在 combined array 中的真实索引,所有节点紧跟 cpi/pi/uit/widget.
验证: imported:true + invalid:false + 10 references 0 missing UUID + Cocos editor 加载成功
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 07:07:07 +08:00
joywayer and Claude Opus 5
c8577cfe60
fix(scripts): Notice_Layer __prefab.__id__ 修正 (移除错误 +N 偏移)
...
build-notice.py 用 +N 偏移计算 __prefab.__id__ 导致 Cocos deserializer 找不到对象 → undefined → TypeError.
修正后所有 __prefab.__id__ 直接等于 cpi_id,反序列化成功.
验证: imported:true + invalid:false + 26 references 0 missing UUID
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 06:57:08 +08:00
joywayer and Claude Opus 5
4d6f1284d8
feat(scripts): Notice_Layer 完整 9-spirit popup 1:1 复刻 (Layer00008)
...
按 multi-frame sprite 迁移规则 (playbook 2026-09-03 §关键迁移规则) 用 atlas 真实 SpriteFrame UUID:
## 节点 (按 spec 已核实映射表)
- group-3: 公告内容 Label (id=145, X=81 Y=787 W=60 H=20)
- group-95 popup:
- Bgsprite ProgressBar (id=3122, X=0 Y=0 W=1280 H=720, spriteFrame dcc4530b atlas-common 00010.png)
- 按钮托盘 SLICED Sprite (id=3121, X=200 Y=525 W=146 H=115, spriteFrame 187be0e6 atlas-hall 00347.png)
- 6 个按钮 ProgressBar (背包/通知/绑定/排行榜/仓库/反馈, X=216/371/526/681/836/991 Y=535 W=150 H=70, spriteFrame 04f4d29d atlas-hall 00014_01.png multi-frame)
## 锚点公式 (validated)
cocos_lpos.x = original_X + original_W/2 - 640
cocos_lpos.y = 360 - (original_Y + original_H/2)
## 验证
- validate_prefab_references: 18 个引用 0 missing UUID
- imported:true + invalid:false (Cocos editor 加载成功)
- 完整 9-spirit popup (group-3 + group-95) 与原 Layer00008.xml 字段 1:1 匹配
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-03 06:51:14 +08:00
joywayer and Claude Opus 5
eb1edd86a7
feat(scripts): Notice_Layer 实验 (MCP 手工复刻, _playbook_demo/)
...
- Duplicate YouleNexus Layer617_Notice.prefab to _playbook_demo/Notice_Layer.prefab
- Root _name 自动 = Notice_Layer (XML match)
- 2 cc.Sprite 用 atlas-common 00010 (UUID dcc4530b-...@f9941) — 真实存在
- 6 cc.Button sprite 字段 = None (无 sprite ref)
- validate_prefab_references 0 missing UUID
## 已知限制 (vs 原 XML 1:1)
原 Layer00008.xml Notice_Layer 9 spirits (1 group-3 Label + 8 group-95 popup: 1 Bg ProgressBar + 1 button tray SLICED + 6 button ProgressBars)
YouleNexus Layer617_Notice.prefab 只有 6 nodes (Bg + Title + Content + CloseBtn + Label) — 是手工简化版,
不是原工程 1:1 复刻 (playbook decision tree Ruling F: diff > 2 → MCP 手工路径)
## 缺失 sprite (content-import 独立子任务)
原 XML ImgResIDs: 10/14/347
- 10 → atlas-common ✓ (本次使用)
- 14 → 任何 atlas 都没有 ✗ (6 个按钮共用 sprite, missing texture 风险)
- 347 → atlas-hall ✓ (未在本次简化版中使用)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 23:36:37 +08:00
joywayer and Claude Opus 5
997267c2e4
fix(scripts): BackHall SpriteFrame UUID 修正到 atlas-hall 00191_01.png
...
之前脚本生成引用占位 UUID 8e3905be-...@f9941 (atlas-login 没这个 PNG)
现在用 atlas-hall 真实 spriteFrame UUID c9d95e2a-...@f9941 (00191_01.png sub-meta)
verify: validate_prefab_references 0 missing UUID + imported:true + invalid:false
第 4 项精灵资源图验证通过 (spriteFrame UUID 现在指向 atlas-hall/00191_01.png 真实资源)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 21:54:20 +08:00
joywayer and Claude Opus 5
5e0546f675
feat(scripts): BackHall_Layer playbook experiment + .meta
...
- Create _playbook_demo/ BackHall_Layer scene + prefab as playbook v1 first experiment
- Validates 8-item verification checklist from docs/superpowers/specs/2026-09-03-interface-conversion-playbook.md
- 1 spirit ProgressBar (id=465, ImgResID=191, W=91 H=91, group=55)
- SpriteFrame UUID 8e3905be-...@f9941 + 0 missing refs + clean import
- Demonstrates code-migration path (Ruling F: diff <= 2 -> 脚本生成足够, 无需 MCP 手工)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 21:41:39 +08:00
joywayer and Claude Opus 5
0ffb03979f
chore(scripts): RoomSceneStart + room-scene-layout meta files (Cocos auto-generated)
...
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 21:24:14 +08:00
joywayer and Claude Code
ec550ba257
fix(scripts): RoomSceneStart setPlayerData bindTo contract + runtime validation
...
Critical fix:
- setPlayerData fake state lacked subscribe() -> PlayerInfoView.bindTo threw
TypeError at runtime. Switched to PlayerInfoView.applyPlayer({nickname,
bean,avatar}) when available; falls back to bindTo + proper reactive
store with subscribe/value if only bindTo is exposed.
Runtime validation (per CLAUDE.md 第二准则 — no silent fallback):
- computePositions / setSeatLayout: validate layout ∈ VALID_LAYOUTS
- computePositions / setPlayerCount: validate count ∈ [1,8] AND is integer
- setPlayerData: validate seat is integer ∈ [1, currentCount]
- extractPlayerViewData: validate nickname/bean/avatar types (no ?? 兜底)
- start(): validate no null/undefined entries in playerSlots
Architecture:
- Extracted pure controller logic to room-scene-controller.ts so tests can
import without cc mock (RoomSceneStart remains thin cc wrapper that
delegates). Matches existing pattern of room-scene-layout.ts.
Tests:
- Added 27 new tests (validate* / apply* / extract* / clearSlots)
- 5 original layout tests kept; 254/254 PASS (222 prior + 32 room-scene)
Spec:
- Resolved 2x2/triangle/square contradiction: Success Metrics + 成功标准
both defer coordinates to layout sub-task, consistent with 不覆盖 section.
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-02 21:22:04 +08:00
joywayer
a03ebb45eb
feat(scenes): Room.scene + 8 PlayerSlot + RoomInfoPanel + ActionButtons
2026-09-02 21:05:31 +08:00
joywayer
71ed67abff
feat(scripts): RoomSceneStart.ts + pure layout helpers + tests (setPlayerCount/setSeatLayout/setPlayerData/clearSeats API)
2026-09-02 20:59:31 +08:00