优化项目名称显示 #245

Closed
opened 2026-09-02 14:43:39 +08:00 by kdletters · 1 comment
Member

支持修改项目名称以及LLM根据用户输入自主提炼项目名称

img_v3_02155_7361c030-3c73-4891-8300-5b9929b8548g.jpg

支持修改项目名称以及LLM根据用户输入自主提炼项目名称 ![img_v3_02155_7361c030-3c73-4891-8300-5b9929b8548g.jpg](/attachments/c624068b-c827-4390-ba23-77aa351c7801)
suzmii self-assigned this 2026-09-02 14:44:38 +08:00
suzmii added the due date 2026-09-02 2026-09-02 14:44:47 +08:00
Member

需求文档:优化项目名称显示与命名链路

1. 问题

当前项目名称只在创建时生成一次,且缺少用户可用的改名入口:

  • 首页自动创建的工作区固定命名为 GameAgent 项目 {短ID},用户无法从名称看出真实创作主题。
    • 代码现状:apps/ai-game-creator-shell/src-tauri/src/commands.rscreate_automatic_local_game_project_at 生成 GameAgent 项目 {short_id}
  • 手动新建项目直接把所选文件夹名作为项目名,无法表达“想做什么游戏”。
    • 代码现状:useHomeProjectCreation.ts 使用 projectNameFromPath(trimmedProjectPath)
  • 客户端没有重命名项目名称的正式入口;项目名已展示在窗口标题、最近项目列表和工作台上下文中,但用户不能修改。
  • 项目名称的权威存储是本地项目 .agent/manifest.jsonname 字段,最近项目列表通过 inspect_local_project_directory 读取;因此改名必须落在 manifest,而不是只改前端显示。

2. 目标

  1. 用户可以修改已有项目名称。
  2. 用户在首页输入创作需求后,系统用 LLM 从用户输入中提炼一个更贴近主题的项目名称;LLM 失败时回退到当前默认名,不阻断创作。
  3. 名称修改后,最近项目列表、当前项目上下文、窗口标题和后续 manifest 读取保持一致。
  4. 不改变项目目录路径、projectId、项目类型和本地权限模型。

3. 非目标

  • 不重命名项目所在文件夹。
  • 不引入远端项目名同步或新的持久化存储。
  • 不把项目名编辑扩展到素材画布、图片编辑器等其他项目对象的标题。
  • 不让 LLM 修改用户已手动确认过的名称;自动提炼只在新建首页工作区时执行一次。
  • 不修改 SpacetimeDB schema,也不涉及 /api/external/v1

4. 方案

4.1 名称权威与校验

  • 继续以 GameCreationAppManifest.name 作为唯一权威名称。
  • 新增 Rust Tauri 命令,例如 rename_local_game_project
    • 输入:projectPathname
    • 行为:校验项目路径、读取现有 manifest、更新 name 后通过现有 mutate_manifest_at/write_manifest 持久化。
    • 校验:trim 后非空、限制最大长度(建议 80 个字符,与 GDD 标题上限一致)、拒绝控制字符;不要求可移植文件名,因为不改变目录。
    • 并发:复用现有项目写锁、manifest 写锁和私有目录 ACL/权限校验;失败时保持原 manifest。
  • 最近项目列表和当前项目上下文必须基于命令返回的新 manifest 或重新读取的 manifest 更新。

4.2 UI 修改

  • 在项目页最近项目行加入“重命名”入口:
    • 点击后进入行内编辑态,预填当前项目名。
    • 保存时调用新命令;取消不写盘。
    • 保存成功后刷新该项目的目录状态,显示新名称。
    • 保存失败显示后端错误,并保留编辑值。
  • 当前项目上下文的 projectName 更新后:
    • WorkspaceLauncher 窗口标题自动跟随。
    • 工作台和后续 manifest 合并逻辑继续使用新 manifest。
  • 遵循现有 UI 约束:移动端可用、键盘可访问、按钮有清晰 aria-label,不新增平行页面。

4.3 LLM 自动提炼项目名

  • 在首页提交创作需求、自动创建工作区前,新增一次受限命名提炼调用。
  • 新增 Rust Tauri 命令,例如 suggest_automatic_project_name
    • 输入:用户首页 prompt,以及必要的附件元数据;不上传或读取附件正文,只允许文本/文件名等安全摘要参与。
    • Provider 路径:优先复用现有首页隔离 Codex/LLM 通道,不暴露无项目聊天命令。
    • 系统提示必须要求只返回一个简短中文项目名,不要解释、不要路径、不要凭据、不要原创性无关的整段方案。
    • 输出规范化:trim、拒绝空值和控制字符、限制到统一最大长度;失败或非法输出时返回 null
  • 首页创建流程:
    1. 先调用命名提炼。
    2. 成功则把提炼名传给自动建项命令;失败则继续使用现有 GameAgent 项目 {短ID}
    3. 无论命名提炼是否成功,都继续创建项目并投递首条需求。
  • create_automatic_local_game_project 增加可选 name 入参;未提供时保持现有默认名,已提供时走同一套名称校验。
  • 手动“新建项目”仍默认使用文件夹名;后续用户可手动重命名,不在此入口额外调用 LLM。

5. 验收标准

  1. 新建首页工作区后,manifest 名称是 LLM 提炼名或明确回退的默认名;首条创作流程不因命名失败中断。
  2. 项目页可重命名已有项目;保存后 .agent/manifest.jsonname、项目列表、当前项目上下文和窗口标题一致。
  3. 空名称、控制字符、超长名称被拒绝;失败不会损坏 manifest。
  4. 重命名不会改变项目路径、目录名、projectId、任务、资源、版本和权限。
  5. 命名提炼失败、Provider 未配置或返回非法内容时,流程回退默认名并继续。
  6. Rust 命令测试覆盖:成功重命名、空/超长/控制字符拒绝、并发 manifest 写入、不存在项目、自动建项自定义名和默认名回退。
  7. 前端测试覆盖:项目页重命名成功/失败/取消、名称刷新、首页 LLM 命名成功与失败回退、窗口标题跟随。
  8. 通过定向 Rust 测试、前端相关测试、npm run typechecknpm run check:encodinggit diff --check

6. 风险与边界

  • LLM 可能返回过短、过长、无关或格式化内容;必须做服务端规范化并允许回退。
  • 自动命名增加一次 Provider 请求,可能带来延迟或费用;只在新首页工作区时执行,失败不重试或最多做一次轻量重试。
  • manifest 已有写锁/恢复机制,必须复用,避免绕过 ACL 或破坏并发写。
  • 最近项目列表存在异步刷新窗口,保存成功后应触发该项目状态刷新,避免旧名称短暂残留。
  • 首页隔离 Codex 通道当前被配置门禁禁止作为无项目聊天命令暴露;新增的命名命令只作为受限内部能力,不能恢复无项目项目文件读写。
## 需求文档:优化项目名称显示与命名链路 ### 1. 问题 当前项目名称只在创建时生成一次,且缺少用户可用的改名入口: - 首页自动创建的工作区固定命名为 `GameAgent 项目 {短ID}`,用户无法从名称看出真实创作主题。 - 代码现状:`apps/ai-game-creator-shell/src-tauri/src/commands.rs` 的 `create_automatic_local_game_project_at` 生成 `GameAgent 项目 {short_id}`。 - 手动新建项目直接把所选文件夹名作为项目名,无法表达“想做什么游戏”。 - 代码现状:`useHomeProjectCreation.ts` 使用 `projectNameFromPath(trimmedProjectPath)`。 - 客户端没有重命名项目名称的正式入口;项目名已展示在窗口标题、最近项目列表和工作台上下文中,但用户不能修改。 - 项目名称的权威存储是本地项目 `.agent/manifest.json` 的 `name` 字段,最近项目列表通过 `inspect_local_project_directory` 读取;因此改名必须落在 manifest,而不是只改前端显示。 ### 2. 目标 1. 用户可以修改已有项目名称。 2. 用户在首页输入创作需求后,系统用 LLM 从用户输入中提炼一个更贴近主题的项目名称;LLM 失败时回退到当前默认名,不阻断创作。 3. 名称修改后,最近项目列表、当前项目上下文、窗口标题和后续 manifest 读取保持一致。 4. 不改变项目目录路径、`projectId`、项目类型和本地权限模型。 ### 3. 非目标 - 不重命名项目所在文件夹。 - 不引入远端项目名同步或新的持久化存储。 - 不把项目名编辑扩展到素材画布、图片编辑器等其他项目对象的标题。 - 不让 LLM 修改用户已手动确认过的名称;自动提炼只在新建首页工作区时执行一次。 - 不修改 SpacetimeDB schema,也不涉及 `/api/external/v1`。 ### 4. 方案 #### 4.1 名称权威与校验 - 继续以 `GameCreationAppManifest.name` 作为唯一权威名称。 - 新增 Rust Tauri 命令,例如 `rename_local_game_project`: - 输入:`projectPath`、`name`。 - 行为:校验项目路径、读取现有 manifest、更新 `name` 后通过现有 `mutate_manifest_at`/`write_manifest` 持久化。 - 校验:trim 后非空、限制最大长度(建议 80 个字符,与 GDD 标题上限一致)、拒绝控制字符;不要求可移植文件名,因为不改变目录。 - 并发:复用现有项目写锁、manifest 写锁和私有目录 ACL/权限校验;失败时保持原 manifest。 - 最近项目列表和当前项目上下文必须基于命令返回的新 manifest 或重新读取的 manifest 更新。 #### 4.2 UI 修改 - 在项目页最近项目行加入“重命名”入口: - 点击后进入行内编辑态,预填当前项目名。 - 保存时调用新命令;取消不写盘。 - 保存成功后刷新该项目的目录状态,显示新名称。 - 保存失败显示后端错误,并保留编辑值。 - 当前项目上下文的 `projectName` 更新后: - `WorkspaceLauncher` 窗口标题自动跟随。 - 工作台和后续 manifest 合并逻辑继续使用新 manifest。 - 遵循现有 UI 约束:移动端可用、键盘可访问、按钮有清晰 aria-label,不新增平行页面。 #### 4.3 LLM 自动提炼项目名 - 在首页提交创作需求、自动创建工作区前,新增一次受限命名提炼调用。 - 新增 Rust Tauri 命令,例如 `suggest_automatic_project_name`: - 输入:用户首页 prompt,以及必要的附件元数据;不上传或读取附件正文,只允许文本/文件名等安全摘要参与。 - Provider 路径:优先复用现有首页隔离 Codex/LLM 通道,不暴露无项目聊天命令。 - 系统提示必须要求只返回一个简短中文项目名,不要解释、不要路径、不要凭据、不要原创性无关的整段方案。 - 输出规范化:trim、拒绝空值和控制字符、限制到统一最大长度;失败或非法输出时返回 `null`。 - 首页创建流程: 1. 先调用命名提炼。 2. 成功则把提炼名传给自动建项命令;失败则继续使用现有 `GameAgent 项目 {短ID}`。 3. 无论命名提炼是否成功,都继续创建项目并投递首条需求。 - `create_automatic_local_game_project` 增加可选 `name` 入参;未提供时保持现有默认名,已提供时走同一套名称校验。 - 手动“新建项目”仍默认使用文件夹名;后续用户可手动重命名,不在此入口额外调用 LLM。 ### 5. 验收标准 1. 新建首页工作区后,manifest 名称是 LLM 提炼名或明确回退的默认名;首条创作流程不因命名失败中断。 2. 项目页可重命名已有项目;保存后 `.agent/manifest.json` 的 `name`、项目列表、当前项目上下文和窗口标题一致。 3. 空名称、控制字符、超长名称被拒绝;失败不会损坏 manifest。 4. 重命名不会改变项目路径、目录名、`projectId`、任务、资源、版本和权限。 5. 命名提炼失败、Provider 未配置或返回非法内容时,流程回退默认名并继续。 6. Rust 命令测试覆盖:成功重命名、空/超长/控制字符拒绝、并发 manifest 写入、不存在项目、自动建项自定义名和默认名回退。 7. 前端测试覆盖:项目页重命名成功/失败/取消、名称刷新、首页 LLM 命名成功与失败回退、窗口标题跟随。 8. 通过定向 Rust 测试、前端相关测试、`npm run typecheck`、`npm run check:encoding`、`git diff --check`。 ### 6. 风险与边界 - LLM 可能返回过短、过长、无关或格式化内容;必须做服务端规范化并允许回退。 - 自动命名增加一次 Provider 请求,可能带来延迟或费用;只在新首页工作区时执行,失败不重试或最多做一次轻量重试。 - manifest 已有写锁/恢复机制,必须复用,避免绕过 ACL 或破坏并发写。 - 最近项目列表存在异步刷新窗口,保存成功后应触发该项目状态刷新,避免旧名称短暂残留。 - 首页隔离 Codex 通道当前被配置门禁禁止作为无项目聊天命令暴露;新增的命名命令只作为受限内部能力,不能恢复无项目项目文件读写。
Sign in to join this conversation.
2 Participants
Notifications
Due Date
2026-09-02
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#245