MooTool

Handy tool set for developers

View on GitHub

MooTool Next Flutter 验收与交付标准

初始状态:全部待开发/待验收。本文规定测试方法和完成标准,不能作为已通过的测试报告。

1. 状态与证据规则

状态 何时使用
未开始 没有对应实现
开发中 有部分实现,核心路径尚未闭环
待验收 代码完成但缺真实平台/视觉/持久化证据
已验收 本文要求的对应范围已执行,并链接具体证据
明确差异 有精确范围、原因、替代操作、影响及决策记录;不自动视为完整对齐

禁止以“库声称支持”“页面有按钮”“另一个版本已通过”“构建通过”代替用户流程验收。未运行的平台标记未验证;预览版可以有限范围发布,不能称三平台完整可用。

每轮证据放入 docs/evidence/<日期>-<阶段>/

environment.md       # 提交、工具链、OS/架构、屏幕缩放、测试数据路径
results.md           # 检查命令、结果、失败和范围
screenshots/         # 当前产品可复现截图
parity.md            # 当前 Electron 基线、Flutter 变化、未决项
performance.json    # 如本轮有性能测试,含原始测量

测试不能使用开发者真实工作区。应用内集成测试启动参数指定 Flutter 临时数据目录;Electron 对照运行使用另一个专属临时目录。测试后只清理自己创建的目录。

2. 功能进度表

实现人员逐项更新状态与证据,F 编号对应 功能规格。不能只更新总体百分比。

ID 入口 当前状态 证据
F00 mootool / 首页 开发中 三语言首页与外链已实现;与 Electron 并排桌面截图未跑
F01 quickNote / 随手记 开发中 列编辑/24 项替换/附件路径;剪贴板图片走 DesktopHost;拖放树、Git watcher、5MiB 冲突 UI 未完
F02 textDiff / 文本对比 开发中 test/unit/local_tools_test.dart 对齐 unified/segment fixtures;同步滚动与字符高亮 UI 未完
F03 reformat / 格式化 开发中 Nginx 对齐;XML/HTML/Java 为自写整理,非 Prettier,见 ADR 004
F04 json / JSON 开发中 test/unit/json_engine_test.dartworkspace_test.dart;Git 主流程有服务,冲突 UI 未完
F05 java / 代码运行 开发中 test/unit/p5_system_test.dartreview_runtime_test.dart R13 杀进程树;Node 非 Prettier;桌面 UI 未跑
F06 ymlProperties / 配置转换 开发中 Properties↔YAML 单测通过
F07 protobuf / Protobuf 开发中 粘贴 proto3 JSON↔Hex/Wire 单测通过;嵌套/map/oneof 未做
F08 variables / 环境变量 开发中 用户变量写入本产品 environment/user.json;不改系统环境;OS 持久未做
F09 http / HTTP 开发中 test/unit/network_test.dart 本地服务确认 method/重复 query/body/超时/过大响应;cURL 导入不执行命令;代理 UI 未完
F10 host / Host 开发中 方案 CRUD 持久化;系统 hosts 提权写入明确未实现
F11 net / 网络/IP 开发中 IPv4↔Long 对齐 Electron;DNS/ping 真实查找;WHOIS 走 :43 并跟随 refer;本机地址来自网卡列表
F12 uaParse / UA 开发中 预设 Chrome/Safari/bot 单测通过
F13 encode / 编码 开发中 Unicode/URL UTF-8+GB2312/Hex/ASCII 单测通过
F14 crypto / 加解密/随机 开发中 AES ECB PKCS7 固定密文与 Electron 一致;DES/摘要/Base32/随机已做;SM4/RSA/SM2 明确未实现
F15 regex / 正则 开发中 分组与零宽匹配;^ 锚点不再因 substring 重跑而失真;超时取消未做
F16 cron / Cron 开发中 下次运行与年字段单测通过;L/# 未做
F17 qrCode / 二维码 开发中 生成 PNG;识别未接入解码器
F18 timeConvert / 时间 开发中 时区往返与非法日期单测通过;全屏时钟未做
F19 messageBoard / 留言板 开发中 8 预设/6 主题/80 字/对齐/比例/Esc 退出演示;防休眠走 DesktopHost,失败不假装常亮
F20 translation / 翻译 开发中 Google gtx 客户端 + 分段/取消单测;Bing/单词本/自动翻译未做
F21 calculator / 计算器 开发中 表达式/进制/GCD/排列组合单测通过
F22 colorBoard / 调色板 开发中 解析/运算/主题色 SHA 对齐;取色走 DesktopHost / NSColorSampler;Release 安装包未验收
F23 image / 图片 开发中 图片库导入/压缩/水印/轮廓 SVG;剪贴板与截图走 DesktopHost;截图可裁剪,取消不写库
F24 pdf / PDF 开发中 页码规则对齐 Electron;SimplePdf 可提取含括号文本;任意/加密 PDF 拒绝;不是真实页对象复制
F25 hardware / 系统信息 开发中 Platform/内存/网卡真实采集;非 systeminformation 全量;CPU% 未做
A01 11 类设置 开发中 11 类页可持久化;六种风格有独立 token;凭据不进 settings/备份;关闭 hide 无托盘时改为询问;托盘/截图/取色 Release 实机未验收
A02 历史/收藏/搜索 开发中 JSON 与本地工具历史;regex/cron/color 收藏入口;⌘K 搜索
A03 数据/Git/窗口/平台/更新 开发中 保存队列/恢复内存/文档边界/原子回退/隔离见 test/unit/review_regression_test.dart;分离窗口诚实失败;更新只读 next-flutter;本机未签名 DMG 见 p7b;Windows/Linux 包与清单节点未做;R01 Release 原生通信未用安装包验收

每个复杂工具再维护子能力状态。比如随手记正文编辑完成、列编辑未完成时,F01 不能标记已验收。

3. 首批必须实现的验收用例

以下用例 ID 可以直接作为 Cursor 测试任务名;它们是后续实现任务,并非现有测试文件。

用例 操作 必须观察到的结果
CORE-01 搜索中英日名称/ID/关键词,键盘选择 命中正确工具;全部 26 项可访问
CORE-02 编辑 JSON → 切计算器 → 回 JSON 文本、选区、滚动、选项保持
CORE-03 切 theme/language/navigation 所有已打开工具同步;编辑状态不重建丢失
CORE-04 新建自定义组、隐藏工具、重启 分组/隐藏持久化,隐藏工具仍可搜索
CORE-05 输入中文候选期间按 Enter/Esc 完成/取消输入法,不执行工具或关闭窗口
JSON-01 {"b":2,"a":{"d":4,"c":3}} 排序格式化 内外 Key 按已选规则排序;undo 恢复输入
JSON-02 {"a":1,"a":2} 检查重复 报告重复 a,不能因 Map 覆盖而显示无重复
JSON-03 非法 JSON 保存/查找/切页 校验失败但原文不丢,文本仍可操作
JSON-04 数组筛选 JSONPath、路径树选值 结果由实际数据产生,路径和值一致
NOTE-01 矩形选择三行,输入相同前缀后 undo 三行正确更新并一次恢复,范围不含多余字符
NOTE-02 双击选词 → 等待自动保存 → 切预览 选区及 undo 不因保存丢失,切回可继续
NOTE-03 连续粘贴两张图片,中间不手动换行 两个独立相对附件引用,顺序正确,预览可见
NOTE-04 有选区时快速替换;无选区再执行 分别只改选区/全文,均能撤销
NOTE-05 移动/重命名笔记、删除另一笔记 附件引用有效,仍被引用附件不会误删
HTTP-01 发重复 Query/表单/Headers/Cookies 到本地服务 服务收到准确内容,响应 Tab/耗时/状态真实
HTTP-02 延迟响应时取消,马上发送新请求 原请求真正停止;旧结果不覆盖新响应
HTTP-03 cURL 导入含引号/转义/重复参数 只解析不执行;支持字段准确,不支持项明确
RUN-01 实际 Node/Python 打印参数和 cwd 输出与用户设置一致,非固定文本
RUN-02 启动含子进程的长任务后停止 整棵受控进程树退出,无遗留临时文件
DATA-01 写笔记/历史/集合 → 退出 → 重启 内容、选项和导航恢复
DATA-02 自动保存期间注入写失败 保留 dirty 状态和旧文件;可重试,不显示已保存
DATA-03 修改外部文档,同时本地有 dirty 提示比较/保留/另存,不静默覆盖
DATA-04 备份 → 修改 → 恢复 所有声明覆盖类别一致回到快照点
DATA-05 损坏 settings/DB/备份 保留原数据并显示恢复入口,不写空数据覆盖
IMPORT-01 对受支持 Java/Electron 样本导入两次 只读来源,第二次幂等,无重复记录
IMPORT-02 预览后改变来源,或中途注入失败 变化拒绝/重新预览;失败回滚目标,来源不变
FILE-01 导入中文/空格/长路径、选择后删除文件 正常文件处理正确,竞态错误可理解
FILE-02 相对越界、symlink 逃逸、重复解包项 拒绝越界,不写本产品作用域外
CRYPTO-01 Electron 固定密文→Flutter 解密/验签 按冻结兼容模式得出正确结果
PROTO-01 粘贴运行前从未见过的 proto message 无需重编译即可编解码
QR-01 生成 PNG→文件/图片剪贴板识别 原始中文内容准确回读
PDF-01 5 页 PDF 选页拆分再合并 页数/顺序正确,文字可提取,非栅格化
IMAGE-01 多张图片压缩、水印、转 SVG 真正新产物,取消/覆盖策略正确

4. 多窗口、桌面与原生交互

用例 场景 通过条件
WIN-01 JSON 带选区/undo 分离再收回 同一逻辑会话,文本/选择/滚动/undo 保持
WIN-02 关闭分离窗口 工具收回主工作区,不清空、不退出应用
WIN-03 JSON、随手记、HTTP、计算器同时分离 互不串状态;各窗口插件与剪贴板可用
WIN-04 转移中目标窗口初始化失败 源恢复可编辑,无两个写入 owner
WIN-05 HTTP/运行代码期间分离/收回 不重新执行、不丢输出,取消仍有效
WIN-06 分离/收回连续 100 次 无崩溃、遗留窗口、累积监听器、持续内存增长
WIN-07 打开搜索、设置、分组、更新说明 层级正确,可点击;工具视图不盖住 overlay
WIN-08 主窗口 ask/hide/quit 与托盘禁用 无隐藏后无法恢复的孤儿进程
WIN-09 多屏、负坐标、移除显示器后重启 窗口恢复到可见工作区,尺寸/缩放正确
SYS-01 截图、区域选择、取消、拒绝权限 实际捕获/正确恢复窗口,取消不保留临时资产
SYS-02 100%/150%/200% 屏幕取色 像素坐标和预览一致,无窗口遮挡污染
SYS-03 留言板演示、退出、失活 防休眠 token 按 owner 释放
SYS-04 Hosts/环境写入拒绝提权 不显示成功,不破坏系统文件
SYS-05 本机菜单、右键、拖放、复制粘贴 真实 OS 工作流,与 Widget 层结果一致

必须实际使用输入法和系统剪贴板。测试控制器直接修改文本不能替代键盘输入验收;直接写数据库不能替代保存按钮验收。

5. 视觉验收

5.1 建立两类基线

  1. Electron 体验基线:冻结提交、设置、测试数据、窗口尺寸。检查工具顺序、左右/上下关系、Tab 顺序、主要动作和结果位置。
  2. Flutter 视觉基线:按现代 token 和本平台原生行为建立。检查字体、色彩、边距、焦点、密度和主题一致性。

Flutter 不要求与 Electron 跨渲染引擎逐像素相等。外边距、圆角、原生按钮和字体渲染等有意变化记录为设计差异;不能借此容许布局错位、缺功能或错误选中态。

每张截图写明版本/提交、系统、DPI、logical size、语言、主题、导航模式、工具状态。历史截图中的大标题不再作为当前功能页验收目标。

5.2 矩阵

维度 最低覆盖
入口 26 个入口默认态全部覆盖;有编辑/结果的工具至少一个真实结果态
主题 每个入口 light/dark;另测系统主题切换
核心尺寸 1440×920 light、1080×720 dark;JSON/随手记/HTTP/设置两尺寸双主题
额外尺寸 960×640 最小、1920×1080 大屏;实际平台支持允许更严格最小值但需记录
语言 中文/英文/日文导航和设置全量;密集工具全部检查英文/日文最长文案
缩放 至少 100%、150%、200% OS 缩放;应用文字 125%、150%
导航 classic/card/grouped、展开/折叠、自定义组/隐藏工具
风格 modern 完整矩阵;其余五个预设至少首页/JSON/设置的双主题代表状态
原生层 工具独立窗口、原生菜单/文件对话框、tooltip、popup、拖放反馈

验收标准:

5.3 黄金路径截图场景

6. 性能与资源

以下是 Flutter 初版工程目标,不是当前测量结果;P0/P2 要记录参考硬件,调整目标需说明理由。用 release/profile 模式测试,debug 耗时不能当发行指标。

指标 初始目标
冷启动至导航与输入可用 中位数 ≤ 2 秒;至少 10 次,记录 p95
已加载工具切换 p95 ≤ 100 ms,无输入丢失
普通文本键入反馈 p95 ≤ 50 ms;不计输入法候选服务自身延迟
搜索 26 工具 p95 ≤ 50 ms
3 MiB JSON 格式化 ≤ 3 秒;UI 可交互、可取消
5 MiB 随手记保存/恢复 单次 ≤ 2 秒;不阻塞 UI isolate
10,000 文件树节点 首屏增量显示 ≤ 1 秒;虚拟化/后台索引
帧耗时 常见操作以 60 Hz 的约 16.7 ms 帧预算检查;记录慢帧和原因
稳态内存 主窗口+已使用核心工具参考目标 ≤ 300 MiB RSS;跨平台分别测量
反复窗口转移 100 次后无持续单调增长;关闭临时引擎/worker 后稳定值有记录

性能不作为伪造测试数字或删除功能的理由。多 engine 内存成本高时采取按需创建、及时释放非 owner engine 和有限缓存,不能销毁 dirty 会话。

压力样本包含:1/3/10 MiB JSON、5 MiB 笔记、大段单行文本、10,000 节点 Vault、20 项 PDF、超大图片、连续网络取消和无限运行程序。所有限制使用统一常量,超限告知原因并保留现有数据。

7. 五产品并存:专门验收

测试环境同时安装可用的 Java、Electron、Tauri、macOS Native(仅 macOS)和 Flutter。缺少某产品时记录未覆盖,不能默认判定通过。

用例 操作 通过条件
ISO-01 安装 Flutter 应用名、ID、目录、快捷方式、卸载项独立;其他安装文件 hash 不变
ISO-02 所有可用产品同时启动 不被跨产品单实例锁阻止;不激活错误产品
ISO-03 Flutter 修改主题、草稿、历史、Vault 其他产品专属数据内容不变,重启仍保持原设置
ISO-04 Flutter 更新检查遇到其他产品更高版本 不提示跨产品升级,不下载其他产品资产
ISO-05 安装 Flutter 新版本 仅升级 Flutter,自有数据迁移成功
ISO-06 卸载 Flutter 其他产品可启动且数据不变;删除 Flutter 数据只在明确选择时发生
ISO-07 从 Electron/Java 显式导入 来源内容 hash 不变,旧产品仍正常使用
ISO-08 用户误选其他产品活动数据/Vault 目录 阻止直接接管,提供复制导入方式
ISO-09 凭据和缓存 Flutter 专属命名空间,不能读到/删除其他产品 token
ISO-10 只取出 next-flutter 干净构建 不读取其他产品源码/资源/产物,不运行其他产品构建
ISO-11 发布 Flutter tag/更新清单 只操作 next-flutter 节点和 Release;保留其他节点,不覆盖 Latest
ISO-12 平台 URL scheme/文件关联/全局快捷键 独立身份;默认不抢占已有产品注册;冲突时显式提示

ISO-03 验证专属数据的只读/未改写,可对关闭的来源数据制作 before/after 内容 hash。测试运行中数据库自行写 WAL 时不能把其正常写入误判为 Flutter 改动;需要控制测试条件并辅以实际访问日志。

系统 Hosts、环境变量、剪贴板属于 OS 共享资源,用户主动操作它们会影响整个系统。验收应确认“操作范围明确、动作由用户触发、没有跨产品私有数据依赖”,不能要求剪贴板或系统 Hosts 在不同应用间物理隔离。

8. 发布和更新验收

9. 差异记录模板

差异 ID:
工具/能力:
Electron 基线提交与具体源码:
Electron 观察行为:
Flutter 行为:
类别:视觉改进 / 平台差异 / 修复源缺陷 / 尚未实现
原因与影响:
用户仍如何完成原任务:
实现/测试/截图证据:
状态与后续动作:
是否改变已约定功能范围:

“尚未实现”不能写成“视觉改进”。可自行确定控件圆角、实现库等常规选择;减少核心功能或改变数据共享边界须回到用户决定。不要因为一般实现选择频繁请求确认。

10. 完整产品的发布 DoD

若只是阶段预览,应按实际范围命名并发布;不要把“做完 P1 壳”标记为完整 Flutter 版。