@amaster.ai/pi-lark 0.1.2-beta.52 → 0.1.2-beta.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/lark-apps/SKILL.md +39 -6
- package/skills/lark-apps/references/lark-apps-cloud-dev.md +5 -4
- package/skills/lark-apps/references/lark-apps-create.md +6 -3
- package/skills/lark-apps/references/lark-apps-get.md +1 -1
- package/skills/lark-apps/references/lark-apps-list.md +1 -1
- package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
- package/skills/lark-base/SKILL.md +4 -3
- package/skills/lark-base/references/lark-base-data-query-guide.md +8 -0
- package/skills/lark-base/references/lark-base-field-create.md +19 -8
- package/skills/lark-base/references/lark-base-field-json.md +3 -2
- package/skills/lark-doc/SKILL.md +25 -61
- package/skills/lark-doc/references/genres/business-analysis.md +30 -0
- package/skills/lark-doc/references/genres/data-report.md +32 -0
- package/skills/lark-doc/references/genres/email.md +38 -0
- package/skills/lark-doc/references/genres/execution-plan.md +27 -0
- package/skills/lark-doc/references/genres/formal-doc.md +37 -0
- package/skills/lark-doc/references/genres/meeting-minutes.md +24 -0
- package/skills/lark-doc/references/genres/memo-brief.md +25 -0
- package/skills/lark-doc/references/genres/official-redhead.md +73 -0
- package/skills/lark-doc/references/genres/prd.md +26 -0
- package/skills/lark-doc/references/genres/proposal.md +24 -0
- package/skills/lark-doc/references/genres/research-report.md +32 -0
- package/skills/lark-doc/references/genres/retrospective.md +25 -0
- package/skills/lark-doc/references/genres/route-consumer.md +37 -0
- package/skills/lark-doc/references/genres/route-creative.md +36 -0
- package/skills/lark-doc/references/genres/route-knowledge.md +39 -0
- package/skills/lark-doc/references/genres/route-marketing.md +40 -0
- package/skills/lark-doc/references/genres/route-media.md +36 -0
- package/skills/lark-doc/references/genres/route-opinion.md +38 -0
- package/skills/lark-doc/references/genres/route-personal-brand.md +36 -0
- package/skills/lark-doc/references/genres/route-platform.md +9 -0
- package/skills/lark-doc/references/genres/route-report.md +10 -0
- package/skills/lark-doc/references/genres/route-workplace.md +17 -0
- package/skills/lark-doc/references/genres/sop-tutorial.md +41 -0
- package/skills/lark-doc/references/genres/technical-doc.md +39 -0
- package/skills/lark-doc/references/genres/wechat.md +39 -0
- package/skills/lark-doc/references/genres/weekly-report.md +24 -0
- package/skills/lark-doc/references/genres/white-paper.md +32 -0
- package/skills/lark-doc/references/genres/xiaohongshu.md +38 -0
- package/skills/lark-doc/references/lark-doc-create-workflow.md +121 -0
- package/skills/lark-doc/references/lark-doc-create.md +22 -48
- package/skills/lark-doc/references/lark-doc-fetch.md +75 -92
- package/skills/lark-doc/references/lark-doc-history.md +3 -1
- package/skills/lark-doc/references/lark-doc-md.md +5 -1
- package/skills/lark-doc/references/lark-doc-script.md +76 -0
- package/skills/lark-doc/references/lark-doc-update.md +70 -222
- package/skills/lark-doc/references/lark-doc-whiteboard.md +5 -9
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +17 -12
- package/skills/lark-doc/references/lark-doc-xml.md +38 -167
- package/skills/lark-drive/SKILL.md +7 -5
- package/skills/lark-drive/references/lark-drive-copy.md +87 -0
- package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
- package/skills/lark-im/SKILL.md +3 -3
- package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
- package/skills/lark-im/references/lark-im-messages-resources-download.md +19 -25
- package/skills/lark-im/references/lark-im-messages-search.md +1 -3
- package/skills/lark-sheets/SKILL.md +83 -82
- package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
- package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
- package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
- package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
- package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
- package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
- package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
- package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
- package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
- package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
- package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
- package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
- package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
- package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
- package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
- package/skills/lark-sheets/scripts/sheets_df.py +21 -3
- package/skills/lark-slides/SKILL.md +11 -13
- package/skills/lark-slides/references/lark-slides-create.md +70 -39
- package/skills/lark-slides/references/lark-slides-edit-workflows.md +4 -7
- package/skills/lark-slides/references/lark-slides-update-slide.md +146 -0
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +26 -3
- package/skills/lark-slides/references/slides_chart_demo.xml +0 -1
- package/skills/lark-slides/references/troubleshooting.md +6 -6
- package/skills/lark-slides/references/validation-checklist.md +1 -1
- package/skills/lark-slides/references/xml-schema-quick-ref.md +0 -2
- package/skills/lark-whiteboard/SKILL.md +15 -8
- package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
- package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
- package/skills/lark-whiteboard/routes/dsl.md +8 -2
- package/skills/lark-whiteboard/routes/mermaid.md +1 -1
- package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
- package/skills/lark-whiteboard/routes/svg.md +3 -1
- package/skills/lark-whiteboard/scenes/mention.md +71 -0
- package/skills/lark-doc/references/lark-doc-word-stat.md +0 -93
- package/skills/lark-doc/references/style/lark-doc-create-workflow.md +0 -47
- package/skills/lark-doc/references/style/lark-doc-style.md +0 -68
- package/skills/lark-doc/references/style/lark-doc-update-workflow.md +0 -48
- package/skills/lark-doc/scripts/doc_word_stat.py +0 -1243
- package/skills/lark-slides/references/lark-slides-replace-pages.md +0 -97
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 编辑已有 PPT:读-改-写闭环
|
|
2
2
|
|
|
3
|
-
局部编辑走 **shortcut [`+replace-slide`](lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id
|
|
3
|
+
局部编辑走 **shortcut [`+replace-slide`](lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id`。整页重建走 **[`+update-slide`](lark-slides-update-slide.md)**,多页就每页各跑一次 —— 它原地覆盖并保留 `slide_id` 和页序;只有写进 `--content` 且带原 id 的元素才会保留元素 id,遗漏的元素会被删除。
|
|
4
4
|
|
|
5
5
|
> 生成 XML 前**必读** [xml-schema-quick-ref.md](xml-schema-quick-ref.md)。
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| 已知某块的 `block_id`,要换这块内容(改标题、换图、挪坐标) | `block_replace` | 精准替换,原子性好;`replacement` 根 `id` 由 CLI 自动注入为 `block_id` |
|
|
12
12
|
| 只加 1~N 个元素、不动现有布局 | `block_insert` | 新增不覆盖,可选 `insert_before_block_id` 指定位置 |
|
|
13
13
|
| 一次动多个元素(如:换标题 + 加图) | 单次 `--parts` 里拼多条 | 整批作为原子事务,任一失败整批不生效;`block_replace` 和 `block_insert` 可混用 |
|
|
14
|
-
|
|
|
14
|
+
| 整页版式重建、整页坐标重排、改页面背景、删若干元素 | `+update-slide`(每页一次) | 原地整页覆盖,`slide_id` 和页序不变;带原 `id` 的元素保留 id,不带 `id` 的作为新元素插入,遗漏的被删除 |
|
|
15
15
|
|
|
16
16
|
> **没有字段级 patch**:即便只想改一个 `shape` 的 `topLeftX`,也得把整个块的新 XML 写出来用 `block_replace`。这不是"微调",是块级重写。
|
|
17
17
|
|
|
@@ -105,10 +105,7 @@ lark-cli slides +replace-slide --as user \
|
|
|
105
105
|
```bash
|
|
106
106
|
lark-cli slides +replace-slide --as user \
|
|
107
107
|
--presentation "$PID" --slide-id "$SID" \
|
|
108
|
-
--parts '[
|
|
109
|
-
{"action":"block_replace","block_id":"bab","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"},
|
|
110
|
-
{"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
|
|
111
|
-
]'
|
|
108
|
+
--parts '[{"action":"block_replace","block_id":"bab","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"},{"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}]'
|
|
112
109
|
```
|
|
113
110
|
|
|
114
111
|
整批作为原子事务:任一条失败整批不生效。失败时后端通常返回 3350001;若响应中带 `failed_part_index` / `failed_reason` 字段,shortcut 会原样透传。
|
|
@@ -139,7 +136,7 @@ cat parts.json | lark-cli slides +replace-slide --as user --presentation "$PID"
|
|
|
139
136
|
## 相关文档
|
|
140
137
|
|
|
141
138
|
- [lark-slides-replace-slide.md](lark-slides-replace-slide.md) — +replace-slide shortcut 参数详情
|
|
142
|
-
- [lark-slides-
|
|
139
|
+
- [lark-slides-update-slide.md](lark-slides-update-slide.md) — +update-slide shortcut 参数详情(整页覆盖)
|
|
143
140
|
- [lark-slides-xml-presentation-slide-get.md](lark-slides-xml-presentation-slide-get.md) — slide.get 参考(拿 `block_id` / `revision_id`)
|
|
144
141
|
- [lark-slides-xml-presentation-slide-replace.md](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考(一般直接用 shortcut 即可)
|
|
145
142
|
- [lark-slides-media-upload.md](lark-slides-media-upload.md) — 上传图片拿 file_token
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# slides +update-slide(整页更新已有页面)
|
|
2
|
+
|
|
3
|
+
把一整页 XML 交给某个已有页面,页面变成 `--content` 描述的样子。`slide_id` 和页序都不变。
|
|
4
|
+
|
|
5
|
+
## 命令
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 标准用法:整页 XML 从文件读(推荐:避免 shell 转义和长参数截断)
|
|
9
|
+
lark-cli slides +update-slide --as user \
|
|
10
|
+
--presentation "https://xxx.larkoffice.com/slides/SCtZ...ynae" \
|
|
11
|
+
--slide-id "piy" \
|
|
12
|
+
--content @page.xml
|
|
13
|
+
|
|
14
|
+
# XML 从 stdin 读
|
|
15
|
+
cat page.xml | lark-cli slides +update-slide --as user \
|
|
16
|
+
--presentation "$PRES" --slide-id "$SLIDE" --content -
|
|
17
|
+
|
|
18
|
+
# wiki 链接直接传(CLI 自动解析并校验 obj_type=slides)
|
|
19
|
+
lark-cli slides +update-slide --as user \
|
|
20
|
+
--presentation "https://xxx.larkoffice.com/wiki/wikcn..." \
|
|
21
|
+
--slide-id "piy" --content @page.xml
|
|
22
|
+
|
|
23
|
+
# 预览请求,不实际写入
|
|
24
|
+
lark-cli slides +update-slide --as user \
|
|
25
|
+
--presentation "$PRES" --slide-id "$SLIDE" --content @page.xml --dry-run
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 参数
|
|
29
|
+
|
|
30
|
+
| 参数 | 必需 | 说明 |
|
|
31
|
+
|------|------|------|
|
|
32
|
+
| `--presentation` | 是 | `xml_presentation_id`、`/slides/` URL 或 `/wiki/` URL |
|
|
33
|
+
| `--slide-id` | 是 | 要整页替换的页面 `slide_id` |
|
|
34
|
+
| `--content` | 是 | 这一页的完整目标 XML,单一 `<slide>` 根;支持字面量、`@file`、stdin `-`。别名:`--xml` / `--slide-xml` / `--slide-content` / `--content-xml` |
|
|
35
|
+
| `--revision-id` | 否 | 默认 `-1`(最新)。它只选择服务端执行所基于的快照,不是“页面有新编辑就拒绝”的乐观锁;传旧版本号会以旧快照重建页面并丢弃其后的编辑 |
|
|
36
|
+
| `--tid` | 否 | 调用方提供的任务/事务标识,CLI 原样透传;用于关联同一编辑任务或重试,不等同于版本前置条件,不能单独保证并发冲突时拒绝写入。一般留空 |
|
|
37
|
+
|
|
38
|
+
`@file` 和 `+xml-get --output` 一样**只接受当前目录下的相对路径**,绝对路径会被拒。
|
|
39
|
+
命令别名:`slides +update`(隐藏);服务别名:`lark-cli slide …` 等价于 `lark-cli slides …`。
|
|
40
|
+
|
|
41
|
+
如果要求“从读取之后页面一旦变化就不再写入”,不能只传 `--revision-id` 或 `--tid`。写入前必须再次用 `+xml-get` 回读最新版,比较读取期间是否发生变化;有变化时先基于最新版重新合并本次修改,再执行整页写回。当前 shortcut 不提供严格的 compare-and-swap 保证。
|
|
42
|
+
|
|
43
|
+
## 语义:`--content` 就是这一页的最终状态
|
|
44
|
+
|
|
45
|
+
**没写进 `--content` 的东西会从页面上消失。** 这不是补丁,是整页覆盖。
|
|
46
|
+
|
|
47
|
+
| 你在 `--content` 里怎么写 | 页面上的结果 |
|
|
48
|
+
|---|---|
|
|
49
|
+
| 元素带原来的 `id` | 按新 XML 更新这个元素 |
|
|
50
|
+
| 元素不带 `id` | 作为新元素插入到它所在的位置 |
|
|
51
|
+
| 原来有、`--content` 里没有的元素 | **删除** |
|
|
52
|
+
| `<style>` 改了 | 背景等页面样式跟着改 |
|
|
53
|
+
| 没写 `<note>` | 讲者备注被清空 |
|
|
54
|
+
|
|
55
|
+
一次请求就能同时做完改样式、插入、删除、换备注、换背景——这是 `+replace-slide` 逐元素 part 做不到的(它没法寻址背景,也没有 move 操作)。
|
|
56
|
+
|
|
57
|
+
## 标准读-改-写流程
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 1. 读回当前页(拿到带 id 的完整 XML)
|
|
61
|
+
lark-cli slides +xml-get --as user \
|
|
62
|
+
--presentation "$PRES" --slide-id "$SLIDE" --output page.xml
|
|
63
|
+
|
|
64
|
+
# 2. 编辑 page.xml —— 保留想留下的元素的 id,删掉不要的整段,新元素不写 id
|
|
65
|
+
|
|
66
|
+
# 3. 整页写回
|
|
67
|
+
lark-cli slides +update-slide --as user \
|
|
68
|
+
--presentation "$PRES" --slide-id "$SLIDE" --content @page.xml
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
先 `--dry-run` 看请求,确认无误再执行。
|
|
72
|
+
|
|
73
|
+
> ⚠️ **第 1 步不要加 `--remove-attr-id`。** 那个参数会把所有元素的 `id` 去掉,再交给 `+update-slide` 的话,每个元素都会被当成新元素插入、原来的全部被删除——页面看起来一样,但所有元素换了新 id,锚在旧 id 上的评论和 block 直达链接全部失效,而且**不会有任何报错**。`--remove-attr-id` 只用于只读查看。
|
|
74
|
+
|
|
75
|
+
## 命令校验与空页限制
|
|
76
|
+
|
|
77
|
+
| 情况 | 报错 |
|
|
78
|
+
|---|---|
|
|
79
|
+
| 根元素不是 `<slide>`(例如直接给了 `<shape>`) | `--content root must be <slide>` → 改单个元素请用 `+replace-slide` |
|
|
80
|
+
| 根 `id` 和 `--slide-id` 不一致 | 拒绝。这通常是 A 页的 XML 要写到 B 页 —— 会毁掉 B 页 |
|
|
81
|
+
| 根 `id` 缺失 | 自动补上 `--slide-id`,不报错 |
|
|
82
|
+
| 根标签带命名空间前缀(`<sml:slide>`) | 拒绝。页面 id 没法贴到带前缀的标签上;写成 `<slide>`,需要命名空间就用默认 `xmlns` |
|
|
83
|
+
| `<slide>` 之后还有第二个根元素或多余文本 | 拒绝。服务端解析会静默丢掉它们 |
|
|
84
|
+
| XML 不合法 | 拒绝,带上出错位置 |
|
|
85
|
+
| `<slide/>`(自闭合,空页) | 命令本身可以解析,但提交前的强制版式 lint 会报 `blank_slide`;按本 Skill 不得调用接口提交空页 |
|
|
86
|
+
|
|
87
|
+
标为“拒绝”的情况由命令校验拦截,**不会发出任何请求**;空页则必须在调用命令前由强制版式 lint 拦截。
|
|
88
|
+
|
|
89
|
+
## 什么时候不要用它
|
|
90
|
+
|
|
91
|
+
- **只改一个元素** → 用 [`+replace-slide`](lark-slides-replace-slide.md),一条 `block_replace` part 更省,也不用带上整页
|
|
92
|
+
- **要改多个页面** → 对每一页各跑一次本命令
|
|
93
|
+
- **要新建页面** → `slides +create` 或 `xml_presentation.slide create`
|
|
94
|
+
|
|
95
|
+
## 提交前与写入后验证
|
|
96
|
+
|
|
97
|
+
和其他整页写入一样,把 `--content` 存成本地文件后先跑版式 lint。先取得当前已加载 `lark-slides/SKILL.md` 的父目录,记为 `<lark-slides-skill-dir>`;不要猜测全局安装路径:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
python3 "<lark-slides-skill-dir>/scripts/xml_text_overlap_lint.py" --input page.xml
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`summary.error_count` 必须为 0 才调接口;`warning_count > 0` 时写完要截图复核。
|
|
104
|
+
|
|
105
|
+
写入成功后,必须回读整份演示文稿的最新 XML,而不是只相信写接口的成功响应:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
lark-cli slides +xml-get --as user \
|
|
109
|
+
--presentation "$PRES" --output readback.xml
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
按当前已加载 `lark-slides/SKILL.md` 指向的 [validation-checklist.md](validation-checklist.md) 完成验证:核对总页数、目标页和关键元素(包括需要保留的 ID、文本、背景与备注),并对回读 XML 运行同一版式 lint;发现差异时先停止后续写入并重新基于最新版处理。
|
|
113
|
+
|
|
114
|
+
## 成功输出
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"ok": true,
|
|
119
|
+
"identity": "user",
|
|
120
|
+
"data": {
|
|
121
|
+
"xml_presentation_id": "slides_example_presentation_id",
|
|
122
|
+
"slide_id": "piy",
|
|
123
|
+
"revision_id": 43
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
| `data` 下的字段 | 说明 |
|
|
129
|
+
|------|------|
|
|
130
|
+
| `xml_presentation_id` | 实际写入的演示文稿 ID |
|
|
131
|
+
| `slide_id` | 与传入相同——整页覆盖不换页 id |
|
|
132
|
+
| `revision_id` | 写入后的新版本号 |
|
|
133
|
+
|
|
134
|
+
服务端拒绝这次写入时(`failed_reason` 非空)**不会**返回成功输出,而是报错并带上原因——单个 part 承载整页,任何失败都意味着页面没被写入。
|
|
135
|
+
|
|
136
|
+
- 原因包含 `not found`:先检查 `--presentation` 和 `--slide-id`,再用 `slides +xml-get` 回读当前页面 ID。页面可能已删除,或 ID 来自另一份演示文稿。
|
|
137
|
+
- 其他 invalid-parameter 错误:检查 `--content` 中不支持的元素、缺少 `<content/>` 的 `<shape>`,以及超出 960×540 的坐标。
|
|
138
|
+
|
|
139
|
+
## 常见错误
|
|
140
|
+
|
|
141
|
+
| 现象 | 原因 | 解决 |
|
|
142
|
+
|------|------|------|
|
|
143
|
+
| 3350001,原因包含 `not found` | `--presentation` 不匹配,或 `--slide-id` 对应的页面已被删除 | 检查 `--presentation` 和 `--slide-id`,再用 `slides +xml-get` 回读当前页面 ID |
|
|
144
|
+
| 3350001,其他 invalid param | `--content` 的 XML 结构有问题(如 `<shape>` 缺 `<content/>`、包含服务端不支持的元素) | 按 [troubleshooting.md](troubleshooting.md) 检查 `--content` 的 XML 结构 |
|
|
145
|
+
| 3350002 not found | `--revision-id` 传了不存在的版本号 | 用 `-1` 或真实存在的 `revision_id` |
|
|
146
|
+
| 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## 用途
|
|
4
4
|
|
|
5
|
-
读取飞书幻灯片(PPT
|
|
5
|
+
读取飞书幻灯片(PPT)的完整演示文稿 XML,或通过 `--slide-id` / `--slide-number` 读取指定单页 XML。
|
|
6
6
|
|
|
7
7
|
## Shortcut
|
|
8
8
|
|
|
9
9
|
使用 `slides +xml-get` shortcut,可以把 XML 保存到本地文件,避免终端输出被截断。
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
```bash
|
|
13
12
|
lark-cli slides +xml-get --as user \
|
|
14
13
|
--presentation "slides_example_presentation_id" \
|
|
@@ -23,7 +22,10 @@ lark-cli slides +xml-get --as user \
|
|
|
23
22
|
| `--presentation` | string | 是 | 演示文稿的唯一标识符 |
|
|
24
23
|
| `--revision-id` | integer | 否 | 版本号,`-1` 表示最新版本 |
|
|
25
24
|
| `--output` | string | 否 | XML 保存路径,必须使用相对路径;省略时 XML 在 stdout 的 JSON envelope 中返回 |
|
|
26
|
-
| `--
|
|
25
|
+
| `--raw` | flag | 否 | 直接把 XML 输出到 stdout,不包 JSON envelope;不能与 `--output`、`--jq` 或非 JSON `--format` 同时使用 |
|
|
26
|
+
| `--slide-id` | string | 否 | 只读取指定 `slide_id` 的单页 XML;不能与 `--slide-number` 或 `--remove-attr-id` 同时使用 |
|
|
27
|
+
| `--slide-number` | integer | 否 | 只读取指定的 1-based 页码;不能与 `--slide-id` 或 `--remove-attr-id` 同时使用 |
|
|
28
|
+
| `--remove-attr-id` | flag | 否 | 仅全文读取可用;移除 XML id 属性后读取,不适合后续精确块编辑 |
|
|
27
29
|
| `--json` | flag | 否 | `--format json` 的简写,json 为默认输出格式 |
|
|
28
30
|
|
|
29
31
|
|
|
@@ -36,6 +38,27 @@ lark-cli slides +xml-get --as user \
|
|
|
36
38
|
--json
|
|
37
39
|
```
|
|
38
40
|
|
|
41
|
+
### 读取单页并保存
|
|
42
|
+
|
|
43
|
+
按页面 ID 和按页码二选一:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
lark-cli slides +xml-get --as user \
|
|
47
|
+
--presentation "slides_example_presentation_id" \
|
|
48
|
+
--slide-id "slide_example_id" \
|
|
49
|
+
--output .lark-slides/plan/slides_example_presentation_id/slide.xml \
|
|
50
|
+
--json
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 直接输出 XML 到管道
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
lark-cli slides +xml-get --as user \
|
|
57
|
+
--presentation "slides_example_presentation_id" \
|
|
58
|
+
--slide-number 1 \
|
|
59
|
+
--raw
|
|
60
|
+
```
|
|
61
|
+
|
|
39
62
|
### 指定版本读取
|
|
40
63
|
|
|
41
64
|
```bash
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Troubleshooting
|
|
2
2
|
|
|
3
|
-
本文件覆盖 lark-slides 的通用创建前自检、XML 排障和常见失败处理。命令专属问题优先看对应 reference,例如 `+replace-slide`、`+media-upload
|
|
3
|
+
本文件覆盖 lark-slides 的通用创建前自检、XML 排障和常见失败处理。命令专属问题优先看对应 reference,例如 `+replace-slide`、`+media-upload`。
|
|
4
4
|
|
|
5
5
|
## XML Preflight
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- 特殊字符已转义:正文和标题里的 `&`、`<`、`>` 不能裸写;属性值里的裸 `&` 也必须写成 `&`。
|
|
10
10
|
- 属性引号安全:XML 属性、shell 引号、JSON 字符串包装之间没有互相打断。
|
|
11
11
|
- 结构合法:`<slide>` 下只放 `<style>`、`<data>`、`<note>`,文本都在 `<content>` 内。
|
|
12
|
-
- 图片路径正确:`<img src="@...">`
|
|
12
|
+
- 图片路径正确:`<img src="@...">` 占位符由 `+create` 和 `+add-slide` 处理。
|
|
13
13
|
|
|
14
14
|
## Failure Order
|
|
15
15
|
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
3. 检查失败页是否含未转义字符:`Q&A -> Q&A`,文本 `<` / `>` 写成 `<` / `>`,属性 URL `a=1&b=2 -> a=1&b=2`。
|
|
21
21
|
4. 检查标签闭合、属性引号、`<content>` 结构,以及 `<slide>` 直接子元素。
|
|
22
22
|
5. 页面空白、溢出、重叠或越界时,按 [validation-checklist.md](validation-checklist.md) 运行 `xml_text_overlap_lint.py`;先修复所有 `error`,再对 `warning` 指向的页面和元素做截图复核。
|
|
23
|
-
6. 如果使用 `--slides '[...]'
|
|
24
|
-
7. 局部问题用 `+replace-slide`
|
|
23
|
+
6. 如果使用 `--slides '[...]'` 字面量,怀疑 shell 转义或截断时改用文件输入:`+create --slide @page-01.xml --slide @page-02.xml`。
|
|
24
|
+
7. 局部问题用 `+replace-slide` 块级修正;整页结构要改时用 `+delete-slide` 删旧页 + `+add-slide` 建新页。
|
|
25
25
|
|
|
26
26
|
## Symptom Fixes
|
|
27
27
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
| 表格列宽不合理 | 调整 `colgroup` 中 `col` 的 `width` 值 |
|
|
35
35
|
| 图表没有显示 | 检查 `chartPlotArea` 和 `chartData` 是否都包含,`dim1` / `dim2` 数据数量是否匹配 |
|
|
36
36
|
| 图片被裁掉一部分 | `<img>` 的 `width` / `height` 是裁剪后尺寸;要整图显示就让 `width:height` 对齐原图比例 |
|
|
37
|
-
| 图片不显示 / `<img src>` 仍是 `@path` | `@`
|
|
37
|
+
| 图片不显示 / `<img src>` 仍是 `@path` | `@` 占位符由 `+create` 和 `+add-slide` 替换 |
|
|
38
38
|
| 新插入的 `<img>` 挡住原有元素 | `slide.get` 读原页,对照已有块坐标挑空白位置;空间不够就在同一批 `--parts` 里先移动/缩小现有块再插图 |
|
|
39
39
|
| 渐变背景变成白色 | 渐变必须用 `rgba()` 格式 + 百分比停靠点,如 `linear-gradient(135deg,rgba(30,60,114,1) 0%,rgba(59,130,246,1) 100%)` |
|
|
40
40
|
| 整体风格不统一 | 封面页和结尾页用同一背景,内容页保持一致的配色和字号体系 |
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|--------------|------|----------|
|
|
46
46
|
| 400 XML 格式错误 | XML 语法错误 | 检查标签闭合、属性引号、特殊字符转义 |
|
|
47
47
|
| 400 请求包装错误 | `--data` 未按 schema 包装 | 检查是否传入 `xml_presentation.content` 或 `slide.content` |
|
|
48
|
-
| 创建成功但页面空白 / 内容缺失 / 布局错乱 | 常见于 `--slides '[...]'`
|
|
48
|
+
| 创建成功但页面空白 / 内容缺失 / 布局错乱 | 常见于 `--slides '[...]'` 字面量的 shell 转义或长参数传递问题 | 改用 `--slide @file`(每页一个文件)或 `--slides @deck.json`,并在创建后立即读取 XML 验证 |
|
|
49
49
|
| 403 权限不足 | scope 或文档权限不匹配 | 确认 scope 和文档权限;无权限时根据错误响应引导用户解决 |
|
|
50
50
|
| 404 演示文稿不存在 | `xml_presentation_id` 不正确或无权限 | 检查 token;wiki URL 需先解析真实 `obj_token` |
|
|
51
51
|
| 404 幻灯片不存在 | `slide_id` 不正确 | 重新读取 presentation 或 slide,确认最新 ID |
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
## 最小可用示例
|
|
13
13
|
|
|
14
14
|
```xml
|
|
15
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
16
15
|
<presentation xmlns="https://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
17
16
|
<slide>
|
|
18
17
|
<data>
|
|
@@ -431,7 +430,6 @@ XSD 中的 `title`、`headline`、`sub-headline`、`body`、`caption` 主要出
|
|
|
431
430
|
## 完整示例
|
|
432
431
|
|
|
433
432
|
```xml
|
|
434
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
435
433
|
<presentation xmlns="https://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
436
434
|
<title>季度报告</title>
|
|
437
435
|
<theme>
|
|
@@ -22,16 +22,23 @@ metadata:
|
|
|
22
22
|
|
|
23
23
|
**身份**:画板操作默认使用 `--as user`。仅当需要以应用身份上传时使用 `--as bot`。
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
> 先判断「只读还是写入」,再在对应表内按上到下匹配,**命中即停**。
|
|
26
|
+
|
|
27
|
+
### A. 只读 · 查看 / 导出(不改画板)
|
|
28
|
+
|
|
29
|
+
| 用户需求 | 行动 |
|
|
30
|
+
|---|---|
|
|
27
31
|
| 查看画板内容 / 导出图片 | [`+export --output-type preview`](references/lark-whiteboard-export.md) |
|
|
28
32
|
| 导出 SVG 矢量图 | [`+export --output-type svg`](references/lark-whiteboard-export.md) |
|
|
29
|
-
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
|
34
|
-
|
|
33
|
+
| 提取画板的 Mermaid/PlantUML 源码 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
|
|
34
|
+
|
|
35
|
+
### B. 写入 · 创作 / 编辑(会改画板,命中即停)
|
|
36
|
+
|
|
37
|
+
| 场景 | 行动 | 写入方式 | 对原内容 |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| 用户**已提供** Mermaid/PlantUML/SVG 代码,或明确指定用该格式 | 使用该代码 → [`+update`](references/lark-whiteboard-update.md),`--input_format` 取单值 `mermaid` / `plantuml` / `svg`;写入非空已有画板并需要 overwrite 时,先确认会整板重建;若 SVG 用于修改已有画板,先走 [`routes/svg-edit.md`](routes/svg-edit.md) 有损确认 | overwrite / append | 按用户要求 |
|
|
40
|
+
| 从零新建复杂图表(架构/流程/组织等) | → **[§ 创作 Workflow](references/lark-whiteboard-workflow.md#创作-workflow)** | 首次写入 | — |
|
|
41
|
+
| 修改 / 增补已有画板 | → **[§ 编辑 Workflow](references/lark-whiteboard-workflow.md#编辑-workflow)** | 见该表 | 见该表 |
|
|
35
42
|
|
|
36
43
|
## Shortcuts
|
|
37
44
|
|
|
@@ -10,15 +10,16 @@
|
|
|
10
10
|
|----------------------|----|------------------------------------------------------------------------|
|
|
11
11
|
| `--whiteboard-token` | 是 | 画板 token,需要拥有画板的读权限 |
|
|
12
12
|
| `--output-type` | 是 | 输出格式:`preview`(预览图片)、`svg`(SVG 矢量图)、`source`(PlantUML/Mermaid 代码)、`raw`(OpenAPI 原生画板节点格式) |
|
|
13
|
-
| `--output` | 否 | 输出路径。当 `--output-type preview`
|
|
13
|
+
| `--output` | 否 | 输出路径。当 `--output-type preview` 时必填;当 `--output-type svg/source/raw` 时可选,不填则直接输出到终端 |
|
|
14
14
|
| `--overwrite` | 否 | 覆盖已存在的文件,默认为 false |
|
|
15
15
|
|
|
16
16
|
## 输出格式
|
|
17
17
|
|
|
18
|
-
- `preview
|
|
18
|
+
- `preview`:预览图片。保存时会根据接口实际返回的 `Content-Type` 决定扩展名,例如 `image/jpeg` 会保存为 `.jpg`。
|
|
19
19
|
- `svg`:导出画板为标准 SVG 矢量图。可用于 SVG 编辑后回写画板(见 [`routes/svg-edit.md`](../routes/svg-edit.md))。注意:导出为纯视觉快照,思维导图层级、表格结构、连接器绑定等语义信息会丢失。
|
|
20
20
|
- `source`:PlantUML/Mermaid 代码。仅限画板内有且仅有一个 PlantUML/Mermaid 图时,才可导出代码,否则会在返回值中告知不存在/有多个节点。
|
|
21
|
-
- `raw`:飞书 OpenAPI 原生画板节点格式。这一 json 格式不适合直接编辑复杂布局或内容,建议仅限于需要修改简单的文本内容/颜色等细节时使用。需要进行更复杂的设计/修改时,建议参考 [§
|
|
21
|
+
- `raw`:飞书 OpenAPI 原生画板节点格式。这一 json 格式不适合直接编辑复杂布局或内容,建议仅限于需要修改简单的文本内容/颜色等细节时使用。需要进行更复杂的设计/修改时,建议参考 [§ 编辑 Workflow](lark-whiteboard-workflow.md#编辑-workflow)。
|
|
22
|
+
- **需编辑后回写时,导出务必加 `--output <file>` 写入文件**:文件内容可直接作为 `+update` 的输入;直接输出到终端的结果会多一层 `{ ok, identity, data }` 包装,`+update` 无法解析。
|
|
22
23
|
|
|
23
24
|
## 示例
|
|
24
25
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|----------------------|----|--------------------------------------------|
|
|
18
18
|
| `--whiteboard-token` | 是 | 画板 token,需要拥有画板的编辑权限 |
|
|
19
19
|
| `--idempotent-token` | 否 | 幂等 token,确保更新操作幂等;最少 10 个字符,建议使用时间戳 + 场景标识拼接(如 `1744800000-board-1`)。同一次逻辑更新只生成一次该 token,重试时须原样复用;切勿在每次重试时重新生成时间戳或幂等 key,否则会重复写入 |
|
|
20
|
-
| `--overwrite` | 否 |
|
|
20
|
+
| `--overwrite` | 否 | 写入模式:带上则覆盖更新(写入前删除画板所有现有内容再写入);省略则为增量追加(保留原有内容,新内容叠加写入)。默认 false(增量追加)|
|
|
21
21
|
| `--source` | 是 | 输入画板内容,支持使用 `@path` 从文件读取,或 `-` 从 stdin 读取 |
|
|
22
22
|
| `--input_format` | 否 | 输入格式:`raw`、`plantuml`、`mermaid`、`svg`,默认为 `raw` |
|
|
23
23
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
思维导图,时序图,类图,饼图,流程图等图表推荐使用 Mermaid/PlantUML 语法绘制。
|
|
29
29
|
|
|
30
|
-
而当需要绘制架构图,组织架构图,泳道图,对比图,鱼骨图,柱状图,折线图,树状图,漏斗图,金字塔图,循环/飞轮图,里程碑或其他较为复杂的图表时,推荐参考 [§ 渲染 & 写入画板](
|
|
30
|
+
而当需要绘制架构图,组织架构图,泳道图,对比图,鱼骨图,柱状图,折线图,树状图,漏斗图,金字塔图,循环/飞轮图,里程碑或其他较为复杂的图表时,推荐参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板) 使用 whiteboard-cli 工具创作。
|
|
31
31
|
|
|
32
32
|
## 示例
|
|
33
33
|
|
|
@@ -71,7 +71,7 @@ lark-cli whiteboard +update \
|
|
|
71
71
|
|
|
72
72
|
### 示例 3:使用 whiteboard-cli 生成 OpenAPI 格式并写入画板
|
|
73
73
|
|
|
74
|
-
whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](
|
|
74
|
+
whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板)
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
77
|
# 使用 whiteboard-cli 生成 OpenAPI 格式并通过管道传递
|
|
@@ -85,7 +85,7 @@ npx -y @larksuite/whiteboard-cli@^0.2.13 -i <产物文件> --to openapi --format
|
|
|
85
85
|
|
|
86
86
|
### 示例 4:先生成产物文件,再从文件读取更新
|
|
87
87
|
|
|
88
|
-
whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](
|
|
88
|
+
whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板)
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
# 生成 OpenAPI 格式到文件
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 画板创作/编辑工作流
|
|
2
2
|
|
|
3
3
|
## 创作 Workflow
|
|
4
4
|
|
|
@@ -19,23 +19,24 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## 编辑 Workflow
|
|
23
23
|
|
|
24
24
|
**Step 1:获取 board_token**(同创作 Workflow Step 1)
|
|
25
25
|
|
|
26
|
-
**Step 2
|
|
26
|
+
**Step 2:探测可编辑性 / 是否由代码绘制**
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
- `+export --output-type source` — 能返回单一 Mermaid/PlantUML 源码,说明画板由代码绘制、可走路径①;返回无代码/多图则走路径②③④
|
|
29
|
+
|
|
30
|
+
**Step 3:选编辑路径**(按上到下匹配,命中即停;用户有明确指定则以用户为准)
|
|
31
|
+
|
|
32
|
+
| 路径 | 命中条件 | 怎么改 | 写入方式 | 是否有损 |
|
|
33
|
+
|---|---|---|---|---|
|
|
34
|
+
| ①源码重构 | `+export source` 返回单一 Mermaid/PlantUML(即画板由代码绘制) | 在源码上改 → 按源码类型用 `+update --input_format mermaid` 或 `+update --input_format plantuml` | overwrite(整板重建) | ⚠️ **非严格无损,执行前确认** |
|
|
35
|
+
| ②属性微调 | 只改已有节点的文字/颜色 | `+export --output-type raw --output <file>`(**必须写入文件**)→ 编辑文件中目标节点字段;如只能用 `+update --input_format raw --source @<file> --overwrite` 写回,先说明会整板重建并等待用户确认 | overwrite(整板重建) | ⚠️ **有损风险,未确认不得执行** |
|
|
36
|
+
| ③增量追加 | 在原图基础上新增图/元素,保留原内容 | `+export --output-type preview` → 理解原图 → `+export --output-type raw` → 确定新节点坐标 → [§ 渲染 & 写入画板](#渲染--写入画板) 创作&写入 | append(**不加 `--overwrite`**) | 无损(原节点不动) |
|
|
37
|
+
| ④结构重绘 | 需几何变动/增删元素/结构调整/混合编辑 | [`../routes/svg-edit.md`](../routes/svg-edit.md) | overwrite(清空重来) | ⚠️ **有损,必须先经用户确认** |
|
|
38
|
+
|
|
39
|
+
**⚠️ 止损**:一条路径最多试 2 轮,不行就换条路径尝试一次;仍不行就停下,如实告诉用户卡点,不要在各路径间反复横跳。
|
|
39
40
|
|
|
40
41
|
---
|
|
41
42
|
|
|
@@ -45,12 +46,13 @@
|
|
|
45
46
|
|
|
46
47
|
**先自报身份**:按训练来源,你属于哪一家?`Claude` / `Gemini` / `GPT` / `GLM` / `Doubao 或 Seed` / `Other`。身份决定 SVG / DSL 分流(不同家族对这两种表达语言的能力不均衡),不要跳过这一步。
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
**然后按当前产物类型 / 图表类型 × 身份选路径**,读对应文件按其完整 workflow 执行(含读 scene 指南、生成内容、渲染审查、交付):
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
当前产物路由按上到下匹配, 命中即停:
|
|
51
52
|
|
|
52
53
|
| 图表类型 | 身份 | 路径 |
|
|
53
54
|
|--------------------|-------------------------------------|------------------------------------------------|
|
|
55
|
+
| 当前要生成/追加的内容包含 @用户提及或图片/配图 | 任何身份 | [`../routes/dsl.md`](../routes/dsl.md) |
|
|
54
56
|
| 思维导图、时序图、类图、饼图、甘特图 | 任何身份 | [`../routes/mermaid.md`](../routes/mermaid.md) |
|
|
55
57
|
| 鱼骨图、金字塔图、流程图 | `Doubao` / `Seed` | [`../routes/dsl.md`](../routes/dsl.md) |
|
|
56
58
|
| 其他图表 | `Claude` / `Gemini` / `GPT` / `GLM` / `Doubao` / `Seed` | [`../routes/svg.md`](../routes/svg.md) |
|
|
@@ -81,7 +83,7 @@ diagram.png ← 渲染结果
|
|
|
81
83
|
|
|
82
84
|
写入画板时按最终产物类型选择 `+update --input_format`:
|
|
83
85
|
|
|
84
|
-
- Mermaid / PlantUML / SVG
|
|
86
|
+
- Mermaid / PlantUML / SVG 产物直接写入时,`--input_format` 取单值 `mermaid` / `plantuml` / `svg`;写入非空已有画板并需要 overwrite 时,先确认会整板重建;SVG 修改已有画板时先走 [`../routes/svg-edit.md`](../routes/svg-edit.md) 的确认 workflow。
|
|
85
87
|
- 只有 DSL 产物或已明确需要 OpenAPI 原生节点格式时,才先用 `npx -y @larksuite/whiteboard-cli@^0.2.13 --to openapi --format json` 转换,再用 `raw` 写入。
|
|
86
88
|
|
|
87
89
|
具体命令示例、`--overwrite`、`--idempotent-token` 和 `--as user/bot` 的使用方式,统一参考 [`whiteboard +update`](./lark-whiteboard-update.md)。
|
|
@@ -33,7 +33,7 @@ Step 3: 渲染 & 审查 → 交付
|
|
|
33
33
|
npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json --to openapi --format json \
|
|
34
34
|
| lark-cli whiteboard +update --whiteboard-token <board_token> \
|
|
35
35
|
--source - --input_format raw --idempotent-token <时间戳+标识> --as user
|
|
36
|
-
→ 完整 dry-run / 确认流程见
|
|
36
|
+
→ 完整 dry-run / 确认流程见 [§ 写入画板](../references/lark-whiteboard-workflow.md#写入画板)
|
|
37
37
|
- 交付:向用户报告 board_token 写入成功
|
|
38
38
|
```
|
|
39
39
|
|
|
@@ -73,7 +73,13 @@ Step 3: 渲染 & 审查 → 交付
|
|
|
73
73
|
| 循环/飞轮图 | `scenes/flywheel.md` | 增长飞轮、闭环链路 |
|
|
74
74
|
| 里程碑 | `scenes/milestone.md` | 时间线、版本演进 |
|
|
75
75
|
| 流程图 | `scenes/flowchart.md` | 业务流、状态机、带条件判断的链路 |
|
|
76
|
-
|
|
76
|
+
|
|
77
|
+
### 插入 @用户提及 / 图片
|
|
78
|
+
|
|
79
|
+
| 当前内容包含 | 必读指南 |
|
|
80
|
+
|---|---|
|
|
81
|
+
| @用户提及 | [`../scenes/mention.md`](../scenes/mention.md) |
|
|
82
|
+
| 图片 / 配图 | [`../scenes/photo-showcase.md`](../scenes/photo-showcase.md) |
|
|
77
83
|
|
|
78
84
|
## 渲染前自查
|
|
79
85
|
|
|
@@ -22,6 +22,6 @@ Step 3: 渲染验证 & 写入画板 & 交付
|
|
|
22
22
|
npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.mmd --to openapi --format json \
|
|
23
23
|
| lark-cli whiteboard +update --whiteboard-token <board_token> \
|
|
24
24
|
--source - --input_format raw --idempotent-token <时间戳+标识> --as user
|
|
25
|
-
→ 完整 dry-run / 确认流程见
|
|
25
|
+
→ 完整 dry-run / 确认流程见 [§ 写入画板](../references/lark-whiteboard-workflow.md#写入画板)
|
|
26
26
|
6. 交付:向用户报告 board_token 写入成功
|
|
27
27
|
```
|
|
@@ -16,11 +16,14 @@ SVG 导出是**纯视觉快照**,再次导入后画板语义(思维导图层
|
|
|
16
16
|
|
|
17
17
|
### 0. 用户确认(强制)
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
执行任何编辑前,先判断**紧邻的上一条用户消息**是否已明确确认有损编辑:
|
|
20
|
+
|
|
21
|
+
- **已确认**(含用户主动预授权,如"我知道有损,直接改")→ 直接进入 Step 1,不再重复警告。
|
|
22
|
+
- **未确认或回复含糊** → 原样向用户发出下面这句话,**然后立即结束本回合等待回复** —— 同一条消息内不得附带任何导出/编辑/写回命令或工具调用:
|
|
20
23
|
|
|
21
24
|
> SVG 编辑只保证视觉层面对齐,画板语义(层级/节点类型/思维导图结构/表格结构/连线绑定/容器类型/mention 等)将不可恢复,是否继续?
|
|
22
25
|
|
|
23
|
-
|
|
26
|
+
这是**知情确认**(动手前让用户对语义丢失止损);真正的破坏性写入在 Step 4 还会再经 `--overwrite` dry-run 确认一次,二者职责不同、都不可省。
|
|
24
27
|
|
|
25
28
|
### 1. 导出当前画板 SVG
|
|
26
29
|
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
- 阴影:`<filter>` 里放 `<feDropShadow>` 或标准 drop/inner primitive 链 (`<feGaussianBlur in="SourceAlpha">` + `<feOffset>` + `<feFlood>` + `<feComposite>` + `<feMerge>`), 会被识别成节点阴影, drop 至多 1 个, inner 至多 1 个; 其余 filter 效果不识别
|
|
55
55
|
- 渐变:`<linearGradient>` / `<radialGradient>` 在 `<defs>` 中定义, 通过 `fill="url(#id)"` 引用 (载体限 `<rect>` / `<circle>` / `<ellipse>` / `<polygon>` / `<path>`), 需要至少 2 个 `<stop>`, `gradientUnits` 只支持默认的 `objectBoundingBox` (不写即可);
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
> [!IMPORTANT]
|
|
58
|
+
> ⚠️ **不支持的装饰特性**
|
|
59
|
+
|
|
58
60
|
- `<pattern>` / `<clipPath>` / `<mask>` / 非阴影用途的 `<filter>` (blur / hue-rotate / 复合合成 / `flood-color=url(...)` / 多个 `<feDropShadow>` 等) → 画板不支持,**请避免使用,否则会导致画板渲染问题**
|
|
59
61
|
- 渐变边界:`gradientUnits="userSpaceOnUse"` / `spreadMethod="reflect|repeat"` / stops 少于 2 个 / 复杂 `gradientTransform` 会变成不可编辑图片, 视觉正确但失去可编辑性, 若无必要请沿用默认 `objectBoundingBox`
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# 提及用户 (@用户 / mentionUser)
|
|
2
|
+
|
|
3
|
+
适用于:文本节点内需要 @ 某个飞书用户(如"负责人:@张三"、"@李四 请跟进")。mention 不是独立节点,而是文本节点富文本中的一段 run,可与普通文字混排。
|
|
4
|
+
|
|
5
|
+
> 当用户要插入 @用户提及时阅读本页。
|
|
6
|
+
|
|
7
|
+
## 取值来源(强约束)
|
|
8
|
+
|
|
9
|
+
- 本页只讲 @用户(mentionUser)。@文档(mentionDoc)暂不支持。
|
|
10
|
+
- `mentionUserId` 必须是**真实的飞书用户 open_id**(形如 `ou_xxxxxxxx`)。
|
|
11
|
+
- 用户只给出**姓名**时,先用 `lark-contact` skill 把姓名解析成 open_id,再填入 `mentionUserId`。
|
|
12
|
+
- **无法解析出真实 open_id 时,停下向用户确认,禁止臆造 id**。假 id 会写入失败或 @ 到错误的人。
|
|
13
|
+
|
|
14
|
+
## Content 约束(关键)
|
|
15
|
+
|
|
16
|
+
- 带 `mentionUserId` 的 run,其 `content` **必须非空**,约定填 `"*"`(单字符占位)。
|
|
17
|
+
- 原因:转换按字符占位来引用样式,`content` 为空串时该 mention 不会产出任何元素(静默丢失)。
|
|
18
|
+
- `content` 的字面内容**不会显示**:画板上显示的是按 open_id 反查到的用户名,不是 `content` 的文字。因此不要把用户名写进 `content`,填单个 `"*"` 即可。
|
|
19
|
+
- 一个 run 只能是一种类型:`mentionUserId` 与 `hyperlink` **互斥**,不能同时出现在同一个 run(校验会报错)。需要"链接 + @用户"时拆成两个 run。
|
|
20
|
+
|
|
21
|
+
## 骨架示例
|
|
22
|
+
|
|
23
|
+
`text` 用 `WBTextRun[]`,把 @用户 拆成独立 run(`content: "*"` + `mentionUserId`),前后再接普通文字 run:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"type": "text",
|
|
28
|
+
"width": "fit-content",
|
|
29
|
+
"height": "fit-content",
|
|
30
|
+
"text": [
|
|
31
|
+
{ "content": "负责人:", "fontSize": 14 },
|
|
32
|
+
{ "content": "*", "mentionUserId": "ou_xxxxxxxxxxxxxxxx", "fontSize": 14 },
|
|
33
|
+
{ "content": " 请本周内跟进", "fontSize": 14 }
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
写入画板走标准 DSL 路径(`npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json --to openapi --format json | lark-cli whiteboard +update ... --input_format raw`),无需手写 raw JSON。
|
|
39
|
+
|
|
40
|
+
## 正反例
|
|
41
|
+
|
|
42
|
+
正确:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{ "content": "*", "mentionUserId": "ou_abc123" }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
错误(content 空串 → 不产出 @用户):
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{ "content": "", "mentionUserId": "ou_abc123" }
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
错误(把用户名写进 content → 多余占位,显示仍由 uid 决定):
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{ "content": "@张三", "mentionUserId": "ou_abc123" }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
错误(与 hyperlink 同 run → 校验报错,须拆两个 run):
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{ "content": "*", "mentionUserId": "ou_abc123", "hyperlink": "https://xxx.com" }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 陷阱
|
|
67
|
+
|
|
68
|
+
- **content 为空**:mention 静默丢失,画板上看不到 @用户。必须填 `"*"`。
|
|
69
|
+
- **把用户名写进 content**:无意义,显示名由 open_id 反查决定;且多字符会占用多个字符位。
|
|
70
|
+
- **mentionUserId + hyperlink 同 run**:一个 run 只能是一种元素类型,会被校验拦截,须拆成两个 run。
|
|
71
|
+
- **用假 id 或用户中文名当 id**:`mentionUserId` 只接受真实 open_id,先经 `lark-contact` 解析。
|