diff --git a/docs/superpowers/reports/2026-04-05-tauri-functional-test-report.md b/docs/superpowers/reports/2026-04-05-tauri-functional-test-report.md new file mode 100644 index 0000000..31f1c60 --- /dev/null +++ b/docs/superpowers/reports/2026-04-05-tauri-functional-test-report.md @@ -0,0 +1,316 @@ +# ZCLAW Tauri 端功能测试报告 + +**日期:** 2026-04-05 +**测试环境:** Windows 11, Tauri 2.x, React 19, pnpm start:dev +**测试方法:** UI 交互 + JS 注入探针 + localStorage/Store 数据验证 +**测试人员:** Claude (自动化) + +--- + +## 测试总结 + +| 模块 | 状态 | P0 | P1 | P2 | 备注 | +|------|------|----|----|-----|------| +| T1 聊天核心 | ⚠️ 部分通过 | 1 | 0 | 0 | LLM 500 错误导致消息发送失败 | +| T2 会话管理 | ⚠️ 部分通过 | 0 | 1 | 0 | 消息持久化位置不明 | +| T3 Agent 人格 | ⚠️ 部分通过 | 0 | 1 | 0 | 侧边栏切换 Bug | +| T4 记忆系统 | ⚠️ 部分通过 | 0 | 0 | 1 | 记忆去重缺失 | +| T5 自动化 | ✅ 通过 | 0 | 0 | 1 | 审计日志单一 | +| T6 技能市场 | ✅ 通过 | 0 | 0 | 0 | 12 个技能正常 | +| 登录系统 | ✅ 通过 | 0 | 0 | 0 | SaaS 登录正常 | +| **总计** | | **1** | **2** | **2** | | + +--- + +## 详细测试结果 + +### 登录系统 ✅ 通过 + +**测试操作:** +1. 启动应用后显示 SaaS 登录页面(用户名/密码表单) +2. 输入 `admin / admin123`,点击登录 +3. 登录成功,跳转到主聊天界面 + +**验证结果:** +- [x] 登录页面正常渲染(表单、按钮、Logo) +- [x] 用户名密码输入正常 +- [x] SaaS 后端(8080 端口)响应正常 +- [x] 登录成功后 `isLoggedIn` 状态更新 +- [x] Cookie/Token 持久化到 localStorage(加密存储 `enc_zclaw-saas-token`) +- [x] 会话恢复机制(`restoreSession`)存在 + +**状态数据:** +```json +{ + "connectionMode": "saas", + "saasUrl": "http://127.0.0.1:8080", + "username": "admin", + "tokenStorage": "encrypted (AES)" +} +``` + +--- + +### T1: 聊天核心功能 ⚠️ 部分通过 (P0 x1) + +**测试操作:** +1. 在 textarea 中输入测试消息 +2. 通过 React nativeInputValueSetter 设置值并触发 input/change 事件 +3. 点击发送按钮(aria-label="发送消息") +4. 等待 LLM 流式响应 + +**验证结果:** +- [x] Textarea 输入框正常渲染,placeholder "今天我能为你做些什么?" +- [x] React 受控组件输入正常(需用 nativeInputValueSetter) +- [x] 发送按钮在空输入时 disabled,有内容时 enabled +- [x] 消息发送后 textarea 自动清空 +- [x] 思考模式(Thinking)已启用 +- [x] 当前模型显示: `glm-4-flash` +- [ ] **P0: LLM 响应 500 错误** — 发送消息后收到 `API error 500 Internal Server Error: {"error":"INTERNAL_ERROR","message":"服务内部错误"}` +- [x] 历史消息中有成功回复("收到"),说明 LLM 调用链路本身是通的 + +**LLM 调用链路:** +``` +用户输入 → KernelClient → SaaS Relay (8080) → GLM API → 流式响应 +``` + +**错误日志:** +``` +[KernelClient] Stream error: LLM error: API error 500 Internal Server Error +``` + +**流式存储状态:** +```json +{ "chatMode": "thinking" } +``` + +--- + +### T2: 会话管理 ⚠️ 部分通过 (P1 x1) + +**测试操作:** +1. 查看侧边栏对话列表 +2. 检查 localStorage 中的对话存储 + +**验证结果:** +- [x] 侧边栏显示对话列表("你叫什么名字 — 2小时前5条消息") +- [x] 对话搜索框存在(placeholder "搜索对话...") +- [x] "新对话" 按钮存在(2个位置:顶部和主内容区) +- [ ] **P1: 消息持久化位置不明** — `zclaw-chat-storage` 为 `{state:{}, version:0}`,但页面上能看到历史消息 + - 消息可能存储在 IndexedDB 或内存中 + - 刷新页面后消息是否能恢复未验证 + +**存储数据:** +```json +{ + "zclaw-chat-storage": "{\"state\":{},\"version\":0}", + "zclaw-stream-storage": "{\"state\":{\"chatMode\":\"thinking\"}}" +} +``` + +--- + +### T3: Agent 人格系统 ⚠️ 部分通过 (P1 x1) + +**测试操作:** +1. 检查 localStorage 中 Agent 身份数据 +2. 点击侧边栏"智能体"按钮 +3. 验证 CloneManager 组件是否渲染 + +**验证结果:** +- [x] 5 个 Agent 身份存储在 `zclaw-agent-identities` +- [x] 每个 Agent 有完整的三件套: `soul` + `instructions` + `userProfile` +- [x] Soul 内容完整(ZCLAW 人格定义,含核心特质和语气) +- [x] Instructions 完整(操作规范、记忆管理) +- [x] UserProfile 初始状态:"尚未收集到用户偏好信息" +- [ ] **P1: 侧边栏 "智能体" tab 切换失效** — 点击"智能体"按钮后: + - 按钮样式变为 active(font-medium class 已添加) + - 但内容区仍显示 ConversationList 而不是 CloneManager + - `activeTab` 状态确实切换到了 'clones'(通过按钮样式确认) + - **根因**: AnimatePresence mode="wait" 可能导致渲染问题,或 CloneManager 组件渲染失败 + +**Soul 内容示例:** +```markdown +# ZCLAW 人格 +你是 ZCLAW(小龙虾),一个基于 OpenClaw 定制的中文 AI 助手。 + +## 核心特质 +- **高效执行**: 你不只是出主意,你会真正动手完成任务 +- **中文优先**: 默认使用中文交流,必要时切换英文 +- **专业可靠**: 对技术问题给出精确答案,不确定时坦诚说明 +- **持续成长**: 你会记住与用户的交互,不断改进自己的服务方式 + +## 语气 +简洁、专业、友好。避免过度客套,直接给出有用信息。 +``` + +**问题:** +- 所有 5 个 Agent 共享相同的 Soul 模板(没有个性化差异) +- 新创建的 Agent 没有独特的 personality/communicationStyle 设置 + +--- + +### T4: 记忆系统 ⚠️ 部分通过 (P2 x1) + +**测试操作:** +1. 检查 `zclaw-intelligence-fallback`(本地降级记忆) +2. 检查 `zclaw-agent-memories`(Agent 记忆) +3. 检查 `zclaw-memory-stats`(记忆统计) +4. 检查 `zclaw-memory-graph`(记忆图谱过滤器) + +**验证结果:** +- [x] Fallback 记忆: 4 条,存储在 localStorage +- [x] Agent 记忆: 3 条任务类型记忆 +- [x] 记忆统计: 4 entries, 1337 bytes +- [x] 记忆图谱过滤器支持 5 种类型: fact/preference/lesson/context/task +- [x] 记忆图谱有 minImportance 和 dateRange 过滤 +- [ ] **P2: 记忆去重缺失** — 同一内容 "用户偏好: 不用进行人格设置么" 重复存储 4 次(ID 不同) + - 时间戳递增说明是多次独立写入 + - 缺少基于内容的去重检查 + +**记忆数据:** +``` +Fallback 记忆 (4条): +- mem_...a0s5z9: "用户偏好: 不用进行人格设置么" (preference) +- mem_...pbx96r: "用户偏好: 不用进行人格设置么" (preference) ← 重复 +- mem_...q6rqwo: "用户偏好: 不用进行人格设置么" (preference) ← 重复 +- mem_...u8mger: "用户偏好: 不用进行人格设置么" (preference) ← 重复 + +Agent 记忆 (3条): +- "帮我起草一份产品需求文档" (task) +- "帮我写一个 Python 脚本处理 Excel 文件" (task) +- "帮我梳理服饰公司的业务SOP" (task) +``` + +--- + +### T5: 自动化系统 ✅ 通过 (P2 x1) + +**测试操作:** +1. 检查自主配置(`zclaw-autonomy-config`) +2. 检查反思引擎(`zclaw-reflection-*`) +3. 检查心跳系统(`zclaw-heartbeat-*`) +4. 检查审计日志(`zclaw-autonomy-audit-log`) +5. 点击"自动化"按钮,验证 Pipeline 列表 + +**验证结果:** +- [x] 自主等级: `autonomous`(最高级别) +- [x] 所有自主操作均已启用: + - memoryAutoSave: true + - identityAutoUpdate: true + - skillAutoInstall: true + - selfModification: true + - autoCompaction: true + - autoReflection: true +- [x] 反思引擎配置完整: + - 每 5 次对话触发 + - 允许修改 Soul + - 需要用户批准 + - 支持 LLM 增强分析 +- [x] 反思历史: 8 条记录 +- [x] 反思状态: 距上次反思已过 2 次对话 +- [x] 心跳系统: 已启用,30 分钟间隔,3 个检查项 + - 待办任务检查 + - 记忆健康检查 + - 空闲问候 +- [x] Pipeline 模板: 15 个,支持 7 个行业分类 +- [x] 自动化面板 UI 渲染正常(Pipeline/Hands/Workflows 三个标签) +- [ ] **P2: 审计日志单一** — 6 条日志全部是 `reflection_run`,没有 Hands 触发或技能执行记录 + - 可能是因为没有触发过 Hands + - 也可能是审计日志记录不完整 + +**Prompt Cache 验证:** +``` +已缓存 3 个 prompt 模板: +- reflection: 反思引擎系统提示 +- compaction: 上下文压缩提示 +- extraction: 记忆提取提示 +``` + +--- + +### T6: 技能市场 ✅ 通过 + +**测试操作:** +1. 检查 `zclaw-skill-index` 数据 +2. 点击"技能市场"按钮 + +**验证结果:** +- [x] 12 个技能已安装 +- [x] 覆盖 8 个分类 +- [x] 每个技能有 5-6 个触发器 +- [x] 技能列表: + | 技能 | 分类 | 触发器数 | + |------|------|----------| + | Code Review | development | 5 | + | Frontend Developer | development | 6 | + | Backend Architect | development | 5 | + | Security Engineer | security | 5 | + | Data Analysis | analytics | 5 | + | Chinese Writing | content | 5 | + | DevOps Automator | ops | 6 | + | Senior PM | management | 5 | + | Git Operations | development | 6 | + | API Tester | testing | 5 | + | Finance Tracker | business | 5 | + | Social Media Strategist | marketing | 6 | + +--- + +## 额外发现 + +### 环境信息 + +| 项目 | 值 | +|------|-----| +| 运行时 | Tauri (桌面端) | +| 连接模式 | SaaS relay | +| SaaS 后端 | http://127.0.0.1:8080 (运行中) | +| Dev Server | 端口 50051 (未监听) | +| MCP 插件 | 端口 4000 (未监听) | +| 当前模型 | glm-4-flash | +| 用户 | admin | + +### 已知但未测试的功能 + +- [ ] 新建对话流程(点击"新对话"后的完整流程) +- [ ] 切换对话(点击侧边栏不同对话) +- [ ] 删除对话 +- [ ] 创建新 Agent(因 CloneManager 未渲染无法测试) +- [ ] Agent 人格编辑 +- [ ] 记忆搜索功能 +- [ ] Pipeline 运行 +- [ ] Hand 触发执行 +- [ ] 技能安装/卸载 +- [ ] 模型切换(点击 glm-4-flash 按钮) + +### Dev Server 端口 50051 问题 + +`dev-server` feature 已添加到 `tauri:dev` 命令(本次测试中修改了 `desktop/package.json`),但重启后 50051 端口仍未监听。可能原因: +1. Cargo 需要重新编译才能识别新 feature(增量编译可能跳过) +2. `dev_server::start_dev_server()` 可能在绑定端口时失败但静默吞掉了错误 +3. 需要完全重新构建:`cargo clean && pnpm start:dev` + +--- + +## 缺陷清单 + +### P0 (阻塞性) + +| ID | 模块 | 描述 | 复现步骤 | +|----|------|------|----------| +| P0-1 | T1 聊天 | SaaS relay 模式下 glm-4-flash 偶发 500 错误 | 发送消息后 LLM 返回 INTERNAL_ERROR | + +### P1 (严重) + +| ID | 模块 | 描述 | 复现步骤 | +|----|------|------|----------| +| P1-1 | T3 Agent | 侧边栏"智能体"tab 切换后内容区不更新 | 点击"智能体"按钮 → 内容区仍显示对话列表 | +| P1-2 | T2 会话 | 消息持久化位置不明确 | 检查 zclaw-chat-storage 为空,但页面有历史消息 | + +### P2 (一般) + +| ID | 模块 | 描述 | 复现步骤 | +|----|------|------|----------| +| P2-1 | T4 记忆 | 记忆写入无去重 | 多次对话产生相同内容的重复记忆 | +| P2-2 | T5 自动化 | 审计日志仅记录反思运行 | 无 Hands/技能执行日志 |