From b31a771b093a86540c67068db731e5d206e09abd Mon Sep 17 00:00:00 2001 From: Linghong Date: Tue, 22 Sep 2026 04:18:51 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9F=8B=E7=82=B9=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E5=90=8E=E7=9A=84=E5=AE=A2=E6=88=B7=E7=AB=AFCI?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正Tauri命令解析,避免将模块路径识别为命令名。 更新预览生命周期测试以匹配带埋点租约的注册调用。 同步技术方案中的CI适配说明。 --- apps/ai-game-creator-shell/scripts/check-config.mjs | 8 +++++++- apps/ai-game-creator-shell/tests/sessionPreview.test.ts | 2 +- ...【技术方案】客户端本地埋点与主站入库契约-2026-09-21.md | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/ai-game-creator-shell/scripts/check-config.mjs b/apps/ai-game-creator-shell/scripts/check-config.mjs index eaba4e582..bd2f20c68 100644 --- a/apps/ai-game-creator-shell/scripts/check-config.mjs +++ b/apps/ai-game-creator-shell/scripts/check-config.mjs @@ -516,7 +516,7 @@ function parseTauriHandlerCommandNames(source) { throw new Error('AI game creator shell Tauri handler list is missing'); } return Array.from( - match[1].matchAll(/\b([a-z][a-z0-9_]+)\b/g), + match[1].matchAll(/\b(?:[a-z][a-z0-9_]*::)*([a-z][a-z0-9_]*)\b/g), ([, command]) => command, ); } @@ -549,6 +549,12 @@ function assertCommandNamesDisjoint(label, leftNames, rightNames) { } function runAppInvokeParserRegressionChecks() { + assert.deepEqual( + parseTauriHandlerCommandNames( + 'tauri::generate_handler![plain_command, analytics::gui::capture_analytics_context,]', + ), + ['plain_command', 'capture_analytics_context'], + ); assert.deepEqual( parseAppInvokeCommandNames(` invoke('direct_command', {}); diff --git a/apps/ai-game-creator-shell/tests/sessionPreview.test.ts b/apps/ai-game-creator-shell/tests/sessionPreview.test.ts index 872fb48d1..90f8e6750 100644 --- a/apps/ai-game-creator-shell/tests/sessionPreview.test.ts +++ b/apps/ai-game-creator-shell/tests/sessionPreview.test.ts @@ -195,7 +195,7 @@ describe('本地预览记录的生命周期(Rust 侧结构性守卫)', () => // record_replaced_preview_stop 只允许在旧预览属于别的项目时调用:同项目重启时它会把 // 刚写进去的 running 覆盖成 stopped。 const replaceBranch = - /let \(preview, previous_preview\) = registry\.set_running\(preview, stop\);([\s\S]*?)\n {4}\}/u.exec( + /let \(preview, previous_preview\) =\s*registry\.set_running_with_lease\(preview, stop, analytics_lease\);([\s\S]*?)\n {4}\}/u.exec( previewSource, )?.[1] ?? ''; expect(replaceBranch).toContain('ensure_preview_belongs_to_project'); diff --git a/docs/technical/【技术方案】客户端本地埋点与主站入库契约-2026-09-21.md b/docs/technical/【技术方案】客户端本地埋点与主站入库契约-2026-09-21.md index 91a6127ab..cb9b4c9b3 100644 --- a/docs/technical/【技术方案】客户端本地埋点与主站入库契约-2026-09-21.md +++ b/docs/technical/【技术方案】客户端本地埋点与主站入库契约-2026-09-21.md @@ -1,12 +1,14 @@ # 客户端本地埋点与主站入库契约 -Version: 0.26 +Version: 0.27 Status: 本地采集及上传、入库、成功清理、后台查询已实现并完成本地隔离环境验收;未部署生产 Date: 2026-09-21 需求来源:[Game Agent 埋点设计原始方案](./【需求来源】GameAgent埋点设计原始方案-2026-09-05.md);原始方案与后续已确认决策有差异时,以本文为准。 ## 1. 交付目标与范围 +2026-09-22 CI 检查适配:Tauri 命令清单解析仅提取模块路径末尾的函数名,避免将 `analytics::gui` 误判为命令;预览生命周期结构性测试匹配当前 `set_running_with_lease` 调用,继续检查同项目重启不覆盖新预览记录的保护逻辑。此修正不改变运行行为或采集范围。 + 阅读说明:第 1 至 12 节记录本地采集合同及其已完成的验收证据;当前上传、入库、清理与后台查询的实施合同统一见第 13 节。第 13 节细化第 8 节,不改变现有 12 类事件和采集触发点。当前整体仍在实施验收中,不表示已经上线。 交付结果:在 Game Agent 与现役 Design Agent 客户端的真实业务节点产生有明确语义的产品事件,以明文 JSONL 批次持久化在应用级目录;当前实施增加主站入库、确认后清理与后台明细查询,验收要求见第 13 节。