Compare commits

...

2 Commits

Author SHA1 Message Date
zhengkenghong
4dbdfb56e7 chore: ignore local agent workspace artifacts 2026-07-08 11:10:22 +08:00
zhengkenghong
33439e16c3 docs: refine lark-doc whiteboard routing guidance 2026-07-08 11:05:02 +08:00
5 changed files with 87 additions and 34 deletions

2
.gitignore vendored
View File

@@ -55,3 +55,5 @@ cover*.out
lark-env.sh
/automations/
/.agent-work/
/.agents/

View File

@@ -39,7 +39,7 @@ lark-cli docs +update --doc "文档URL或token" --command append --content '<p>
- 连续执行多个文档写操作时,必须按 [`lark-doc-update.md`](references/lark-doc-update.md) 的「Block ID 生命周期」判断旧 block ID 是否还能复用;`overwrite` / `block_replace` / `block_delete` 后不要复用受影响的旧 ID插入 / 复制后要重新 fetch 才能拿到新 block ID
- 用户需要在文档内**创建、复制或移动**资源块(画板、电子表格、多维表格等)时,必须先读取 [`lark-doc-xml.md`](references/lark-doc-xml.md) 的「三、资源块」章节
- 写文档时,由内容和用户意图决定表达形式;流程、架构、路线图、关键指标等信息可以使用画板,但不要默认把重要信息都画板化
- 新增或更新画板时,按 [`lark-doc-whiteboard.md`](references/lark-doc-whiteboard.md) 选型;Mermaid 可由主 Agent 直接插入SVG / 复杂图 / 已有画板更新按其中流程隔离到 SubAgent
- 新增或更新画板时,按 [`lark-doc-whiteboard.md`](references/lark-doc-whiteboard.md) 选型;先按图形语义判断 Mermaid / SVG / blank 路径,再用复杂度与上下文预算决定是否隔离到 SubAgent。简单 Mermaid 和简单自包含 SVG 可由主 Agent 直接插入;复杂图或已有画板内容更新再切到 `lark-whiteboard`
- 用户说"看一下文档里的图片/附件/素材""预览素材" → 用 `lark-cli docs +media-preview`
- 用户明确说"下载素材" → 用 `lark-cli docs +media-download`
- 用户想把文档回滚到某个 `revision_id` 或某一时刻 → 先读 [`lark-doc-history.md`](references/lark-doc-history.md),按其中流程操作

View File

@@ -230,7 +230,9 @@ lark-cli docs +update --doc "<doc_id>" --command str_replace \
## 画板处理
> **`docs +update` 不能直接编辑已有画板的内容。** 本命令只能**新增**画板块;要修改已有画板,先用 `docs +fetch` 取到 `<whiteboard token="...">`,再按 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md) 启动 SubAgent 读取 [`lark-whiteboard`](../../lark-whiteboard/SKILL.md) 写入。
> **`docs +update` 不能直接编辑已有画板的内容。** 本命令只能**新增**画板块;要修改已有画板内部内容,先用 `docs +fetch` 取到 `<whiteboard token="...">`,再按 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md) 切到 [`lark-whiteboard`](../../lark-whiteboard/SKILL.md) 写入。
>
> **如果是更换文档中嵌入的画板底层类型**(例如把 `<whiteboard type="mermaid">` 改成 `<whiteboard type="svg">`,或改成 `blank` 后再交由 `lark-whiteboard` 填充),这属于文档 block 层替换,不是画板内部编辑;应优先使用 `docs +update --command block_replace` 整块替换该 `<whiteboard>` block。
画板的语法选型与插入示例见 [`lark-doc-xml.md`](lark-doc-xml.md) 与 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md)。

View File

@@ -4,10 +4,10 @@
## 两个 Skill 的职责边界
| Skill | 核心职责 | 约束 |
|-------------------|-----------------------------------------------------------|---------------------------------|
| `lark-doc` | 识别画板机会、使用 Mermaid/SVG 创建图表、调度 SubAgent、插入简单 SVG 画板或复杂空白画板 | 主 Agent 不直接创作画板内容; |
| `lark-whiteboard` | 查询/导出已有画板;复杂图表生成Mermaid/DSL/SVG 路由、场景选型、渲染验证;写入已有/空白画板 | 仅特别复杂的图表或已有画板更新时由独立 SubAgent 读取 |
| Skill | 核心职责 | 约束 |
|---|---|---|
| `lark-doc` | 识别画板机会、决定文档内嵌画板用 Mermaid / SVG / blank 哪条路径、直接插入简单 Mermaid 或简单自包含 SVG、在需要时创建空白画板并把后续创作切给 `lark-whiteboard` | 主 Agent 负责文档入口的选型和简单插入;不要把所有图都默认外包给 SubAgent |
| `lark-whiteboard` | 查询 / 导出已有画板;处理复杂图表生成、DSL/场景选型、渲染验证;写入已有画板或空白画板 | 当图复杂、需要多轮打磨、需要 whiteboard 专属场景能力,或要更新已有画板内部内容时再切入 |
## 画板适用规则
@@ -19,49 +19,92 @@
### 步骤 1识别画板机会
| 场景 | 入口 |
|-------------------------|-----------------------------------------------------------|
| 文档中需要思维导图、时序图、类图、饼图、甘特图 | 步骤 2A:使用 mermaid 插入图表 |
| 文档中需要插入其他图表/自定义图形 | 步骤 2B: 使用 SVG 插入图表 |
| 已有画板需要更新内容 | 先 `docs +fetch` 获取 `board_token`,跳至步骤 3B |
| 只查看 / 下载已有画板 | 切换至 `lark-whiteboard`,不走本流程 |
| 场景 | 入口 |
|---|---|
| 文档中需要思维导图、时序图、类图、饼图、甘特图,或用户明确给了 Mermaid 语法 | 优先看步骤 2A使用 Mermaid 插入图表 |
| 文档中需要组织结构、架构关系、泳道、对比、分层、漏斗、金字塔、飞轮、路线图、信息卡片式示意等更依赖形状表达的图 | 优先看步骤 2B按复杂度选择直接插入 SVG 或先建空白画板 |
| 已有画板需要更新内部内容 | 先 `docs +fetch` 获取 `board_token`,跳至步骤 3B |
| 只查看 / 下载已有画板 | 切换至 `lark-whiteboard`,不走本流程 |
> [!IMPORTANT]
> ⚠️ **分别对每个图表进行决策**
> **每个图单独决策,不按整篇文档一刀切。**
如果有多个位置需要插入图表,你需要根据每个图表的内容**分别决定**采用步骤 2A 还是 2B
中的方式插入这个图表。在需要插入思维导图、时序图、类图、饼图、甘特图的时候可以插入 mermaid 块,在需要插入其他类型图表时启动
SubAgent 插入 SVG。
先看图形语义,再看实现成本。不要把“哪种更好插入”当成第一判断标准:
建议优先使用 SVG 插入图表,除非其属于思维导图、时序图、类图、饼图、甘特图这类可以直接使用 mermaid 语法描述,且不适宜用 SVG 绘制的图表
- **结构即语义**的图,优先 Mermaid例如思维导图、时序图、类图、饼图、甘特图以及用户明确给出 Mermaid 文本的场景
- **形状即语义**的图,优先 SVG / blank + `lark-whiteboard`:例如组织架构、流程分层、架构拓扑、泳道、漏斗、金字塔、飞轮、路线图、对比卡片
- **已有画板内部内容修改**,不走文档重建,直接切 `lark-whiteboard`
### 步骤 2A: 使用 mermaid 插入图
### 步骤 1.5:选型
| 图形语义 / 复杂度 | 推荐路径 | 说明 |
|---|---|---|
| Mermaid 原生强适配,且图不复杂 | 主 Agent 直接插入 `<whiteboard type="mermaid">` | 适合源码短、结构清晰、无需复杂视觉设计的图 |
| SVG 更合适,但图简单、源码可控、主流程上下文足够 | 主 Agent 直接插入 `<whiteboard type="svg">` | 适合简单对比图、轻量架构示意、少量节点关系图 |
| SVG 或 whiteboard scene 更合适,且图复杂、源码长、需要多轮修改或渲染校验 | 先插入 `<whiteboard type="blank"></whiteboard>`,再切 `lark-whiteboard` | 适合复杂流程、泳道、漏斗、金字塔、飞轮、大型架构图 |
| 已有画板内部内容更新 | 切 `lark-whiteboard` | 这是画板内容编辑,不是文档 block 替换 |
| 仅更换嵌入类型mermaid / svg / blank 之间切换) | 用 `docs +update --command block_replace` 替换整个 `<whiteboard>` block | 这是文档层替换,不是画板内部编辑 |
### 步骤 2A使用 Mermaid 插入图表
```xml
<whiteboard type="mermaid">
mermaid 代码...
</whiteboard>
```
### 步骤 2B: SubAgent 使用 SVG 插入图表
适用条件:
主 Agent 启动 SubAgent让它用 `docs +create` / `docs +update` 插入:
- 图本身更适合 Mermaid 表达
- Mermaid 文本较短,主流程可以稳定维护
- 不需要复杂视觉编排或多轮渲染打磨
### 步骤 2BSVG 路径
当图形语义更适合 SVG 表达时,不要默认一定启动 SubAgent先判断复杂度与上下文预算。
#### 2B-1简单 SVG 由主 Agent 直接插入
```xml
<whiteboard type="svg">
<svg...>...
</svg>
<svg ...>...</svg>
</whiteboard>
```
Sub Agent 需要携带以下的最小上下文,以及后续的 [SVG 设计 Workflow] 章节指南
适用条件
- 节点不多结构清晰SVG 源码规模可控
- 不需要 whiteboard 专属 scene、复杂布局推演或多轮修图
- 主流程保留该图上下文不会明显污染后续任务
#### 2B-2复杂图先建空白画板再切 `lark-whiteboard`
主 Agent 先在文档里插入:
```xml
<whiteboard type="blank"></whiteboard>
```
然后读取返回值里的 `block_token` / whiteboard token切到 `lark-whiteboard` 完成写入。
适用条件:
- 图表复杂,源码长,或预期需要多轮修改
- 需要 `lark-whiteboard` 的 DSL / scene / 渲染校验能力
- 图对视觉质量要求高,主流程继续携带画图上下文成本过高
切给 `lark-whiteboard` 时携带最小上下文:
- doc token、插入位置标题 / block_id / command
- board_token
- 图表目标、受众、源段落或数据
- 要求读取 `lark-doc-xml.md`;不需要读取 `lark-whiteboard`
- 推荐画板类型或推荐 scene如果已经判断出来
### 步骤 2C直接插入 SVG 时的约束
- SVG 必须完整自包含:包含 `<svg>` 根节点和 `viewBox`,不引用外部图片、脚本、远程资源
- 直接插入 SVG 时仍需遵守下方的 [SVG 设计 Workflow] 与支持/不支持特性约束
- 如果插入后发现设计方向不对或需要大改,不要在文档层反复硬改;改走 2B-2 或切 `lark-whiteboard`
#### 画板 SVG 设计指南
@@ -125,24 +168,30 @@ lark-cli whiteboard +query \
--output ./preview.png
```
### 步骤 3B编辑已有画板 — 启动 lark-whiteboard SubAgent
### 步骤 3B编辑已有画板或复杂空白画板
复杂图和已有画板更新必须启动 SubAgent。主 Agent 只传最小上下文,不直接执行 `lark-whiteboard` 的渲染和写入流程。
以下场景切 `lark-whiteboard`
复杂图 SubAgent 的最小上下文:
- 更新已有画板内部内容
- 已经插入 `<whiteboard type="blank"></whiteboard>`,需要继续填充
- 复杂图需要 `lark-whiteboard` 的 DSL / scene / 渲染校验能力
最小上下文:
- board_token
- 图表目标、推荐画板类型、受众
- 与图表直接相关的源段落或数据
- 要求读取 [`../../lark-whiteboard/SKILL.md`](../../lark-whiteboard/SKILL.md),按其完整流程写入该 board_token
多个画板互不依赖时,可并行启动多个 SubAgent每个 SubAgent 只负责一个画板或一个 SVG 插入点,不要互相复用上下文
如果只是想把现有 `<whiteboard type="mermaid">` 换成 `<whiteboard type="svg">`,或从 `svg` 改成 `blank` 再重做,不走本步骤,回到文档层用 `docs +update --command block_replace` 替换整个画板 block
### 步骤 4完成校验
- Mermaid: 确认插入的是 `<whiteboard type="mermaid">`,且内容 mermaid 语法完整
- SVG: 确认插入的是 `<whiteboard type="svg">`,且内容是完整 `<svg ...>...</svg>`
- 不保留空白占位画板;复杂路径只有空白画板而无内容视为任务未完成
- Mermaid确认插入的是 `<whiteboard type="mermaid">`,且 Mermaid 语法完整
- 直接插入 SVG确认插入的是 `<whiteboard type="svg">`,且内容是完整 `<svg ...>...</svg>`
- blank 路径:确认空白画板后续已经由 `lark-whiteboard` 写入内容;只有占位空板视为任务未完成
- 已有画板更新:确认走的是 `lark-whiteboard`,不是误用 `docs +update` 直接改内部内容
- 类型切换:确认走的是文档层 `block_replace`,不是误当成画板内部编辑
---

View File

@@ -41,7 +41,7 @@ p, h1-h9, ul, ol, li, table, thead, tbody, tr, th, td, blockquote, pre, code, hr
文档中可嵌入外部资源块(属于容器标签的特殊形式),需要额外语法创建:
- `<img>``<img href="https://..."/>` 上传网络图片
- `<whiteboard>`简单图由 SubAgent 直接插入 `<whiteboard type="svg">完整自包含 SVG</whiteboard>`复杂图使用 `<whiteboard type="blank"></whiteboard>` 先创建空白画板,再按 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md) 启动 SubAgent 调用 `lark-whiteboard` 写入;
- `<whiteboard>`按 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md) 先判断图形语义与复杂度:结构语义强且 Mermaid 适配时可直接写 `<whiteboard type="mermaid">...</whiteboard>`简单且自包含的 SVG 可直接写 `<whiteboard type="svg">完整自包含 SVG</whiteboard>`;复杂图或需要多轮编辑时先创建 `<whiteboard type="blank"></whiteboard>`,再按该指南切到 `lark-whiteboard` 写入;
- `<sheet>``<sheet type="blank"></sheet>` 空白;`<sheet sheet-id="SID" token="TOKEN"></sheet>` 复制已有
- `<task>``<task task-id="GUID"></task>`,必传 task-id任务 guid
- `<chat_card>``<chat_card chat-id="CHAT_ID"></chat_card>`,必传 chat-id