From 45ae29461cd7c4fdc62ad8dfa11a0091fa3e4413 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Mon, 5 Oct 2026 15:35:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=84=E5=AE=A1=E5=90=8E=E7=BB=AD=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=A0=87=E9=A2=98=E6=A0=8F=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=9A=84=E7=A9=BA=E6=80=81=E3=80=81=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E9=97=A8=E6=8E=A7=E4=B8=8E=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 面板形态:快照读取成功但没有在跑回合时不再渲染「未能读取正在运行的项目」,补回 !readFailed 守卫 - 发布门控:currentProjectPath / currentProjectName 只在 launcherView === 'project-development' 时发布,离开工作台按口径回落到最近启动的在跑项目 - 菜单头部只报运行中数量,读取失败结论由 role=status 一行独占,避免同一句连排两遍 - 标签提示拆成「作用域 + 运行状态」:回落态记为「最近运行的项目:X」、状态位「共 N 个项目在运行」,不再重复「正在运行」 - 数量徽标补 title 说明数字含义 - 用例:新增面板空态回归与两条视图门控回归,更新两处标签断言;三条定向文件 25 passed - 文档:决策日志补 2026-10-05 评审后续条目并修正实施计划交叉引用,里程碑补 2026-10-05 修订,实施计划与主规范同步口径 --- .../src/components/windowChromeContext.ts | 3 +- .../app-shell/ActiveProjectRunsPanel.tsx | 32 +++-- .../features/app-shell/WorkspaceLauncher.tsx | 17 ++- .../tests/WindowChrome.test.tsx | 6 +- .../tests/directActiveTurns.test.tsx | 12 +- .../tests/workspaceWindowSync.test.tsx | 126 +++++++++++++++++- ...ž合跨页面生命周期与运行中项目可见性-2026-09-15.md | 2 +- ...合跨页面生命周期与运行中项目可见性-2026-09-15.md | 12 +- .../shared-memory/decision-log.md | 16 ++- ...¹案】AI游戏创作智能体App实施计划-2026-06-24.md | 2 +- 10 files changed, 202 insertions(+), 26 deletions(-) diff --git a/apps/ai-game-creator-shell/src/components/windowChromeContext.ts b/apps/ai-game-creator-shell/src/components/windowChromeContext.ts index c2af570b6..1c2dcf911 100644 --- a/apps/ai-game-creator-shell/src/components/windowChromeContext.ts +++ b/apps/ai-game-creator-shell/src/components/windowChromeContext.ts @@ -20,7 +20,8 @@ export type WindowChromeActiveProjectRuns = { currentProjectPath?: string | null; /** * 当前工作台打开的项目名(清单项目名)。标题栏标签的主文案认这一个:正在运行的项目只在 - * 徽标和展开菜单里表达,否则「我在哪个项目」会被后台别的项目顶掉。 + * 徽标和展开菜单里表达,否则「我在哪个项目」会被后台别的项目顶掉。只在项目视图发布: + * 离开工作台后置空,标签回落到最近启动的在跑项目。 */ currentProjectName?: string | null; readFailed?: boolean; diff --git a/apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx b/apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx index 66318de4d..9d17d308b 100644 --- a/apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx +++ b/apps/ai-game-creator-shell/src/features/app-shell/ActiveProjectRunsPanel.tsx @@ -120,14 +120,18 @@ export function ActiveProjectRunsPanel({ ); } - const runningLabel = readFailed + /** + * 标签提示 = 作用域 + 运行状态,分成两段是为了不在一句话里重复「正在运行」: + * 回落态的主文案本身就是「最近启动的在跑项目」,状态位再写一遍会读成「正在运行的项目:X; + * 正在运行 N 个项目」。 + */ + const scopeLabel = currentName + ? `当前项目:${primaryName}` + : `最近运行的项目:${primaryName}`; + const runStateLabel = readFailed ? '正在运行的项目读取失败' - : `正在运行 ${runningCount} 个项目`; - const triggerLabel = `${ - currentName - ? `当前项目:${primaryName}` - : `正在运行的项目:${primaryName}` - };${runningLabel}`; + : `共 ${runningCount} 个项目在运行`; + const triggerLabel = `${scopeLabel};${runStateLabel}`; const openProject = (projectPath: string) => { setOpen(false); onOpenProject?.(projectPath); @@ -155,7 +159,12 @@ export function ActiveProjectRunsPanel({ {primaryName} {runningCount > 0 ? ( - {runningCount} + + {runningCount} + ) : null}
正在运行的项目 - {runningLabel} + {/* 头部只报数量:读取失败的结论由下面那行 role=status 独占,避免同一句连排两遍。 */} + {runningCount > 0 ? `${runningCount} 个` : null}
{readFailed ? (

@@ -229,6 +239,10 @@ export function ActiveProjectRunsPanel({ } if (runningCount === 0) { + // 快照读到了、只是没有在跑回合:整块不渲染,不能报成读取失败。 + if (!readFailed) { + return null; + } // 三次都没读到快照:只说"没读到",不改写成业务、权限或审批结论。 return (