修复:AGC 窗口标题栏项目标签改认当前项目(#618) #621
Reference in New Issue
Block a user
Delete Branch "fix/agc-titlebar-project-label"
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?
问题(#618)
AGC 客户端窗口标题栏中央那枚项目标签,展示的不是当前打开的项目,而是「正在运行的项目」里最晚启动的那一个。
现场复现(真实 Chromium,切换前代码):
gameagent-ff7f3240/ 「飞鸟 v2」(对话头「已打开:」仍然正常)gameagent-c3af9c7e(后台另一个项目在跑回合)正在运行的项目:gameagent-c3af9c7e根因链路:
src/components/WindowChrome.tsx:只要activeTurns.length > 0 || readFailed,标题栏整块换成ActiveProjectRunsPanel,当前工作区名window-chrome__title被替换掉 —— 当前项目名从此不再出现。src/features/app-shell/ActiveProjectRunsPanel.tsx(titlebar 分支):主文案按startedAt取最晚启动的在跑项目,与"当前打开哪个项目"无关。projectName(Rust 侧取thread_id目录名),空闲态标签走currentProjectContext.projectName(清单项目名)→ 同一项目「有回合在跑显示目录名、没在跑显示项目名」两种口径。改动
WindowChromeActiveProjectRuns新增currentProjectName,由WorkspaceLauncher发布currentProjectContext.projectName,WindowChrome透传给标题栏入口;不在项目内(首页 / 项目组 / 模板库)才回落到最后开始的在跑项目(原行为不变)。aria-current保留。.launcher-runs-panel-dot.is-warning、.launcher-runs-titlebar-menu-note两条样式。改动文件:
src/components/{WindowChrome.tsx,windowChromeContext.ts}、src/features/app-shell/{ActiveProjectRunsPanel.tsx,WorkspaceLauncher.tsx}、src/styles.css、tests/{directActiveTurns,WindowChrome}.test.tsx;文档:主规范 2026-09-15 段标题栏条目、里程碑与实施计划文末 2026-10-04 修订、decision-log.md。不改 Rust、快照命令字段、公共 API 与持久化。前后对照(真实 Chromium 冒烟,Vite + 真实 styles.css)
四个场景(
WindowChrome+ActiveProjectRunsPanel+setActiveProjectRuns夹具):gameagent-c3af9c7e,当前项目名消失飞鸟 v2+ 徽标1,菜单里gameagent-c3af9c7e 生成中 · 3 分钟gameagent-ff7f3240(目录名)飞鸟 v2,菜单行飞鸟 v2 / 当前 · 创作中 · 1 分钟(aria-current=true)正在运行的项目读取失败飞鸟 v2+ 告警圆点,菜单内一行「正在运行的项目读取失败」截图(本机,供对照,未上传):
C:\Users\dongy\AppData\Local\Temp\agc-titlebar-smoke\{before-1-other-running,before-2-other-running-menu,after-1-other-running,after-2-other-running-menu,after-3-read-failed-menu}.png验证
npx vitest run apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx apps/ai-game-creator-shell/tests/WindowChrome.test.tsx apps/ai-game-creator-shell/tests/workspaceWindowSync.test.tsx→ 22 passed(三条新回归:别的项目在跑时标签仍是当前项目、当前项目自己跑时列表带「当前」、读取失败不顶掉当前项目名;原「只显示最后开始的项目」用例改名为「不在项目内时…」)。npm run test -- apps/ai-game-creator-shell/tests→ 197 files passed / 1 skipped,1922 passed / 17 skipped(首次运行有一条与本改动无关的customLlmSettings并行负载 flake,单跑与复跑均通过)。npm --prefix apps/ai-game-creator-shell run typecheck、npx eslint <改动文件> --max-warnings 0均通过。npx prettier --check(改动文件全绿)、npm run check:encoding、git diff --check。npm --prefix apps/ai-game-creator-shell run bundled-resources:test有 3 例EPERM(Windows 临时目录原子替换),在未改动的 master 检出上同样失败。有意未做
后台项目在展开菜单里仍显示目录名:快照
projectName由 Rust 取thread_id目录名,改成清单项目名需要让ThreadManager在认领回合时读.agent/manifest.json,等于给纯内存模块的 claim 路径加锁内文件 I/O;当前项目那一行已用清单项目名对齐,标签主文案口径也已统一。已记在里程碑修订里。Closes #618
评审结论(approve-with-comments → 已修正)
对
master..fix/agc-titlebar-project-label这份改动做了 PR 式评审:先对齐 issue #618 的完整链路(WindowChrome 门控 → ActiveProjectRunsPanel → WorkspaceLauncher 发布 → Rust 快照),再按「实现 + 用例」「文档」两组并行细读,共 6 条发现。关于合并判断:其中 4 条确为文档/文案口径问题,但另有 2 条是代码行为(面板形态空态、发布门控),不是纯文档;不过两者都不影响现网路径——
ActiveProjectRunsPanel的面板形态目前无生产调用方(WindowChrome恒用titlebar),门控只是把发布条件收紧到与窗口标题 effect 同口径——所以不影响「可以合并」的结论。评审时的整体判断是:核心修复(主文案认当前项目)正确,无需返工。已修正(提交 45ae29461)
runningCount === 0,把「快照读取成功、只是没有在跑回合」渲染成「未能读取正在运行的项目」,与本组件自身注释相反!readFailed守卫 + 回归用例currentProjectContext是会话级(离开工作台不清空)、回合快照却是全局轮询;照搬上下文会让首页/项目组/模板库一直写「当前项目:<上次打开的项目>」,徽标数字却属于别的项目,也让「不在项目内回落到最近启动的在跑项目」实际不可达launcherView === 'project-development'门控 path/name,与窗口标题 effect 同口径;补两条回归用例(非工作台不发布、工作台照常发布)role=status行连排两遍最近运行的项目:X;共 N 个项目在运行title;视觉版式未动(aria-label已说全,改版式属设计决定)验证
directActiveTurns+WindowChrome+workspaceWindowSync→ 25 passed(22 → 25,新增 3 条)launcherView门控、去掉面板空态守卫,对应用例各自转红typecheckexit 0;check:encoding、git diff --check通过遗留(不阻断合并)
bundled-resources:test稳定报 Windows EPERM(替换%TEMP%\…\resources\plugins失败;单测隔离跑通过、整文件跑必失败),本变更未触及scripts/、资源与 Rust,属既有环境问题;因此check:web的 vitest 部分我是单独跑绿的。Close #618