joywayer
3963b3b791
fix(platform): harden runtime lifecycle cleanup
2026-09-05 09:40:00 +08:00
joywayer
3a9c5d6fdb
feat(platform): add single-entry platform runtime
2026-09-05 09:13:00 +08:00
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 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
71ed67abff
feat(scripts): RoomSceneStart.ts + pure layout helpers + tests (setPlayerCount/setSeatLayout/setPlayerData/clearSeats API)
2026-09-02 20:59:31 +08:00
joywayer and Claude Opus 5
65c627e2de
docs(scripts): spirit-semantics type=5 uncertainty note
...
PoC 2 实证: Login_Layer.prefab Spirit465 (type=5 _type=1 SLICED)
引用的 SpriteFrame 8e3905be-...@f9941 实际 capInsets=[0,0,0,0] (非 9-slice).
Fix path: 扩展 resolveSpriteFrameUuid 返回 capInsets, emitPrefabJson
根据 capInsets 决定 _type (all zero → 0/SIMPLE, otherwise → 1/SLICED).
当前按 type 硬编码 _type=1 与 YouleNexus 手工 prefab 1:1 一致
(手工 prefab 也有同样 bug), 运行时 SpriteFrame 实际非 SLICED.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 18:09:31 +08:00
joywayer and Claude Opus 5
d0b2265716
docs(scripts): spirit-semantics type=4 uncertainty note (Pay_Layer 11 type-4 可能 Button; 待 PoC 2 验证)
...
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 17:51:45 +08:00
joywayer
cb3bd54175
fix(scripts): final review Critical+Important fixes (Widget alignment, full readLayerXml, Label _string, atlas selection, hard-coded paths, exit code, dead code removal)
2026-09-02 09:11:51 +08:00
joywayer
601de1f903
fix(tests): PoC 3 bypass CLI to verify _lpos (sprite atlas import out of scope)
2026-09-02 08:42:39 +08:00
joywayer
36e593ecef
test(scripts): PoC 阶段 3 - Login_Layer 端到端 _lpos 测试
...
参考 brief task-11-brief.md, 验证 Layer00002.xml → Login_Layer.prefab 在
渠道logo (Spirit405) + 游客登录 (Spirit177) 两个 anchor 节点 _lpos 误差 < 0.001.
测试目前因 ImgResID 427 (00427.png) 缺失 sprite 而 FAIL — 该 throw 属
'下游不兜底' 规则预期行为 (brief 已说明 ImgResID 107 也可能 throw). 详见
task-11-report.md.
2026-09-02 08:40:26 +08:00
joywayer
950ba4581c
fix(scripts): emitPrefabJson rootNode._children 必须包含 group-X 节点 (Task 9 fix round 1)
2026-09-02 08:36:51 +08:00
joywayer
e8f4180483
feat(scripts): PoC 阶段 2 - Layer10_Protocol + Widget 锚定
...
computeWidgetAlignment(spirit) 简化版 (水平+垂直居中):
_alignFlags = 16 | 8
_horizontalCenter = x + w/2 - 640
_verticalCenter = 360 - (y + h/2)
emitPrefabJson 仅在 Spirit 父节点是 group (非 Layer 根) 时调用;
root / group-X envelope 沿用默认 _alignFlags=45 全屏铺满.
PoC 验证: Layer00010.xml Protol_Layer (group 37, 4 spirits)
生成 Protol_Layer.prefab — 6 Widget 节点 (1 root + 1 group-37 + 4 spirit),
4 spirit widget 全部 _alignFlags=24.
2026-09-02 08:35:03 +08:00
joywayer and Claude Code
ba5aec9bca
feat(scripts): PoC 阶段 1 - CLI + Layer00619 BackHall 端到端跑通
...
- scripts/legacy-layer-to-cocos-prefab-cli.mjs (CLI 入口: <inputXml> [<youlePrefab>] <outputDir>)
- framework-tests/legacy-layer-migration/poc-iconbutton.test.mjs (1 个 node:test 端到端校验 cc.Prefab 头 + group-55 父节点)
- YouleNexus/out/legacy-migration/BackHall_Layer.prefab (生成产物, 437 lines)
- YouleNexus/out/legacy-migration/BackHall_Layer.prefab.diff (vs YouleNexus Layer619_BackOtherGame.prefab, 1244 lines)
累计: 30/30 PASS (29 prior + 1 PoC). Layer00619 (1 Spirit, type=3 ProgressBar, group=55) 是最简 PoC, diff 大是预期 (脚本首个端到端输出 vs 手写 prefab 必然差异大).
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-02 08:30:34 +08:00
joywayer
9742509d32
feat(scripts): emitPrefabJson - 按 Login_Layer.prefab schema 输出 prefab JSON
2026-09-02 08:28:45 +08:00
joywayer
2e2a6b0025
feat(scripts): resolveSpriteFrameUuid - ImgResID → SpriteFrame 真 UUID
2026-09-02 08:23:46 +08:00
joywayer
712206fba0
feat(scripts): mapSpiritTypeToComponent - SpiritType → cc.* 组件映射(读 spirit-semantics.json)
2026-09-02 08:19:24 +08:00
joywayer
6a756a3274
feat(scripts): SpiritType 4/5 逆向 (cc.EditBox / cc.Sprite SLICED) + SizeCalcMode 公式 (Task 5)
...
gameabc.min.js 逆向结果固化到 fixtures/spirit-semantics.json:
SpiritType 4 = cc.EditBox
逆向证据: phoneInfo Layer00029.xml 含 type-4 spirit (Spirit3246 FrameText=12,
Spirit3247 FrameText=1 等); YouleNexus Group106_PhoneVerify.prefab (映射到
Layer00029) 含 cc.EditBox 节点, 与 type-4 FrameText 输入框语义一致.
独有属性: FrameText (默认/显示文本) + ImgResID (背景图) + CanClick=1.
SpiritType 5 = cc.Sprite (type=SLICED)
逆向证据 1 (smoking gun): Layer00002.xml Spirit159 (370x170, 边缘 100/80/100/80)
→ YouleNexus Login_Layer.prefab 唯一 cc.Sprite._type=1 (SLICED), _contentSize
严格等于 370x170. 1:1 同一个节点.
逆向证据 2: Layer00609.xml '设置背景' (100/134/100/135) → YouleNexus
Layer609_Setting.prefab cc.Sprite._type=1.
独有属性: LeftEdge/TopEdge/RightEdge/BottomEdge (4 边缘宽度) = 9-slice scaling.
SizeCalcMode 0/2 公式 (55 Layer 全量解析: 仅观察到这两种值):
0 = 直接读 Width/Height (Task 3 已实现).
2 = parent_size (lookup by SizeParentID) * SizeRelaWidth/Height / 10000. 全部采样
WidthCalcMode=1, SizeRelaWidth=10000 (即按 100% 比例继承父 spirit 尺寸).
测试 spirit-type-reverse.test.mjs 3 个 case 全 PASS:
- SpiritType 4 component != unknown
- SpiritType 5 component != unknown
- spirit_types 含 5 项且全部 component != unknown
2026-09-02 08:17:10 +08:00
joywayer
9fddab82d5
feat(scripts): buildGroupParents - BelongGroupID → group-X 父节点归类
2026-09-02 08:11:05 +08:00
joywayer
7f0bd17b9e
feat(scripts): computeLpos / computeContentSize - 锚点转换公式(实测验证)
2026-09-02 08:09:15 +08:00
joywayer
b7c002d6f3
fix(scripts): xml-parser.test.mjs 用绝对路径修 fixture ENOENT (Task 2 fix round 1)
2026-09-02 08:05:52 +08:00