joywayer
712206fba0
feat(scripts): mapSpiritTypeToComponent - SpiritType → cc.* 组件映射(读 spirit-semantics.json)
2026-09-02 08:19:24 +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
cfca336e98
feat(scripts): readLayerXml - UTF-8 解码 + Layer/Spirit 字段提取
2026-09-02 07:52:11 +08:00
joywayer and Claude Opus 5
02dc5d51ca
chore(spec): 综合清理 + legacy-layer 迁移 spec/plan/data
...
主要改动:
- 切到 funplay-cocos-mcp v0.5.1 (用户级配置, 项目级 .mcp.json 删除)
- 仓库文档/CLAUDE.md/.gitignore 等清理过时 cocos-mcp-server 引用
- memory 文件同步: cocos-mcp-setup/path/blocker/spriteframe-uuid/prefab-persist 等加 funplay 实测警告
- memory 新建 funplay-cocos-mcp-pending-verification.md (后已被实测覆盖)
- spec/plan/data:
- docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md
- docs/superpowers/plans/2026-09-02-legacy-layer-migration.md
- docs/superpowers/data/layer-spirit-summary.json
- YouleNexus: profiles.ts / defaults.ts / PlayerInfoView.prefab / scene 改动
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-09-02 07:36:54 +08:00
joywayer and Claude Opus 5
416a51e422
feat(ui-migration): 转换 CLI 与全量产出
...
55 界面 / 991 节点 → 中间描述; 439 图 → 1306 张散图落入 atlas-* 目录。
产出前先跑重组校验; 每次转换清空产出目录(中间描述 + 各 atlas-{bucket})保证幂等。
bucket 未定的层告警并落入 atlas-unassigned(7 层/162 图/285 帧), 不静默归入 common。
10 条 FrameIndex 越界警告(已知源数据遗留问题)随产出落盘为 warnings.json。
散图已用 cocos-mcp-server 刷新导入, 1306 个 .meta 由编辑器生成并入库。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 01:49:51 +08:00
joywayer and Claude Opus 5
96cbbd8b0a
fix(ui-migration): 拉伸解耦背景判定 + objectIndex 内容级校验 + 缺图抛错回归
...
评审 Important 修复:
1. spec §2.4: flags.stretch/拉伸widget 适用于全部满屏对象(52个),不只是层内首个
的 backgroundNodeId(40个,判定规则不变)。此前实现把两者绑死,导致12个非首位
满屏遮罩(如"创建房间遮罩")套用三区锚点几何,进 Cocos 后会错位。
2. 真实数据护栏补内容级校验: 遍历 manifest.objectIndex 全部991条,核对每条
layerId 与源数据 BelongLayerID 一致——杀掉"全部条目指向同一层"这类只查条数
查不出的变异,这是子系统 C 定位 1773 处 set_self 的承重字段。
3. 补"引用不存在的图显式抛错"的回归用例——此前只有代码审查保护,真实数据恰好
不触发,没有测试防线;错误信息须可定位对象ID与图ID。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 01:40:33 +08:00
joywayer and Claude Opus 5
b6c9af25e5
feat(ui-migration): 中间描述组装
...
对象 → 节点(坐标/锚点/九宫格/帧引用/flags/legacy), 层 → LayerDoc(bucket/背景/分组)。
manifest 含 ObjectID 全局索引 —— 子系统 C 移植 1773 处 set_self 调用的承重依赖。
真实数据回归护栏: 55 界面 / 991 节点, 一个对象都不得丢。
真实数据里有 10 个对象(如 3067/3068/3075/3076/3087/3088/3089/3145/388/3265)的
FrameIndex 超出其图的帧数(多帧图重导后帧数变少但对象未同步)——不抛错中止、不静默
钳到末帧,而是回退帧1 + 打 flags.frameIndexOutOfRange + 收进 convertAll 返回的
warnings 清单(objectId/layerId/imageFileId/frameIndex/frameCount/reason),真实
数据护栏钉死 warnings.length===10,数量漂移会被人工看到。另补一条背景判定用例:
非首位的满屏对象不应被误判为背景,钉住"层内首个+满屏"而非"只要满屏"的规则。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 01:29:06 +08:00
joywayer and Claude Opus 5
d2502276e0
feat(ui-migration): 层与图的 bucket 归属
...
按 LayerID 段位 + 显式名单判定; 命名笼统的 7 个层标 unassigned 交人工归位, 不猜。
图按引用它的对象所在层归属, 跨 bucket 归 common, 无引用归 unassigned。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 01:12:53 +08:00
joywayer and Claude Opus 5
e49c28eae8
feat(ui-migration): PNG 切分/重组与全量重组校验
...
切分可逆, 故「重组(切分(原图)) 的像素 === 原图像素」是对全部 1006 帧的完全验证,
成本近零。比较解码后的像素缓冲而非文件字节(编码参数不同会让同像素图字节不同)。
verify-frames CLI 对全部 139 张多帧图跑该校验, 任一失败退出码 1。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 01:06:23 +08:00
joywayer and Claude Opus 5
1d546e0211
fix(ui-migration): frameFileName 补上界校验(防止野指针引用)
...
问题:frameFileName 只校验下界(frameIndex > 0),未校验上界(frameIndex <= frameCount)。
结果:会安静产出指向不存在文件的名字(如 frameFileName('00014.png', 999, 12) → '00014_999.png'),
一路流进中间描述,直到 Cocos 加载资源才报错。
这是「把读不出来当成没问题」这一形态的第四次出现:
- Task 2: readPngSize 返回 null 被当成校验通过
- 前期: ??: 缺顶层键当成空集合
- 前轮: frameIndex 任何 falsy 当成帧 1
- 本轮: frameFileName 超界当成合法产出垃圾名字
修法:加上界检查 `normalized > frameCount`,错误信息对齐 frameRect 格式。
新增 1 条测试用例:frameFileName('00014.png', 13, 12) 应抛错。
顺手补齐 frameFileName 的 undefined/NaN 测试的消息断言(与 frameRect 对齐)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:59:22 +08:00
joywayer and Claude Opus 5
e1f67dde1c
fix(ui-migration): frameIndex 验证(拒绝非整数与 undefined/NaN)
...
问题:\`||\` 运算符接受任何 falsy 值(undefined/NaN/null)为帧 1,
违反「零兜底」原则。brief 仅明确规定 frameIndex=0 视同 1。
修法:
- 将 \`frameIndex || 1\` 改为 \`frameIndex === 0 ? 1 : frameIndex\`
- 在 frameRect 中加入 Number.isInteger 检查(拦截 NaN、undefined)
- frameFileName 亦加验证,防止非法输入产出垃圾文件名
- 错误信息明确说明有效范围与 0→1 转换规则
新增 4 条测试用例覆盖 undefined 与 NaN,确保非整数被正确拒绝。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:53:42 +08:00
joywayer and Claude Opus 5
f1ab6e7fd9
feat(ui-migration): 帧矩形与命名(1 基 + 行优先)
...
帧序经实证: 读 00014.png 网格内容与 11 个按钮的 FrameIndex 对照, 六项精确命中。
用例直接锚定该实证样例(通知=10/设置=11/战绩=4)。
命名保持 1 基并补零, 使字典序等于帧序、且文件名与 FrameIndex 直接对齐。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:47:51 +08:00
joywayer and Claude Opus 5
f2e766a89a
feat(ui-migration): 坐标换算与水平锚点三区推断
...
左上原点/左上锚点 → Cocos 中心原点/中心锚点(0.5,0.5)。
fitHeight 下垂直永不溢出, 故只推断水平锚点。
背景四边拉伸; 越界对象只标记不裁剪。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:41:35 +08:00
joywayer and Claude Opus 5
8901221e09
fix(ui-migration): 显式校验源数据顶层数组键,禁止静默兜底
...
添加 readArray() 辅助函数,对四处顶层数组键 (ObjectList, ImageFileList,
LayerList, GroupList) 显式校验,缺失或非数组时即刻抛 SourceError,
不再用 ?? [] 蒙混。遵循 CLAUDE.md 第二准则:数据缺失/非法一律显式暴露。
新增四个测试用例分别验证各键缺失时的错误行为。删除测试文件中未使用的
mkdirSync 导入。条目级缺省值 (entry.Event ?? {}, ObjectList ?? []) 保留,
因为单个对象/层没有事件/对象是合理的合法缺省。
真实数据护栏数字不变: 991 对象 / 55 界面 / 80 组 / 439 图 / 139 多帧图。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:37:37 +08:00
joywayer and Claude Opus 5
9d58145bd8
feat(ui-migration): 源数据加载与校验
...
读取 gameabc_{Object,Layer,GroupList,Image}.json, 跳过 {} 占位槽,
校验多帧图的网格与帧数一致(不符即显式抛错, 不兜底)。
真实数据回归护栏: 991 对象 / 55 界面 / 80 组 / 439 图 / 139 多帧图。
引入 pngjs devDep 供后续切图使用(仅迁移工具, 不进框架运行时)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-28 00:31:36 +08:00
joywayer and Claude Opus 5
5708926711
fix(skin): 修复最终评审发现的 6 处缺陷(junction 排除失效/meta 静默丢失等)
...
跨任务视角发现的问题:Critical1 materialize.mjs 的 junction 排除比较在
Windows 上因长路径前缀恒假、从未生效,且测试夹具的 junction 指向真源自身,
掩盖了此问题;Critical2 composeSkin 例外通道在 uuid 缺失/框架侧无 meta 时
静默失败,违反第二准则;Important3 可覆盖范围误把 theme/ 下的框架 TS 代码
也纳入;Important5 cli-entry 测试漏注册 check-skin/build-game;Important6
composeSkin 与 check-skin 各自拼路径,未共用 paths.mjs 权威推导;Important7
--platform 缺值时静默落到默认平台。逐条修复并补测试,Critical1 用诱饵框架
目录验证过能真正杀掉该 bug(变异推演见 fix report)。
spec §5 step5 的 dist/<name>/ 拷贝按要求标注为本期未实现,不实现。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 23:15:28 +08:00
joywayer and Claude Opus 5
bed9b4f35d
docs(tools): 皮肤与构建流水线文档, 回填 library 缓存实测结论
...
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 22:48:03 +08:00
joywayer and Claude Opus 5
e224d1fa3e
fix(test): 修复 build-game 测试中的关键断言缺陷
...
两处修复:
1. 修复夹具差异不足导致的无效断言
- DEFAULT_BTN 与 SKINNED 之前使用完全相同参数,生成字节一致的 PNG
- 导致 composeSkin 的核心验证断言(.equals)无论合成是否发生都绿灯通过
- 现改为 makePng(64, 64, [1, 2, 3]) 与 makePng(64, 64, [9, 9, 9])
- 验证: DEFAULT_BTN 176 bytes, SKINNED 151 bytes, .equals() = false
2. 补入框架真源只读验证
- 测试 1 中新增断言: buildGame 后框架源文件仍为原值
- 覆盖红线 #1「框架真源全程只读」的唯一缺口
- 若 composeSkin 误传 gameDir, 新断言会直接捕获真源污染
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 22:16:20 +08:00
joywayer and Claude Opus 5
134f4c877c
feat(tools): build-game 构建流水线
...
版本校验 → 实体化 → 皮肤合成 → 构建 → build-info。任一校验不过
即中止且不触发构建。runBuild 为注入点, 除真构建外全流程可单测。
Cocos 可执行路径只从 COCOS_CREATOR 环境变量取, 缺失显式报错。
同时补入 check-skin.mjs 的 process.argv[1] 守卫,与仓库其余脚本一致。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 22:08:48 +08:00
joywayer and Claude Opus 5
dcb8b1bd78
fix(test): test-7 验证校验失败时真的不写任何文件
...
Test 7 现同时放入一个合法的 override(btn.png)和一个孤儿 override(typo.png),
断言校验失败时连合法文件也没有被写入。
这样才能真正验证「校验全部通过之前,不能写任何文件」这条红线。
删除合成逻辑的 for 循环时此用例会在字节比较处失败。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 22:02:08 +08:00
joywayer and Claude Opus 5
078c485b69
fix(test): materialize 夹具改用真 PNG 字节而非字符串
...
scaffold 产出的图片改为真 PNG 二进制数据,用不同 RGB 色值生成
尺寸相同但字节不同的图片(DEFAULT_BTN/DEFAULT_BG/SKINNED_BTN)。
Test 5 现可通过:validateOverrides 不再报 size-unreadable。
Test 7 补充 orphan 错误代码断言,防止因其它原因通过。
所有测试用 readBinary() 字节比较替代字符串比较。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 21:54:40 +08:00
joywayer and Claude Opus 5
8e35556c33
feat(tools): materialize 实体化与皮肤合成
...
junction 变真实拷贝(发布链路不依赖 junction), 框架真源全程只读。
合成先整体校验再写, 不产生半成品; 例外通道把 override meta 的 uuid
改回框架原值以保持 Prefab 引用不断。
修复:Windows UNC 长路径前缀导致 cpSync filter 中 relative() 失败,
规范化 src 路径后正确计算相对位置进行缓存目录过滤。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 21:51:34 +08:00
joywayer and Claude Opus 5
550e6da9d1
feat(tools): check-skin 独立校验 CLI
...
脱离构建即可自检 override, 秒级反馈; 有错退出码 1 并逐条指出
子游戏名+文件路径+原因(第二准则: 错误早暴露、可定位)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 21:36:19 +08:00
joywayer and Claude Opus 5
44264db8ba
fix(tools): skin.mjs 显式报错尺寸不可读,补全测试覆盖
...
Finding 1: 尺寸校验不能无声跳过(null 被当作通过)。
新增 size-unreadable 错误码,当图片无法读取尺寸时显式报错。
Finding 2: 测试 10 是伪测试(.wav 太短,被长度守卫拦下)。
改用真实 PNG 字节但 .wav 扩展名,验证 isImage() 门控在。
新增两条用例:
- size-unreadable 错误场景(override 侧非 PNG)
- PNG 签名检查(长度足够但签名不对)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 21:32:01 +08:00
joywayer and Claude Opus 5
962c79866f
feat(tools): skin.mjs 资源清单与 override 校验
...
框架文件树即可覆盖清单(不另建清单文件)。孤儿/尺寸不一致/Spine 缺件
一律报错中止, 不静默跳过。Spine 贴图豁免尺寸校验(坐标在 .atlas 内)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com >
2026-08-27 21:24:30 +08:00
joywayer and Claude Opus 4.8
fee5c8b0a0
chore(framework): 真机联调脚本 login-live.ts(复用框架+ws transport)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 20:25:36 +08:00
joywayer and Claude Opus 4.8
f693f45895
chore(framework): TS 测试基建(tsx+node:test) + core 常量
...
- 补 @types/node(tsconfig types:[node] 所需,原计划遗漏)
- tsconfig 加 allowImportingTsExtensions(import 带 .ts 后缀所需)
- test:framework 改用 run-framework-tests.mjs 递归枚举(node 20.13 <20.14 不支持 --test glob)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 14:20:25 +08:00
joywayer and Claude Opus 4.8
9cb5f11a33
fix(tools): CLI 守卫防 argv[1] 空崩溃 + check-cocos 宿主版本缺失早退
...
- C1: 4 个 CLI 脚本守卫加 process.argv[1] 空值短路,避免动态 import 时 pathToFileURL(undefined) 崩溃
- I1: check-cocos-version CLI 在宿主 creator.version 为 null 时报错 exit 1,避免 CI 虚假 OK
- M1: scaffold 测试收紧 UUID 正则
- 新增 cli-entry 测试覆盖动态 import 场景
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:31:58 +08:00
joywayer and Claude Opus 4.8
b37c7c5424
docs(tools): 工具链 README + 端到端冒烟通过
...
全量 22 单测通过;e2e 冒烟 new-game→check-cocos→setup-links 全绿。
README 含命令表、关键约束,并补充 junction 删除安全注意事项
(避免 rm -rf 穿透 junction 误删框架真源)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:22:19 +08:00
joywayer and Claude Opus 4.8
379a510343
feat(tools): bump-cocos 批量升级引擎版本字段
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:20:52 +08:00
joywayer and Claude Opus 4.8
ea1eefe8b8
feat(tools): check-cocos-version 引擎版本一致性校验
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:19:14 +08:00
joywayer and Claude Opus 4.8
28362314d2
feat(tools): new-game 一键新建子游戏工程
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:15:01 +08:00
joywayer and Claude Opus 4.8
8bb3b80544
feat(tools): scaffold.mjs 种子复制/改身份/铺 game 骨架
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:12:59 +08:00
joywayer and Claude Opus 4.8
9a0a7f60c1
feat(tools): setup-links 批量重建 framework junction
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:10:19 +08:00
joywayer and Claude Opus 4.8
5ef65c0d05
feat(tools): junction.mjs 跨平台目录链接创建/检测
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:07:40 +08:00
joywayer and Claude Opus 4.8
e7e9406c48
feat(tools): paths.mjs 路径解析与工程发现
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-28 12:04:28 +08:00