清理废弃模块并完善测试基础设施
This commit is contained in:
@@ -1,104 +1,70 @@
|
||||
# QtDesktopPet 当前路线与结构收口
|
||||
|
||||
本文档是当前有效的开发路线总览。旧版长文档已归档到 `docs/archive/QtDesktopPet_后续功能规划与结构审查_旧版.md`。
|
||||
更新时间:2026-07-16
|
||||
|
||||
## 当前产品状态
|
||||
## 产品定位
|
||||
|
||||
项目当前是一个 Windows 优先的 Qt 6 Widgets 桌面宠物应用,主要能力包括:
|
||||
QtDesktopPet 当前定位为轻量 Windows 桌面宠物,核心体验是角色动画、简短 AI 对话、AI 原生联网、本地提醒和天气查询。产品不再承担本地文件管理、应用启动或代码工作区 Agent 职责。
|
||||
|
||||
- 透明无边框桌宠窗口、拖动、置顶、托盘和单实例唤醒。
|
||||
- PNG 序列帧角色包、多状态动画、角色导入、切换、导出和用户角色目录管理。
|
||||
- AI 对话,支持 OpenAI Compatible、OpenAI 官方、Google Gemini、DeepSeek、Custom 配置。
|
||||
- 输入框联网模式,使用 AI Provider 原生联网能力,不再维护旧搜索引擎聚合。
|
||||
- 定时提醒,支持一次性和每天/每周/每月重复提醒、音效管理、历史保留和隐藏/AI 忙通知规则。
|
||||
- 天气查询,使用 Open-Meteo、默认城市、IP fallback、多候选提示和默认城市测试。
|
||||
- 对话历史管理,支持本地保存、关键词搜索、Provider/模型/时间筛选、Markdown/JSON 导出。
|
||||
- 本地应用启动,支持登记应用、别名、手选 `.exe`、启动前确认和开机自启动配置。
|
||||
- 本地文件操作 v1,支持读取文本、列目录、复制、备份和重命名。
|
||||
- 本地工作区 Agent v1b,支持选择工作区、扫描索引、搜索文件、搜索文本、读取文本文件、项目结构摘要、文件内容总结、打开普通文件、显示所在位置和独立 Agent 窗口。
|
||||
## 已落地模块
|
||||
|
||||
## 当前结构边界
|
||||
|
||||
已经形成的模块边界:
|
||||
|
||||
| 模块 | 目录 | 状态 |
|
||||
| 模块 | 主要实现 | 当前状态 |
|
||||
| --- | --- | --- |
|
||||
| AI 对话 | `src/ai/` | 已落地 |
|
||||
| 意图分发 | `src/assistant/` | 已落地 |
|
||||
| 角色包 | `src/character/` | 已落地 |
|
||||
| 配置与密钥 | `src/config/` | 已落地 |
|
||||
| 文件操作 v1 | `src/fileops/` | 已落地,后续将被 Workspace Agent 替代 |
|
||||
| 应用启动 | `src/launcher/` | 已落地 |
|
||||
| 通知 | `src/notification/` | 已落地 |
|
||||
| 提醒 | `src/reminder/` | 已落地 |
|
||||
| 状态机 | `src/state/` | 已落地 |
|
||||
| 系统能力 | `src/system/` | 已落地 |
|
||||
| 天气 | `src/weather/` | 已落地 |
|
||||
| 联网模式 | `src/web/` | 已落地 |
|
||||
| 本地工作区 Agent | `src/workspace/` + `src/ui/WorkspaceAgentWindow.*` | v1a.1/v1b/v1b.5 独立窗口化已落地 |
|
||||
| 桌宠与动画 | `src/ui/`、`src/character/`、`src/state/` | 透明窗口、拖动、托盘、单实例、多状态动画、懒加载和缓存管理已落地 |
|
||||
| AI 对话 | `src/ai/` | OpenAI-compatible、Gemini、DeepSeek/Custom 配置、流式输出、取消和历史管理已落地 |
|
||||
| 联网模式 | `src/web/` | OpenAI 官方 Web Search 与 Gemini Google Search grounding 已落地;不支持 Provider 明确提示 |
|
||||
| 提醒 | `src/reminder/`、`src/notification/` | 一次性和日/周/月重复、编辑 pending、20 天历史、音效、通知和兜底调度已落地 |
|
||||
| 天气 | `src/weather/` | Open-Meteo、默认城市、IP fallback、多候选提示和默认城市测试已落地 |
|
||||
| 角色管理 | `src/character/`、设置页 | 导入、验证、切换、删除用户角色、导出和打开用户角色目录已落地 |
|
||||
| 配置与发布 | `src/config/`、`src/system/`、`tools/`、`installer/` | 原子/兼容配置、开机自启动、打包和安装脚本已落地 |
|
||||
|
||||
`PetWindow` 仍然承担较多 UI 编排职责。后续新增大功能必须优先放在独立模块和 Controller 中,`PetWindow` 只保留入口、展示和确认交互。
|
||||
## 已移除模块
|
||||
|
||||
## 下一阶段主线
|
||||
以下模块已从源码、CMake、意图分发、设置页和托盘入口中删除:
|
||||
|
||||
下一阶段主线仍是本地工作区 Agent,而不是继续扩展旧 `src/fileops/`。
|
||||
- 聊天驱动的本地文件操作。
|
||||
- 本地应用启动与应用登记。
|
||||
- 本地工作区 Agent、独立 Agent 窗口和 `Alt+A` 全局快捷键。
|
||||
|
||||
v1a.1/v1b/v1b.5 已完成:
|
||||
删除原因是这些能力显著扩大安全边界和维护面,并使桌宠产品偏离轻量助手定位。应用自身的“开机自启动”不属于应用启动模块,继续保留。
|
||||
|
||||
- 用户选择一个本地工作区目录。
|
||||
- 桌宠可以扫描、搜索、读取和分析该工作区内文件。
|
||||
- 桌宠可以打开工作区内普通文件、打开文件夹、显示文件所在位置。
|
||||
- 独立 Agent 窗口可以展示文件结果、文本命中、最近读取、用户任务、本地工具结果和 AI 分析结果,并对选中结果执行读取、打开、显示位置。
|
||||
- 写操作误分发已收口:创建/新建/写入/修改不会再误走旧 fileops 的读取文本文件流程。
|
||||
- 文本搜索误分发已收口:`含class的文件 / 包含 class 的文件 / 找一下含 class 的文件` 会走工作区全文搜索,不再弹旧文本文件选择框。
|
||||
兼容策略:程序不主动删除用户目录中的旧 `launcher_config.json`;旧 `app_config.json` 中的 `agent` 对象会被忽略,后续保存时不再写回。
|
||||
|
||||
后续目标:
|
||||
## 当前意图边界
|
||||
|
||||
- 桌宠可以生成文件修改计划。
|
||||
- 创建、修改、复制、移动、重命名、删除到回收站等写操作必须先展示计划并等待用户确认。
|
||||
- 不允许访问工作区外路径。
|
||||
- 不允许执行系统命令、脚本或聊天文本中的命令参数。
|
||||
- 不允许永久删除文件。
|
||||
聊天意图优先级固定为:
|
||||
|
||||
正式施工计划见:
|
||||
```text
|
||||
Reminder > Weather > Chat/WebChat
|
||||
```
|
||||
|
||||
`docs/agent/DesktopPet_本地工作区Agent_施工计划.md`
|
||||
- 含“提醒”等明确提醒表达时进入提醒模块。
|
||||
- 含天气、气温、降雨等表达时进入天气模块。
|
||||
- 其余内容进入普通 AI 对话;输入框联网开关开启且 Provider 支持时进入联网对话。
|
||||
- “读取文件”“打开 Codex”“分析这个项目”等文本不会触发本地系统能力。
|
||||
|
||||
## 功能优先级建议
|
||||
## 下一阶段建议
|
||||
|
||||
当前聊天意图建议保持以下原则:
|
||||
优先完成稳定性和发布收口,不再横向扩展高权限本地自动化:
|
||||
|
||||
1. 提醒明确优先,例如“明天提醒我看天气”应创建提醒。
|
||||
2. 天气明确问答走天气模块,例如“明天西安天气怎么样”。
|
||||
3. 工作区相关文件和代码任务走 Workspace Agent,例如“搜索这个项目里的 README”“读取 main.cpp”“分析这个项目”;重命名等写操作留到后续阶段。
|
||||
4. 明确应用启动走 Launcher,例如“打开 Codex”“启动酷狗音乐”。
|
||||
5. 其余走普通聊天或联网聊天。
|
||||
1. 完成全量手动回归,重点覆盖提醒调度、联网 Provider 差异、天气失败路径和旧配置兼容。
|
||||
2. 完成 Release 包、安装、卸载、开机自启动和无 Qt 开发环境运行验证。
|
||||
3. 完成静置、隐藏、动画缓存、AI 连续对话、提醒、天气和联网请求的性能采样。
|
||||
4. 根据实测问题修复稳定性,不新增复杂提醒规则、网页抓取或高权限本地能力。
|
||||
5. 确认角色、图标、音效素材的公开再分发授权。
|
||||
|
||||
不能简单用“文件 / 打开 / 搜索”这类宽关键词吞掉所有请求。尤其要避免:
|
||||
## 延期或非目标
|
||||
|
||||
- “打开微信”误判为工作区打开文件。
|
||||
- “搜索 Qt 最新版本”误判为工作区搜索。
|
||||
- “把天气截图保存到桌面”误判为天气查询。
|
||||
|
||||
## 当前延期项
|
||||
|
||||
以下能力继续延期,不进入本地工作区 Agent 第一阶段:
|
||||
|
||||
- 语音输入和语音朗读。
|
||||
- Live2D、GIF、视频形象。
|
||||
- 插件系统。
|
||||
- 云同步和自动更新。
|
||||
- 长期记忆系统。
|
||||
- 角色市场或角色包分享平台。
|
||||
- Shell 命令执行、脚本执行、自动安装依赖。
|
||||
- 自动 git commit、自动推送、自动联网下载并执行文件。
|
||||
- 工作区外全盘搜索。
|
||||
- 复杂网页抓取和旧搜索引擎聚合。
|
||||
- 语音输入输出、Live2D、GIF/视频角色。
|
||||
- 插件系统、云同步、自动更新、长期记忆和角色市场。
|
||||
- 空气质量、天气预警、国内天气 Provider 和天气提醒联动。
|
||||
- 复杂提醒规则、跨平台通知和自定义稍后提醒间隔。
|
||||
- 网页全文抓取、搜索引擎页面解析、自建结构化搜索后端。
|
||||
- 本地文件访问、应用启动、命令执行和工作区 Agent。
|
||||
|
||||
## 验收策略
|
||||
|
||||
- Codex 不调用 CMake、`cmake --build`、Qt Creator 构建或等价构建命令。
|
||||
- 每完成一个模块,先做静态检查和逻辑推演。
|
||||
- 编译和运行验证由用户手动执行。
|
||||
- 功能验收按 `docs/QtDesktopPet_测试清单与验收标准.md`。
|
||||
- 性能和发布验收按 `docs/performance_stability_check.md`。
|
||||
- 统一测试入口见 `docs/QtDesktopPet_测试清单与验收标准.md`。
|
||||
- 性能与发布验证入口见 `docs/performance_stability_check.md`。
|
||||
- 每次能力调整后必须同步 README、测试清单、CMake 和设置页,避免残留不可达代码。
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
本文档用于全功能统一手测验收。Codex 不调用 CMake 或构建命令;需要编译验证时由用户手动构建并反馈结果。
|
||||
|
||||
每次实际执行结果保存到 `docs/test-records/`,不得直接用某次结果覆盖本验收标准。内部自动化入口见 `internal/qa/README.md`。
|
||||
|
||||
## 验收记录格式
|
||||
|
||||
每个用例建议记录:
|
||||
@@ -24,7 +26,7 @@ Qt 版本:
|
||||
- 日志不包含完整 API Key、Authorization、完整用户消息正文、完整错误响应正文或完整搜索词。
|
||||
- 设置页保存后立即生效,重启后配置仍能读取。
|
||||
- 所有损坏 JSON 配置都应备份为 `.broken.yyyyMMdd-HHmmss.json` 后回退默认或忽略损坏数据。
|
||||
- 所有涉及本地文件写入的操作必须由用户选择路径,并在执行前显示计划和二次确认。
|
||||
- 角色导入/导出、音效导入和历史导出只能使用用户明确选择的路径;覆盖或删除用户数据时必须确认。
|
||||
- 不运行 CMake 的自动验证;构建和运行由用户手动完成。
|
||||
|
||||
## 基础窗口与托盘
|
||||
@@ -37,6 +39,8 @@ Qt 版本:
|
||||
| 隐藏托盘 | 托盘菜单隐藏/显示 | 隐藏后动画暂停,显示后恢复 | TODO |
|
||||
| 单实例 | 已运行时再次启动 exe | 只有一个进程,已有实例被唤醒 | TODO |
|
||||
| 设置页居中 | 多屏或重复打开设置页 | 设置页出现在当前屏幕可用区域内并置前 | TODO |
|
||||
| 应用设置持久化 | 修改缩放、性能模式、隐藏暂停、懒加载和缓存设置后重启 | 设置立即生效,重启后保持,动画和窗口尺寸无异常 | TODO |
|
||||
| 开机自启动 | 在应用页依次开启、重启检查、再关闭 | 开启时写入当前用户 Run 项且路径正确;关闭时移除;默认关闭 | TODO |
|
||||
|
||||
## 角色管理
|
||||
|
||||
@@ -59,7 +63,7 @@ Qt 版本:
|
||||
| 连接测试 | 点击测试连接 | 成功显示成功;错误配置显示明确错误 | TODO |
|
||||
| 普通聊天 | 发送短消息 | `think` 后进入 `talk`,气泡显示回复 | TODO |
|
||||
| 流式回复 | 启用流式并发送消息 | 首段前保持 `think`,输出中保持 `talk` | TODO |
|
||||
| AI 忙 | 回复中再次发送聊天/天气/搜索 | 不启动第二个请求,显示忙提示 | TODO |
|
||||
| AI 忙 | 回复中再次发送聊天/天气/联网请求 | 不启动第二个请求,显示忙提示 | TODO |
|
||||
| 取消 AI | 右键取消 AI 请求 | 请求取消,状态恢复,气泡提示取消 | TODO |
|
||||
| 历史保存 | 开启本地保存后聊天 | 重启后历史可读取 | TODO |
|
||||
| 历史搜索 | 在设置页按关键词搜索 | 只显示匹配记录 | TODO |
|
||||
@@ -67,6 +71,7 @@ Qt 版本:
|
||||
| 导出 Markdown | 导出筛选结果为 `.md` | 文件包含角色、时间、Provider/模型和正文,不含 API Key | TODO |
|
||||
| 导出 JSON | 导出筛选结果为 `.json` | JSON 可解析,包含 messages 数组,不含 API Key | TODO |
|
||||
| 清空历史 | 点击清空聊天记录并确认 | 内存和本地历史清空,面板刷新 | TODO |
|
||||
| 关闭历史保存 | 关闭本地保存后聊天并重启 | 本轮消息只在内存存在,重启后不写入本地历史 | TODO |
|
||||
|
||||
## 定时提醒
|
||||
|
||||
@@ -90,6 +95,8 @@ Qt 版本:
|
||||
| 历史清理 | 构造 21 天前 triggered/canceled 后清理 | 删除 20 天前历史,保留最近 20 天和 pending | TODO |
|
||||
| 音效导入 | 导入合法 PCM wav | 可选择、试听、删除 | TODO |
|
||||
| 内置音效保护 | 选择内置音效点击删除 | 删除按钮禁用或提示不可删除 | TODO |
|
||||
| 睡眠与时间变化 | 睡眠跨过提醒时间;再分别模拟系统时间向前和向后变化 | 唤醒或向前跳变后补扫一次;向后跳变不提前触发 | TODO |
|
||||
| 提醒保存失败 | 在隔离测试数据上模拟提醒文件不可写并等待到期 | 保持 pending,不播放、不通知、不显示气泡,后续仍可重试 | TODO |
|
||||
|
||||
## 天气查询
|
||||
|
||||
@@ -106,73 +113,20 @@ Qt 版本:
|
||||
| 默认城市测试 | 设置页点击测试默认城市 | 显示匹配城市/行政区/国家,不自动保存 | TODO |
|
||||
| 未知城市 | 输入无法解析城市 | 明确错误,不崩溃 | TODO |
|
||||
| 不支持项 | 查询空气质量/预警/穿衣指数 | 明确提示 v1 暂不支持 | TODO |
|
||||
| 天气网络失败 | 断网或阻断天气请求后查询 | 明确提示网络/超时错误,UI 不阻塞,恢复网络后可再次查询 | TODO |
|
||||
|
||||
## 本地文件操作
|
||||
|
||||
当前源码仍保留安全受限的本地文件操作 v1。后续将由本地工作区 Agent 替代;替代完成前,以下用例仍作为回归项保留。
|
||||
## 已移除本地能力回归
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 读取文本 | 输入读取文本文件请求并选择 txt/md/log | 显示内容预览,最多读取前 64KB | TODO |
|
||||
| 非文本拒绝 | 选择 exe/png 等非文本 | 提示只允许常见文本文件 | TODO |
|
||||
| 列目录 | 输入列出文件夹请求并选择临时目录 | 显示前 200 项,区分目录/文件 | TODO |
|
||||
| 复制文件 | 选择源文件和目标目录 | 显示计划,确认后复制;目标存在则拒绝覆盖 | TODO |
|
||||
| 创建备份 | 选择文件备份 | 显示计划,确认后生成 `.backup.yyyyMMdd-HHmmss` 文件 | TODO |
|
||||
| 重命名 | 选择文件并输入新文件名 | 显示计划,确认后重命名;目标存在拒绝 | TODO |
|
||||
| 危险词拒绝 | 输入删除/覆盖/移动/执行脚本/运行命令 | 明确拒绝,不弹路径选择,不做文件操作 | TODO |
|
||||
| 系统目录拒绝 | 尝试选择 Windows/Program Files 下路径 | 提示不允许访问系统目录 | TODO |
|
||||
| 符号链接拒绝 | 选择符号链接或链接目录内路径 | 提示不允许操作符号链接路径 | TODO |
|
||||
| zip 延期 | 输入打包/压缩请求 | 提示 zip 打包暂不启用 | TODO |
|
||||
| 文件操作已移除 | 输入 `读取文件`、`创建 test.txt`、`复制文件` | 不弹文件选择框,不读取或修改本地文件;按普通 AI 对话处理 | TODO |
|
||||
| 应用启动已移除 | 输入 `打开 Codex`、`启动酷狗音乐` | 不弹 exe 选择框或确认框,不启动任何程序;按普通 AI 对话处理 | TODO |
|
||||
| 工作区 Agent 已移除 | 输入 `打开工作区`、`分析这个项目`、`含 class 的文件` | 不扫描目录、不弹 Agent 窗口、不访问本地项目;按普通 AI 对话处理 | TODO |
|
||||
| 菜单入口清理 | 检查桌宠右键菜单和托盘菜单 | 不再出现 `Agent 工作区` 入口 | TODO |
|
||||
| 设置页清理 | 打开设置页 | 不再出现 `应用启动` 和 `Agent` 页面;应用页仍有 `开机自启动` | TODO |
|
||||
| 快捷键清理 | 按 `Alt+A` | 不再呼出 Agent 窗口,不影响其他快捷键或输入 | TODO |
|
||||
| 旧配置兼容 | 用户目录保留旧 `launcher_config.json`,`app_config.json` 保留 `agent` 对象后启动 | 程序不崩溃,不读取旧能力配置;保存应用配置后不再写入 `agent` | TODO |
|
||||
|
||||
## 本地工作区 Agent
|
||||
|
||||
v1a.1/v1b/v1b.5 已接入工作区只读分析、打开定位和独立 Agent 窗口;创建、修改、移动、删除到回收站仍属后续阶段。正式施工计划见 `docs/agent/DesktopPet_本地工作区Agent_施工计划.md`。
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 选择工作区 | 选择普通项目目录 | 显示当前工作区并扫描索引 | TODO |
|
||||
| 系统目录拒绝 | 选择 `C:/Windows` 或 `Program Files` | 拒绝作为工作区 | TODO |
|
||||
| 扫描跳过目录 | 工作区含 `.git/build/node_modules/release_packages` | 扫描跳过这些目录,结果数量受限制 | TODO |
|
||||
| 搜索文件名 | 输入 `搜索 README` | 返回最多 30 个相对路径结果 | TODO |
|
||||
| 独立 Agent 窗口 | 输入 `搜索 README` | 独立窗口展示上一轮结果,可选中结果;左侧结果/文本命中/上下文、中间对话、右侧详情分区清晰 | TODO |
|
||||
| 窗口非客户区 | 打开独立 Agent 窗口 | 没有白色系统标题栏,标题区与整体深色 UI 协调,顶部可拖动移动窗口 | TODO |
|
||||
| 搜索文本 | 输入 `搜索包含 class 的文件` | 返回路径、行号和片段,跳过二进制和敏感文件 | TODO |
|
||||
| 紧凑文本搜索 | 输入 `含class的文件`、`包含 class 的文件`、`找一下含 class 的文件` | 走 Workspace 文本搜索,不弹旧文本文件选择框,关键词提取为 `class` | TODO |
|
||||
| 文本命中窗口 | 输入 `搜索包含 class 的文件` | 独立窗口展示文本命中和关联文件列表,选中文本命中时右侧详情同步 | TODO |
|
||||
| 读取文本文件 | 输入 `读取 main.cpp` | 读取工作区内文本文件,超大文件截断 | TODO |
|
||||
| 窗口读取 | 搜索后在独立窗口选中结果并点击 `读取` | 读取选中文本文件,目录项读取按钮禁用 | TODO |
|
||||
| 敏感文件拒绝 | 读取 `.env`、`*.pem`、`credentials.json` | 默认拒绝或强确认,不展示敏感内容 | TODO |
|
||||
| 项目结构摘要 | 输入 `分析这个项目` | 显示本地结构摘要;AI 可用且空闲时补简短分析 | TODO |
|
||||
| 文件总结 | 读取文件后输入 `总结这个文件` | 显示本地内容,AI 可用且空闲时补简短总结 | TODO |
|
||||
| 文件分析同义词 | 读取 `main.cpp` 后输入 `分析这个文件`、`解释这个文件`、`看看这个文件` | 走 Workspace 最近读取文件分析,不弹旧文本文件选择框 | TODO |
|
||||
| 文件名分析 | 输入 `分析 main.cpp`、`解释 README`、`main.cpp 是干嘛的` | 走 Workspace 文件读取和 AI 分析流程,不落入普通 AI 对话 | TODO |
|
||||
| 总结无上下文 | 未读取工作区文件时输入 `总结这个文件` | 提示先读取一个工作区文件或输入具体文件名,不弹旧文件选择框 | TODO |
|
||||
| 读取文件泛请求 | 输入 `读取文件` | 仍走旧 fileops 文本文件选择流程 | TODO |
|
||||
| 上下文引用 | 先搜索 README,再输入 `读取第一个` | 正确引用上一轮结果;上下文过期则要求重新选择 | TODO |
|
||||
| 打开文件 | 先搜索 README,再输入 `打开第一个` | 弹出确认框,确认后用系统默认程序打开;取消不打开 | TODO |
|
||||
| 窗口打开 | 搜索后在独立窗口选中结果并点击 `打开` | 文件弹确认后打开;目录直接打开 | TODO |
|
||||
| 打开目录 | 输入 `打开 docs` 或 `打开这个项目里的 docs` | 打开工作区内目录 | TODO |
|
||||
| 显示位置 | 输入 `显示 main.cpp 所在位置` 或 `打开所在文件夹` | 打开工作区内文件所在目录 | TODO |
|
||||
| 窗口显示位置 | 搜索后在独立窗口选中结果并点击 `位置` | 打开选中项所在目录 | TODO |
|
||||
| 右键入口 | 右键桌宠选择 `Agent 工作区` | 独立 Agent 窗口打开;未选择工作区时显示空状态,不强制选择目录 | TODO |
|
||||
| 托盘入口 | 托盘菜单选择 `Agent 工作区` | 独立 Agent 窗口打开;桌宠隐藏时也可直接打开窗口 | TODO |
|
||||
| 默认快捷键 | 按 `Alt+A` | 呼出独立 Agent 窗口 | TODO |
|
||||
| Agent 设置 | 设置页 `Agent` 页关闭快捷键或修改快捷键后保存 | 快捷键立即按新配置生效,非法/冲突快捷键有明确提示 | TODO |
|
||||
| 自动显示设置 | 关闭 `工作区命令完成后自动显示 Agent 窗口` 后输入 `搜索 README` | 搜索正常完成,但独立窗口不自动弹出;手动入口仍可打开 | TODO |
|
||||
| 打开敏感/危险文件拒绝 | 尝试打开 `.exe/.ps1/.lnk/.env/*.pem/credentials.json` | 明确拒绝,不调用系统打开 | TODO |
|
||||
| 打开路径越界拒绝 | 尝试打开工作区外、系统目录、符号链接路径 | 明确拒绝 | TODO |
|
||||
| 创建误分发修复 | 输入 `创建 test.txt` | 提示当前不支持创建/写入,不弹读取文本文件选择框 | TODO |
|
||||
| 写入误分发修复 | 输入 `新建文件`、`写入 README`、`修改 main.cpp`、`修复 main.cpp`、`优化 main.cpp` | 明确拒绝当前阶段写操作,不弹读取文本文件选择框 | TODO |
|
||||
| 危险能力拒绝 | 请求运行脚本、执行命令、自动安装依赖、自动 git commit | 明确拒绝,不调用系统命令 | TODO |
|
||||
|
||||
后续阶段验收项:
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 创建文件 | 创建 `test.txt` | 展示计划,确认后创建;目标存在拒绝 | TODO |
|
||||
| 修改文件 | 修改普通文本文件 | 展示计划,确认后写入;写入前生成备份 | TODO |
|
||||
| 移动/重命名 | 移动或重命名单文件 | 展示计划,确认后执行;工作区外和覆盖目标拒绝 | TODO |
|
||||
| 删除到回收站 | 删除普通文件 | 强确认后移动到回收站;永久删除和批量删除拒绝 | TODO |
|
||||
|
||||
## 联网模式
|
||||
|
||||
@@ -189,23 +143,34 @@ v1a.1/v1b/v1b.5 已接入工作区只读分析、打开定位和独立 Agent 窗
|
||||
| 设置页状态 | 切换 OpenAI/Gemini/DeepSeek/Custom | “联网模式”页即时显示可用/不可用/无法确认状态 | TODO |
|
||||
| 设置页测试 | 点击“测试联网模式” | 支持 Provider 发起测试,不支持 Provider 直接显示原因 | TODO |
|
||||
| 旧失败回归 | 打开联网后询问 `美国的首都在哪里` | 不再返回搜狗/360 帮助、登录、反馈页 | TODO |
|
||||
| 意图优先级 | `明天早上提醒我看天气` / `把天气截图保存到桌面` | 仍优先走提醒或文件操作,不受联网开关影响 | TODO |
|
||||
| 意图优先级 | `明天早上提醒我看天气` / `把天气截图保存到桌面` | 前者走提醒;后者可走天气或普通对话,但绝不触发本地文件保存 | TODO |
|
||||
| 联网开关双向记忆 | 启用记忆后分别执行关到开、开到关,不发送消息直接关闭并重开输入框 | 两个方向都保存最后状态;关闭记忆后使用默认开关值 | TODO |
|
||||
| 联网网络失败 | 支持 Provider 下模拟断网、超时或服务端错误 | 明确提示失败,状态恢复,可重新发起请求,不泄露完整错误正文 | TODO |
|
||||
|
||||
## 应用启动
|
||||
## 配置兼容与隐私
|
||||
|
||||
所有损坏测试都必须先备份用户数据,优先使用隔离测试账户或临时配置副本。
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 设置页登记 | 添加一个 `.exe`,填写名称和别名后保存 | 重启后登记项仍存在 | TODO |
|
||||
| 已登记启动 | 输入 `打开 <别名>` | 弹出确认框,确认后启动对应 exe | TODO |
|
||||
| 未知应用手选 | 输入 `打开酷狗音乐` 且未登记 | 弹出 exe 选择器,选择 `.exe` 后弹确认框 | TODO |
|
||||
| 记住手选应用 | 手选 exe 时勾选记住 | 后续同名请求直接命中登记应用并仍需确认 | TODO |
|
||||
| 用户取消选择 | 未知应用弹出选择器后取消 | 不启动任何程序,无配置写入 | TODO |
|
||||
| 用户取消确认 | 选择或命中应用后取消确认 | 不启动任何程序 | TODO |
|
||||
| 拒绝脚本 | 尝试选择 `.bat/.cmd/.ps1/.vbs/.js/.msi` | 被拒绝,不启动 | TODO |
|
||||
| 不执行命令 | 输入“运行 powershell 命令” | 不执行聊天文本命令;按安全规则拒绝或走普通聊天 | TODO |
|
||||
| 文件操作优先 | 输入 `打开文件夹` | 走文件操作或文件操作拒绝路径,不走应用启动 | TODO |
|
||||
| 设置页测试启动 | 选中登记应用点测试启动 | 先二次确认,确认后启动 | TODO |
|
||||
| 设置页开机自启动 | 应用设置页勾选/取消“开机自启动”并保存 | 当前用户 Run 注册表项写入/移除,重开设置页状态与实际注册表一致 | TODO |
|
||||
| App 配置损坏 | 写入非法 `app_config.json` 后启动 | 原文件备份为带时间戳的 broken 文件,程序使用默认配置启动 | TODO |
|
||||
| AI 配置损坏 | 写入非法 `ai_config.json` 后启动 | 备份损坏文件,AI 回退未配置状态,不泄露旧 Key | TODO |
|
||||
| 天气配置损坏 | 写入非法 `weather_config.json` 后启动 | 备份损坏文件,天气使用默认配置 | TODO |
|
||||
| 联网配置损坏 | 写入非法 `web_config.json` 后启动 | 备份损坏文件,联网开关使用默认配置 | TODO |
|
||||
| 提醒数据损坏 | 写入非法 `reminders.json` 后启动 | 备份损坏文件,不崩溃、不触发错误数据 | TODO |
|
||||
| 历史数据损坏 | 写入非法 `conversation_history.json` 后打开历史 | 备份损坏文件并忽略,历史面板可继续使用 | TODO |
|
||||
| 日志隐私 | 覆盖正常请求、错误 Key、错误 Base URL、天气和联网失败 | 日志不含 API Key、Authorization、完整消息或完整错误响应 | TODO |
|
||||
|
||||
## 自动化验证
|
||||
|
||||
内部 QA 与发布构建隔离。用户配置好 Qt 测试构建后执行核心逻辑测试;不需要编译的静态检查可直接执行:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File internal/qa/scripts/Invoke-StaticChecks.ps1
|
||||
```
|
||||
|
||||
当前自动化覆盖意图分发、提醒解析和类型、天气解析和模板、联网能力检测、聊天历史兼容,以及源码登记、废弃模块残留、默认资源和 GitHub 导出隔离。真实窗口、托盘通知、音效、网络 Provider、安装卸载仍按手测执行。
|
||||
|
||||
|
||||
## 发布与性能
|
||||
|
||||
@@ -244,8 +209,6 @@ UI 状态:
|
||||
| 提醒 | `CommandDispatcher -> ReminderCommandHandler -> ReminderManager` | 创建/查询/取消一次性和 daily/weekly/monthly;到点先保存 JSON,再播放音效和展示/通知 | 保存失败回滚内存,不播放、不通知、不气泡;隐藏和 AI 忙只发系统通知;拖动中进入可见队列;20 天前历史可清理 | 系统通知是否真正弹出受 Windows/托盘后端影响,Qt 只能确认发起状态 | v2 行为保持,复杂重复规则、跨平台通知、自定义稍后间隔延期 |
|
||||
| 角色 | 设置页角色页和 `CharacterPackageRepository` | 导入先验证再复制;切换保存后立即生效;用户角色可删除;任意角色可导出;可打开用户角色目录 | 内置角色不可删除/覆盖;导出目标存在需二次确认;损坏角色包不复制 | 目标目录权限失败、用户取消、角色包资源缺失 | 当前角色管理补全完成,角色市场/分享延期 |
|
||||
| 历史 | 设置页聊天页和 `ConversationManager/ConversationStore` | 新消息写入 `timestamp/provider/model`;旧 role/content 历史兼容读取;支持关键词、Provider、模型筛选;Markdown/JSON 导出 | 本地历史关闭时只显示内存记录;损坏历史备份后忽略;导出路径不可写时提示错误 | 超大历史由保存上限和筛选 UI 控制;导出文件由用户选择路径 | 历史管理补全完成,不导出 API Key,不记录完整聊天日志 |
|
||||
| 文件操作 | `CommandDispatcher -> PetWindow::handleFileOperationChatMessage() -> FileOperationManager` | 用户通过系统对话框选择路径;读取文本、列目录、复制、备份、重命名;写操作先展示计划并二次确认 | 删除/覆盖/移动/脚本/命令/截图保存/zip 直接拒绝;系统目录、符号链接、目标冲突、非法文件名均拒绝 | 文件选择对话框是安全边界;系统目录根据常见路径和环境变量识别 | v1 安全能力完成,zip 打包延期,不引入重依赖 |
|
||||
| 本地工作区 Agent | `CommandDispatcher -> PetWindow::handleWorkspaceChatMessage() -> WorkspaceController -> WorkspaceAgent/WorkspaceTool -> WorkspaceAgentWindow` | v1b.5 用户选择工作区后,扫描索引、搜索文件/文本、读取文本文件、生成本地摘要,AI 可用时补简短分析,并支持打开普通文件、打开文件夹、显示所在位置、独立 Agent 窗口、菜单入口和全局快捷键 | 工作区外路径、系统目录、符号链接、危险后缀、敏感文件、命令执行均拒绝;打开文件前确认;AI 忙时不阻塞本地结果 | 路径归一化、符号链接逃逸、敏感文件判断、意图误判、全局快捷键冲突是核心风险;写操作仍未进入当前阶段 | v1a.1/v1b/v1b.5 独立窗口化已落地;低风险写操作计划留到后续 |
|
||||
| 本地能力收缩 | `CommandDispatcher -> Reminder / Weather / Chat` | 本地文件、应用启动和工作区 Agent 文本不再进入系统工具链,且旧配置只被忽略 | AI 仍可能解释如何手动操作,但不得声称已访问文件、启动程序或执行命令 | 重点防止残留入口、旧配置读取和意图枚举引用 | 三个本地高权限模块已从当前产品中移除 |
|
||||
| 联网模式 | `ChatInputDialog -> PetWindow::submitWebChatMessage() -> WebChatManager` | 输入框联网开关开启后,支持 OpenAI 官方 Web Search 和 Gemini Google Search grounding;记住开关状态时用户切换会立即保存 | AI 未配置、Provider 不支持、超时、网络失败、无来源均明确提示;Web 忙时不启动第二个请求 | 不再维护旧搜索源聚合或 SearXNG 旧配置 | 联网模式完成,结构化搜索 API/自建后端延期 |
|
||||
| 应用启动 | `CommandDispatcher -> PetWindow::handleLaunchAppChatMessage() -> AppLaunchManager` | 用户输入打开/启动应用后,按登记别名、开始菜单、App Paths、手选 exe 顺序解析,启动前二次确认 | 配置关闭、未找到应用、用户取消、非 exe/lnk、脚本/安装包、路径不存在均不启动;手选记住失败只提示,不影响已确认启动 | 启动成功由系统返回值判断,目标应用自身异常不由桌宠控制;开始菜单和注册表发现仅 Windows 优先 | v1 完成,不支持脚本、命令行参数、管理员权限、跨平台发现 |
|
||||
| 发布/性能 | `tools/package_release.ps1` 和 `docs/performance_stability_check.md` | 发布脚本复制 exe、Qt runtime、角色/图标/音效资源、README、LICENSE;性能文档覆盖静置、AI、提醒、天气、联网模式、文件操作 | `windeployqt`、Inno Setup、安装/卸载验证需用户手动执行并记录 | 未经手动构建和实机安装不能确认二进制运行 | 验收入口已补齐,本轮不运行 CMake 或构建命令 |
|
||||
| 发布/性能 | `tools/package_release.ps1` 和 `docs/performance_stability_check.md` | 发布脚本复制 exe、Qt runtime、角色/图标/音效资源、README、LICENSE;性能文档覆盖静置、AI、提醒、天气和联网模式 | `windeployqt`、Inno Setup、安装/卸载验证需用户手动执行并记录 | 未经手动构建和实机安装不能确认二进制运行 | 验收入口已补齐,本轮不运行 CMake 或构建命令 |
|
||||
|
||||
+5
-2
@@ -9,7 +9,7 @@
|
||||
| `QtDesktopPet_后续功能规划与结构审查.md` | 当前功能状态、下一阶段路线和结构边界 |
|
||||
| `QtDesktopPet_测试清单与验收标准.md` | 功能测试清单、回归验收标准和静态推演记录 |
|
||||
| `performance_stability_check.md` | 性能采样、稳定性检查和发布验证入口 |
|
||||
| `agent/DesktopPet_本地工作区Agent_施工计划.md` | 本地工作区 Agent 的正式施工计划 |
|
||||
| `test-records/` | 每次回归、性能和候选发布的长期测试记录 |
|
||||
|
||||
## 归档文档
|
||||
|
||||
@@ -20,7 +20,9 @@
|
||||
| `archive/implementation_plan.md` | 早期分阶段实施计划,当前大部分阶段已完成或被后续模块替代 |
|
||||
| `archive/Qt_DesktopPet_开发文档.md` | 初版开发总纲,当前产品能力已超出第一版范围 |
|
||||
| `archive/QtDesktopPet_后续功能规划与结构审查_旧版.md` | 旧后续规划过长,包含大量已完成阶段和旧文件操作路线 |
|
||||
| `archive/DesktopPet 本地工作区 Agent 开发文档_草案.md` | 本地工作区 Agent 初稿,已整理为正式施工计划 |
|
||||
| `archive/DesktopPet 本地工作区 Agent 开发文档_草案.md` | 已终止的本地工作区 Agent 初稿 |
|
||||
| `archive/DesktopPet_本地工作区Agent_施工计划_已终止.md` | 工作区 Agent 路线已从当前产品移除 |
|
||||
| `archive/QtDesktopPet_本地工作区Agent_独立窗口化施工文档_已终止.md` | 独立 Agent 窗口路线已从当前产品移除 |
|
||||
|
||||
## 维护规则
|
||||
|
||||
@@ -28,4 +30,5 @@
|
||||
- 功能完成后,同步更新 README、测试清单和性能检查项。
|
||||
- 历史文档不再直接修改,除非补充归档说明。
|
||||
- GitHub 公开导出不包含 `docs/`;开发仓库保留完整文档。
|
||||
- 内部自动化测试位于 `internal/qa/`,只进入开发仓库,不进入 GitHub 公开导出和发布包。
|
||||
- 在构建卡住问题解决前,文档中的验证步骤仍以用户手动构建为准,不由 Codex 调用 CMake 或构建命令。
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
# DesktopPet 本地工作区 Agent 施工计划
|
||||
|
||||
> 归档说明:该路线已于 2026-07-16 从 QtDesktopPet 当前产品方向中移除,本文仅保留历史设计,不再作为施工依据。
|
||||
|
||||
## 1. 定位
|
||||
|
||||
本地工作区 Agent 是下一阶段核心功能。它不是继续维护旧版“文件操作 v1”,而是新增一个独立的工作区系统:
|
||||
+3
-1
@@ -1,5 +1,7 @@
|
||||
# QtDesktopPet 本地工作区 Agent 独立窗口化施工文档
|
||||
|
||||
> 归档说明:该路线已于 2026-07-16 从 QtDesktopPet 当前产品方向中移除,本文仅保留历史设计,不再作为施工依据。
|
||||
|
||||
## 0. 本次施工目标
|
||||
|
||||
当前项目已经有“本地工作区 Agent”面板雏形,能够显示:
|
||||
@@ -1227,4 +1229,4 @@ Agent 搜索、读取、分析文件
|
||||
用户确认后执行
|
||||
```
|
||||
|
||||
这是后续接近 Codex / Claude Code 工作流的基础。
|
||||
这是后续接近 Codex / Claude Code 工作流的基础。
|
||||
@@ -22,13 +22,13 @@
|
||||
默认采样当前 `QtDesktopPet` 进程 5 分钟,每 5 秒一条:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tools/perf_sample.ps1
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File internal/qa/scripts/perf_sample.ps1 -Scenario idle-5m
|
||||
```
|
||||
|
||||
指定 PID 采样:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File tools/perf_sample.ps1 -Pid 12345 -DurationSeconds 600
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File internal/qa/scripts/perf_sample.ps1 -Pid 12345 -Scenario idle-10m -DurationSeconds 600
|
||||
```
|
||||
|
||||
输出目录默认是:
|
||||
@@ -37,28 +37,34 @@ powershell -NoProfile -ExecutionPolicy Bypass -File tools/perf_sample.ps1 -Pid 1
|
||||
reports/perf/
|
||||
```
|
||||
|
||||
`reports/perf/` 已加入 `.gitignore`。需要沉淀结论时,只把摘要写入本文档,不提交原始采样 CSV。
|
||||
`reports/perf/` 已加入 `.gitignore`。原始 CSV 不提交;使用报告脚本生成统计摘要,审核并脱敏后写入对应的 `docs/test-records/` 记录:
|
||||
|
||||
```powershell
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File internal/qa/scripts/New-PerformanceReport.ps1 `
|
||||
-InputPath reports/perf/<sample>.csv -Scenario idle-5m
|
||||
```
|
||||
|
||||
默认只强制判定进程意外退出和无响应。CPU、内存、句柄和线程阈值保存在 `internal/qa/config/performance-thresholds.json`,取得稳定 Release 基线后再按场景填写。
|
||||
|
||||
下表中的 `perf_sample.ps1` 均指 `internal/qa/scripts/perf_sample.ps1`。
|
||||
|
||||
## 检查项
|
||||
|
||||
| 场景 | 步骤 | 采样命令 | 预期结果 | 实际结果 | 结论 | 备注 |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| 启动后静置 | 启动程序后不操作 5 分钟 | `tools/perf_sample.ps1` 默认参数 | CPU 保持低占用,内存无持续上涨 | TODO | TODO | TODO |
|
||||
| idle 连续播放 | 保持桌宠可见并播放 idle 10 分钟 | `tools/perf_sample.ps1 -DurationSeconds 600` | 动画持续播放,内存曲线稳定 | TODO | TODO | TODO |
|
||||
| 启动后静置 | 启动程序后不操作 5 分钟 | `perf_sample.ps1 -Scenario idle-5m` | CPU 保持低占用,内存无持续上涨 | TODO | TODO | TODO |
|
||||
| idle 连续播放 | 保持桌宠可见并播放 idle 10 分钟 | `perf_sample.ps1 -Scenario idle-10m -DurationSeconds 600` | 动画持续播放,内存曲线稳定 | TODO | TODO | TODO |
|
||||
| 隐藏到托盘 | 可见采样 3 分钟,隐藏后再采样 3 分钟 | 两次采样分别记录 | 隐藏后 CPU 下降或保持低占用 | TODO | TODO | TODO |
|
||||
| 重复显示 / 隐藏 | 连续显示/隐藏 10 次 | `tools/perf_sample.ps1 -DurationSeconds 300` | 无崩溃,句柄数和内存无异常增长 | TODO | TODO | TODO |
|
||||
| 重复显示 / 隐藏 | 连续显示/隐藏 10 次 | `perf_sample.ps1 -Scenario show-hide` | 无崩溃,句柄数和内存无异常增长 | TODO | TODO | TODO |
|
||||
| 重复启动 / 单实例 | 已运行时连续双击 exe 多次;隐藏到托盘后再双击 exe | 任务管理器或 `Get-Process QtDesktopPet` | 始终只有一个进程;隐藏状态可被重复启动唤醒 | TODO | TODO | 检查 QLocalServer 激活路径 |
|
||||
| 设置页居中 / 置前 | 从托盘打开设置页;多屏环境重复打开;设置页已打开时再次启动 exe | 手工观察 | 设置页位于当前屏幕可用区域中心;重复启动时设置页置前 | TODO | TODO | 优先按宠物所在屏幕计算 |
|
||||
| 重复切换状态 | 通过右键状态测试切换 `idle/think/talk/error/drag` | `tools/perf_sample.ps1 -DurationSeconds 300` | 首次切换状态允许加载资源,缓存达到上限后按 LRU 卸载非保护状态 | TODO | TODO | 结合日志确认加载/卸载记录 |
|
||||
| 动画预热与卸载 | 默认配置启动后静置,随后隐藏到托盘再显示 | `tools/perf_sample.ps1 -DurationSeconds 600` | 日志出现有限次分批预热;隐藏后非保护动画缓存释放;显示后不会反复预热刚被卸载的状态 | TODO | TODO | 不应影响当前播放状态恢复 |
|
||||
| 缩放 / 置顶切换 | 设置页切换缩放,右键切换置顶 | `tools/perf_sample.ps1 -DurationSeconds 300` | 窗口尺寸和状态稳定,无崩溃 | TODO | TODO | TODO |
|
||||
| AI 对话 | 连续发送 20 轮短消息 | `tools/perf_sample.ps1 -DurationSeconds 900` | 请求期间 UI 不阻塞,内存不持续上涨;日志不包含完整消息正文、API Key 或完整错误响应正文 | TODO | TODO | 使用错误 Key/Base URL 时检查脱敏摘要 |
|
||||
| 提醒触发 | 创建 2 条同时间提醒并等待触发 | `tools/perf_sample.ps1 -DurationSeconds 300` | 可见时队列逐条显示;隐藏或 AI 忙时只发系统通知;内存和句柄无异常增长 | TODO | TODO | 检查音效播放和 5 分钟稍后提醒 |
|
||||
| 天气查询 | 连续查询当前/明天/未来三天天气 | `tools/perf_sample.ps1 -DurationSeconds 300` | 网络请求异步执行,UI 不阻塞;失败时明确提示;日志不记录完整用户原文 | TODO | TODO | 覆盖默认城市、IP fallback、多候选提示 |
|
||||
| 联网模式 | 使用支持联网的 OpenAI/Gemini Provider 连续发起 5 次联网对话,并覆盖 DeepSeek/Custom 不支持提示 | `tools/perf_sample.ps1 -DurationSeconds 300` | 请求异步执行,来源展示不阻塞 UI;不支持 Provider 不发起伪联网;日志不记录完整用户问题或 API Key | TODO | TODO | 输入框打开联网开关;不再测试旧多搜索源/SearXNG 路径 |
|
||||
| 应用启动 | 登记一个测试 exe,聊天触发启动并取消/确认各一次 | 手工观察 + 采样 | 启动前始终二次确认;取消时不启动;确认后 UI 可继续响应;不执行脚本或聊天参数 | TODO | TODO | 使用无副作用测试程序,例如记事本或临时测试 exe |
|
||||
| 本地文件操作 | 读取文本、列目录、复制、备份、重命名 | 手工观察 + 采样 | 写操作有确认;不覆盖、不删除、不访问系统目录;操作后 UI 可继续响应 | TODO | TODO | 使用临时测试目录,不操作真实重要文件 |
|
||||
| 本地工作区 Agent v1b.5 | 选择临时项目工作区,扫描、搜索文件、搜索文本、读取文件、总结文件、打开普通文件、显示所在位置,并使用独立 Agent 窗口、右键/托盘入口和 `Alt+A` 快捷键操作选中结果 | 手工观察 + `tools/perf_sample.ps1 -DurationSeconds 600` | 扫描和搜索结果数量受限制;独立窗口刷新不阻塞 UI;快捷键注册失败有提示且菜单入口可用;打开文件前二次确认;系统目录、符号链接、危险后缀、敏感文件和命令执行均拒绝;日志不记录敏感文件内容;内存无持续异常增长 | TODO | TODO | 不做创建、修改、移动、删除;使用临时测试仓库,不操作真实重要项目 |
|
||||
| 重复切换状态 | 通过右键状态测试切换 `idle/think/talk/error/drag` | `perf_sample.ps1 -Scenario state-switch` | 首次切换状态允许加载资源,缓存达到上限后按 LRU 卸载非保护状态 | TODO | TODO | 结合日志确认加载/卸载记录 |
|
||||
| 动画预热与卸载 | 默认配置启动后静置,随后隐藏到托盘再显示 | `perf_sample.ps1 -Scenario prewarm-unload -DurationSeconds 600` | 日志出现有限次分批预热;隐藏后非保护动画缓存释放;显示后不会反复预热刚被卸载的状态 | TODO | TODO | 不应影响当前播放状态恢复 |
|
||||
| 缩放 / 置顶切换 | 设置页切换缩放,右键切换置顶 | `perf_sample.ps1 -Scenario scale-topmost` | 窗口尺寸和状态稳定,无崩溃 | TODO | TODO | TODO |
|
||||
| AI 对话 | 连续发送 20 轮短消息 | `perf_sample.ps1 -Scenario ai-20-turns -DurationSeconds 900` | 请求期间 UI 不阻塞,内存不持续上涨;日志不包含完整消息正文、API Key 或完整错误响应正文 | TODO | TODO | 使用错误 Key/Base URL 时检查脱敏摘要 |
|
||||
| 提醒触发 | 创建 2 条同时间提醒并等待触发 | `perf_sample.ps1 -Scenario reminder-trigger` | 可见时队列逐条显示;隐藏或 AI 忙时只发系统通知;内存和句柄无异常增长 | TODO | TODO | 检查音效播放和 5 分钟稍后提醒 |
|
||||
| 天气查询 | 连续查询当前/明天/未来三天天气 | `perf_sample.ps1 -Scenario weather-queries` | 网络请求异步执行,UI 不阻塞;失败时明确提示;日志不记录完整用户原文 | TODO | TODO | 覆盖默认城市、IP fallback、多候选提示 |
|
||||
| 联网模式 | 使用支持联网的 OpenAI/Gemini Provider 连续发起 5 次联网对话,并覆盖 DeepSeek/Custom 不支持提示 | `perf_sample.ps1 -Scenario web-queries` | 请求异步执行,来源展示不阻塞 UI;不支持 Provider 不发起伪联网;日志不记录完整用户问题或 API Key | TODO | TODO | 输入框打开联网开关;不再测试旧多搜索源/SearXNG 路径 |
|
||||
| 配置损坏兜底 | 备份后分别破坏 app 配置、AI 配置或本地聊天记录再启动 | 启动后采样 3 分钟 | 程序恢复默认配置或忽略损坏历史,并生成带时间戳的 broken 备份,不覆盖旧备份 | TODO | TODO | 使用备份副本测试 |
|
||||
| 角色包损坏兜底 | 使用临时复制的损坏角色包测试 | 启动后采样 3 分钟 | 程序不崩溃,回退 preview 或默认显示 | TODO | TODO | 不直接破坏仓库内默认角色包 |
|
||||
|
||||
@@ -81,7 +87,7 @@ reports/perf/
|
||||
```text
|
||||
1. 后台线程预热
|
||||
2. 单帧级缓存
|
||||
3. 自动化长期压测记录
|
||||
3. 经 Release 基线校准的自动性能阈值
|
||||
```
|
||||
|
||||
## 发布包说明
|
||||
@@ -91,6 +97,7 @@ reports/perf/
|
||||
```text
|
||||
tools/
|
||||
docs/
|
||||
internal/
|
||||
reports/
|
||||
build/
|
||||
dist/
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
# QtDesktopPet 预发布测试记录
|
||||
|
||||
## 构建信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 测试日期 | 2026-07-17 |
|
||||
| 版本 / 发布阶段 | 当前开发版 / 预发布回归进行中 |
|
||||
| 测试源码基线 | `d0d1de4-dirty`;包含已确认的产品能力收缩、无用代码清理和内部 QA 基础设施 |
|
||||
| 工作树说明 | 用户手测后只新增测试记录,未再修改产品业务代码 |
|
||||
| 构建类型 | 用户未反馈,待补充 |
|
||||
| 编译器 / Qt | 待补充 |
|
||||
| 操作系统 | Windows,具体版本待补充 |
|
||||
| 显示器 / DPI | 待补充 |
|
||||
| 测试人 | 用户手动测试 |
|
||||
|
||||
## 自动化摘要
|
||||
|
||||
| 检查 | 结果 | 摘要 |
|
||||
| --- | --- | --- |
|
||||
| 核心逻辑 C++ 测试 | NOT_RUN | 已建立 28 个用例;尚未手动构建内部 QA 工程 |
|
||||
| 静态检查 | PASS | 13 项通过,0 项失败 |
|
||||
| 性能工具链自检 | PASS | 脱敏 fixture 和 1 秒临时进程采样均成功生成 PASS 报告;不代表产品性能 |
|
||||
| GitHub 导出隔离 | PASS | 静态确认公开导出排除 `docs/internal/reports`,发布构建和打包不依赖内部 QA |
|
||||
|
||||
## 已执行手测
|
||||
|
||||
| 用例 | 结果 | 实际结果 / 备注 |
|
||||
| --- | --- | --- |
|
||||
| 启动 | PASS | 用户确认通过 |
|
||||
| 拖动 | PASS | 用户确认通过 |
|
||||
| 置顶及重启保持 | PASS | 用户确认通过 |
|
||||
| 托盘隐藏 / 显示 | PASS | 用户确认通过 |
|
||||
| 单实例唤醒 | PASS | 用户确认通过 |
|
||||
| 设置页居中 / 置前 | PASS | 用户确认通过 |
|
||||
| 应用设置保存及重启保持 | PASS | 用户确认通过 |
|
||||
|
||||
## 批次状态
|
||||
|
||||
| 批次 | 范围 | 结果 | 备注 |
|
||||
| --- | --- | --- | --- |
|
||||
| T01 | 基础窗口与托盘 | PASS | 6 项基础窗口/托盘用例通过 |
|
||||
| T02 | 应用设置与开机自启动 | IN_PROGRESS | 应用设置持久化通过;开机自启动尚未测试 |
|
||||
| T03 | 角色管理 | NOT_RUN | |
|
||||
| T04 | AI 与聊天历史 | NOT_RUN | |
|
||||
| T05 | 定时提醒 | NOT_RUN | |
|
||||
| T06 | 天气查询 | NOT_RUN | |
|
||||
| T07 | 联网模式 | NOT_RUN | |
|
||||
| T08 | 已移除能力与安全边界 | NOT_RUN | |
|
||||
| T09 | 配置损坏与隐私 | NOT_RUN | |
|
||||
| T10 | 打包、安装与卸载 | NOT_RUN | |
|
||||
|
||||
## 性能状态
|
||||
|
||||
实际 QtDesktopPet 性能场景尚未执行。QA 脚本自检结果不得作为产品性能结论。
|
||||
|
||||
## 缺陷与复测
|
||||
|
||||
当前已执行项目未发现缺陷。
|
||||
|
||||
## 当前结论
|
||||
|
||||
- 已执行手测:7 项 `PASS`。
|
||||
- 已执行静态检查:13 项 `PASS`。
|
||||
- 未执行项目仍较多,本记录状态为 `IN_PROGRESS`。
|
||||
- 当前不能据此判定可发布。
|
||||
@@ -0,0 +1,48 @@
|
||||
# QtDesktopPet QA 基础设施验证记录
|
||||
|
||||
## 构建信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 测试日期 | 2026-07-17 |
|
||||
| 验证范围 | 内部 QA 基础设施,不是产品发布验收 |
|
||||
| Git commit | `d0d1de4` |
|
||||
| 工作树状态 | dirty;包含产品能力收缩、无用代码清理和本次 QA 基础设施改动 |
|
||||
| 构建类型 | 未构建 |
|
||||
| 操作系统 | Windows / Asia-Shanghai 环境 |
|
||||
|
||||
## 执行结果
|
||||
|
||||
| 检查 | 结果 | 摘要 |
|
||||
| --- | --- | --- |
|
||||
| 核心逻辑 C++ 测试 | NOT_RUN | 已建立 28 个用例;本轮未调用 CMake、编译器或构建命令 |
|
||||
| 静态检查 | PASS | 13 项通过,0 项失败 |
|
||||
| PowerShell / JSON 解析 | PASS | 内部 QA 脚本和配置均可解析 |
|
||||
| 性能报告器 fixture | PASS | 脱敏稳定样本成功生成 Markdown 报告,未出现退出或无响应判定 |
|
||||
| 性能采样与报告链路 | PASS | 对临时 PowerShell 进程执行 1 秒采样并成功生成 PASS 报告;不代表产品性能 |
|
||||
| 发布隔离规则 | PASS | 静态确认 GitHub 导出排除 `docs/internal/reports`,发布 CMake 和打包脚本不依赖内部 QA |
|
||||
|
||||
## 静态检查明细
|
||||
|
||||
- 92 个生产 `.h/.cpp` 均登记在根 CMake。
|
||||
- 根 CMake 不引用缺失生产源码。
|
||||
- 6 个内部测试翻译单元均登记在内部 QA CMake。
|
||||
- 活跃生产代码中没有已移除模块路径、类型或意图动作。
|
||||
- 生产代码没有 `Q_OBJECT`,保持 `CMAKE_AUTOMOC OFF`。
|
||||
- 9 个发布必需输入存在。
|
||||
- 默认角色清单可解析,所有声明状态均有 PNG 帧。
|
||||
- GitHub 导出规则包含 `docs/internal/reports` 排除项。
|
||||
- 生产构建和打包不依赖 `internal/qa`。
|
||||
- `git diff --check` 通过,仅显示 Git 的 LF/CRLF 提示。
|
||||
|
||||
## 限制与后续
|
||||
|
||||
- 没有验证 C++ 测试能否编译和运行;需要用户使用匹配 Qt Kit 手动构建内部 QA 工程。
|
||||
- 没有运行桌宠 Release,因此没有功能、UI、网络、安装或真实性能结论。
|
||||
- 性能 fixture 只验证报告脚本算法和输出路径,不代表 QtDesktopPet 实际性能。
|
||||
- 下一份记录应基于重新构建后的 Release,并从 `TEMPLATE.md` 创建正式验收记录。
|
||||
|
||||
## 最终结论
|
||||
|
||||
- QA 基础设施:`PASS WITH LIMITATIONS`
|
||||
- 产品发布状态:`NOT EVALUATED`
|
||||
@@ -0,0 +1,27 @@
|
||||
# 测试记录维护规则
|
||||
|
||||
本目录保存 QtDesktopPet 每次正式回归、候选发布和性能验收的长期记录。验收标准定义在
|
||||
`../QtDesktopPet_测试清单与验收标准.md`,本目录只记录某一次构建的实际执行结果。
|
||||
|
||||
## 文件规则
|
||||
|
||||
- 每次验收创建独立文件:`YYYY-MM-DD_<version>_<commit>.md`。
|
||||
- 已完成记录不覆盖;复测结果追加在原记录的“缺陷与复测”部分。
|
||||
- `index.md` 维护所有测试轮次和最终结论。
|
||||
- 工作树不干净时,commit 后增加 `-dirty`,并记录差异摘要。
|
||||
- 状态统一使用 `PASS / FAIL / BLOCKED / NOT_RUN`。
|
||||
|
||||
## 数据边界
|
||||
|
||||
- 允许提交:测试环境、用例结论、脱敏错误摘要、性能统计摘要和缺陷编号。
|
||||
- 禁止提交:API Key、Authorization、完整用户对话、完整服务端错误正文、真实用户路径和原始性能 CSV。
|
||||
- 原始性能 CSV 保存在 `reports/perf/`,该目录不进入 Git。
|
||||
- 自动化临时输出保存在 `internal/qa/out/`,该目录不进入 Git。
|
||||
|
||||
## 工作流
|
||||
|
||||
1. 从 `TEMPLATE.md` 创建本次记录并填写不可变构建信息。
|
||||
2. 执行内部自动化和静态检查,粘贴摘要而不是完整原始日志。
|
||||
3. 按功能测试清单分批手测,用户反馈后更新本次记录。
|
||||
4. 执行性能采样,将审核后的 Markdown 摘要纳入本次记录。
|
||||
5. 在 `index.md` 登记结论;存在阻断问题时不得标记为可发布。
|
||||
@@ -0,0 +1,64 @@
|
||||
# QtDesktopPet 测试记录
|
||||
|
||||
## 构建信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 测试日期 | TODO |
|
||||
| 版本 / 发布阶段 | TODO |
|
||||
| Git commit | TODO |
|
||||
| 工作树状态 | clean / dirty;差异摘要:TODO |
|
||||
| 构建类型 | Debug / Release |
|
||||
| 编译器 / Qt | TODO |
|
||||
| 操作系统 | TODO |
|
||||
| CPU / 内存 | TODO |
|
||||
| 显示器 / DPI | TODO |
|
||||
| 测试人 | TODO |
|
||||
|
||||
## 自动化摘要
|
||||
|
||||
| 检查 | 结果 | 摘要 |
|
||||
| --- | --- | --- |
|
||||
| 核心逻辑测试 | NOT_RUN | TODO |
|
||||
| 静态检查 | NOT_RUN | TODO |
|
||||
| GitHub 导出隔离 | NOT_RUN | TODO |
|
||||
|
||||
## 手测结果
|
||||
|
||||
| 批次 | 范围 | 结果 | 失败 / 阻塞用例 | 备注 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| T01 | 基础窗口与托盘 | NOT_RUN | | |
|
||||
| T02 | 应用设置与开机自启动 | NOT_RUN | | |
|
||||
| T03 | 角色管理 | NOT_RUN | | |
|
||||
| T04 | AI 与聊天历史 | NOT_RUN | | |
|
||||
| T05 | 定时提醒 | NOT_RUN | | |
|
||||
| T06 | 天气查询 | NOT_RUN | | |
|
||||
| T07 | 联网模式 | NOT_RUN | | |
|
||||
| T08 | 已移除能力与安全边界 | NOT_RUN | | |
|
||||
| T09 | 配置损坏与隐私 | NOT_RUN | | |
|
||||
| T10 | 打包、安装与卸载 | NOT_RUN | | |
|
||||
|
||||
## 性能摘要
|
||||
|
||||
| 场景 | CSV 时间 | 报告结论 | 关键指标 | 备注 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| idle-5m | NOT_RUN | NOT_RUN | | |
|
||||
| idle-10m | NOT_RUN | NOT_RUN | | |
|
||||
| hidden-5m | NOT_RUN | NOT_RUN | | |
|
||||
| ai-20-turns | NOT_RUN | NOT_RUN | | |
|
||||
| reminder-trigger | NOT_RUN | NOT_RUN | | |
|
||||
| weather-queries | NOT_RUN | NOT_RUN | | |
|
||||
| web-queries | NOT_RUN | NOT_RUN | | |
|
||||
|
||||
## 缺陷与复测
|
||||
|
||||
| 缺陷 ID | 首次现象 | 严重级别 | 修复 commit | 复测结果 | 备注 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| | | | | | |
|
||||
|
||||
## 最终结论
|
||||
|
||||
- 结论:`BLOCKED / CONDITIONAL PASS / PASS`
|
||||
- 未执行项:TODO
|
||||
- 已知风险:TODO
|
||||
- 是否允许发布:否 / 是
|
||||
@@ -0,0 +1,8 @@
|
||||
# QtDesktopPet 测试记录索引
|
||||
|
||||
| 日期 | 版本 / 阶段 | Commit | 构建 | 自动化 | 手测 | 性能 | 发布结论 | 记录 |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 2026-07-17 | 预发布回归进行中 | `d0d1de4-dirty` | 用户构建,详情待补 | 静态 13/13;C++ NOT_RUN | 7 PASS,其余 NOT_RUN | NOT_RUN | IN_PROGRESS | `2026-07-17_pre-release_d0d1de4-dirty.md` |
|
||||
| 2026-07-17 | QA 基础设施 | `d0d1de4-dirty` | 未构建 | 静态 13/13;C++ NOT_RUN | NOT_RUN | fixture PASS | NOT EVALUATED | `2026-07-17_qa-infrastructure_d0d1de4-dirty.md` |
|
||||
|
||||
正式记录按时间倒序添加。模板和维护规则分别见 `TEMPLATE.md` 与 `README.md`。
|
||||
Reference in New Issue
Block a user