Finalize desktop pet feature set and GitHub export
This commit is contained in:
@@ -32,12 +32,16 @@
|
||||
- 删除用户导入角色
|
||||
- 本地一次性/重复提醒、提醒列表、取消提醒和到点通知
|
||||
- 内置/用户提醒音效切换、导入、删除和试听
|
||||
- 天气查询、默认城市、公网 IP 定位兜底和多候选提示
|
||||
- 本地文件操作安全入口:读取文本、列目录、复制、备份、重命名
|
||||
- 联网模式:输入框开关、OpenAI/Gemini 原生联网、DeepSeek/Custom 不支持提示
|
||||
- 本地应用启动:登记应用、开始菜单 / App Paths 发现、手选 `.exe` 和二次确认
|
||||
- Windows 打包脚本和 Inno Setup 安装器脚本
|
||||
- Release exe 双击不弹控制台窗口
|
||||
|
||||
项目已经从早期 MVP 进入到“可扩展桌面应用原型”阶段,可以开始规划工具能力扩展。
|
||||
|
||||
但是,在正式加入定时提醒、天气、本地文件操作、联网搜索之前,建议先做一轮结构收口。
|
||||
但是,在正式加入定时提醒、天气、本地文件操作、联网模式之前,建议先做一轮结构收口。
|
||||
|
||||
---
|
||||
|
||||
@@ -98,7 +102,7 @@ loadCharacterPackage() 重新构建动画状态并从 idle 状态开始播放
|
||||
```text
|
||||
提醒解析
|
||||
天气查询
|
||||
联网搜索
|
||||
联网模式
|
||||
本地文件读写
|
||||
AI 工具调度
|
||||
复杂业务状态管理
|
||||
@@ -126,7 +130,8 @@ ToolCommandDispatcher
|
||||
定时提醒
|
||||
天气查询
|
||||
本地文件操作
|
||||
联网搜索
|
||||
联网模式
|
||||
本地应用启动
|
||||
普通 AI 对话
|
||||
```
|
||||
|
||||
@@ -165,7 +170,7 @@ enum class UserIntentType
|
||||
Reminder,
|
||||
Weather,
|
||||
FileOperation,
|
||||
Search
|
||||
LaunchApp
|
||||
};
|
||||
```
|
||||
|
||||
@@ -178,7 +183,7 @@ IntentRouter 判断意图
|
||||
↓
|
||||
CommandDispatcher 分发
|
||||
↓
|
||||
ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / ConversationManager
|
||||
ReminderManager / WeatherManager / FileOperationManager / WebChatManager / AppLaunchManager / ConversationManager
|
||||
```
|
||||
|
||||
第一版意图识别不需要复杂,规则优先即可。
|
||||
@@ -192,7 +197,7 @@ ReminderManager / WeatherManager / FileOperationManager / WebSearchManager / Con
|
||||
推荐:
|
||||
|
||||
```text
|
||||
Reminder > FileOperation > Weather > Search > Chat
|
||||
Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat
|
||||
```
|
||||
|
||||
原因:
|
||||
@@ -205,7 +210,7 @@ Reminder > FileOperation > Weather > Search > Chat
|
||||
可能是文件操作,而不是单纯天气查询。
|
||||
|
||||
“搜索一下明天天气”
|
||||
可能是搜索请求,但如果已有 WeatherTool,应优先走天气工具。
|
||||
新版不再作为独立搜索工具处理;如果已有 WeatherTool,应优先走天气工具,否则按普通聊天或输入框联网开关进入 Chat/WebChat。
|
||||
```
|
||||
|
||||
---
|
||||
@@ -229,7 +234,7 @@ set(CMAKE_AUTOMOC ON)
|
||||
|
||||
当前阶段选择方案 B:继续保持 `CMAKE_AUTOMOC OFF`,新增意图分发模块使用普通 C++ 类和同步返回值,不引入 `Q_OBJECT`。
|
||||
|
||||
后续如果 Reminder / Weather / Search 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
|
||||
后续如果 Reminder / Weather / WebChat 等模块需要大量跨对象异步信号,再单独评估是否切换到方案 A。
|
||||
|
||||
---
|
||||
|
||||
@@ -253,7 +258,7 @@ set(CMAKE_AUTOMOC ON)
|
||||
天气 API 请求说明
|
||||
IP 定位隐私说明
|
||||
本地文件操作权限说明
|
||||
联网搜索来源和隐私说明
|
||||
联网模式来源和隐私说明
|
||||
```
|
||||
|
||||
---
|
||||
@@ -292,7 +297,7 @@ IP 定位隐私说明
|
||||
阶段 1:定时提醒
|
||||
阶段 2:天气查询
|
||||
阶段 3:本地文件操作
|
||||
阶段 4:联网搜索
|
||||
阶段 4:联网模式
|
||||
阶段 5:语音对话 / 更复杂 Agent 能力
|
||||
```
|
||||
|
||||
@@ -301,7 +306,7 @@ IP 定位隐私说明
|
||||
```text
|
||||
1. 天气查询
|
||||
2. 本地文件操作安全边界
|
||||
3. 联网搜索
|
||||
3. 联网模式
|
||||
```
|
||||
|
||||
---
|
||||
@@ -330,7 +335,7 @@ src/assistant/CommandDispatcher.cpp
|
||||
- 定时提醒
|
||||
- 天气查询
|
||||
- 本地文件操作
|
||||
- 联网搜索
|
||||
- 联网模式
|
||||
```
|
||||
|
||||
第一版可以使用规则判断,不依赖 AI。
|
||||
@@ -634,9 +639,35 @@ Windows 托盘通知后端不可用:记录日志,不补气泡,不进入可
|
||||
|
||||
# 6. 阶段 2:天气查询功能
|
||||
|
||||
当前天气查询 v1 已进入实现阶段:
|
||||
|
||||
- 已新增独立 `src/weather/` 模块
|
||||
- 已支持 Open-Meteo 市级城市优先的基础地理编码和基础天气查询
|
||||
- 已支持设置页默认城市
|
||||
- 已支持默认城市为空时通过公网 IP 定位兜底
|
||||
- 已支持当前/今天、明天、后天和未来 1-3 天模板回复
|
||||
- 已支持读取前 5 个地理编码候选;多候选时仍查首项,并在回复中提示同名城市风险和其他候选
|
||||
- 已支持设置页测试默认城市;测试只展示匹配结果,不自动保存配置
|
||||
- 已通过 `CommandDispatcher` 将 Weather 意图接入聊天入口
|
||||
- 已保持 `PetWindow` 只负责 UI 展示,不承载天气解析或网络逻辑
|
||||
|
||||
v1 明确暂不支持:
|
||||
|
||||
- AI 润色天气回复
|
||||
- 空气质量
|
||||
- 天气预警
|
||||
- 天气提醒联动
|
||||
- 多天气源切换
|
||||
- 小时级精细降雨判断
|
||||
- 穿衣指数
|
||||
|
||||
默认城市为空且启用公网 IP 定位时,会请求 ipapi.co 判断城市;回复必须说明“根据公网 IP 判断城市”。设置页默认城市和公网 IP 定位都属于非用户明确城市来源,回复必须说明来源。
|
||||
|
||||
当前 v1 推荐填写市级城市名;区县、乡镇、街道不保证精确识别,可能无法匹配或被匹配到上级/同名城市。同名城市当前使用天气源返回的第一个结果,并在回复或测试结果中提示其他候选。后续优先补可交互候选选择、区县级定位和国内天气源增强。
|
||||
|
||||
## 6.1 功能定位
|
||||
|
||||
天气是独立工具能力,不放进联网搜索。
|
||||
天气是独立工具能力,不放进联网模式。
|
||||
|
||||
正确流程:
|
||||
|
||||
@@ -654,9 +685,9 @@ AI 根据结构化数据自然语言回复
|
||||
|
||||
不要让 AI 自己搜索天气,也不要让 AI 自己拼 URL。
|
||||
|
||||
## 6.2 为什么不用联网搜索做天气
|
||||
## 6.2 为什么不用联网模式做天气
|
||||
|
||||
搜索天气有几个问题:
|
||||
用联网模式查询天气有几个问题:
|
||||
|
||||
```text
|
||||
结果格式不稳定
|
||||
@@ -706,10 +737,10 @@ src/weather/
|
||||
├── WeatherConfig.h
|
||||
├── WeatherStore.h
|
||||
├── WeatherStore.cpp
|
||||
├── WeatherProvider.h
|
||||
├── WeatherProvider.cpp
|
||||
├── OpenMeteoWeatherProvider.h
|
||||
├── OpenMeteoWeatherProvider.cpp
|
||||
├── WeatherParser.h
|
||||
├── WeatherParser.cpp
|
||||
├── WeatherSummaryFormatter.h
|
||||
├── WeatherSummaryFormatter.cpp
|
||||
├── WeatherManager.h
|
||||
└── WeatherManager.cpp
|
||||
```
|
||||
@@ -836,6 +867,8 @@ VPN / 代理会导致定位错误
|
||||
|
||||
## 6.10 AI 回复上下文
|
||||
|
||||
当前 v1 采用模板优先,不依赖 AI 润色;本节作为 v1.1 预留方向。
|
||||
|
||||
程序应把结构化天气数据交给 AI:
|
||||
|
||||
```text
|
||||
@@ -872,6 +905,27 @@ VPN / 代理会导致定位错误
|
||||
|
||||
本地文件操作是高风险功能,必须后置,不能早于提醒和天气。
|
||||
|
||||
当前本地文件操作 v1 已进入实现阶段:
|
||||
|
||||
- 已新增独立 `src/fileops/` 模块
|
||||
- 已通过 `CommandDispatcher` 将 FileOperation 意图接入聊天入口
|
||||
- 已支持读取用户主动选择的常见文本文件
|
||||
- 已支持列出用户主动选择的文件夹
|
||||
- 已支持复制文件、创建备份、重命名文件
|
||||
- 写操作会展示操作计划并二次确认
|
||||
- 聊天文本不会直接变成本地路径,所有路径必须由用户通过文件选择框选择
|
||||
- 已拒绝删除、覆盖、移动、执行脚本、运行命令和系统目录访问
|
||||
- 已拒绝符号链接路径,降低路径逃逸风险
|
||||
|
||||
v1 明确暂不支持:
|
||||
|
||||
- zip 打包
|
||||
- 删除文件
|
||||
- 覆盖文件
|
||||
- 移动文件
|
||||
- 执行脚本或命令
|
||||
- 修改源码
|
||||
|
||||
目标是让桌宠能辅助用户处理本地文件,例如:
|
||||
|
||||
```text
|
||||
@@ -930,8 +984,6 @@ AI 自己决定访问系统目录
|
||||
```text
|
||||
src/fileops/
|
||||
├── FileOperationTypes.h
|
||||
├── FileOperationPlanner.h
|
||||
├── FileOperationPlanner.cpp
|
||||
├── FileOperationManager.h
|
||||
├── FileOperationManager.cpp
|
||||
├── FileSandbox.h
|
||||
@@ -953,6 +1005,8 @@ src/fileops/
|
||||
重命名文件,需确认
|
||||
```
|
||||
|
||||
当前 v1 中 zip 打包延期,因为 Qt 公共 API 没有稳定内置写 zip 能力;不为此引入重依赖。后续如果要补 zip,优先选择明确许可和可维护的压缩库。
|
||||
|
||||
暂不做:
|
||||
|
||||
```text
|
||||
@@ -978,82 +1032,95 @@ D:/xxx/b.txt
|
||||
是否继续?
|
||||
```
|
||||
|
||||
---
|
||||
## 7.7 应用启动独立模块
|
||||
|
||||
# 8. 阶段 4:联网搜索功能
|
||||
|
||||
## 8.1 功能定位
|
||||
|
||||
联网搜索后置,不要现在优先做。
|
||||
|
||||
联网搜索是通用增强能力:
|
||||
当前已新增独立 `src/launcher/` 模块,不放进 `src/fileops/`:
|
||||
|
||||
```text
|
||||
查询最新信息
|
||||
查官网
|
||||
查报错
|
||||
查新闻
|
||||
查版本
|
||||
查文档
|
||||
src/launcher/
|
||||
├── AppLaunchTypes.h
|
||||
├── AppLaunchStore.h
|
||||
├── AppLaunchStore.cpp
|
||||
├── AppDiscovery.h
|
||||
├── AppDiscovery.cpp
|
||||
├── AppLaunchManager.h
|
||||
└── AppLaunchManager.cpp
|
||||
```
|
||||
|
||||
## 8.2 不要给每家模型各自配置搜索
|
||||
|
||||
不建议:
|
||||
应用启动支持:
|
||||
|
||||
```text
|
||||
OpenAIProvider 自己一套搜索
|
||||
GeminiProvider 自己一套搜索
|
||||
DeepSeekProvider 自己一套搜索
|
||||
CustomProvider 自己一套搜索
|
||||
打开 Codex
|
||||
启动酷狗音乐
|
||||
帮我打开 VSCode
|
||||
```
|
||||
|
||||
推荐:
|
||||
解析和发现顺序:
|
||||
|
||||
```text
|
||||
WebSearchManager 独立负责搜索
|
||||
LLMProvider 只负责回答
|
||||
ConversationManager / CommandDispatcher 负责把搜索结果注入给 AI
|
||||
用户在设置页登记的应用别名
|
||||
↓
|
||||
Windows 开始菜单快捷方式
|
||||
↓
|
||||
Windows App Paths 注册表
|
||||
↓
|
||||
未知应用时由用户手动选择 .exe
|
||||
```
|
||||
|
||||
## 8.3 建议目录
|
||||
启动安全边界:
|
||||
|
||||
```text
|
||||
src/search/
|
||||
├── SearchTypes.h
|
||||
├── SearchProvider.h
|
||||
├── SearXNGSearchProvider.h
|
||||
├── SearXNGSearchProvider.cpp
|
||||
├── WebSearchManager.h
|
||||
└── WebSearchManager.cpp
|
||||
启动前始终二次确认
|
||||
只允许 .exe 或开始菜单 .lnk
|
||||
不执行 .bat / .cmd / .ps1 / .vbs / .js / .msi
|
||||
不执行聊天文本里的命令
|
||||
不拼接聊天文本参数
|
||||
不以管理员权限启动
|
||||
```
|
||||
|
||||
第一版只做:
|
||||
配置保存到:
|
||||
|
||||
```text
|
||||
SearXNG + 自定义 Base URL
|
||||
QStandardPaths::AppConfigLocation/launcher_config.json
|
||||
```
|
||||
|
||||
后续再加:
|
||||
损坏时备份为:
|
||||
|
||||
```text
|
||||
Tavily
|
||||
Brave Search
|
||||
CustomSearchProvider
|
||||
```
|
||||
|
||||
## 8.4 安全边界
|
||||
|
||||
```text
|
||||
不要让 AI 自己生成任意 URL 给程序访问
|
||||
不要做网页全文抓取第一版
|
||||
不要默认每次都联网
|
||||
不要把用户隐私查询写日志
|
||||
搜索结果要显示来源
|
||||
launcher_config.broken.yyyyMMdd-HHmmss.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 8. 阶段 4:联网模式
|
||||
|
||||
联网能力已从旧“搜索引擎聚合器”重做为 Web 端 AI 对话式联网模式。
|
||||
|
||||
当前已落地:
|
||||
|
||||
- 已删除旧 `src/search/` 模块,不再维护 Google/百度/360/搜狗页面解析、SearXNG 旧配置、多源聚合和旧 `search_config.json` 兼容。
|
||||
- 已新增独立 `src/web/` 模块:`WebConfig`、`WebStore`、`WebCapabilityDetector`、`WebChatManager` 和 Web citation 类型。
|
||||
- 输入框新增“联网”开关;开关开启后,普通聊天进入 WebChat 流程。
|
||||
- 支持 OpenAI 官方 Provider 的 Responses API Web Search。
|
||||
- 支持 Google Gemini Provider 的 Google Search grounding。
|
||||
- DeepSeek 官方 API 当前不提供托管联网搜索工具,显示“不支持原生联网”。
|
||||
- Custom / 第三方 OpenAI-Compatible 默认无法确认联网能力,不发送未知联网参数,不做旧搜索页抓取。
|
||||
- 设置页改为“联网模式”:显示当前能力状态、开关记忆、默认开关、Provider 模式、超时、来源展示和测试联网模式。
|
||||
- 旧 `search_config.json` 已废弃;新版使用 `web_config.json`,损坏时备份为 `web_config.broken.yyyyMMdd-HHmmss.json`。
|
||||
|
||||
边界:
|
||||
|
||||
- 不再默认每次联网,模型可判断稳定常识无需联网。
|
||||
- 不做搜索结果页 HTML 解析,避免登录、帮助、反馈、验证码页面污染答案。
|
||||
- 不实现 Tavily / Brave / Bing Search API、自建搜索后端、网页全文抓取或长期缓存。
|
||||
- 天气仍是独立工具能力,不放进联网模式。
|
||||
|
||||
后续可选:
|
||||
|
||||
- 更多 AI Provider 原生联网适配。
|
||||
- 结构化搜索 API 或自建联网后端,用于不支持原生联网的模型。
|
||||
- 更强的引用 UI、证据片段摘录和来源可点击展示。
|
||||
|
||||
# 9. 建议最终开发顺序
|
||||
|
||||
## 9.1 第一步:收口架构
|
||||
@@ -1076,33 +1143,30 @@ CustomSearchProvider
|
||||
## 9.3 第三步:天气查询
|
||||
|
||||
```text
|
||||
1. WeatherTypes
|
||||
2. WeatherConfig / WeatherStore
|
||||
3. OpenMeteoWeatherProvider
|
||||
4. WeatherManager
|
||||
5. IntentRouter 天气识别
|
||||
6. AI 回复 / 模板兜底
|
||||
当前已落地天气 v1:WeatherTypes、WeatherConfig / WeatherStore、WeatherParser、WeatherManager、模板回复、设置页默认城市、公网 IP 定位兜底和 Weather 意图接入。
|
||||
当前已落地天气 v1.2 / v1.3:多候选城市提示和设置页默认城市测试。后续可继续补可交互候选选择、区县级定位、国内天气源增强、AI 润色、空气质量、天气预警、多天气源切换、小时级降雨判断和天气提醒联动。
|
||||
```
|
||||
|
||||
## 9.4 第四步:本地文件操作
|
||||
|
||||
```text
|
||||
1. FileSandbox
|
||||
2. FileOperationTypes
|
||||
3. FileOperationPlanner
|
||||
4. FileOperationManager
|
||||
5. 用户确认 UI
|
||||
6. 备份机制
|
||||
当前已落地 FileSandbox、FileOperationTypes、FileOperationManager、FileBackupManager 和用户确认 UI。
|
||||
v1 支持读取文本、列出文件夹、复制、备份、重命名。
|
||||
v1 不支持 zip、删除、覆盖、移动、脚本/命令执行和系统目录访问。
|
||||
```
|
||||
|
||||
## 9.5 第五步:联网搜索
|
||||
## 9.5 第五步:联网模式
|
||||
|
||||
```text
|
||||
1. SearchTypes
|
||||
2. SearchProvider
|
||||
3. SearXNGSearchProvider
|
||||
4. WebSearchManager
|
||||
5. 来源展示
|
||||
当前已落地 WebConfig、WebStore、WebCapabilityDetector、WebChatManager 和输入框联网开关。新版支持 OpenAI/Gemini 原生联网;DeepSeek/Custom 明确提示不支持或无法确认;旧搜索聚合与 SearXNG 旧配置已废弃。
|
||||
```
|
||||
|
||||
## 9.6 第六步:应用启动
|
||||
|
||||
```text
|
||||
当前已落地 AppLaunchStore、AppDiscovery、AppLaunchManager 和设置页应用登记。
|
||||
v1 支持已登记应用、开始菜单快捷方式、App Paths 注册表和用户确认手选 .exe。
|
||||
v1 不支持脚本、聊天参数、命令执行、管理员权限和跨平台应用发现。
|
||||
```
|
||||
|
||||
---
|
||||
@@ -1112,17 +1176,17 @@ CustomSearchProvider
|
||||
下面这段可以直接作为后续任务总说明:
|
||||
|
||||
```text
|
||||
当前不要急着直接实现提醒、天气、文件操作或联网搜索。
|
||||
当前不要急着直接实现提醒、天气、文件操作或联网模式。
|
||||
|
||||
请先审查当前 QtDesktopPet 项目结构,并完成以下准备工作:
|
||||
|
||||
1. 角色切换在设置保存后已确认立即生效,后续只需保留回归检查。
|
||||
2. 新增 IntentRouter / CommandDispatcher,使用户输入先经过统一意图分发。
|
||||
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、Search。
|
||||
4. 意图优先级为 Reminder > FileOperation > Weather > Search > Chat。
|
||||
3. 意图类型包括 Chat、Reminder、Weather、FileOperation、LaunchApp;联网模式由输入框开关决定,不再是独立 Search 意图。
|
||||
4. 意图优先级为 Reminder > FileOperation > Weather > LaunchApp > Chat/WebChat。
|
||||
5. 普通聊天继续走现有 AI 对话流程。
|
||||
6. 新功能不得继续直接塞进 PetWindow。
|
||||
7. 后续 Reminder、Weather、FileOperation、Search 均应作为独立模块接入。
|
||||
7. 后续 Reminder、Weather、FileOperation、LaunchApp、WebChat 均应作为独立模块接入。
|
||||
8. 当前阶段保持 CMAKE_AUTOMOC OFF,后续模块不要使用 Q_OBJECT;确需 Qt 信号槽时再单独评估。
|
||||
9. 保持现有隐私策略:API Key、Authorization、完整用户消息、完整错误响应不得写入日志。
|
||||
10. 保持现有文件安全策略:路径校验、危险操作确认、修改前备份。
|
||||
@@ -1137,7 +1201,7 @@ CustomSearchProvider
|
||||
建议先做:
|
||||
|
||||
```text
|
||||
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网搜索
|
||||
结构收口 → IntentRouter / CommandDispatcher → 定时提醒 → 天气 → 本地文件操作 → 联网模式
|
||||
```
|
||||
|
||||
其中:
|
||||
@@ -1146,5 +1210,5 @@ CustomSearchProvider
|
||||
定时提醒:已作为第一个工具能力落地
|
||||
天气:建议第二个落地
|
||||
本地文件操作:风险较高,第三个落地
|
||||
联网搜索:通用能力,最后落地
|
||||
联网模式:通用 AI 对话增强,最后落地
|
||||
```
|
||||
|
||||
@@ -0,0 +1,198 @@
|
||||
# QtDesktopPet 测试清单与验收标准
|
||||
|
||||
本文档用于全功能统一手测验收。Codex 不调用 CMake 或构建命令;需要编译验证时由用户手动构建并反馈结果。
|
||||
|
||||
## 验收记录格式
|
||||
|
||||
每个用例建议记录:
|
||||
|
||||
```text
|
||||
测试日期:
|
||||
Git commit:
|
||||
构建类型:Debug / Release
|
||||
操作系统:
|
||||
Qt 版本:
|
||||
测试人:
|
||||
结论:通过 / 不通过 / 阻塞
|
||||
实际结果:
|
||||
备注:
|
||||
```
|
||||
|
||||
## 总体验收标准
|
||||
|
||||
- 程序不崩溃、不卡死,UI 主线程不被网络、文件或 AI 请求阻塞。
|
||||
- 日志不包含完整 API Key、Authorization、完整用户消息正文、完整错误响应正文或完整搜索词。
|
||||
- 设置页保存后立即生效,重启后配置仍能读取。
|
||||
- 所有损坏 JSON 配置都应备份为 `.broken.yyyyMMdd-HHmmss.json` 后回退默认或忽略损坏数据。
|
||||
- 所有涉及本地文件写入的操作必须由用户选择路径,并在执行前显示计划和二次确认。
|
||||
- 不运行 CMake 的自动验证;构建和运行由用户手动完成。
|
||||
|
||||
## 基础窗口与托盘
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 启动 | 启动 `QtDesktopPet.exe` | 桌宠显示,透明无边框,无控制台窗口,日志创建成功 | TODO |
|
||||
| 拖动 | 按住桌宠拖动后松开 | 拖动时进入 `drag`,松开后恢复合理状态 | TODO |
|
||||
| 置顶 | 右键切换置顶 | 置顶状态立即变化,重启后保持 | TODO |
|
||||
| 隐藏托盘 | 托盘菜单隐藏/显示 | 隐藏后动画暂停,显示后恢复 | TODO |
|
||||
| 单实例 | 已运行时再次启动 exe | 只有一个进程,已有实例被唤醒 | TODO |
|
||||
| 设置页居中 | 多屏或重复打开设置页 | 设置页出现在当前屏幕可用区域内并置前 | TODO |
|
||||
|
||||
## 角色管理
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 切换角色 | 设置页选择角色并保存 | 桌宠立即切换,不依赖重启 | TODO |
|
||||
| 导入合法角色 | 导入有效角色文件夹 | 验证通过后复制到用户数据目录,可选择使用 | TODO |
|
||||
| 导入非法角色 | 导入缺少 `character.json` 或无 idle 的角色 | 弹出错误,不复制、不覆盖 | TODO |
|
||||
| 覆盖用户角色 | 导入同 id 用户角色 | 弹出覆盖确认,取消则不操作 | TODO |
|
||||
| 内置角色保护 | 尝试删除内置角色 | 提示不能删除,不做文件操作 | TODO |
|
||||
| 删除用户角色 | 删除用户导入角色 | 二次确认后删除用户角色目录;当前角色被删时回退默认 | TODO |
|
||||
| 导出角色 | 选择任意角色并导出到目录 | 目标生成 `<characterId>/` 副本;目标存在时必须确认 | TODO |
|
||||
| 打开目录 | 点击打开用户角色目录 | 系统文件管理器打开用户角色目录 | TODO |
|
||||
|
||||
## AI 与聊天历史
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| AI 配置保存 | 设置 Provider/Base URL/API Key/Model 并保存 | 配置保存,API Key 按平台策略加密或确认明文 | TODO |
|
||||
| 连接测试 | 点击测试连接 | 成功显示成功;错误配置显示明确错误 | TODO |
|
||||
| 普通聊天 | 发送短消息 | `think` 后进入 `talk`,气泡显示回复 | TODO |
|
||||
| 流式回复 | 启用流式并发送消息 | 首段前保持 `think`,输出中保持 `talk` | TODO |
|
||||
| AI 忙 | 回复中再次发送聊天/天气/搜索 | 不启动第二个请求,显示忙提示 | TODO |
|
||||
| 取消 AI | 右键取消 AI 请求 | 请求取消,状态恢复,气泡提示取消 | TODO |
|
||||
| 历史保存 | 开启本地保存后聊天 | 重启后历史可读取 | TODO |
|
||||
| 历史搜索 | 在设置页按关键词搜索 | 只显示匹配记录 | TODO |
|
||||
| 历史筛选 | 按 Provider/模型筛选 | 只显示对应元数据记录;旧记录按未知处理 | TODO |
|
||||
| 导出 Markdown | 导出筛选结果为 `.md` | 文件包含角色、时间、Provider/模型和正文,不含 API Key | TODO |
|
||||
| 导出 JSON | 导出筛选结果为 `.json` | JSON 可解析,包含 messages 数组,不含 API Key | TODO |
|
||||
| 清空历史 | 点击清空聊天记录并确认 | 内存和本地历史清空,面板刷新 | TODO |
|
||||
|
||||
## 定时提醒
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 一次性提醒 | `10分钟后提醒我喝水` | 创建 pending 提醒,显示标题和时间 | TODO |
|
||||
| 中文相对时间 | `半小时后提醒我休息`、`一个半小时后提醒我喝水` | 时间解析正确 | TODO |
|
||||
| 绝对日期 | `明天9点提醒我开会`、`6月3日9点提醒我提交` | 未明确日期且当天已过时顺延 | TODO |
|
||||
| 重复提醒 | `每天9点提醒我打卡`、`每周一上午10点提醒我周会`、`每月3号9点提醒我交报告` | 创建 daily/weekly/monthly | TODO |
|
||||
| 不支持规则 | `工作日9点提醒我打卡`、`农历初一提醒我` | 明确提示暂不支持,不创建一次性误提醒 | TODO |
|
||||
| 提醒列表 | `提醒列表` | 只列出 pending 提醒 | TODO |
|
||||
| 聊天取消 | `取消喝水提醒` | 唯一匹配时标记 canceled;多匹配提示去设置页处理 | TODO |
|
||||
| 设置页编辑 | 编辑 pending 标题/时间/重复规则 | 保存后列表和下一次触发时间更新 | TODO |
|
||||
| 触发可见 | 到点时桌宠可见且 AI 不忙 | 播放当前音效,显示气泡和操作区,不发系统通知 | TODO |
|
||||
| 触发隐藏 | 桌宠隐藏时到点 | 播放当前音效,只发 Windows 托盘通知,不补气泡 | TODO |
|
||||
| AI 忙触发 | AI 请求或流式回复中到点 | 播放当前音效,发系统通知,不显示提醒气泡 | TODO |
|
||||
| 拖动触发 | 拖动中到点 | 不打断 `drag`,松开后按队列显示气泡 | TODO |
|
||||
| 多提醒同时触发 | 两条同时间提醒 | 可见时逐条队列展示,后一条不覆盖前一条 | TODO |
|
||||
| 知道了 | 点击 `知道了` | 关闭当前提醒展示,队列进入下一条 | TODO |
|
||||
| 5分钟后再提醒 | 点击 `5分钟后再提醒` | 创建当前时间 + 5 分钟的一次性 pending,不影响原重复规则 | TODO |
|
||||
| 历史清理 | 构造 21 天前 triggered/canceled 后清理 | 删除 20 天前历史,保留最近 20 天和 pending | TODO |
|
||||
| 音效导入 | 导入合法 PCM wav | 可选择、试听、删除 | TODO |
|
||||
| 内置音效保护 | 选择内置音效点击删除 | 删除按钮禁用或提示不可删除 | TODO |
|
||||
|
||||
## 天气查询
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 明确城市 | `西安天气怎么样` | 返回 Open-Meteo 模板结果 | TODO |
|
||||
| 明天 | `明天西安天气怎么样` | 返回明天预报 | TODO |
|
||||
| 后天 | `后天纽约天气` | 返回后天预报 | TODO |
|
||||
| 未来三天 | `未来三天北京天气` | 返回 1-3 天摘要 | TODO |
|
||||
| 默认城市 | 设置默认城市后输入 `今天天气怎么样` | 使用默认城市并说明来源 | TODO |
|
||||
| IP fallback | 清空默认城市并启用 IP 定位 | 使用公网 IP 城市并说明来源 | TODO |
|
||||
| 禁用 IP fallback | 清空默认城市并关闭 IP 定位 | 提示配置默认城市或在问题中带城市 | TODO |
|
||||
| 多候选 | 查询同名城市 | 使用首项并提示其他候选 | TODO |
|
||||
| 默认城市测试 | 设置页点击测试默认城市 | 显示匹配城市/行政区/国家,不自动保存 | TODO |
|
||||
| 未知城市 | 输入无法解析城市 | 明确错误,不崩溃 | TODO |
|
||||
| 不支持项 | 查询空气质量/预警/穿衣指数 | 明确提示 v1 暂不支持 | TODO |
|
||||
|
||||
## 本地文件操作
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 读取文本 | 输入读取文本文件请求并选择 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 |
|
||||
|
||||
## 联网模式
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 开关关闭 | 输入框联网开关关闭,询问 `美国的首都在哪里` | 走普通 AI 对话,不调用 WebChatManager | TODO |
|
||||
| OpenAI 官方联网 | 使用 OpenAI 官方 Provider,打开联网开关,询问 `Qt 6 最新版本` | 进入联网模式,返回回答;有来源时展示来源 | TODO |
|
||||
| Gemini 官方联网 | 使用 Google Gemini Provider,打开联网开关,询问 `Qt 6 最新版本` | 进入 Gemini grounding,返回回答;有来源时展示来源 | TODO |
|
||||
| DeepSeek 不支持 | 使用 DeepSeek Provider,打开联网开关并发送问题 | 不发起伪联网请求,提示 DeepSeek 当前不支持原生联网 | TODO |
|
||||
| 第三方兼容不确认 | 使用 Custom 或第三方 Base URL,打开联网开关 | 提示当前 AI 配置无法确认联网能力 | TODO |
|
||||
| 模型未联网 | 支持联网 Provider 回答稳定常识但未返回来源 | 展示回答,并标注模型未使用联网来源 | TODO |
|
||||
| Web 忙冲突 | 联网请求中再次发送普通聊天或联网聊天 | 不启动第二个请求,提示稍后 | TODO |
|
||||
| AI 忙冲突 | 普通 AI 回复中打开联网再发送 | 不启动联网请求,提示 AI 回复正在进行 | TODO |
|
||||
| 设置页状态 | 切换 OpenAI/Gemini/DeepSeek/Custom | “联网模式”页即时显示可用/不可用/无法确认状态 | TODO |
|
||||
| 设置页测试 | 点击“测试联网模式” | 支持 Provider 发起测试,不支持 Provider 直接显示原因 | TODO |
|
||||
| 旧失败回归 | 打开联网后询问 `美国的首都在哪里` | 不再返回搜狗/360 帮助、登录、反馈页 | TODO |
|
||||
| 意图优先级 | `明天早上提醒我看天气` / `把天气截图保存到桌面` | 仍优先走提醒或文件操作,不受联网开关影响 | 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 |
|
||||
|
||||
## 发布与性能
|
||||
|
||||
| 用例 | 步骤 | 预期结果 | 结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| Release 构建 | 用户手动构建 Release | 构建成功,无新增编译错误 | TODO |
|
||||
| 打包 | 运行 `tools/package_release.ps1` | 包含 exe、Qt runtime、resources、README、LICENSE | TODO |
|
||||
| 安装器 | 生成并安装 Inno Setup 包 | 无 Qt 开发环境机器可运行 | TODO |
|
||||
| 安装器自启动选项 | 安装页面勾选/不勾选开机自启动分别安装 | 勾选时写入当前用户 Run 项;不勾选时不新增自启动项;选项默认不勾选 | TODO |
|
||||
| 卸载清理自启动 | 已启用开机自启动后卸载 | 当前用户 Run 项被清理,不残留开机启动入口 | TODO |
|
||||
| 卸载保留数据 | 卸载时选择不删除用户数据 | 配置、角色、历史、日志保留 | TODO |
|
||||
| 卸载删除数据 | 卸载时选择删除用户数据 | 当前用户 QtDesktopPet 数据目录被删除 | TODO |
|
||||
| 性能采样 | 按 `performance_stability_check.md` 执行 | CPU/内存无持续异常增长,摘要写入文档 | TODO |
|
||||
|
||||
## 静态推演记录
|
||||
|
||||
每个模块完成后记录:
|
||||
|
||||
```text
|
||||
模块:
|
||||
入口:
|
||||
成功路径:
|
||||
失败路径:
|
||||
数据兼容:
|
||||
UI 状态:
|
||||
日志隐私:
|
||||
回归影响:
|
||||
结论:
|
||||
```
|
||||
|
||||
本轮静态推演明细:
|
||||
|
||||
| 模块 | 入口 | 成功路径 | 失败路径 / 兜底 | 风险点 | 结论 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 天气 | `CommandDispatcher -> PetWindow::handleWeatherChatMessage() -> WeatherManager` | 解析城市和日期,按显式城市 / 默认城市 / IP fallback 定位,请求 Open-Meteo,模板格式化后显示气泡 | AI 忙、天气忙提前拒绝;未知城市、IP 失败、超时、JSON 异常返回明确错误;默认城市测试超时会恢复测试按钮 | 网络不可用、Open-Meteo 多候选首项可能不符合预期 | v1/v1.2/v1.3 收口完成,区县精确定位和空气质量等保持延期 |
|
||||
| 提醒 | `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 打包延期,不引入重依赖 |
|
||||
| 联网模式 | `ChatInputDialog -> PetWindow::submitWebChatMessage() -> WebChatManager` | 输入框联网开关开启后,支持 OpenAI 官方 Web Search 和 Gemini Google Search grounding;不支持 DeepSeek/Custom 伪联网 | 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 或构建命令 |
|
||||
@@ -1696,8 +1696,9 @@ MIT License 开源
|
||||
当前仍需补齐:
|
||||
|
||||
```text
|
||||
1. 角色包导出和更完整管理界面
|
||||
2. 对话历史导出、搜索或更完整管理界面
|
||||
3. 发布前素材授权确认与打包验证
|
||||
4. 长期性能压测记录
|
||||
1. 发布前素材授权确认与打包验证
|
||||
2. 长期性能压测记录
|
||||
3. 本地文件操作 zip 打包能力,如后续确认压缩库方案再补
|
||||
4. 联网模式后续可补更多 AI Provider 原生联网适配、结构化搜索 API 或自建联网后端;网页全文抓取和长期缓存仍需先确认安全边界
|
||||
5. 应用启动跨平台发现、脚本/命令执行和管理员权限当前不支持,后续如确需增加必须重新评估安全边界
|
||||
```
|
||||
|
||||
@@ -597,8 +597,8 @@ release_packages/
|
||||
当前实现与计划仍存在差异:
|
||||
|
||||
```text
|
||||
1. SettingsDialog 仍是最小设置界面,角色页已有导入、切换和删除用户角色,但尚未包含导出和更完整的角色管理流程
|
||||
2. 对话历史已有内存上限和可选本地保存,但尚未提供导出、搜索或完整管理界面
|
||||
1. SettingsDialog 已支持角色导入、切换、删除用户角色、导出角色和打开用户角色目录;后续更复杂的角色市场/分享仍不在当前范围
|
||||
2. 对话历史已有内存上限、可选本地保存、关键词搜索、Provider/模型筛选和 Markdown/JSON 导出
|
||||
3. 状态级懒加载尚未包含后台线程预热、单帧级缓存和长期压测记录
|
||||
4. README 和开发文档已开始同步当前进度,但仍需随功能继续维护
|
||||
```
|
||||
@@ -636,12 +636,12 @@ release_packages/
|
||||
|
||||
```text
|
||||
1. 完善设置界面:
|
||||
- 角色导出
|
||||
- 打开用户角色目录
|
||||
- 更完整的角色管理状态提示
|
||||
- 后续如果做角色分享,需要补版权提示和包格式校验
|
||||
2. 使用 tools/perf_sample.ps1 补一轮可重复的稳定性与性能测试记录
|
||||
3. 使用 tools/perf_sample.ps1 验证状态级 LRU 卸载、主线程分批预热和动画缓存上限策略
|
||||
4. 做发布包安装/卸载实机验证,并确认 release_packages/ 或根目录安装包输出规则
|
||||
5. 按 docs/QtDesktopPet_测试清单与验收标准.md 做全功能手测
|
||||
```
|
||||
|
||||
---
|
||||
@@ -652,6 +652,6 @@ release_packages/
|
||||
|
||||
```text
|
||||
1. shiroko 素材是否允许作为正式开源发布素材继续保留在仓库中
|
||||
2. 角色管理下一步是否需要导出、打开用户角色目录
|
||||
3. 对话历史后续是否需要导出、搜索或按角色/Provider 分组管理
|
||||
2. 角色管理后续是否需要角色分享/市场能力
|
||||
3. 对话历史后续是否需要更复杂的会话分组、归档或全文索引
|
||||
```
|
||||
|
||||
@@ -53,6 +53,11 @@ reports/perf/
|
||||
| 动画预热与卸载 | 默认配置启动后静置,随后隐藏到托盘再显示 | `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 | 使用临时测试目录,不操作真实重要文件 |
|
||||
| 配置损坏兜底 | 备份后分别破坏 app 配置、AI 配置或本地聊天记录再启动 | 启动后采样 3 分钟 | 程序恢复默认配置或忽略损坏历史,并生成带时间戳的 broken 备份,不覆盖旧备份 | TODO | TODO | 使用备份副本测试 |
|
||||
| 角色包损坏兜底 | 使用临时复制的损坏角色包测试 | 启动后采样 3 分钟 | 程序不崩溃,回退 preview 或默认显示 | TODO | TODO | 不直接破坏仓库内默认角色包 |
|
||||
|
||||
@@ -99,6 +104,7 @@ QtDesktopPet.exe
|
||||
Qt 运行时依赖
|
||||
resources/characters/
|
||||
resources/icons/
|
||||
resources/sounds/
|
||||
LICENSE
|
||||
README.md
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user