# [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 结果包含最小审计信息
