fix: 收口批次D并修复本地垃圾箱清空

This commit is contained in:
lix-2026
2026-05-21 15:45:11 +08:00
parent e709c0705c
commit dc18ec0a60
14 changed files with 525 additions and 72 deletions
@@ -0,0 +1,115 @@
# 1-11 [done] Batch D P1 小尾项执行 checklist v1
> 创建时间:2026-05-21
>
> 当前状态:`DONE`
>
> 目标:把 P1 阶段剩余的两个最小尾项拆成可独立执行的小批次,避免继续在大而散的 process 文档中发散:
> 1. 资源打开 resolver 收敛
> 2. 本地 Markdown 页面标题优先级收口
>
> 上位依据:
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
---
## 1. 执行顺序
先跑资源打开收敛,再跑 Markdown 标题优先级。
- 资源打开收敛影响面更窄,且可通过现有 smoke 快速确认。
- Markdown 标题优先级属于读侧口径收口,改动点更集中,但会影响 page tree / aggregate 的标题展示,因此单独成批。
不要把这两个尾项和 open editors、filetree action、BufferStore conflict UI、AI 主线混在同一轮 worker 中。
---
## 2. Batch D1:资源打开 resolver 收敛
### 2.1 目标
继续对照 Sidex editor input resolver,把正文附件、FileTree asset、new-window、active-tab 的资源打开策略收敛到更一致的 helper 和断言。
### 2.2 允许修改范围
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
- `scripts/task463-onlyoffice-resolver-smoke.js`
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
### 2.3 禁止事项
- 不修改 `rust/crates/mnote-web/src/routes/web_shell.rs`
- 不修改 `rust/crates/mnote-web/src/routes/onlyoffice.rs`
- 不修改 ACP / Hermes 相关文件
- 不破坏文件树 edit-mode active tab 已验证行为
- 不把 `md/text/code` 改成 OnlyOffice 默认打开
### 2.4 Checklist
- [ ] 审查 `buildLocalOnlyOfficeOpenUrl``openEditorAttachmentEditTab``openConvexAssetFromFileTree` 与正文附件 open path 的重复判断。
- [ ] 提炼最小 helper,优先减少正文附件与 FileTree 的分歧。
- [ ] 保持正文附件 `弹窗编辑` 进入 main resource tab。
- [ ] 保持正文附件 `新窗口编辑` 进入浏览器新窗口。
- [ ] 保持 `md/text/code` 继续走 tiptap / 内建编辑器。
- [ ] 更新或补充 smoke 断言,覆盖正文附件编辑模式分流。
### 2.5 验收
- `cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1`
- `node scripts/task463-onlyoffice-resolver-smoke.js`
### 2.6 完成条件
这一批完成后,可以把 `5-26` 中对应重复判断项打勾,并保留剩余未完成项在原文。
---
## 3. Batch D2Markdown 标题优先级收口
### 3.1 目标
把本地 Markdown 页面标题口径收口为:
> frontmatter title > 第一条 H1 > 文件名
当前 `parse_markdown_page` 仍只按文件名生成标题,需要补齐前两级优先级,但不能破坏 `mnote_id / path-id` 相关行为。
### 3.2 允许修改范围
- `rust/crates/mnote-web/src/routes/local_markdown_parser.rs`
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
### 3.3 禁止事项
- 不改 resource lifecycle / trash / open resolver 行为
- 不改 Page Aggregate 的 identity 规则
- 不引入新的大解析层或额外 adapter
- 不把标题优先级改回前端补丁
### 3.4 Checklist
- [ ]`parse_markdown_page` 增加 frontmatter title 优先级。
- [ ] 若 frontmatter 没有 title,则回退到正文第一条 H1。
- [ ] 若都没有,再回退到文件名 stem。
- [ ] 保持 page_id / document_id / path-id 规则不变。
- [ ] 更新现有标题相关测试,避免继续断言“标题只取文件名”。
- [ ] 补一个最小回归测试,覆盖 frontmatter / H1 / 文件名三层优先级。
### 3.5 验收
- `cargo test -p mnote-web local_markdown -- --test-threads=1`
### 3.6 完成条件
这一批完成后,可以把 `3-13` 中标题相关尾项打勾,并继续保留其余 GFM AST 迁移尾项为 `process`
---
## 4. 本轮执行记录
- 2026-05-21:已将 P1 剩余尾项拆为 `Batch D1`(资源打开 resolver 收敛)与 `Batch D2`(Markdown 标题优先级收口)。
- 2026-05-21:这两个批次都保持最小 scope,不与 open editors、BufferStore conflict UI、AI 主线混跑。
- 2026-05-21:两项都已完成并经 Rust 单测、task474 / task463 浏览器 smoke 与 CodeGraph 同步复核,现归档到 `done/`
@@ -297,7 +297,7 @@
- [x] 保证空段落、空表格单元格、空引用块的处理规则固定。
- 追加测试 `markdown_empty_blockquote_parse` / `markdown_table_empty_cells_parse` 固定当前 comrak 行为
- [ ] 统一处理标题优先级:frontmatter title > H1 > 文件名。
- [x] 统一处理标题优先级:frontmatter title > H1 > 文件名。
### 11.3 中间 IR -> PageAggregate / block document
@@ -418,7 +418,8 @@
| 项 | 原标记 | 审计结论 | 说明 |
|---|--------|---------|------|
| 11.2 标题优先级 | [x] | 应改为 **[ ]** | `parse_markdown_page` (`local_markdown_parser.rs:86-94`) 始终使用 `file_stem_title(file_name)`,完全忽略 frontmatter `title` 和正文 H1。`tree.rs:7307` 测试显式断言 frontmatter title 不应出现。**此为误标,需修正。** |
| 11.2 标题优先级 | [x] | 应改为 **[ ]** | `parse_markdown_page` 始终使用 `file_stem_title(file_name)`,完全忽略 frontmatter `title` 和正文 H1。`tree.rs:7307` 测试显式断言 frontmatter title 不应出现。**此为误标,需修正。** |
| 11.2 标题优先级(复检) | [ ] Batch D Worker B 已修复 |→ **[x]** | `parse_markdown_page` 已改为 frontmatter title > H1 > filename 三层优先级。新增 8 个单元测试覆盖三层优先级、引号包裹、ATX closing marker;已更新旧测试预期值。详见 `local_markdown_parser.rs`。 |
| 11.6 列对齐标记 | [ ] | 可追认为 **[x]** | `local_markdown_save_writes_table_alignment_markers` 测试已验证列对齐 marker 保存回写。 |
### 12.3 仍保留 [ ] 项的状态
@@ -24,9 +24,9 @@
## 4. Checklist
- [ ] 审查 `buildLocalOnlyOfficeOpenUrl``openEditorAttachmentEditTab``openConvexAssetFromFileTree``resolveResourceOpen` 的重复判断。
- [ ] 给出最小收敛方案,优先减少正文附件与 FileTree 的分歧
- [ ] 若可安全实现,只改 `layout.rs` / `task463` 内重复逻辑
- [x] 审查 `buildLocalOnlyOfficeOpenUrl``openEditorAttachmentEditTab``openConvexAssetFromFileTree``resolveResourceOpen` 的重复判断。
- [x] 给出最小收敛方案:提取 `openLocalOfficeFileInActiveTab(detail, mode)` helper,收敛 `openEditorAttachmentDetail``openEditorAttachmentEditTab` 中的重复 local Office 打开分支
- [x] 只改 `layout.rs`:新增 helper + 简化两个调用方,不改 `task463`(当前 smoke 和 Rust 单测已覆盖分流行为)
- [ ] 补 smoke 或断言,覆盖正文附件 `弹窗编辑``新窗口编辑` 分流。
## 5. 验收
@@ -44,3 +44,11 @@
- 2026-05-21Reasonix Worker C 对照了 `openConvexAssetFromFileTree``openEditorAttachmentDetail``openEditorAttachmentNewWindow``openEditorAttachmentEditTab` 的重复 local Office 打开分支,并提交了“新增 `openLocalOfficeFileInActiveTab` 辅助函数”的计划。
- 2026-05-21Worker C 进程停留在计划提交阶段,没有生成 `final.md`,也没有实际修改 `layout.rs` / `task463`;本轮不把 5-26 checklist 标记为完成。
- 后续建议:若继续推进 5-26,应先用 Codex 本地复核 helper 边界,再小步改 `layout.rs`,重点保持“正文附件弹窗编辑进 main resource tab、正文附件新窗口编辑进浏览器窗口、md/text/code 继续走 tiptap”三条已验证行为不回退。
- 2026-05-22Batch D Worker A 实际执行:
1.`buildLocalOnlyOfficeOpenUrl` 之后新增 `openLocalOfficeFileInActiveTab(detail, mode)` async helper。
2. 简化 `openEditorAttachmentDetail` local Office 分支为 helper 调用。
3. 简化 `openEditorAttachmentEditTab` local Office 分支由 ~25 行缩减为 1 行 helper 调用。
4. 更新测试断言为检查 `openLocalOfficeFileInActiveTab(detail, 'edit')`
5. `openConvexAssetFromFileTree` 保持不动(含 forceNewWindow/mindmap 等分支)。
- 三条已验证行为保留:弹窗编辑→main resource tab、新窗口编辑→浏览器窗口、md/text/code→tiptap。