chore: align mvp design governance
- 统一 local-first MVP 后阶段架构口径,补充 process 执行总序和 Reasonix 协作记录 - 归档已完成的 design checklist,标注参考型 process,更新 AGENTS/REASONIX/架构文档 - 补充文件树/主编辑器下载与上下文菜单相关实现、bug 记录和 smoke 脚本 验证:git diff --check;codegraph sync .;cargo test -p mnote-web;node --check scripts/task476-filetree-editor-context-menu-download-smoke.js
This commit is contained in:
+1
-1
@@ -93,7 +93,7 @@
|
||||
| `tree.*` 命令切流(Stage 2)| DONE | `design/04-tree-domain/done/4-6-tree-command-protocol-cutover-stage2-v1.md` |
|
||||
| 文件树资源行与页面命令分离 | DONE | `bugs/04-tree-domain/done/4-46-filetree-resource-row-document-command-leak-v1.md` |
|
||||
| 垃圾箱恢复位置记录 + reveal/focus | DONE | `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md` §2 |
|
||||
| 资源生命周期命令 `tree.resource.*`(mindmap/table rename 未完成)| PARTIAL | `design/04-tree-domain/process/4-27-resource-lifecycle-command-cutover-v1.md` |
|
||||
| 资源生命周期命令 `tree.resource.*`(核心 cutover 已完成,局部尾项由后续文档承接)| DONE/PARTIAL tails | `design/04-tree-domain/done/4-27-resource-lifecycle-command-cutover-v1.md`,尾项见 `4-28` / `4-34` / `4-44` / `4-45` |
|
||||
| 双浏览器 no-refresh(页面 + 文件 + 垃圾箱实时同步)| PROCESS | `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md` |
|
||||
| Local/Cloud 桥接 | P3 CANDIDATE | `design/04-tree-domain/process/4-23-local-cloud-explicit-bridge-p3-candidate-v1.md` |
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
> 上位依据:
|
||||
> - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
|
||||
> - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/done/2-2-local-first-workspace-convex-control-plane-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/process/2-3-local-workspace-access-control-productization-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/done/2-3-local-workspace-access-control-productization-v1.md`
|
||||
> - `/mnt/Data1T/mnote/ARCHITECTURE.md`
|
||||
> - `/mnt/Data1T/mnote/CURRENT_ARCHITECTURE.md`
|
||||
>
|
||||
|
||||
-258
@@ -1,258 +0,0 @@
|
||||
# 1-7 Local Workspace Root Page Bundle Checklist v1
|
||||
|
||||
## 背景
|
||||
|
||||
当前默认本地工作区初始化会创建 `pages/`、`assets/`、`mindmaps/`、`ai-sessions/` 等顶层目录。这更像早期产品内部布局,不像用户真实打开的 VSCode 文件夹,也不利于页面导出。
|
||||
|
||||
本轮收口方向:
|
||||
|
||||
- 默认工作区只保留用户内容根目录和 `.mnote/` 系统目录。
|
||||
- 页面树允许把 `页面.md + 页面/` 解释成一个页面节点与其子页面容器。
|
||||
- 文件树必须真实展示文件系统,不合并、不隐藏同名 `.md` 和目录。
|
||||
- 新建页面使用 `新页面HHMMSS` 命名,避免重复创建同名 `新页面.md`。
|
||||
- 新建页面时同时创建 `新页面HHMMSS.md` 和 `新页面HHMMSS/`。
|
||||
- 附件、思维导图等页面资源默认进入同名目录下,而不是顶层 `assets/` / `mindmaps/`。
|
||||
|
||||
## 参考代码位置
|
||||
|
||||
- 当前默认工作区初始化:`rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `create_default_local_workspace_for_actor_at_base`
|
||||
- `ensure_default_workspace_directories`
|
||||
- `ensure_default_workspace_home_page`
|
||||
- 当前本地页面创建:`rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `execute_local_tree_command`
|
||||
- `create_local_markdown_page`
|
||||
- 当前本地资源上传:`rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `write_local_markdown_asset`
|
||||
- 当前文件树真实扫描:`rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `load_local_folder_file_tree_snapshot`
|
||||
- `scan_directory`
|
||||
- 当前页面树扫描:`rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
||||
- `load_local_folder_page_tree_snapshot`
|
||||
- `scan_markdown_page_tree`
|
||||
- 当前根入口默认初始化测试:`rust/crates/mnote-web/src/routes/gateway.rs`
|
||||
- `root_entry_initializes_default_local_workspace_page`
|
||||
- 当前上传 smoke:`scripts/task443-local-markdown-asset-upload-smoke.js`
|
||||
|
||||
## 目标目录契约
|
||||
|
||||
### 默认初始化
|
||||
|
||||
默认工作区初始化后应该是:
|
||||
|
||||
```text
|
||||
my-space/
|
||||
.mnote/
|
||||
workspace.json
|
||||
trash/
|
||||
初始化的新页面.md
|
||||
```
|
||||
|
||||
不再默认创建:
|
||||
|
||||
```text
|
||||
pages/
|
||||
assets/
|
||||
mindmaps/
|
||||
ai-sessions/
|
||||
```
|
||||
|
||||
`ai-sessions` 后续如果要落本地,应放入 `.mnote/ai-sessions/`,本轮只禁止默认创建顶层 `ai-sessions/`。
|
||||
|
||||
### 新建页面
|
||||
|
||||
在父目录下新建页面时,默认标题若为 `新页面`,真实落盘应为:
|
||||
|
||||
```text
|
||||
新页面HHMMSS.md
|
||||
新页面HHMMSS/
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```text
|
||||
新页面061240.md
|
||||
新页面061240/
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- `HHMMSS` 使用本地时间或现有时间工具生成,精确到秒。
|
||||
- 即使有时间戳,也必须做磁盘冲突检查;同秒冲突时使用 `-2`、`-3` 追加。
|
||||
- `documentId` 仍使用路径型 `local-md:<relative_path>`。
|
||||
- `.md` 正文标题应使用最终安全标题,例如 `# 新页面061240`。
|
||||
|
||||
### 页面树和文件树边界
|
||||
|
||||
- 页面树:允许把 `X.md` 与同目录 `X/` 解释为一个页面 `X`,并把 `X/` 内 Markdown 作为页面 `X` 的子页面。
|
||||
- 文件树:必须真实展示 `X.md` 和 `X/` 两个磁盘条目。不得把二者合并为一个节点。
|
||||
|
||||
### 页面资源
|
||||
|
||||
对 `X.md` 上传附件或图片时,默认写入:
|
||||
|
||||
```text
|
||||
X/assets/<file>
|
||||
```
|
||||
|
||||
对 mindmap,后续默认写入:
|
||||
|
||||
```text
|
||||
X/mindmaps/<file>
|
||||
```
|
||||
|
||||
本轮先完成 `write_local_markdown_asset` 的附件/图片路径迁移。正文链接相对 `X.md` 应为:
|
||||
|
||||
```markdown
|
||||

|
||||
[spec.pdf](X/assets/spec.pdf)
|
||||
```
|
||||
|
||||
## 顺序执行 Checklist
|
||||
|
||||
### A0 基线保护
|
||||
|
||||
- [x] 记录当前 `git status --short`,不要清理与本任务无关的脏改动。
|
||||
- [x] 运行当前相关定向测试,确认改前基线:
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web create_default_local_workspace_uses_managed_data_root -- --nocapture`
|
||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_markdown_asset_upload_copies_next_to_markdown_with_relative_path -- --nocapture`
|
||||
|
||||
验收:
|
||||
|
||||
- [x] 基线通过。两项测试均 ok。
|
||||
|
||||
### A1 默认工作区目录最小化
|
||||
|
||||
- [x] 修改 `ensure_default_workspace_directories`:默认只创建 `.mnote/trash`。
|
||||
- [x] 修改 `ensure_default_workspace_home_page`:初始化页改为 `root/初始化的新页面.md`,不再放入 `pages/`。
|
||||
- [x] 更新 `create_default_local_workspace_uses_managed_data_root`:
|
||||
- 断言 `初始化的新页面.md` 位于 root 下。
|
||||
- 断言 `pages/`、`assets/`、`mindmaps/`、顶层 `ai-sessions/` 不存在。
|
||||
- 保留 `.mnote/workspace.json` 与 `.mnote/trash` 断言。
|
||||
- [x] 更新 `root_entry_initializes_default_local_workspace_page`:
|
||||
- 断言 root 下存在 `初始化的新页面.md`。
|
||||
- 不再断言 `pages/初始化的新页面.md`。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web create_default_local_workspace_uses_managed_data_root -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web root_entry_initializes_default_local_workspace_page -- --nocapture` — ok
|
||||
|
||||
### A2 新建页面创建 `.md + 同名目录`
|
||||
|
||||
- [x] 新增 helper `determine_page_stem`:
|
||||
- 输入默认标题 `新页面` 输出 `新页面HHMMSS`(本地时间 HHMMSS,失败时回退 UTC)。
|
||||
- 对非默认标题,仍使用用户标题的安全文件名。
|
||||
- 对冲突同时检查 `<name>.md` 与 `<name>/`,追加 `-2`、`-3`。
|
||||
- [x] 修改 `create_local_markdown_page`:
|
||||
- 创建 `<name>.md`。
|
||||
- 同步创建 `<name>/`。
|
||||
- 返回的 `relativePath` 仍是 `<name>.md`。
|
||||
- 返回的 `documentId` 仍是 `local-md:<relative_path>`。
|
||||
- [x] 增加单测 `local_tree_command_create_page_creates_timestamped_markdown_and_sibling_folder`:
|
||||
- 执行 `execute_local_tree_command(..., "create", ..., Some("新页面"))`。
|
||||
- 断言产生 `新页面\d{6}.md` 和同名目录。
|
||||
- 断言返回 `documentId` 指向 `.md`。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_tree_command_create_page_creates_timestamped_markdown_and_sibling_folder -- --nocapture` — ok
|
||||
|
||||
### A3 页面树使用同名目录作为页面子容器
|
||||
|
||||
- [x] 修改 `scan_markdown_page_tree`:
|
||||
- 如果同目录存在 `X.md` 和 `X/`,页面树只显示 `X.md` 对应的页面节点。
|
||||
- `X/` 内的 Markdown 节点挂在 `X.md` 页面节点下。
|
||||
- 没有同名 `.md` 的普通目录,如果包含 Markdown,继续作为 page group 显示。
|
||||
- [x] 增加单测:
|
||||
- 构造 `Root.md`、`Root/Child.md`。
|
||||
- 页面树断言 `Child.md` 的 `parent_node_id` 是 `Root.md` 的 `documentId`。
|
||||
- 页面树断言没有单独的 `local:page-group:Root` 行。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_page_tree_uses_sibling_directory_as_page_children_container -- --nocapture` — ok
|
||||
|
||||
### A4 文件树保持真实
|
||||
|
||||
- [x] 确认 `scan_directory` 不做任何同名 `.md + folder` 合并。
|
||||
- [x] 增加单测:
|
||||
- 构造 `Root.md`、`Root/Child.md`。
|
||||
- 文件树断言同时存在 `Root.md` markdown 行和 `Root` folder 行。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_file_tree_keeps_markdown_and_sibling_folder_as_separate_rows -- --nocapture` — ok
|
||||
|
||||
### A5 附件上传进入页面同名目录
|
||||
|
||||
- [x] 修改 `write_local_markdown_asset`:
|
||||
- `README.md` 的附件目录从 `README.assets/` 改为 `README/assets/`。
|
||||
- 返回的 `sourcePath` / `file_url` 相对 Markdown 文件目录,例如 `README/assets/photo.png`。
|
||||
- 保留重复文件名 `photo-1.png` 逻辑。
|
||||
- [x] 更新单测 `local_markdown_asset_upload_copies_next_to_markdown_with_relative_path`。
|
||||
- [x] 更新 `scripts/task443-local-markdown-asset-upload-smoke.js` 中对 `README.assets/...` 的断言为 `README/assets/...`。
|
||||
- [x] 只改本地 local_folder 上传路径,不改 cloud / Convex media 路径。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_markdown_asset_upload_copies_next_to_markdown_with_relative_path -- --nocapture` — ok
|
||||
- [x] `node scripts/task443-local-markdown-asset-upload-smoke.js` — ok,证据:`tmp/task443-local-markdown-asset-upload-smoke/result.json`
|
||||
|
||||
### A6 重命名 bundle 规则最小收口
|
||||
|
||||
- [x] 检查 `rename_local_entry`:
|
||||
- 当重命名 `X.md` 且同目录存在 `X/` 时,同步重命名目录为新标题目录。
|
||||
- 如果目标目录已存在,使用与文件一致的冲突策略或返回可解释错误,禁止覆盖。
|
||||
- [x] 增加单测:
|
||||
- `Old.md + Old/Child.md` 重命名为 `New`。
|
||||
- 断言 `New.md` 和 `New/Child.md` 存在。
|
||||
- 页面树中 `Child.md` 仍挂在 `New.md` 下。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_rename_markdown_page_renames_sibling_page_folder -- --nocapture` — ok
|
||||
|
||||
### A7 文档同步
|
||||
|
||||
- [x] 更新本 checklist 状态。
|
||||
- [x] 本 checklist 已明确覆盖旧的默认顶层 `pages/assets/mindmaps/ai-sessions` 初始化结构;未大范围改旧 done 文档。
|
||||
|
||||
验收:
|
||||
|
||||
- [x] checklist 中已记录实际完成情况。
|
||||
|
||||
### A8 最终验证
|
||||
|
||||
- [x] `cargo fmt --check --all --manifest-path rust/Cargo.toml` — ok
|
||||
- [x] `cargo check --manifest-path rust/Cargo.toml -p mnote-web` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web create_default_local_workspace_uses_managed_data_root -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_tree_command_create_page_creates_timestamped_markdown_and_sibling_folder -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_page_tree_uses_sibling_directory_as_page_children_container -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_file_tree_keeps_markdown_and_sibling_folder_as_separate_rows -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_markdown_asset_upload_copies_next_to_markdown_with_relative_path -- --nocapture` — ok
|
||||
- [x] `cargo test --manifest-path rust/Cargo.toml -p mnote-web local_rename_markdown_page_renames_sibling_page_folder -- --nocapture` — ok
|
||||
- [x] `node scripts/task443-local-markdown-asset-upload-smoke.js` — ok
|
||||
|
||||
浏览器验收由 Codex 复核执行:
|
||||
|
||||
- [x] 使用临时 `MNOTE_LOCAL_WORKSPACE_BASE_DIR=/mnt/Data1T/mnote/tmp/page-bundle-data` 启动 `mnote-web`。
|
||||
- [x] 登录/注入测试 actor 后打开首页。
|
||||
- [x] 截图保存到 `tmp/`:
|
||||
- `tmp/page-bundle-home-3003.png`
|
||||
- `tmp/page-bundle-after-create-3003.png`
|
||||
- `tmp/page-bundle-filetree-3003.png`
|
||||
- [x] 检查磁盘:
|
||||
- root 下有 `初始化的新页面.md`。
|
||||
- root 下没有默认 `pages/`、`assets/`、`mindmaps/`、顶层 `ai-sessions/`。
|
||||
- 新建页面后有 `新页面HHMMSS.md` 和 `新页面HHMMSS/`。
|
||||
- 文件树能看到 `.md` 与同名目录两个真实条目。
|
||||
- 页面树把同名目录内子页面挂到 `.md` 页面下。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不迁移用户历史数据。
|
||||
- 不删除正式 `/mnt/Data1T/Mnote_data/users` 下旧测试目录。
|
||||
- 不实现完整 mindmap 新路径落盘;本轮只定义默认目标并完成附件/图片上传路径迁移。
|
||||
- 不把文件树改成页面语义树。
|
||||
- 不重新引入 `mnote_id` frontmatter。
|
||||
@@ -0,0 +1,413 @@
|
||||
# 1-8 [process] MVP 后阶段 process 执行总序 v1
|
||||
|
||||
> 创建时间:2026-05-21
|
||||
>
|
||||
> 当前状态:`PROCESS`
|
||||
>
|
||||
> 目标:把本轮 design governance 后剩余的主线 `process/` 文档排成可执行顺序,避免后续 worker 在 40 份 process 中自行猜优先级。
|
||||
>
|
||||
> 上位依据:
|
||||
> - `/mnt/Data1T/mnote/ARCHITECTURE.md`
|
||||
> - `/mnt/Data1T/mnote/CURRENT_ARCHITECTURE.md`
|
||||
> - `/mnt/Data1T/mnote/design/README.md`
|
||||
> - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
|
||||
> - `/mnt/Data1T/mnote/design/10-review/done/15-design-governance-mvp-post-review-v1.md`
|
||||
|
||||
## 1. 一句话顺序
|
||||
|
||||
后续执行顺序固定为:
|
||||
|
||||
> **先补阻塞验证和工作区身份底座,再收 Page Aggregate / BufferStore / live cache / command context,随后补资源打开与文件树 action,最后扩 AI、mindmap、Wolai 对标和远期分享同步。**
|
||||
|
||||
不要从 `process/` 中按编号顺序机械执行。编号只代表历史产生顺序,不代表当前优先级。
|
||||
|
||||
## 2. 状态分类
|
||||
|
||||
### 2.1 Active Process
|
||||
|
||||
代表仍需继续推进的执行或架构收口文档。
|
||||
|
||||
判定规则:
|
||||
|
||||
- 有未完成 checklist。
|
||||
- 或者是当前主线架构入口,仍会指导后续实现。
|
||||
- 或者有明确阻塞项、smoke 缺口、compat 瘦身缺口。
|
||||
|
||||
### 2.2 Process Reference
|
||||
|
||||
保留在 `process/`,但不是当前直接执行 checklist。
|
||||
|
||||
典型文档:
|
||||
|
||||
- 参考实现采用矩阵。
|
||||
- Wolai / 思源 / Sidex / Hermes 对照证据。
|
||||
- P3 / future 候选合同。
|
||||
- 已拆成执行 checklist 的 review 原始证据。
|
||||
|
||||
处理规则:
|
||||
|
||||
- 不迁入 `done/`,因为不是“当前代码已完成”的实现文档。
|
||||
- 不当作当前 sprint 的任务源。
|
||||
- 需要转实施时,新建更小的执行 checklist。
|
||||
|
||||
### 2.3 Done / Old
|
||||
|
||||
- 已完成且有真实代码、测试、smoke 或明确验收证据:移动到同域 `done/`。
|
||||
- 已被覆盖且口径过时但未完成:移动到 `design/old/<domain>/process/` 并标 `[recycle]`。
|
||||
- 本轮已完成一批 `done/` 归档,详见 `15-design-governance-mvp-post-review-v1.md`。
|
||||
|
||||
## 3. P0:先清阻塞和验证红灯
|
||||
|
||||
这一步先处理“会干扰后续判断”的验证缺口,不扩新产品面。
|
||||
|
||||
### P0.1 FileTree action / open editors smoke 前置
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 修复或明确 `task430-vscode-explorer-stage7-smoke.js` / `task471-local-folder-bulk-resource-trash-smoke.js` 的 workspace bootstrap 前置条件。
|
||||
2. 把 4-44 中未通过的 browser smoke 跑绿,或把环境阻塞写成可复现 bug。
|
||||
3. 补 open editor / filetree active row / lifecycle 状态断言。
|
||||
|
||||
验收:
|
||||
|
||||
- `node --check scripts/task430-vscode-explorer-stage7-smoke.js`
|
||||
- `node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
- 对应 smoke 实跑通过,或形成 `bugs/04-tree-domain/process/` 中明确 bug。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `4-45` 四项 checklist 完成后归档到 `04-tree-domain/done/`。
|
||||
- `4-44` browser smoke 全绿后归档到 `04-tree-domain/done/`。
|
||||
|
||||
### P0.2 local folder no-refresh / restore focus
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 补 local folder 非 md 资源 trash / restore / purge 的双浏览器 no-refresh 证据。
|
||||
2. 补 restore 后 DOM focus / reveal 的浏览器证据。
|
||||
|
||||
验收:
|
||||
|
||||
- 新增或复用 task436 等价 smoke,证明 B 浏览器不刷新能看到 local folder 资源生命周期变化。
|
||||
- restore location / reveal / focus smoke 截图和 JSON 证据落盘。
|
||||
|
||||
归档条件:
|
||||
|
||||
- local folder 子项通过后,`4-34` 归档。
|
||||
- React / Rust 主壳 focus 证据完成后,`4-28` 归档。
|
||||
|
||||
## 4. P1:统一工作区身份、BufferStore 和 Page Aggregate
|
||||
|
||||
这一步是 MVP 后阶段真正的底座收口。
|
||||
|
||||
### P1.1 WorkspacePath / ObjectIdentity
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-4-next-phase-execution-roadmap-v1.md`
|
||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 统一 page `.md`、raw local file、directory、asset folder、mindmap、office 的 canonical identity。
|
||||
2. 让 FileTree open target、主编辑器 tab、Open Editors snapshot 和 URL active state 消费同一套 identity。
|
||||
3. 解决 `5-26` 中“正文附件 open resolver 与 FileTree open resolver 收敛”未闭环问题。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web filetree_runtime -- --test-threads=1`
|
||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- 覆盖 markdown / office / mindmap / raw file / directory 的 browser smoke。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `5-26` checklist 完成后归档。
|
||||
- `1-5 / 1-6` 中对应 identity 缺口完成打勾。
|
||||
|
||||
### P1.2 DocumentBuffer / BufferStore
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 让 tiptap、resource tab、watcher、agent 写入和冲突 UI 共用打开态与文件版本仲裁。
|
||||
2. 避免 dirty editor、资源 tab、文件树点击分别维护状态。
|
||||
3. 把已有 BufferStore 基础设施接到更多真实 runtime 消费点。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web document_buffer -- --test-threads=1`
|
||||
- `cargo test -p mnote-web local_folder -- --test-threads=1`
|
||||
- 外部修改、dirty buffer、agent writeback、tab 切换 smoke 全部可解释。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `1-6` 中 BufferStore 运行时接入、浏览器读回、冲突 UI 相关项完成。
|
||||
|
||||
### P1.3 Page Aggregate compat 瘦身
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`(reference)
|
||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 收敛 `body.content` / compat join / 临时转换分支。
|
||||
2. 补 GFM AST parser 写侧尾项:web shell 单测、手写 parser 过渡标记、临时适配分支清理。
|
||||
3. 明确 `PageAggregateClientState` 哪些仍是合法 draft state,哪些应退出事实源地位。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web local_markdown -- --test-threads=1`
|
||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- Page Aggregate body/options/title smoke 不回退。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `3-13` 三个未完成项完成后归档。
|
||||
- `5-6` 剩余 Phase G/H 小尾项完成或拆成更小 checklist 后归档。
|
||||
|
||||
## 5. P2:tree live cache 与 command context
|
||||
|
||||
### P2.1 Tree realtime live cache
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`
|
||||
- `design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 把 local-folder watcher、projection refresh、WS/SSE snapshot/delta/resync 收进同一 live cache。
|
||||
2. 减少 polling、手动 refresh 和双路径补偿。
|
||||
3. 明确 Convex realtime 只服务 cloud / sync replica,不回到 local-first 默认真相层。
|
||||
|
||||
验收:
|
||||
|
||||
- tree create / rename / move / archive / restore / purge 双浏览器 smoke。
|
||||
- local folder watcher 修改 `.md`、resource、directory 后主壳不整页刷新。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `3-3` 中统一 live cache 和 no-refresh 矩阵完成后归档。
|
||||
|
||||
### P2.2 Command context / context key
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 菜单、快捷键、按钮、AI 写入能力共享 enablement 判断。
|
||||
2. 让 readonly、dirty、permission、resource kind、open target 统一成为 context key。
|
||||
3. 降低 filetree / editor / AI 各自硬编码能力判断的概率。
|
||||
|
||||
验收:
|
||||
|
||||
- Rust 或 JS 单测覆盖 context key `when` 判断。
|
||||
- 文件树右键、主编辑器附件菜单、快捷键的 disabled/hidden 行为一致。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `4-44` action layer smoke 全绿。
|
||||
- `1-5` command context 对应项完成。
|
||||
|
||||
## 6. P3:AI 主线继续收口
|
||||
|
||||
### P3.1 online markdown final content truth
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/07-ai/process/7-27-online-markdown-writeback-final-content-truth-v2.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 修正 online / compat `mnote.doc.markdown_edit` 的 final markdown 写回真相。
|
||||
2. 避免 full_content 和多 operation 场景仍从旧 blocks 二次推导。
|
||||
3. 保持 local-first 默认编辑仍走 agent 原生 patch/diff,不把 `markdown_edit` 升回默认主路径。
|
||||
|
||||
验收:
|
||||
|
||||
- `cargo test -p mnote-web hermes_tools -- --test-threads=1`
|
||||
- 覆盖 full_content、多 op、inline content、selection scope 的回归测试。
|
||||
|
||||
归档条件:
|
||||
|
||||
- 7-27 的 6 步实施计划完成后归档。
|
||||
|
||||
### P3.2 ACP runtime 后续步骤
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md`
|
||||
- `design/07-ai/process/7-12-page-ai-hermes-tool-routing-and-review-surface-v1.md`
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 继续拆 `7-15` step 8 之后:Reasonix wrapper、前端 runtime selector、存量迁移、旧 HTTP proxy 兼容隔离。
|
||||
2. 给 `7-12` 的 manifest / review surface / state event 仍未完成项拆新 checklist。
|
||||
3. Phase C / Review Mode 仍冻结,不在未解冻前实现流式 apply。
|
||||
|
||||
验收:
|
||||
|
||||
- ACP Hermes 与 ACP Reasonix 均能真实回复。
|
||||
- session load、permission、tool location、plan UI 不回退。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `7-15` 后续步骤拆成并完成具体 checklist 后再归档。
|
||||
- `7-12` Phase B-F 完成或冻结项移出后再归档。
|
||||
|
||||
## 7. P4:mindmap、Wolai 对标和参考流程
|
||||
|
||||
### P4.1 Mindmap 尾项
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
|
||||
- `design/06-mindmap/process/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md`
|
||||
- `design/06-mindmap/process/6-mindmap-leptos-adapter-reference-notes-v1.md`(reference)
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 明确 simplemindmap 当前产品化边界。
|
||||
2. 给 KMind visual parity 设置可退出标准,避免无限尾项。
|
||||
3. 后续 AI 操作 mindmap 时以 Resource Tree 对象能力为入口,不塞入 Markdown 正文真相。
|
||||
|
||||
验收:
|
||||
|
||||
- mindmap open / save / filetree active / resource tab smoke 继续通过。
|
||||
- KMind parity 未完成项要么完成,要么明确降级为参考。
|
||||
|
||||
### P4.2 Wolai-aline 持续项
|
||||
|
||||
入口文档:
|
||||
|
||||
- `design/05-editor-mainline/process/5-9-wolai-aline-continuous-checklist-v1.md`
|
||||
- `design/08-wolai-aline-test-flow/process/wolai-aline-test-flow-v1.md`(workflow reference)
|
||||
- `design/05-editor-mainline/process/5-7-wolai-page-tree-main-editor-experience-restoration-v1.md`(reference)
|
||||
|
||||
执行目标:
|
||||
|
||||
1. 清理 `5-9` 中已被 `5-6` 覆盖但仍显示 TODO 的 Page Aggregate 项。
|
||||
2. 对 A4 字体 token、E18 paste/clipboard 等仍有价值项补 smoke 或降级。
|
||||
3. 所有 Wolai 对标任务继续按 `wolai-aline` skill 和 `08` 流程执行。
|
||||
|
||||
归档条件:
|
||||
|
||||
- `5-9` 剩余项全部完成或降级后归档。
|
||||
|
||||
## 8. P5:远期 / 候选 / 参考
|
||||
|
||||
这些文档不进入当前直接执行序列,只有当产品优先级明确时再拆 checklist:
|
||||
|
||||
- `design/03-rust-web/process/3-17-convex-export-web-entry-v1.md`
|
||||
- CLI 已有迁移闭环;Web 管理入口未排期。
|
||||
- `design/04-tree-domain/process/4-23-local-cloud-explicit-bridge-p3-candidate-v1.md`
|
||||
- P3 候选,不能进入 local-first 默认主链。
|
||||
- `design/07-ai/process/7-17-acp-session-convex-sharing-contract-v1.md`
|
||||
- Future sharing contract。
|
||||
- `design/07-ai/process/7-28-resource-ai-tool-contract-v1.md`
|
||||
- mindmap / office Resource AI tool 草案。
|
||||
- `design/09-siyuan-reference/process/9-siyuan-reference-boundary-and-adoption-v1.md`
|
||||
- 参考边界,不是实施入口。
|
||||
- `design/10-review/process/12-*`、`13-*`、`14-*`
|
||||
- 原始 review 证据;执行项已拆出或归档。
|
||||
|
||||
## 9. 推荐执行批次
|
||||
|
||||
### Batch A:清验证阻塞
|
||||
|
||||
1. `4-45`
|
||||
2. `4-44`
|
||||
3. `4-34`
|
||||
4. `4-28`
|
||||
|
||||
完成后预期:tree/filetree action 和 trash/no-refresh 的判断不再被 smoke 红灯干扰。
|
||||
|
||||
### Batch B:身份与打开态
|
||||
|
||||
1. `5-26`
|
||||
2. `1-5` identity 子项
|
||||
3. `1-6` BufferStore / conflict browser 子项
|
||||
|
||||
完成后预期:页面、资源、tab、filetree active、open editors 可围绕同一 identity 和 buffer state 工作。
|
||||
|
||||
### Batch C:Page Aggregate / local markdown 写侧
|
||||
|
||||
1. `3-13`
|
||||
2. `5-6`
|
||||
3. `1-5` Page Aggregate 子项
|
||||
|
||||
完成后预期:正文真相、runtime projection、compat join 的边界更薄。
|
||||
|
||||
### Batch D:live cache / command context
|
||||
|
||||
1. `3-3`
|
||||
2. `1-5` command context 子项
|
||||
3. `4-44` 若 Batch A 未完成则回补
|
||||
|
||||
完成后预期:树域实时与 enablement 判断更统一。
|
||||
|
||||
### Batch E:AI 与资源工具
|
||||
|
||||
1. `7-27`
|
||||
2. `7-15` 后续拆分
|
||||
3. `7-12` Phase B-F 拆分
|
||||
4. `7-28` 仅在 mindmap / office AI 明确排期后进入
|
||||
|
||||
完成后预期:local-first AI 主路径稳定,cloud/compat 工具不再误导默认路径。
|
||||
|
||||
### Batch F:体验对标与远期
|
||||
|
||||
1. `6-mindmap-*`
|
||||
2. `5-9`
|
||||
3. `3-17`
|
||||
4. `4-23`
|
||||
5. `7-17`
|
||||
|
||||
完成后预期:产品体验和分享同步进入产品化,而不是继续扩底层 compat。
|
||||
|
||||
## 10. 每轮执行的固定流程
|
||||
|
||||
每次从本文选一个 batch 后,按以下流程推进:
|
||||
|
||||
1. 先读本文和对应入口文档。
|
||||
2. 对该 batch 新建或更新一个小 checklist,不直接修改大而旧的全景文档。
|
||||
3. 如果有 2 个以上互不冲突方向,按 Reasonix parallel flow 拆 worker。
|
||||
4. worker 只改其 ownership 范围,不提交 git。
|
||||
5. Codex 复核 diff、跑 targeted tests / browser smoke。
|
||||
6. 完成后:
|
||||
- 更新 checklist 状态和证据。
|
||||
- 能归档的移动到 `done/`。
|
||||
- 被覆盖但未完成的移入 `old/` 并标 `[recycle]`。
|
||||
- 更新本文对应 batch 状态。
|
||||
- 运行 `codegraph sync .`。
|
||||
|
||||
## 11. 不做事项
|
||||
|
||||
- 不按文件编号顺序清空 process。
|
||||
- 不把 `process-reference` 当作当前实现任务。
|
||||
- 不因为文档老就移动到 `done/`;必须有真实完成证据。
|
||||
- 不把 Phase C / Review Mode / cloud sync / sharing future 合同提前实现。
|
||||
- 不恢复旧 Next / BlockNote / Convex 默认主存储口径。
|
||||
Reference in New Issue
Block a user