Files
mnote/design/old/05-editor-mainline/done/rust-block-editor-command-contract-v0.md

217 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [recycle] Rust Block Editor Command Contract v0
> 更新时间:2026-04-18
>
> 关联文档:
> - `/mnt/Data1T/mnote/design/old/05-editor-mainline/process/ai-first-rust-block-editor-baseline-v1.md`
> - `/mnt/Data1T/mnote/design/old/05-editor-mainline/process/rust-block-editor-model-v0.md`
> - `/mnt/Data1T/mnote/rust/crates/core-protocol/src/editor/command.rs`
> - `/mnt/Data1T/mnote/rust/crates/core-protocol/src/editor/markdown.rs`
## 1. 目的
本文冻结 `task-054` 的第一阶段命令契约:
- editor command 列表
- editor 到 kernel command 的映射边界
- `Markdown import` / `Markdown export` 的责任边界
第一阶段目标不是一次定义所有高级交互,而是先把最小可执行命令面固定下来。
## 2. 第一阶段 command 列表
第一阶段固定以下命令进入 editor command contract
- `replace_block`
- `insert_block_after`
- `delete_block`
- `split_block`
- `merge_with_previous`
- `move_block`
- `indent_block`
- `outdent_block`
- `toggle_heading_collapse`
- `attach_reference_token`
- `detach_reference_token`
## 3. 命令语义
### 3.1 `replace_block`
用途:
- 替换块的 `block_type`
- 替换块的 `BlockProps`
- 替换块的 `content_nodes`
第一阶段要求:
- 支持单块粒度更新
- 不要求整页重算
### 3.2 `insert_block_after`
用途:
- 在目标块后插入同级块
第一阶段要求:
- Enter 拆块、加号插入、slash 插入都先归一到 `insert_block_after`
### 3.3 `delete_block`
用途:
- 删除目标块
第一阶段要求:
- 支持是否保留子块的最小策略
### 3.4 `split_block`
用途:
- 在指定 `content_node` 位置拆分当前块
第一阶段要求:
- 支持可选 `text_offset`
- 支持指定 trailing block type
### 3.5 `merge_with_previous`
用途:
- 当前块为空或满足合并条件时,把内容合并到上一块
### 3.6 `move_block`
用途:
- 块重排
- 调整父块
- 调整 after block
第一阶段要求:
- 先承接有限移动与局部重排
### 3.7 `indent_block`
用途:
- 调整有限缩进层级
### 3.8 `outdent_block`
用途:
- 回退一层有限缩进
### 3.9 `toggle_heading_collapse`
用途:
- 切换标题折叠状态
### 3.10 `attach_reference_token`
用途:
- 在指定块内容位置挂接引用 token
### 3.11 `detach_reference_token`
用途:
- 移除指定引用 token
## 4. editor command 到 kernel command 的映射
第一阶段固定口径:
- editor command 是人层和 AI/CLI 的直接操作面
- kernel command 仍是系统底层事实变更面
映射原则:
- `replace_block` 优先映射到块 patch / content update 类 kernel command
- `insert_block_after` 映射到 insert / create block
- `delete_block` 映射到 delete block
- `move_block` 映射到 move block
- `attach_reference_token` / `detach_reference_token` 先映射到块内容 patch,而不是单独扩出新的 kernel mutation
第一阶段允许 lossless 或 lossy mapping,但必须显式记录:
- `editor_command`
- `kernel_command_name`
- `lossy`
- `notes`
## 5. `Markdown import`
第一阶段 `Markdown import` 固定只承担:
- Markdown 文本转 editor block document
- 识别标题、列表、待办、引用、代码块
- 可选识别 `[[page]]``((block))`
第一阶段不强求:
- 完整 HTML block 保真
- 复杂 front matter 管线
- 富文本 mark 全量映射
`Markdown import` 最小选项:
- mode
- flavor
- reference_token_strategy
- boundary
## 6. `Markdown export`
第一阶段 `Markdown export` 固定只承担:
- 把 editor block document 转成可读 Markdown
- 保留标题、列表、待办、引用、代码块
- 尽量保留 `[[page]]` / `((block))`
第一阶段允许:
- 对未知块做 paragraph fallback
- 对暂不支持块做 lossy export,但要记录 warning
`Markdown export` 最小选项:
- mode
- flavor
- reference_token_strategy
- boundary
## 7. 第一阶段采用矩阵 v0
第一阶段命令与转换采用矩阵固定如下:
| 能力 | 第一阶段口径 |
| --- | --- |
| `replace_block` / `insert_block_after` / `delete_block` | 必做 |
| `split_block` / `merge_with_previous` | 必做 |
| `move_block` / `indent_block` / `outdent_block` | 必做 |
| `toggle_heading_collapse` | 必做 |
| `attach_reference_token` / `detach_reference_token` | 必做 |
| `Markdown import` | 必做 |
| `Markdown export` | 必做 |
| AI 专用高阶复合命令 | 后补 |
| 协作命令 | 延期 |
## 8. 结论
`task-054` 的固定口径是:
-`replace_block``insert_block_after``delete_block``split_block``merge_with_previous``move_block``indent_block``outdent_block``toggle_heading_collapse``attach_reference_token``detach_reference_token` 冻结成第一阶段 command contract
- 让 editor command 成为人层、CLI、AI 的统一写接口
-`Markdown import``Markdown export` 成为第一阶段必须可用的基础能力