Skip to content

计划评审基础:可视化评审 AI 计划 ​

学完你能做什么 ​

  • ✅ 使用 Plannotator 可视化界面评审 AI 生成的计划
  • ✅ 选中计划文本,添加不同类型的注释(删除、替换、评论)
  • ✅ 批准计划,让 AI 继续实施
  • ✅ 拒绝计划,将注释作为反馈发送给 AI
  • ✅ 理解注释类型的使用场景和区别

你现在的困境 ​

问题 1:AI 生成的实施计划在终端里阅读,文字量大、结构不清晰,评审起来很累。

问题 2:想给 AI 反馈时,只能用文字描述"删除第3段"、"修改这个函数",沟通成本高,AI 也可能理解错误。

问题 3:计划中有些地方不需要修改,有些地方需要替换,有些地方需要评论,但没有工具帮你结构化这些反馈。

问题 4:不知道如何让 AI 知道你批准了计划,还是需要修改。

Plannotator 能帮你:

  • 可视化 UI 替代终端阅读,结构清晰
  • 选中文本即可添加注释(删除、替换、评论),精确反馈
  • 注释自动转换为结构化数据,AI 准确理解你的意图
  • 一键批准或拒绝,AI 立即响应

什么时候用这一招 ​

使用场景:

  • AI Agent 完成计划并调用 ExitPlanMode(Claude Code)
  • AI Agent 调用 submit_plan 工具(OpenCode)
  • 需要评审 AI 生成的实施计划
  • 需要精确反馈计划的修改意见

不适用场景:

  • 直接让 AI 实施代码(跳过计划评审)
  • 已经批准计划,需要评审实际代码变更(使用代码评审功能)

🎒 开始前的准备 ​

前置条件:

  • ✅ 已安装 Plannotator CLI(详见 快速开始)
  • ✅ 已配置 Claude Code 或 OpenCode 插件(详见对应安装指南)
  • ✅ AI Agent 支持计划评审(Claude Code 2.1.7+,或 OpenCode)

触发方式:

  • Claude Code:AI 完成 plan 后自动调用 ExitPlanMode,Plannotator 自动启动
  • OpenCode:AI 调用 submit_plan 工具,Plannotator 自动启动

核心思路 ​

计划评审是什么 ​

计划评审是 Plannotator 的核心功能,用于可视化评审 AI 生成的实施计划。

为什么需要计划评审?

AI 生成计划后,通常会问"这个计划可以吗?"或"是否开始实施?"。如果没有可视化工具,你只能在终端里阅读纯文本计划,然后回复"可以"、"不行,修改XX"等模糊反馈。Plannotator 让你用可视化界面查看计划,精确选中需要修改的部分,添加结构化注释,AI 更容易理解你的意图。

工作流程 ​

┌─────────────────┐
│  AI Agent      │
│  (生成计划)    │
└────────┬────────┘
         │
         │ ExitPlanMode / submit_plan
         ▼
┌─────────────────┐
│ Plannotator UI  │  ← 浏览器自动打开
│                 │
│ ┌───────────┐  │
│ │ 计划内容   │  │
│ │ (Markdown) │  │
│ └───────────┘  │
│       │         │
│       │ 选中文本
│       ▼         │
│ ┌───────────┐  │
│ │ 添加注释   │  │
│ │ Delete/    │  │
│ │ Replace/   │  │
│ │ Comment    │  │
│ └───────────┘  │
│       │         │
│       ▼         │
│ ┌───────────┐  │
│ │ 决策      │  │
│ │ Approve/  │  │
│ │ Request   │  │
│ │ Changes   │  │
│ └───────────┘  │
└────────┬────────┘
         │
         │ {"behavior": "allow"} 或
         │ {"behavior": "deny", "message": "..."}
         ▼
┌─────────────────┐
│  AI Agent      │
│  (继续实施)    │
└─────────────────┘

注释类型 ​

Plannotator 支持四种注释类型,每种都有不同的用途:

注释类型用途AI 收到的反馈
Delete删除不需要的内容"删除:[选中的文本]"
Replace替换为更好的内容"替换:[选中的文本] 为 [你输入的文本]"
Comment评论某段内容,不要求修改"评论:[选中的文本]。说明:[你输入的评论]"
Global Comment全局评论,不关联具体文本"全局评论:[你输入的评论]"

Approve vs Request Changes ​

决策类型操作AI 收到的反馈适用场景
Approve点击 Approve 按钮{"behavior": "allow"}计划没问题,直接批准
Request Changes点击 Request Changes 按钮{"behavior": "deny", "message": "..."}有需要修改的地方

Claude Code 和 OpenCode 的差异

  • Claude Code:Approve 时不会发送注释(注释会被忽略)
  • OpenCode:Approve 时可以发送注释作为备注(可选)

拒绝计划时:无论哪个平台,注释都会发送给 AI

跟我做 ​

第 1 步:触发计划评审 ​

Claude Code 示例:

在 Claude Code 中与 AI 对话,让 AI 生成一个实施计划:

用户:帮我写一个用户认证模块的实施计划

Claude:好的,这是实施计划:
1. 创建用户模型
2. 实现注册 API
3. 实现登录 API
...
(AI 调用 ExitPlanMode)

OpenCode 示例:

在 OpenCode 中,AI 会自动调用 submit_plan 工具。

你应该看到:

  1. 浏览器自动打开 Plannotator UI
  2. 显示 AI 生成的计划内容(Markdown 格式)
  3. 页面底部有"Approve"和"Request Changes"按钮

第 2 步:浏览计划内容 ​

在浏览器中查看计划:

  • 计划以 Markdown 格式渲染,包括标题、段落、列表、代码块
  • 可以滚动查看整个计划
  • 支持亮/暗模式切换(点击右上角的主题切换按钮)

第 3 步:选中计划文本,添加注释 ​

添加 Delete 注释:

  1. 用鼠标选中计划中需要删除的文本
  2. 在弹出的工具栏中点击 Delete 按钮
  3. 文本会被标记为删除样式(红色删除线)

添加 Replace 注释:

  1. 用鼠标选中计划中需要替换的文本
  2. 在弹出的工具栏中点击 Replace 按钮
  3. 在弹出的输入框中输入替换后的内容
  4. 按回车或点击确认
  5. 原文本会被标记为替换样式(黄色背景),并在下方显示替换内容

添加 Comment 注释:

  1. 用鼠标选中计划中需要评论的文本
  2. 在弹出的工具栏中点击 Comment 按钮
  3. 在弹出的输入框中输入评论内容
  4. 按回车或点击确认
  5. 文本会被标记为评论样式(蓝色高亮),并在侧边栏显示评论

添加 Global Comment:

  1. 点击页面右上角的 Add Global Comment 按钮
  2. 在弹出的输入框中输入全局评论内容
  3. 按回车或点击确认
  4. 评论会显示在侧边栏的"Global Comments"部分

你应该看到:

  • 选中文本后,会立即弹出工具栏(Delete、Replace、Comment)
  • 添加注释后,文本会显示相应的样式(删除线、背景色、高亮)
  • 侧边栏会显示所有注释列表,可以点击跳转到对应位置
  • 可以点击注释旁的 删除 按钮移除注释

第 4 步:批准计划 ​

如果计划没有问题:

点击页面底部的 Approve 按钮。

你应该看到:

  • 浏览器自动关闭(1.5 秒延迟)
  • Claude Code/OpenCode 终端中显示计划已批准
  • AI 继续实施计划

Approve 的行为

  • Claude Code:只发送 {"behavior": "allow"},注释被忽略
  • OpenCode:发送 {"behavior": "allow"},注释可以作为备注发送(可选)

第 5 步:拒绝计划(Request Changes) ​

如果计划需要修改:

  1. 添加必要的注释(Delete、Replace、Comment)
  2. 点击页面底部的 Request Changes 按钮
  3. 浏览器会显示确认对话框

你应该看到:

  • 确认对话框显示"Send X annotations to AI?"
  • 点击确认后,浏览器自动关闭
  • Claude Code/OpenCode 终端中显示反馈内容
  • AI 会根据反馈修改计划

Request Changes 的行为

  • Claude Code 和 OpenCode:都会发送 {"behavior": "deny", "message": "..."}
  • 注释会被转换为结构化的 Markdown 文本
  • AI 会根据注释修改计划并再次调用 ExitPlanMode/submit_plan

第 6 步:查看反馈内容(可选) ​

如果你想查看 Plannotator 发送给 AI 的反馈内容,可以在终端中查看:

Claude Code:

Plan rejected by user
Please modify the plan based on the following feedback:

[结构化的注释内容]

OpenCode:

<feedback>
[结构化的注释内容]
</feedback>

检查点 ✅ ​

完成以上步骤后,你应该能够:

  • [ ] 在 AI 触发计划评审后,浏览器自动打开 Plannotator UI
  • [ ] 选中计划文本,添加 Delete、Replace、Comment 注释
  • [ ] 添加 Global Comment
  • [ ] 在侧边栏查看所有注释,并跳转到对应位置
  • [ ] 点击 Approve,浏览器关闭,AI 继续实施
  • [ ] 点击 Request Changes,浏览器关闭,AI 修改计划

如果某一步失败,详见:

踩坑提醒 ​

常见错误 1:选中文本后,工具栏没有弹出

原因:可能是因为选中的是代码块中的文本,或者选中的文本跨多个元素。

解决:

  • 尽量选中单个段落或列表项中的文本
  • 对于代码块,可以使用 Comment 注释,不要跨多行选中

常见错误 2:添加 Replace 注释后,替换内容没有显示

原因:替换内容输入框可能没有正确提交。

解决:

  • 输入替换内容后,按回车键或点击确认按钮
  • 检查侧边栏中是否显示了替换内容

常见错误 3:点击 Approve 或 Request Changes 后,浏览器没有关闭

原因:可能是服务器错误或网络问题。

解决:

  • 检查终端中是否有错误信息
  • 手动关闭浏览器
  • 如果问题持续,详见 故障排查

常见错误 4:AI 收到反馈后,没有按照注释修改

原因:AI 可能没有正确理解注释的意图。

解决:

  • 尝试使用更明确的注释(Replace 比 Comment 更明确)
  • 使用 Comment 添加详细说明
  • 如果问题持续,可以再次拒绝计划,并调整注释内容

常见错误 5:添加多个 Delete 注释后,AI 只删除了部分内容

原因:多个 Delete 注释之间可能有重叠或冲突。

解决:

  • 确保每个 Delete 注释的文本范围不重叠
  • 如果需要删除大段内容,可以选中整个段落一次性删除

本课小结 ​

计划评审是 Plannotator 的核心功能,让你可以可视化评审 AI 生成的计划:

核心操作:

  1. 触发:AI 调用 ExitPlanMode 或 submit_plan,浏览器自动打开 UI
  2. 浏览:在可视化界面中查看计划内容(Markdown 格式)
  3. 注释:选中文本,添加 Delete、Replace、Comment 或 Global Comment
  4. 决策:点击 Approve(批准)或 Request Changes(拒绝)
  5. 反馈:注释被转换为结构化数据,AI 根据反馈继续或修改计划

注释类型:

  • Delete:删除不需要的内容
  • Replace:替换为更好的内容
  • Comment:评论某段内容,不要求修改
  • Global Comment:全局评论,不关联具体文本

决策类型:

  • Approve:计划没问题,直接批准(Claude Code 会忽略注释)
  • Request Changes:有需要修改的地方,注释发送给 AI

下一课预告 ​

下一课我们学习 添加计划注释。

你会学到:

  • 如何精确使用 Delete、Replace、Comment 注释
  • 如何添加图像标注
  • 如何编辑和删除注释
  • 注释的最佳实践和常见场景

附录:源码参考 ​

点击展开查看源码位置

更新时间:2026-01-24

功能文件路径行号
计划评审 UIpackages/editor/App.tsx1-200
注释类型定义packages/ui/types.ts1-70
计划评审服务器packages/server/index.ts91-310
API: 获取计划内容packages/server/index.ts132-134
API: 批准计划packages/server/index.ts201-277
API: 拒绝计划packages/server/index.ts280-309
Viewer 组件packages/ui/components/Viewer.tsx1-100
AnnotationPanel 组件packages/ui/components/AnnotationPanel.tsx1-50

关键类型:

  • AnnotationType:注释类型枚举(DELETION、INSERTION、REPLACEMENT、COMMENT、GLOBAL_COMMENT)(packages/ui/types.ts:1-7)
  • Annotation:注释接口(packages/ui/types.ts:11-33)
  • Block:计划块接口(packages/ui/types.ts:35-44)

关键函数:

  • startPlannotatorServer():启动计划评审服务器(packages/server/index.ts:91)
  • parseMarkdownToBlocks():将 Markdown 解析为 Blocks(packages/ui/utils/parser.ts)

API 路由:

  • GET /api/plan:获取计划内容(packages/server/index.ts:132)
  • POST /api/approve:批准计划(packages/server/index.ts:201)
  • POST /api/deny:拒绝计划(packages/server/index.ts:280)

业务规则:

  • Claude Code 批准时不发送注释(apps/hook/server/index.ts:132)
  • OpenCode 批准时可发送注释作为备注(apps/opencode-plugin/index.ts:270)
  • 拒绝计划时注释总是发送(apps/hook/server/index.ts:154)