refactor: add selection current block info helper
This commit is contained in:
@@ -332,9 +332,7 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据
|
|||||||
- 2026-05-25:Batch BB 只派发 1 个只读 Reasonix worker 审计 `slash_menu_anchor_style()` 剩余 fallback 是否还有可继续外置的纯几何 helper 边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bb-worker-b-5-29-slash-fallback-readonly`,run id `reasonix-2026-05-25T00-57-16-369Z-153f8ae2`,显式 `--no-memory-recall`。
|
- 2026-05-25:Batch BB 只派发 1 个只读 Reasonix worker 审计 `slash_menu_anchor_style()` 剩余 fallback 是否还有可继续外置的纯几何 helper 边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bb-worker-b-5-29-slash-fallback-readonly`,run id `reasonix-2026-05-25T00-57-16-369Z-153f8ae2`,显式 `--no-memory-recall`。
|
||||||
- Codex 已读取 Hindsight recall、`process-handoff.md/json`、`result.json`,并核对该 worktree 源码 `git diff --stat` 为空;worktree 中仅新增 `final.md`、`process-handoff.*`、`result.json` 等审计产物,不视为源码修改。
|
- Codex 已读取 Hindsight recall、`process-handoff.md/json`、`result.json`,并核对该 worktree 源码 `git diff --stat` 为空;worktree 中仅新增 `final.md`、`process-handoff.*`、`result.json` 等审计产物,不视为源码修改。
|
||||||
- 该 run 违反任务边界:worker 把 `3-20` 与 `5-29` 两个只读审计混成一份总体报告,因此不作为正式 handoff 全量采纳。
|
- 该 run 违反任务边界:worker 把 `3-20` 与 `5-29` 两个只读审计混成一份总体报告,因此不作为正式 handoff 全量采纳。
|
||||||
- 但主控根据其 `5-29` 线索做了本地代码复核,确认当前粒度判断基本成立:`slash_menu_anchor_style()` 已复用 `selection_bounding_rect()` 与 `clamp_overlay_anchor()`;剩余 fallback 只包含 `hovered_block_from_selection()`、`editor_stage_element()`、`content_text_left(stage_rect.width())` 和 3 行 anchor 算术,不值得再抽新的微型 helper。
|
- 当时主控根据其 `5-29` 线索做了本地代码复核,判断 `content_text_left()` / 内容列布局常量若要统一,应另起独立收口,而不是继续从 `slash_menu_anchor_style()` fallback 中抽 3-5 行几何包装。
|
||||||
- 主控本地代码证据:`hovered_block_from_selection()` 已退化为 `block_index_from_selection().and_then(block_state_from_index)` 的薄包装;`block_menu_overlay.rs` 已存在一份独立的 `content_text_left()` / 布局常量体系,若为 `slash_menu_anchor_style()` 再外置同类 helper,反而会引入第三处布局常量复制。
|
|
||||||
- 当前决定:`5-29` 暂不再围绕 `slash_menu_anchor_style()` 继续拆刀;若后续确实需要推进,应另起设计收口 `content_text_left()` / 内容列布局常量,而不是从当前 fallback 中抽 3-5 行几何包装。
|
|
||||||
- 2026-05-25:Batch BC 派发 1 个 browser smoke Reasonix worker 在当前 head 做只读回归,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bc-worker-b-smoke-head-readonly`,预期 run id `reasonix-2026-05-25T01-03-07-032Z-a487a063`,显式 `--no-memory-recall`。
|
- 2026-05-25:Batch BC 派发 1 个 browser smoke Reasonix worker 在当前 head 做只读回归,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bc-worker-b-smoke-head-readonly`,预期 run id `reasonix-2026-05-25T01-03-07-032Z-a487a063`,显式 `--no-memory-recall`。
|
||||||
- 结果拒收:该 run 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `result.json`、`process-handoff.md/json`、`final.md`;worktree 源码零 diff。
|
- 结果拒收:该 run 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,无 `result.json`、`process-handoff.md/json`、`final.md`;worktree 源码零 diff。
|
||||||
- 处置:不采纳其 smoke 结论;后续如需浏览器验收,仍需由主控亲自复跑,或重新派发受控 smoke worker。
|
- 处置:不采纳其 smoke 结论;后续如需浏览器验收,仍需由主控亲自复跑,或重新派发受控 smoke worker。
|
||||||
@@ -343,13 +341,17 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据
|
|||||||
- 约束:任务书写入该 worktree `tmp/`;禁止修改源码、禁止 `.codex/reasonix-tasks/*`、禁止子 agent。Codex 仅在拿到 Hindsight recall、`process-handoff.md/json`、`result.json` 与源码零 diff 证据后才会裁决是否采纳。
|
- 约束:任务书写入该 worktree `tmp/`;禁止修改源码、禁止 `.codex/reasonix-tasks/*`、禁止子 agent。Codex 仅在拿到 Hindsight recall、`process-handoff.md/json`、`result.json` 与源码零 diff 证据后才会裁决是否采纳。
|
||||||
- 2026-05-25:Batch BE 的 5-29 侧 Worker D `/mnt/Data1T/mnote-worktrees/0525-be-worker-d-5-29-layout-constant-readonly` 已由 Codex 主控独立复核后采纳为方向证据。
|
- 2026-05-25:Batch BE 的 5-29 侧 Worker D `/mnt/Data1T/mnote-worktrees/0525-be-worker-d-5-29-layout-constant-readonly` 已由 Codex 主控独立复核后采纳为方向证据。
|
||||||
- Codex 已读取 Hindsight recall、`process-handoff.md/json`、`result.json`,并核对该 worktree 源码零 diff;worktree 中仅新增 `final.md`、`process-handoff.*`、`result.json` 等审计产物,不视为源码修改。
|
- Codex 已读取 Hindsight recall、`process-handoff.md/json`、`result.json`,并核对该 worktree 源码零 diff;worktree 中仅新增 `final.md`、`process-handoff.*`、`result.json` 等审计产物,不视为源码修改。
|
||||||
- 主控本地代码证据与只读结论一致:`content_text_left()` / `content_column_left()` / `content_column_width()` 与相关 `CONTENT_COLUMN_*` 常量目前确实在 [lib.rs](/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/lib.rs:69) 和 [block_menu_overlay.rs](/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_overlay.rs:19) 各保留一份,但这仍只是小规模重复,不是当前 `5-29` 的高收益下一刀。
|
- 主控本地代码证据与只读结论在当时一致:`content_text_left()` / `content_column_left()` / `content_column_width()` 与相关 `CONTENT_COLUMN_*` 常量曾分别留在 `lib.rs` 与 `block_menu_overlay.rs` 两处。
|
||||||
- 当前决定:不把 `content_text_left()` / 内容列布局常量单独拉成下一刀实现;若后续确实需要统一,应另起专门 design 或共享 helper 收口。当前更高收益方向仍是 selection bridge / host status 一带的边界审计与小切片,而不是继续追 slash fallback 或布局常量 DRY。
|
- 后续真实代码已完成这条收口:提交 `12b64935` / `0a15ede8` 新增 [content_layout.rs](/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/editor_runtime/content_layout.rs:1),并让 [block_menu_overlay.rs](/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_overlay.rs:11) 与 [lib.rs](/mnt/Data1T/mnote/rust/spikes/leptos-tiptap-spike/src/lib.rs:43) 共同复用 `content_text_left()` / `content_column_left()`。因此这条“是否值得统一”的方向问题已经被真实实现关闭,不再作为后续待办。
|
||||||
- 2026-05-25:Batch BF 只派发 1 个只读 Reasonix worker 审计 `selection_payload / send_selection_state_to_target` 的下一刀边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bf-worker-a-5-29-selection-payload-readonly`,run id `reasonix-2026-05-25T01-11-58-275Z-2b2e8a66`,显式 `--no-memory-recall`。
|
- 2026-05-25:Batch BF 只派发 1 个只读 Reasonix worker 审计 `selection_payload / send_selection_state_to_target` 的下一刀边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-bf-worker-a-5-29-selection-payload-readonly`,run id `reasonix-2026-05-25T01-11-58-275Z-2b2e8a66`,显式 `--no-memory-recall`。
|
||||||
- 结果拒收:该 run 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json`、`final.md`;worktree 源码零 diff。
|
- 结果拒收:该 run 仅产出 `prompt.md` / `memory-recall.json` / `reasonix-transcript.jsonl`,没有 `result.json`、`process-handoff.md/json`、`final.md`;worktree 源码零 diff。
|
||||||
- 过程异常:主控在等待 BF run 期间发现未批准 residual runner 自动启动了 Batch BE 的 4 个 worker(`0525-be-*`),已统一终止并拒收;在当前 2-worker 上限下,后续不再采纳任何未明确派发的 run。
|
- 过程异常:主控在等待 BF run 期间发现未批准 residual runner 自动启动了 Batch BE 的 4 个 worker(`0525-be-*`),已统一终止并拒收;在当前 2-worker 上限下,后续不再采纳任何未明确派发的 run。
|
||||||
- 主控本地代码结论:`SelectionPayload`、`block_id_from_element`、`block_id_from_json_node`、`runtime_block_id_from_index`、`selection_payload` 已经落在 `editor_runtime/dom_selection.rs` 的合理边界内,继续迁出收益有限;`dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change` 仍绑定 `EventTarget`、Leptos signal、overlay 同步与 editor lifecycle,必须留在 `lib.rs` 壳层。
|
- 主控本地代码结论:`SelectionPayload`、`block_id_from_element`、`block_id_from_json_node`、`runtime_block_id_from_index`、`selection_payload` 已经落在 `editor_runtime/dom_selection.rs` 的合理边界内,继续迁出收益有限;`dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change` 仍绑定 `EventTarget`、Leptos signal、overlay 同步与 editor lifecycle,必须留在 `lib.rs` 壳层。
|
||||||
- 最小下一刀建议:若继续推进,只做 `current_block_info_from_index()` 的单刀收口,把它与 `runtime_block_id_from_index()` 组合成 `dom_selection` 中的轻量 block info helper,供 runtime state / host status / selection bridge 共用;不要继续触碰 `send_selection_state_to_target` 或把 bridge dispatch 下沉进 runtime 模块。
|
- 最小下一刀建议:若继续推进,只做 `current_block_info_from_index()` 的单刀收口,把它与 `runtime_block_id_from_index()` 组合成 `dom_selection` 中的轻量 block info helper,供 runtime state / host status / selection bridge 共用;不要继续触碰 `send_selection_state_to_target` 或把 bridge dispatch 下沉进 runtime 模块。
|
||||||
|
- 2026-05-25:Codex 主控已按上述建议创建新的 clean candidate worktree `/mnt/Data1T/mnote-worktrees/0525-bg-worker-a-5-29-current-block-info`,从 `0a15ede8` 起步独立复现 `current_block_info_from_index()` 小切片。
|
||||||
|
- 当前 clean diff:仅修改 [dom_selection.rs](/mnt/Data1T/mnote-worktrees/0525-bg-worker-a-5-29-current-block-info/rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs:23),新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`;其余源码不动。worktree 中为满足 path 依赖额外创建了本地 `reference-code` 符号链接,仅用于验证环境,不作为源码变更。
|
||||||
|
- 已验证:`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、`cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release` 均在该 clean worktree 中通过。
|
||||||
|
- 含义:`current_block_info_from_index()` 已经从“主区未提交半成品”转成“独立 worktree 的可复核候选 patch”,下一步可补 wasm-bindgen / browser smoke 后再选择性合入。
|
||||||
- 2026-05-25:Codex 主控按 Batch BF 结论完成 `current_block_info_from_index()` 最小切片。
|
- 2026-05-25:Codex 主控按 Batch BF 结论完成 `current_block_info_from_index()` 最小切片。
|
||||||
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs` 新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`;`rust/spikes/leptos-tiptap-spike/src/lib.rs` 删除本地 `CurrentBlockInfo` 与同名 helper,改为复用 runtime helper。
|
- 修改:`rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs` 新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`;`rust/spikes/leptos-tiptap-spike/src/lib.rs` 删除本地 `CurrentBlockInfo` 与同名 helper,改为复用 runtime helper。
|
||||||
- 边界:未迁 `dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change`、`selection_event_target` 或任何 bridge dispatch;本批只收口 selection 数据层的 block info helper。
|
- 边界:未迁 `dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change`、`selection_event_target` 或任何 bridge dispatch;本批只收口 selection 数据层的 block info helper。
|
||||||
@@ -360,6 +362,11 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据
|
|||||||
- 边界:未迁 `handle_lane_left()`、`HANDLE_*` 常量、`slash_menu_anchor_style()`、drop indicator 壳层、block menu overlay 自身布局策略或 DOM 查询;本批只消除内容列布局 helper 的重复定义。
|
- 边界:未迁 `handle_lane_left()`、`HANDLE_*` 常量、`slash_menu_anchor_style()`、drop indicator 壳层、block menu overlay 自身布局策略或 DOM 查询;本批只消除内容列布局 helper 的重复定义。
|
||||||
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、`cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release`、`wasm-bindgen --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3023 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3023 cargo run --manifest-path rust/Cargo.toml -p mnote-web`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。
|
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、`cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release`、`wasm-bindgen --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3023 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3023 cargo run --manifest-path rust/Cargo.toml -p mnote-web`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3023 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。
|
||||||
- 结果:`task489`、`task488`、`task479` 均通过,说明共享布局 helper 外置未破坏块菜单删除/撤销、附件删除/撤销和本地 Markdown 附件生命周期基线。
|
- 结果:`task489`、`task488`、`task479` 均通过,说明共享布局 helper 外置未破坏块菜单删除/撤销、附件删除/撤销和本地 Markdown 附件生命周期基线。
|
||||||
|
- 2026-05-25:Codex 主控完成 `selection payload / bridge` 线的最小后续刀。
|
||||||
|
- 修改:`editor_runtime/dom_selection.rs` 新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`,把 `index + runtime_block_id_from_index(index)` 的纯数据组合收口到 selection runtime;`lib.rs` 后续只负责 bridge dispatch、Leptos signal 和 editor lifecycle 壳层。
|
||||||
|
- 边界:未迁 `dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change`、`selection_event_target` 或 overlay sync;这些仍绑定 `EventTarget`、CustomEvent、Leptos signal 和 Tiptap lifecycle。
|
||||||
|
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check`、`cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、`git diff --check -- rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs rust/spikes/leptos-tiptap-spike/src/lib.rs`、`cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release`、`wasm-bindgen rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3026 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3026 cargo run --manifest-path rust/Cargo.toml -p mnote-web`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3026 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3026 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js`、`MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3026 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`。
|
||||||
|
- 结果:三条 smoke 均通过;本批继续保持 selection payload 纯数据层与 bridge dispatch 壳层分离。
|
||||||
- 2026-05-25:Codex 主控按 Batch BF 的最小下一刀建议,继续收口 `current_block_info_from_index()`。
|
- 2026-05-25:Codex 主控按 Batch BF 的最小下一刀建议,继续收口 `current_block_info_from_index()`。
|
||||||
- 修改:`editor_runtime/dom_selection.rs` 新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`,把 `current_block_index + runtime_block_id_from_index()` 的轻量 block info 组装迁入 selection runtime;`lib.rs` 删除本地 `CurrentBlockInfo` 结构与同名 helper,改为复用 runtime helper。
|
- 修改:`editor_runtime/dom_selection.rs` 新增 `CurrentBlockInfo` 与 `current_block_info_from_index(index)`,把 `current_block_index + runtime_block_id_from_index()` 的轻量 block info 组装迁入 selection runtime;`lib.rs` 删除本地 `CurrentBlockInfo` 结构与同名 helper,改为复用 runtime helper。
|
||||||
- 边界:未迁 `selection_payload`、`dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change` 或任何 bridge dispatch;本批只收口 “index -> {index, block_id}” 的轻量数据 helper。
|
- 边界:未迁 `selection_payload`、`dispatch_selection_event_to_target`、`send_selection_state_to_target`、`on_selection_change` 或任何 bridge dispatch;本批只收口 “index -> {index, block_id}” 的轻量数据 helper。
|
||||||
|
|||||||
Reference in New Issue
Block a user