first-commit
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
refresh-contributors-wall / Refresh contributors wall cache bust (push) Waiting to run
ci / Validate workspace (push) Has been cancelled
landing-page-ci / Validate landing page (push) Has been cancelled
landing-page-deploy / Deploy landing page (push) Has been cancelled
github-metrics / Generate repository metrics SVG (push) Has been cancelled
refresh-contributors-wall / Refresh contributors wall cache bust (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
# 会话生命周期
|
||||
|
||||
这个模块聚焦项目内聊天会话的生命周期:
|
||||
|
||||
- 新建会话
|
||||
- 切换会话
|
||||
- 刷新恢复
|
||||
- 删除会话
|
||||
- 后续可扩展重命名等场景
|
||||
|
||||
## 当前用例
|
||||
|
||||
### `conversation-persistence`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`conversation-persistence`
|
||||
- 目标:覆盖会话创建、刷新恢复、历史切换
|
||||
- 核心步骤:
|
||||
1. 在第一个会话里发送 prompt
|
||||
2. 新建第二个会话
|
||||
3. 在第二个会话里发送新的 prompt
|
||||
4. 刷新页面
|
||||
5. 校验当前会话内容仍在
|
||||
6. 打开历史菜单切回第一个会话
|
||||
|
||||
### `conversation-delete-recovery`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`conversation-delete-recovery`
|
||||
- 目标:覆盖删除当前活跃会话后的回退逻辑
|
||||
- 核心步骤:
|
||||
1. 创建两个会话
|
||||
2. 删除当前活跃会话
|
||||
3. 校验界面自动回退到剩余会话
|
||||
4. 校验项目仍然保有可用会话
|
||||
|
||||
### `question-form-selection-limit`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`question-form-selection-limit`
|
||||
- 目标:覆盖快速确认里 checkbox 多选上限约束
|
||||
- 核心步骤:
|
||||
1. 创建项目并发送一条 prompt
|
||||
2. mock 返回带 `maxSelections: 2` 的 question form
|
||||
3. 连续点击三个视觉风格选项
|
||||
4. 校验始终只有两个选项处于选中态
|
||||
5. 校验第三个选项不会被错误选中
|
||||
|
||||
### `question-form-submit-persistence`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`question-form-submit-persistence`
|
||||
- 目标:覆盖 question form 提交后的用户回答落盘、锁定态与刷新回填
|
||||
- 核心步骤:
|
||||
1. mock 返回一个带必填项的 question form
|
||||
2. 选择答案并点击提交
|
||||
3. 校验会话里写入了用户回答消息
|
||||
4. 校验原表单进入 answered / locked 状态
|
||||
5. 刷新页面后再次确认锁定态和已选答案仍然正确
|
||||
|
||||
## 推荐后续补充
|
||||
|
||||
- 会话重命名
|
||||
- 删除最后一个会话后的自动重建
|
||||
- 历史菜单关闭/重新打开后的状态一致性
|
||||
- 长会话列表滚动与选中态
|
||||
- 多轮对话后的会话标题生成或更新策略
|
||||
@@ -0,0 +1,121 @@
|
||||
# 文件链路
|
||||
|
||||
这个模块聚焦项目文件相关的主链路:
|
||||
|
||||
- 文件上传
|
||||
- 文件 mention
|
||||
- staged attachment
|
||||
- 文件路由打开
|
||||
- 预览恢复
|
||||
|
||||
## 当前用例
|
||||
|
||||
### `file-mention`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`file-mention`
|
||||
- 目标:覆盖 `@` mention 选择文件并加入 staged attachment
|
||||
- 核心步骤:
|
||||
1. 通过项目文件 API 预置 `reference.txt`
|
||||
2. 在聊天输入框中输入 `@ref`
|
||||
3. 选择 mention popover 里的文件
|
||||
4. 校验输入框中插入 `@reference.txt`
|
||||
5. 校验 staged attachment 显示正确
|
||||
|
||||
### `file-upload-send`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`file-upload-send`
|
||||
- 目标:覆盖聊天区真实上传文件并发送
|
||||
- 核心步骤:
|
||||
1. 通过 composer 的隐藏 file input 上传文件
|
||||
2. 校验 staged attachment 出现
|
||||
3. 发送 prompt
|
||||
4. 校验用户消息里带上上传文件
|
||||
|
||||
### `deep-link-preview`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`deep-link-preview`
|
||||
- 目标:覆盖文件路由直达和预览恢复
|
||||
- 核心步骤:
|
||||
1. 生成 artifact
|
||||
2. 校验 URL 进入 `/projects/:id/files/:name`
|
||||
3. 离开项目文件路由
|
||||
4. 再次通过文件路由进入
|
||||
5. 校验预览 iframe 正常恢复
|
||||
|
||||
### `design-files-upload`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`design-files-upload`
|
||||
- 目标:覆盖 Design Files 面板真实上传、预览与打开
|
||||
- 核心步骤:
|
||||
1. 通过 Design Files 面板的上传入口选择图片
|
||||
2. 校验文件行出现在列表中
|
||||
3. 校验右侧预览信息出现
|
||||
4. 双击文件行
|
||||
5. 校验文件以 tab 形式打开
|
||||
|
||||
### `design-files-delete`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`design-files-delete`
|
||||
- 目标:覆盖 Design Files 面板删除文件以及打开 tab 的清理
|
||||
- 核心步骤:
|
||||
1. 先上传一张图片
|
||||
2. 回到 Design Files 面板
|
||||
3. 打开文件行菜单并执行删除
|
||||
4. 确认文件行从列表中消失
|
||||
5. 确认对应文件 tab 也被清理
|
||||
|
||||
### `design-files-tab-persistence`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`design-files-tab-persistence`
|
||||
- 目标:覆盖多个打开文件 tab 在刷新后的恢复
|
||||
- 核心步骤:
|
||||
1. 先上传两张图片
|
||||
2. 确认两张图片都打开为 tab
|
||||
3. 切换当前 active tab
|
||||
4. 刷新页面
|
||||
5. 确认两个 tab 都被恢复
|
||||
6. 确认刷新前的 active tab 仍然是 active
|
||||
|
||||
## 推荐后续补充
|
||||
|
||||
### `deck-pagination-per-file-isolated`
|
||||
|
||||
- 状态:待自动化
|
||||
- 对应 flow:`deck-pagination-per-file-isolated`
|
||||
- 目标:覆盖多个 deck HTML 之间的分页状态隔离
|
||||
- 核心步骤:
|
||||
1. 打开两个多页 deck 文件
|
||||
2. 分别停留在不同页码
|
||||
3. 来回切换文件 tab
|
||||
4. 校验每个文件维持自己的页码
|
||||
|
||||
### `uploaded-image-renders-in-preview`
|
||||
|
||||
- 状态:待自动化
|
||||
- 对应 flow:`uploaded-image-renders-in-preview`
|
||||
- 目标:覆盖上传图片参与生成后,预览中的图片真实可加载
|
||||
- 核心步骤:
|
||||
1. 上传图片作为参考素材
|
||||
2. 生成引用该图片的 HTML artifact
|
||||
3. 进入预览 iframe
|
||||
4. 校验对应 `img` 的 `src` 可解析且不是 broken image
|
||||
|
||||
### `python-source-preview`
|
||||
|
||||
- 状态:待自动化
|
||||
- 对应 flow:`python-source-preview`
|
||||
- 目标:覆盖 `.py` 文件在主工作区中的源码预览能力
|
||||
- 核心步骤:
|
||||
1. 通过项目文件 API 预置一个 `.py` 文件
|
||||
2. 在主工作区打开该文件
|
||||
3. 校验文件查看器进入源码/文本预览模式
|
||||
4. 校验能看到 Python 源码内容,而不是空白或不支持状态
|
||||
|
||||
- 图片文件上传与缩略图展示
|
||||
- 刷新后 staged attachment 清理策略
|
||||
@@ -0,0 +1,88 @@
|
||||
# 项目创建与生成
|
||||
|
||||
这个模块聚焦主入口链路:
|
||||
|
||||
- 创建项目
|
||||
- 进入工作区
|
||||
- 发送 prompt
|
||||
- 生成 artifact
|
||||
- 打开预览
|
||||
|
||||
## 当前用例
|
||||
|
||||
### `prototype-basic`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`standard`
|
||||
- 目标:覆盖 prototype 项目的主 happy path
|
||||
- 核心步骤:
|
||||
1. 创建 `prototype` 项目
|
||||
2. 输入 prompt
|
||||
3. mock `/api/chat` SSE 返回 HTML artifact
|
||||
4. 校验生成文件出现在工作区
|
||||
5. 校验 iframe 预览正常
|
||||
|
||||
### `deck-basic`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`standard`
|
||||
- 目标:覆盖 deck 项目创建分支
|
||||
- 核心步骤:
|
||||
1. 切换到 `deck` 创建 tab
|
||||
2. 创建项目
|
||||
3. 发送 prompt
|
||||
4. mock 返回 deck artifact
|
||||
5. 校验预览正常
|
||||
|
||||
### `design-system-selection`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`design-system-selection`
|
||||
- 目标:覆盖设计系统选择后创建项目,并确认项目元信息保留了该选择
|
||||
- 核心步骤:
|
||||
1. mock 设计系统列表
|
||||
2. 打开设计系统选择器
|
||||
3. 搜索并选择指定设计系统
|
||||
4. 创建项目
|
||||
5. 校验项目页 meta 中出现设计系统名称
|
||||
|
||||
### `example-use-prompt`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`example-use-prompt`
|
||||
- 目标:覆盖 Examples 页的快捷创建链路
|
||||
- 核心步骤:
|
||||
1. mock skills 列表,提供一个示例卡片
|
||||
2. 切到 Examples 页
|
||||
3. 点击 `Use this prompt`
|
||||
4. 校验项目被直接创建
|
||||
5. 校验聊天输入框预填了 example prompt
|
||||
|
||||
### `generation-does-not-create-extra-file`
|
||||
|
||||
- 状态:已自动化
|
||||
- 对应 flow:`generation-does-not-create-extra-file`
|
||||
- 目标:覆盖“没有新 prompt 却自己多生成一个 HTML 文件”的回归风险
|
||||
- 核心步骤:
|
||||
1. 生成一个 mocked artifact
|
||||
2. 通过 files API 记录当前项目文件集合
|
||||
3. 刷新页面但不发送新 prompt
|
||||
4. 再次读取 files API
|
||||
5. 校验文件集合没有变化,也没有新增 HTML 文件
|
||||
|
||||
## 推荐后续补充
|
||||
|
||||
### `deck-pagination-next-prev-correctness`
|
||||
|
||||
- 状态:待自动化
|
||||
- 对应 flow:`deck-pagination-next-prev-correctness`
|
||||
- 目标:覆盖 deck 预览上一页 / 下一页按钮的方向正确性
|
||||
- 核心步骤:
|
||||
1. 打开多页 deck HTML
|
||||
2. 进入中间页
|
||||
3. 点击上一页并校验页码递减
|
||||
4. 点击下一页并校验页码递增
|
||||
|
||||
- template 项目创建
|
||||
- 创建项目后的刷新恢复
|
||||
- 创建失败或必填校验
|
||||
Reference in New Issue
Block a user