align workbench open editors tabs
This commit is contained in:
+49
@@ -0,0 +1,49 @@
|
||||
# 4-45 FileTree / Open Editors Lifecycle Link Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-21
|
||||
>
|
||||
> Owner:filetree action smoke / resource lifecycle observability
|
||||
|
||||
## 1. 目标
|
||||
|
||||
参考 Sidex Explorer + Open Editors 联动,补 MNote filetree action 与 open editor state 的可观测测试。当前优先修 smoke 缺口和文档状态,不直接改核心业务。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `scripts/task430-vscode-explorer-stage7-smoke.js`
|
||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
||||
- 如发现 checklist 已全部完成,可建议移动到 `done/`,但不要直接移动未验证文件。
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不修改 `layout.rs` / `web_shell.rs` / `local_folder_source.rs`。
|
||||
- 不改变 delete 默认到垃圾箱的语义。
|
||||
- 不把环境准备失败伪装成通过。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [ ] 跑或修复 `task430` / `task471` 的可复现前置条件。
|
||||
- [ ] 明确哪些 smoke 已过、哪些因环境阻塞。
|
||||
- [ ] 补充 open editor / filetree active row / lifecycle 状态断言建议。
|
||||
- [ ] 更新 4-44 checklist 执行记录。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- `node --check scripts/task430-vscode-explorer-stage7-smoke.js`
|
||||
- `node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
- `node scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不实现完整 undo stack。
|
||||
- 不改 cloud storage drop executor。
|
||||
|
||||
## 7. 本轮执行记录
|
||||
|
||||
- 2026-05-21:Reasonix Worker D 识别到 `task430` 的前置问题:新注册用户在 `workspaces:fetchWorkspaceSummaries` 前可能还没有 workspace,需要先通过 `/api/tree/commands` create action 触发 workspace bootstrap。
|
||||
- 2026-05-21:Worker D 还建议将 `task471` 的验证记录同步到 `4-44`,并补 open editor / lifecycle 状态断言。
|
||||
- 2026-05-21:Worker D 进程停留在计划提交阶段,没有生成 `final.md`,也没有实际修改 smoke 或 checklist;本轮不把 4-45 checklist 标记为完成。
|
||||
- 后续建议:先修 `task430` workspace bootstrap,再新增 filetree active row 与 open editors snapshot 的联合断言,避免只验证树动作、不验证打开编辑器状态。
|
||||
@@ -0,0 +1,51 @@
|
||||
# 5-24 Open Editors Lightweight View Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-21
|
||||
>
|
||||
> Owner:main editor tab / sidebar open editors parity
|
||||
|
||||
## 1. 目标
|
||||
|
||||
参考 Sidex / VSCode `OpenEditorsView`,为 MNote 做轻量版“打开的编辑器”视图或可观测模型。当前阶段不要求完整 UI,但至少要让 page/resource tabs 的 active、title、kind、dirty guard 状态可被统一读取和测试。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
||||
- 可新增 `scripts/task47*-open-editors-*.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不引入完整 VSCode editor group service。
|
||||
- 不实现多 editor group grid。
|
||||
- 不改变 Page Aggregate / local Markdown 事实源。
|
||||
- 不破坏现有 resource tab 打开、关闭和 URL state。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] 暴露轻量 open editors snapshot:page tab + resource tabs。
|
||||
- [x] snapshot 至少包含 `objectIdentity`、`title`、`kind`、`active`、`dirtyGuard`。
|
||||
- [x] active tab 切换时 snapshot 更新。
|
||||
- [x] resource tab close / create 时 snapshot 更新。
|
||||
- [ ] 如做 UI,保持低干扰,不新增复杂 sidebar 分组。
|
||||
- [x] 补测试或 smoke,验证可读取 active editor 列表。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- 如新增 smoke:`node scripts/task47*-open-editors-*.js`
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不做 drag editor between groups。
|
||||
- 不做完整 dirty working copy service。
|
||||
|
||||
## 7. 执行记录
|
||||
|
||||
- 2026-05-21:Codex 补齐 `mnote.open_editors_snapshot.v1` 轻量合同,暴露 `window.__mnoteDocumentPaneRuntime.getOpenEditorsSnapshot()`,并同步 `window.__mnoteOpenEditorsSnapshot` / `data-mnote-open-editors-count` / `data-mnote-active-editor`。
|
||||
- 2026-05-21:snapshot 覆盖 page tab 与 resource tabs;resource tab 条目包含 `objectIdentity`、`title`、`kind`、`badgeKind`、`active`、`dirtyGuard`、`assetId`、`path`。
|
||||
- 2026-05-21:未新增 sidebar UI,当前阶段先保持为可观测模型。
|
||||
- 2026-05-21:`cargo test -p mnote-web web_shell -- --test-threads=1` 通过。
|
||||
- Reasonix Worker A 本轮只停留在探索,未产生可合入 diff;最终由 Codex 本地实现。
|
||||
@@ -0,0 +1,74 @@
|
||||
# 5-25 Editor Tab Keyboard and MRU Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-21
|
||||
>
|
||||
> Owner:main editor tab keyboard / MRU behavior
|
||||
|
||||
## 1. 目标
|
||||
|
||||
参考 Sidex / VSCode `MultiEditorTabsControl`,补 MNote main tab 的基础键盘和 MRU 行为。当前只做轻量交互,不照搬完整 tab control。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
||||
- 可新增聚焦 smoke
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不新增全局快捷键与浏览器默认冲突。
|
||||
- 不实现完整 tab overflow 复杂布局。
|
||||
- 不改变 resource tab identity。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [x] tab strip 支持左右箭头 roving focus。
|
||||
- [x] `Enter` / `Space` 激活当前 focused tab。
|
||||
- [x] 关闭 active resource tab 后回到 MRU 或 page tab,行为稳定。
|
||||
- [x] tab 上保留可测试 DOM 状态。
|
||||
- [x] 补测试或 smoke。
|
||||
|
||||
## 5. 验收
|
||||
|
||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
||||
- 如新增 smoke:`node scripts/task47*-editor-tab-keyboard-*.js`
|
||||
|
||||
## 6. 执行记录
|
||||
|
||||
> 引用 proposal:`.codex/reasonix-proposals/2026-05-21-tab-keyboard-mru-proposal.md`
|
||||
|
||||
### 已确认
|
||||
|
||||
- `resourceTabMru` 数组 + `touchResourceTabMru` / `lastActiveResourceTabKey` / `removeFromResourceTabMru` 逻辑完整,MRU 核心逻辑无需改动。
|
||||
- `activateMainEditorTab` 已正确维护 roving tabindex(active → `tabindex="0"`, others → `tabindex="-1"`)。
|
||||
- `createResourceTabDom` 中 resource tab 初始 `tabindex="-1"` 符合预期。
|
||||
|
||||
### 已实现
|
||||
|
||||
- [x] 新增 `bindMainEditorTabStrip()` 函数(keydown 事件委托 + collectTabs + 箭头/Home/End/Enter/Space)。
|
||||
- [x] 修改 `closeResourceTab()` 末尾,关闭后 focus 迁移到新激活的 tab。
|
||||
- [x] 在 `styles.rs` 补充 `:focus-visible` 样式。
|
||||
- [x] 更新 Rust contract test 断言。
|
||||
- [x] `cargo test -p mnote-web web_shell -- --test-threads=1` 通过。
|
||||
|
||||
### 后续可选
|
||||
|
||||
- [ ] 如后续需要浏览器级回归,可新增 `scripts/task475-editor-tab-keyboard-mru-smoke.js`,覆盖多 tab 键盘切换与关闭后 focus。
|
||||
|
||||
### 非预期发现
|
||||
|
||||
- `closeResourceTab` 在 activate 后未显式调用 `focus()`,导致 keyboard focus 丢失。需修复。
|
||||
- tab strip 无 `:focus-visible` 样式,键盘用户在箭头导航后看不到 focus 环。
|
||||
|
||||
### Codex 实施记录
|
||||
|
||||
- 2026-05-21:Reasonix Worker B 按要求只输出 proposal,未直接改源码。
|
||||
- 2026-05-21:Codex 按 proposal 的最小安全集实现键盘 roving focus、Enter/Space 激活、关闭后 MRU/page tab focus 迁移。
|
||||
- 2026-05-21:未新增全局快捷键;事件只绑定在 `[data-mnote-main-tab-strip]` 内。
|
||||
|
||||
## 7. 非目标
|
||||
|
||||
- 不做拖拽 tab 排序。
|
||||
- 不做 close others / close saved 复杂菜单。
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
# 5-26 Resource Open Resolver Convergence Checklist v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-21
|
||||
>
|
||||
> Owner:resource open resolver / attachment and filetree open targets
|
||||
|
||||
## 1. 目标
|
||||
|
||||
继续参考 Sidex 的 editor input resolver 思路,把 MNote 正文附件、FileTree asset、side target、new-window 的资源打开策略收敛到更一致的 resolver 合同。
|
||||
|
||||
## 2. 允许修改范围
|
||||
|
||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
||||
- `rust/crates/mnote-web/src/routes/web_shell.rs` 仅限提出 patch 建议,默认不直接修改,避免与 5-24/5-25 冲突。
|
||||
- `scripts/task463-onlyoffice-resolver-smoke.js`
|
||||
|
||||
## 3. 禁止事项
|
||||
|
||||
- 不改变文件树当前已验证可用的 edit-mode active tab 行为。
|
||||
- 不把 md/text/code 改成 OnlyOffice 或浏览器新窗口默认打开。
|
||||
- 不把 resource kind 判断散回多个 UI 分支。
|
||||
|
||||
## 4. Checklist
|
||||
|
||||
- [ ] 审查 `buildLocalOnlyOfficeOpenUrl`、`openEditorAttachmentEditTab`、`openConvexAssetFromFileTree` 与 `resolveResourceOpen` 的重复判断。
|
||||
- [ ] 给出最小收敛方案,优先减少正文附件与 FileTree 的分歧。
|
||||
- [ ] 若可安全实现,只改 `layout.rs` / `task463` 内重复逻辑。
|
||||
- [ ] 补 smoke 或断言,覆盖正文附件 `弹窗编辑` 与 `新窗口编辑` 分流。
|
||||
|
||||
## 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`
|
||||
|
||||
## 6. 非目标
|
||||
|
||||
- 不引入新的 editor service 层。
|
||||
- 不改 OnlyOffice callback 写回链路。
|
||||
|
||||
## 7. 本轮执行记录
|
||||
|
||||
- 2026-05-21:Reasonix Worker C 对照了 `openConvexAssetFromFileTree`、`openEditorAttachmentDetail`、`openEditorAttachmentNewWindow`、`openEditorAttachmentEditTab` 的重复 local Office 打开分支,并提交了“新增 `openLocalOfficeFileInActiveTab` 辅助函数”的计划。
|
||||
- 2026-05-21:Worker C 进程停留在计划提交阶段,没有生成 `final.md`,也没有实际修改 `layout.rs` / `task463`;本轮不把 5-26 checklist 标记为完成。
|
||||
- 后续建议:若继续推进 5-26,应先用 Codex 本地复核 helper 边界,再小步改 `layout.rs`,重点保持“正文附件弹窗编辑进 main resource tab、正文附件新窗口编辑进浏览器窗口、md/text/code 继续走 tiptap”三条已验证行为不回退。
|
||||
@@ -0,0 +1,63 @@
|
||||
# 14 Sidex / MNote Workbench Gap Follow-up Review v1
|
||||
|
||||
> 状态:process
|
||||
>
|
||||
> 日期:2026-05-21
|
||||
>
|
||||
> 范围:在 12 号 review 已覆盖的基础上,继续对照 Sidex / VSCode workbench,收口当前仍最有价值的 editor/workbench 差距。
|
||||
|
||||
## 1. 本轮背景
|
||||
|
||||
上一轮对照已经把 P0/P1 的大方向列出,也推动了 main resource tab、Office local writeback、side target、filetree action layer 的若干补齐。当前需要继续沿 Sidex / VSCode 对照,找出仍值得优先参考的 workbench 细节,避免把精力花在已经收口或不值得照搬的部分。
|
||||
|
||||
## 2. 当前已收口或已在推进的部分
|
||||
|
||||
- `resourceTabRegistry` 已有基础的 active tab / close / URL state 行为。
|
||||
- `openTarget=side` 已有轻量 side target 合同。
|
||||
- `mindmap` 已能进入 main editor resource tab。
|
||||
- `open/edit` 相关 Office 行为已区分默认 view、显式 edit、new-window 与 main resource tab。
|
||||
- local folder sort order、close guard、filetree readonly action layer 已有对应 checklist。
|
||||
|
||||
## 3. 仍值得继续参考 Sidex 的切面
|
||||
|
||||
### 3.1 Open Editors 视图 / tab 模型聚合
|
||||
|
||||
VSCode 的 `OpenEditorsView` 不是单纯 tab strip,而是和 group model、dirty state、label refresh、active focus、drag and context menu 绑在一起。MNote 目前有 `resourceTabRegistry` 和 DOM tab strip,但还缺少一个更像“可被 Sidebar / 搜索 / 快捷键复用”的轻量 open editors 聚合视图。
|
||||
|
||||
### 3.2 tab 键盘 / MRU / 上下文菜单动作一致性
|
||||
|
||||
VSCode 的 tab 组支持聚焦、左右切换、关闭、关闭其他、固定、上下文菜单等。MNote 当前主要靠鼠标点击和少量 close 行为,键盘 roving / MRU / group context action 仍可参考。
|
||||
|
||||
### 3.3 资源打开目标的 resolver 集中化
|
||||
|
||||
Sidex 的 Explorer 不直接决定具体 editor 类型,而是统一交给 editor service + editor input resolver。MNote 现在的资源 open 逻辑已收拢不少,但正文附件、FileTree、side target、new-window 仍有分支,需要继续收敛到一个更明确的 resolver 入口。
|
||||
|
||||
### 3.4 资源生命周期与 filetree / open editors 联动
|
||||
|
||||
VSCode 的 Open Editors / Explorer / working copy / dirty indicator 是一条链。MNote 需要继续确认:
|
||||
|
||||
- tab 关闭和 dirty / saving / conflict 提示
|
||||
- filetree active row 与 resource tab active state 的联动
|
||||
- open editors 视图是否值得在当前阶段做成轻量聚合
|
||||
|
||||
## 4. 不建议继续照搬的部分
|
||||
|
||||
- 不要直接引入完整多 group grid。
|
||||
- 不要照搬完整 DI / service container。
|
||||
- 不要把 Monaco 文本模型当成 MNote 主事实源。
|
||||
- 不要把 VSCode 插件宿主体系当成当前主线。
|
||||
|
||||
## 5. 本轮执行拆分
|
||||
|
||||
拆为四个方向并行推进:
|
||||
|
||||
- `design/05-editor-mainline/process/5-24-open-editors-lightweight-view-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-25-editor-tab-keyboard-and-mru-checklist-v1.md`
|
||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
||||
|
||||
## 6. 预期结果
|
||||
|
||||
- 先用 review / checklist 明确还值得参考的 Sidex 切面。
|
||||
- 再派发多个 Reasonix 并行执行。
|
||||
- 由 Codex 复核是否真的能对齐 MNote 的主线,而不是把 VSCode 全量搬过来。
|
||||
Reference in New Issue
Block a user