205 lines
3.4 KiB
Markdown
205 lines
3.4 KiB
Markdown
# [recycle] Rust Block Editor AI/CLI Tool Contract v0
|
||||
|
|
|
|||
|
|
> 更新时间:2026-04-18
|
|||
|
|
|
|||
|
|
## 1. 目标
|
|||
|
|
|
|||
|
|
这份文档用于冻结 AI 与 CLI 调用 Rust block editor 的最小工具契约。
|
|||
|
|
|
|||
|
|
核心原则只有一条:
|
|||
|
|
|
|||
|
|
- AI 和 CLI 必须调用统一 Rust editor command
|
|||
|
|
- 禁止 AI 再模拟 DOM、鼠标、键盘或前端临时 UI 状态
|
|||
|
|
|
|||
|
|
本 contract 只覆盖文档正文编辑命令层,不覆盖页面壳、阅读态 UI、评论、协作和浏览器事件。
|
|||
|
|
|
|||
|
|
## 2. 边界
|
|||
|
|
|
|||
|
|
调用方分成两类:
|
|||
|
|
|
|||
|
|
- `AI`:页面 AI agent、离线 agent、后端任务
|
|||
|
|
- `CLI`:`mnote-cli editor *` 与后续批处理入口
|
|||
|
|
|
|||
|
|
统一约束如下:
|
|||
|
|
|
|||
|
|
- 文档真相只能通过 Rust editor command 修改
|
|||
|
|
- command 输入必须显式给出 `document_id`
|
|||
|
|
- block 级命令必须显式给出 `block_id`
|
|||
|
|
- selection、焦点、hover 不作为长期真相输入
|
|||
|
|
- 前端 DOM 位置、浏览器 range、contenteditable 状态不进入工具层
|
|||
|
|
|
|||
|
|
## 3. 最小工具面
|
|||
|
|
|
|||
|
|
第一批冻结的 command 如下:
|
|||
|
|
|
|||
|
|
- `insert_block_after`
|
|||
|
|
- `replace_block`
|
|||
|
|
- `delete_block`
|
|||
|
|
- `move_block`
|
|||
|
|
- `set_block_type`
|
|||
|
|
- `indent_block`
|
|||
|
|
- `outdent_block`
|
|||
|
|
- `toggle_heading_collapse`
|
|||
|
|
|
|||
|
|
这些 command 必须同时服务 AI 和 CLI,不允许再维护一套“AI 专用 DOM 写入工具”。
|
|||
|
|
|
|||
|
|
## 4. 输入输出契约
|
|||
|
|
|
|||
|
|
统一输入头:
|
|||
|
|
|
|||
|
|
- `document_id`
|
|||
|
|
- `workspace_id?`
|
|||
|
|
- `request_id?`
|
|||
|
|
- `trace_id?`
|
|||
|
|
- `actor_id`
|
|||
|
|
- `actor_type`
|
|||
|
|
- `reason?`
|
|||
|
|
|
|||
|
|
统一输出头:
|
|||
|
|
|
|||
|
|
- `ok`
|
|||
|
|
- `document_id`
|
|||
|
|
- `applied_command`
|
|||
|
|
- `revision?`
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
- `snapshot?`
|
|||
|
|
- `audit`
|
|||
|
|
|
|||
|
|
### 4.1 `insert_block_after`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `after_block_id?`
|
|||
|
|
- `block`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `inserted_block_id`
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.2 `replace_block`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
- `block`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.3 `delete_block`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `deleted_block_id`
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.4 `move_block`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
- `target_parent_id?`
|
|||
|
|
- `after_block_id?`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.5 `set_block_type`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
- `block_type`
|
|||
|
|
- `props?`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.6 `indent_block`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.7 `outdent_block`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
|
|||
|
|
### 4.8 `toggle_heading_collapse`
|
|||
|
|
|
|||
|
|
输入:
|
|||
|
|
|
|||
|
|
- `block_id`
|
|||
|
|
|
|||
|
|
输出:
|
|||
|
|
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
- `collapsed`
|
|||
|
|
|
|||
|
|
## 5. 安全与约束
|
|||
|
|
|
|||
|
|
- AI 不得假设“当前光标在某处”,必须使用显式 `block_id`
|
|||
|
|
- AI 不得伪造前端已存在的 block id
|
|||
|
|
- CLI 和 AI 都不得绕过 command 直接写原始内容 JSON
|
|||
|
|
- 若命令需要目标 block,但目标不存在,必须返回结构化错误
|
|||
|
|
- 若缩进、移动会破坏树结构,必须拒绝执行
|
|||
|
|
|
|||
|
|
## 6. 审计
|
|||
|
|
|
|||
|
|
每次 command 至少记录:
|
|||
|
|
|
|||
|
|
- `request_id`
|
|||
|
|
- `trace_id`
|
|||
|
|
- `actor_id`
|
|||
|
|
- `actor_type`
|
|||
|
|
- `document_id`
|
|||
|
|
- `command_name`
|
|||
|
|
- `target_block_id?`
|
|||
|
|
- `changed_block_ids`
|
|||
|
|
- `reason?`
|
|||
|
|
|
|||
|
|
## 7. CLI 对齐
|
|||
|
|
|
|||
|
|
CLI 必须与 AI 共用同一组 command 名称与输入结构。
|
|||
|
|
|
|||
|
|
最低要求:
|
|||
|
|
|
|||
|
|
- CLI 能直接调用上述 command
|
|||
|
|
- CLI 返回与 AI 一致的结构化结果
|
|||
|
|
- CLI 可输出变更后的最小 `snapshot`
|
|||
|
|
|
|||
|
|
## 8. 验收标准
|
|||
|
|
|
|||
|
|
满足以下条件即可视为 v0 可用:
|
|||
|
|
|
|||
|
|
- AI 写链不再依赖 DOM 模拟
|
|||
|
|
- CLI 与 AI 共用同一批 command 名称
|
|||
|
|
- `insert_block_after`
|
|||
|
|
- `replace_block`
|
|||
|
|
- `delete_block`
|
|||
|
|
- `move_block`
|
|||
|
|
- `set_block_type`
|
|||
|
|
- `indent_block`
|
|||
|
|
- `outdent_block`
|
|||
|
|
- `toggle_heading_collapse`
|
|||
|
|
都有明确输入输出字段
|
|||
|
|
- command 结果包含最小审计信息
|