Commit Graph
157 Commits
Author SHA1 Message Date
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude Opus 5 967641a7c7 chore(ui): 添加框架 ui 资源目录的自动生成元数据
Cocos Creator 为新创建的目录自动生成 .meta 文件,
确保资源 UUID 在团队协作中保持一致。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 21:16:32 +08:00
joywayerandClaude Opus 5 8a40e682ab feat(ui): 资源归属骨架 + 修复 .gitignore 无锚点模式吞业务目录
framework/ui 建八个资源目录(按加载时机=图集划分)并落地归属规则文档。
根 .gitignore 的 **/native/ 与 YouleNexus 的裸 native 会静默吞掉
assets/framework/**/native/ 等业务目录; 改为各工程 .gitignore 用锚定
路径负责生成物, 根只管仓库级条目。种子补 .gitignore 使新子游戏继承。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 21:15:26 +08:00
joywayerandClaude Opus 5 37421819ee chore(nexus): 补入 assets/framework 的 .meta 文件
framework 下的 .ts 已入库但对应 .meta 一直未提交。Cocos 的 .meta 承载资源 UUID,
缺失会导致其它机器导入时重新生成 UUID, 进而打断引用关系, 必须入库。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 08:01:29 +08:00
joywayerandClaude Opus 5 42bc0722b8 chore(mcp): 换用 cocos-mcp-server 扩展, .mcp.json 改 HTTP 直连
旧扩展 @iflow-mcp/harady-cocos-creator-mcp(164 个细粒度工具 + stdio-bridge
转发)整个删除, 换成 cocos-mcp-server v1.7.9(16 个聚合工具, 靠 action 分派)。

新扩展自身起 streamable-http 服务, 不再需要 stdio 桥, 故 .mcp.json 从
node + stdio-bridge.js 改为 { type: "http", url: "http://127.0.0.1:3000/mcp" }。
原配置指向的 client/stdio-bridge.js 已随旧扩展删除, MCP 因此加载失败。

服务器名保留 cocos-creator-mcp(而非 INSTALL.md 建议的 cocos-creator), 以免
打断 CLAUDE.md、cocos-mcp 技能与 settings.local.json 里的
mcp__cocos-creator-mcp__* 允许规则。

gitignore: 新扩展是商业付费产品(vberai), 非 npm 可重装, dist/sidecar/static
共约 16M 发行产物+加密载荷+平台二进制不入库; 顺带忽略 Claude Code 个人本地
配置与编辑器运行时端口文件。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 08:01:07 +08:00
joywayerandClaude Opus 4.8 4b4e2261b4 feat(framework): platform PlayerStore(=C_Player) applyLogin
Implement PlayerStore wrapping signal<PlayerState> for player account data.
Adds applyLogin(raw) to fill state from login response A group, with:
- Mandatory fields get default 0/'' if missing (never undefined)
- Optional fields (openid/unionid/province/city) only set if present
- Immutable updates via spread operator
- Notifies subscribers on state change

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 22:06:06 +08:00
joywayerandClaude Opus 4.8 7659e1fac5 feat(framework): platform State 类型(登录驱动子集) + 只读视图接口
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 21:39:39 +08:00
joywayerandClaude Opus 4.8 854d72a420 feat(framework): core 响应式 signal 基元(自研薄封装)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 21:32:03 +08:00
joywayerandClaude Opus 4.8 883335f656 fix(framework): kick_server 终止不重连(对齐真实客户端)
收到 kick_server 时 emit kicked 并 stop(),不再 onClose→重连→重踢空转。
kick 处理移出登录门控,登录态内外一致。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:37:16 +08:00
joywayerandClaude Opus 4.8 ad661707ec fix(framework): player_login.version 改为数字 versionCode(联调登录成功)
真机联调发现:协议 version 字段=数字 versionCode(源码 8 处 data.version=GameData.versionCode),
框架原发字符串 '1.1' 被服务器版本校验拒绝(kick_server 检查到新版本)。改为数字后登录成功
(state:0 playerid:430511)。
- ChannelIdentity/LoginRequestData.version: string→number,去掉冗余 versionCode 与未发送的 '1.1' 串
- query-string version 解析为数字;测试 fixture 同步

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:33:53 +08:00
joywayerandClaude 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
joywayerandClaude Opus 4.8 96c6c7c914 fix(framework): decodeFrame 改单层(服务器协议非双层)
真机联调发现:服务器实发单层 {app,route,rpc,data};旧客户端的'外层 data'是浏览器
MessageEvent(00_minhttp.js:266 ws.onmessage=config.onmessage),非协议层。框架传输层
已取 ev.data,decodeFrame 不应再剥一层。修正后 kick_server 等业务包能正确解析。
- decodeFrame 单层化 + 测试改单层帧
- 更正 docs/protocol/01 §3.2(双层→单层,附 MessageEvent 依据)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:25:36 +08:00
joywayerandClaude Opus 4.8 5132fddc4e feat(framework): config 调试 serverOverride(全链路+游戏服连本地)
- DebugProfile 加 serverOverride:debug 抓远程配置走全链路后把连接地址覆盖为此
- staging profile 加 serverOverride=ws://127.0.0.1:3088(联调本地测试服)
- release 一律忽略 serverOverride,用远程解析结果
- 同步指南

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 20:08:59 +08:00
joywayerandClaude Opus 4.8 d461578d6e feat(framework): config 调试登录账号进 profile(DebugAccount)
- DebugProfile 加 account?: DebugAccount(openid 等登录字段,仅 debug 模式生效)
- resolveBootstrap 结果加 account:debug 取 profile.account,release 恒 undefined
- staging profile 留占位 account 待填真值;接入处 setIdentity 合并 identity+account
- 同步指南

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 19:57:41 +08:00
joywayerandClaude Opus 4.8 51a4ee57ac refactor(framework): 移除 resolveBootstrap 下游兜底,立第二准则
- CLAUDE.md 新增「第二准则:数据源权威、唯一,下游不兜底」
- bootstrap 删除 fallbackServers 选项与 ?? DEFAULT_GAMESERVER 猜默认
- 无 server/gameserver、远程失败、解析不出地址 → 一律抛 ConfigFetchError 显式暴露
- 同步 guide + 两篇 spec(删 fallback/降级措辞)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 18:59:15 +08:00
joywayerandClaude Opus 4.8 39bb964a49 chore(framework): 填入真实渠道身份默认值与测试配置服地址
- BUILD_IDENTITY 的 agentid/channelid/gameid 改为真实渠道身份
- STAGING_GAMESERVER 改为真实测试配置服地址

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 18:43:50 +08:00
joywayerandClaude Opus 4.8 5ab4a0a4b6 feat(framework): net NetClient 可选 debug 收发包日志
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 18:16:36 +08:00
joywayerandClaude Opus 4.8 2c2e487d8f feat(framework): config resolveBootstrap 接入 mode + release 锁死 URL 覆盖
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 18:13:15 +08:00
joywayerandClaude Opus 4.8 8cbc488e0c feat(framework): config 运行模式解析 resolveRuntimeMode(自动+手动覆盖)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 18:10:42 +08:00
joywayerandClaude Opus 4.8 e4d16bf412 docs(framework): 澄清 SERVER_KEYS 有意只取 *_server_tcp(WebSocket-only)
最终审查指出 spec 文本列了 *_server_http 而代码注释称逐字一致,易致误解。补注说明本期 WebSocket-only、HTTP 传输模式(netType==1)超范围。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:52:38 +08:00
joywayerandClaude Opus 4.8 632cef35e5 feat(framework): config 生产用 HttpConfigFetcher(全局 fetch)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:47:15 +08:00
joywayerandClaude Opus 4.8 c87d204f28 feat(framework): config 启动编排 resolveBootstrap(身份合并+服务器决策+降级)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:44:43 +08:00
joywayerandClaude Opus 4.8 6333ddc8e4 feat(framework): config 远程配置分层取参 getParam + 服务器解析 resolveServers
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:41:28 +08:00
joywayerandClaude Opus 4.8 231e9ee31c feat(framework): config 调试 profiles + ?profile= 切换
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:38:44 +08:00
joywayerandClaude Opus 4.8 119a457c59 feat(framework): config 原生同步身份来源(window.settings/app_* 逐字对齐)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:36:13 +08:00
joywayerandClaude Opus 4.8 510c074627 feat(framework): config H5 URL query 身份来源
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:33:58 +08:00
joywayerandClaude Opus 4.8 2f97150a6f feat(framework): config 身份类型 + 纯合并 resolveIdentity + 构建期默认
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 16:30:49 +08:00
joywayerandClaude Opus 4.8 9842c065c8 feat(framework): Cocos/浏览器 WebSocket Transport adapter
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:28:13 +08:00
joywayerandClaude Opus 4.8 dbc5d19e61 test(framework): login 全流程集成测试(over FakeTransport)
集成测试在断言处调用 parseLoginResponse(any login 数据),规避 TS6 对闭包内赋值变量经 assert.ok 收窄为 never 的 CFA 行为;断言与覆盖范围不变。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:27:56 +08:00
joywayerandClaude Opus 4.8 0ada512464 feat(framework): protocol routes 常量 + login 请求构造/响应解析
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:25:29 +08:00
joywayerandClaude Opus 4.8 540cf286a5 feat(framework): net-client 编排(login流程/门控/TcpID/超时重连/服务器切换/事件)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:24:57 +08:00
joywayerandClaude Opus 4.8 79d0071645 feat(framework): net 候选服务器轮询策略
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:23:41 +08:00
joywayerandClaude Opus 4.8 08d41cdec1 feat(framework): net 收包超时看门狗(注入 Clock 可测)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:23:13 +08:00
joywayerandClaude Opus 4.8 90843374f9 feat(framework): net Transport 接口 + 测试用 FakeTransport
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:22:47 +08:00
joywayerandClaude Opus 4.8 7dcdeb6615 feat(framework): net 信封编解码 + 握手/心跳/错误包识别
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:22:18 +08:00
joywayerandClaude Opus 4.8 c1be4dcb1e feat(framework): core 座位↔视图转换
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:21:46 +08:00
joywayerandClaude Opus 4.8 bfd9339f64 feat(framework): core EventBus(类型化+故障隔离)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:21:26 +08:00
joywayerandClaude Opus 4.8 56dbfeb5e2 feat(framework): core 最小集协议类型(envelope/login)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 14:20:54 +08:00
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude 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
joywayerandClaude Opus 4.8 beebcb7891 chore(tools): 建立真实种子工程 templates/game-seed
从 YouleNexus 派生工程配置(.creator/settings/package.json + 空 assets),
name 改为 game-seed、保留 creator.version=3.8.8;不含 framework/extensions/缓存。
经 new-game 冒烟验证:生成工程含 game 骨架 + framework junction,真源未受损。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 12:18:15 +08:00