新增 AGC 模板库与由模板创建项目链路 #396
Reference in New Issue
Block a user
Delete Branch "codex/agc-template-library"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
交付范围
agc-devbucket 的templates/前缀作为 AGC 游戏模板库(去掉agc/这一层;agc/继续只放客户端安装包与更新清单)。game/index.html);清单补齐tags、封面字段与包大小/摘要,templateVersion用于判断是否需要重下。客户端行为
fetch_game_template_library:读取并校验清单(≤4 MiB),缓存到<app_data>/templates/index.json;网络失败回退本机缓存并标注source=cache。download_game_template:按清单下载 zip(≤512 MiB),校验字节数与 SHA-256 后解压到<app_data>/templates/installed/<id>/<version>/,最后写installed.json作为安装完成标记。create_automatic_local_game_project_from_template:先把模板文件铺进新项目目录,再走既有init_local_game_project_at补.agent清单与标准目录;失败删除半成品目录。..、盘符、符号链接),安装目录名由标识符白名单拼出;远端只信「受信任 OSS 主机 + 对象键」,清单里的地址字段不参与请求。文档与脚本
docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md;里程碑与实施计划见docs/project-memory/plans/;decision-log.md记录库路径、清单 schema、安装缓存目录与 CSP 约定。scripts/agc-template-library-publish.mjs(--dry-run校验 → 上传 → 回读校验)。InspirationGallery.tsx;tauri.conf.json的img-src放行受信任 OSS 主机用于加载封面。验证
cargo test --bin genarrative-ai-game-creator-shell template_library:9 passed;--ignored真连检查fetches_the_live_template_library_index通过。npx vitest run src/features/template-library:9 passed。npm run typecheck、cargo fmt --check、npm run check:encoding、node scripts/check-doc-index.mjs、git diff --check均通过。templates/index.json、各cover.png与template.zip均返回 200。未做 / 待确认
补充一条与本 PR 无关、但影响更大的现场发现(本地 dev 客户端实测):
WebView2 渲染进程存在无限渲染循环,日志持续刷:
对照实验(同一台机器、同一份
%APPDATA%\world.genarrative.ai-game-creator):Maximum update depth条数template-library-fixtures(1000 条假数据,未打开模板库页,停在首页)结论:渲染进程 4 GB+ 内存与持续吃 CPU 不是模板库卡片数量造成的(对照场景连模板库页都没打开),而是应用层既有的 setState 循环。它也是"拖动进度条不流畅 / 筛选切回全量卡一下"的主要背景噪声——虚拟列表解决的是 1000 个卡片节点这条真实性能债,但要判定交互流畅度是否达标,需要先修掉这个循环再复测。
复现:
AGC_DEV_CARGO_FEATURES=cocos-editor-execute npm run dev(无需假数据),启动后保持首页不动,观察%APPDATA%\world.genarrative.ai-game-creator\diagnostics\application.log与对应 WebView2 renderer 进程。- 页面根节点高度改为内联写入父级 .launcher-main 的实测高度:外壳的 .launcher-main > .platform-theme { height:100% } 特异性高于 Tailwind,且该百分比在 min-height:100vh 链上是不定高,页面退化成内容高度后虚拟网格视口为 0(卡片区整片空白);100vh 又比舞台高一个标题栏会裁掉底部 - 技术方案补页面高度契约说明 - 真机复测(1000 条假数据):可视区 16 张卡、进入页面后 23ms 出现卡片、搜索到空态 22ms、清空搜索回全量 22ms;WebView2 组工作集 487MB(修复前 4.2-4.6GB)无限 setState 已定位并修复,虚拟列表也在真机复测过了,数据如下(本地 dev 客户端,同机同
%APPDATA%)。1. 无限 setState 根因(
13d272c2d)WorkspaceLauncher发布"活动项目面板"的 effect 依赖openActiveProject;它是useCallback([openProject, setProjectPath])生成的,而openProject来自useHomeProjectCreation的普通函数声明(每次渲染都是新身份)→ effect 每渲染重跑 → cleanup/主体调setActiveProjectRuns改WindowChromestate → 标题栏重渲染 → 再来一轮。WindowChrome的 context value 当时还是内联对象,进一步放大连带重渲染。console.error包装里抓new Error().stack(这条日志与 setState 同栈),拿到commitHookEffectListUnmount → dispatchSetState → WorkspaceLauncher.tsx:154。useDirectActiveTurns轮询只在快照内容变化时setActiveTurns(空态保持引用稳定),不再每 5 秒换数组身份带动下游;③WindowChromecontext value 用useMemo。2. 虚拟列表(
066d0fe6f+5a219e53a)react-window@1.8.11的FixedSizeGrid(react-arborist在用同一版本,未引入新包),布局契约收在纯函数templateLibraryGrid.ts。.launcher-main实测内联设置:外壳.launcher-main > .platform-theme { height:100% }特异性高于 Tailwind 工具类,而这条百分比在.launcher-shell { min-height:100vh }链路上是不定高 → 页面退化成内容高度 → 虚拟网格视口 0,卡片区整片空白;改用100vh又会比舞台高一个标题栏(800 vs 750)裁掉底部。这一点已写进技术方案,避免后人踩回。3. 真机复测(1000 条假数据,UIA 驱动)
Maximum update depth日志DOM 里同时只挂可视区的 16 张卡,滚动高度仍按 250 行 × 行高计算。
未测:真实帧时间/掉帧分布。本机 dev 脚本会给 Tauri CLI 子进程传裁剪过的 env,
WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS=--remote-debugging-port=…传不进 WebView2,所以拿不到 CDP;需要的话我再补一条显式透传,就能采 long task 与帧率分布。