From fcd4796feec27958879a6370011eb02d0e2a2d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Wed, 27 May 2026 13:19:02 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20v4.3=20=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=90=AF=E7=94=A8/=E7=A6=81=E7=94=A8=20+=20E2E=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=AE=BE=E8=AE=A1=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- ...6-05-27-v4.3-path-toggle-and-e2e-design.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-27-v4.3-path-toggle-and-e2e-design.md diff --git a/docs/superpowers/specs/2026-05-27-v4.3-path-toggle-and-e2e-design.md b/docs/superpowers/specs/2026-05-27-v4.3-path-toggle-and-e2e-design.md new file mode 100644 index 0000000..c10f8a1 --- /dev/null +++ b/docs/superpowers/specs/2026-05-27-v4.3-path-toggle-and-e2e-design.md @@ -0,0 +1,90 @@ +# v4.3 路径启用/禁用 + E2E 测试 — 设计文档 + +**日期**: 2026-05-27 +**分支**: v4.2(v4.3 后续创建) +**状态**: 已确认 + +## 概述 + +两项独立改进: +1. 路径启用/禁用(软开关):`string[]` → `PathEntry[]`,禁用状态存 JSON 文件 +2. E2E 测试:Playwright + Mock IPC,覆盖 4 条关键流程 + +--- + +## Part 1: 路径启用/禁用 + +### 数据模型 + +```typescript +// src/core/path-entry.ts (新增) +export interface PathEntry { + path: string; + enabled: boolean; +} +``` + +全栈从 `string[]` 迁移到 `PathEntry[]`。注册表读写时做转换。 + +### 禁用状态持久化 + +文件:`%APPDATA%/PathEditor/disabled.json` +格式:`{ "system": ["path1"], "user": ["path2"] }` + +加载流程:注册表读取 → `PathEntry[]`(全部 enabled:true)→ 读取 disabled.json → 匹配到的标记 enabled:false + +保存流程:只将 enabled:true 的 path join 后写入注册表 + +切换流程:复选框点击 → 更新内存状态 → 立即调用 `save_disabled_state` 写入 JSON + +### 新增 Rust 命令 + +- `save_disabled_state(system: Vec, user: Vec) -> Result<(), String>` +- `load_disabled_state() -> Result, Vec, String>` 返回 `(system_disabled, user_disabled)` + +### Undo 适配 + +- `OpRecord.oldPaths` / `newPaths` 从 `string[]` 改为 `PathEntry[]` +- 新增 `OperationType.TOGGLE = 8`:单条路径切换启用/禁用,undo 翻转回去 +- 8 种已有操作类型的 switch case 适配 `PathEntry` + +### UI + +- 路径列表每行前加复选框,`#` 序号列与复选框合并 +- 禁用行:灰色文字 + 删除线(`text-decoration: line-through`) +- 工具栏不新增按钮(复选框独立操作) + +### 状态层 + +- `app-store.ts` 新增 `togglePath(index, target)` 方法 +- `loadPaths` 加载时合并 disabled 状态 +- `savePaths` 保存时过滤 disabled 路径 + +--- + +## Part 2: E2E 测试 + +### 技术选型 + +`@playwright/test`,独立于 Vitest。Mock Tauri IPC 通过 `page.addInitScript()` 注入。 + +### Mock IPC + +页面加载前注入 `window.__TAURI_INTERNALS__.invoke` 的 mock 实现,按命令名返回假数据。 + +### 4 条测试场景 + +| 场景 | 步骤 | +|------|------| +| 启动加载 | 访问页面 → 系统 PATH 显示 2 条 → 用户 PATH 显示 1 条 | +| CRUD + 撤销 | 添加路径 → 出现在列表 → Ctrl+Z 撤销 → 路径消失 → Ctrl+Y 重做 → 路径恢复 | +| 禁用 + 保存 | 点击复选框禁用 → 路径灰显+删除线 → 点保存 → 验证 save IPC 只传了 enabled 路径 | +| 搜索 + 清理 | 输入搜索词 → 列表过滤 → 清空搜索 → 点清理 → 无效路径红色 | + +### 运行方式 + +```bash +npx playwright test +``` + +需要先启动 Vite 开发服务器:`npm run dev`