@amaster.ai/pi-lark 0.1.2-beta.51 → 0.1.2-beta.52

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.
Files changed (50) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-base/SKILL.md +11 -4
  3. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +17 -1
  4. package/skills/lark-base/references/lark-base-dashboard.md +17 -4
  5. package/skills/lark-base/references/lark-base-field-json.md +2 -0
  6. package/skills/lark-calendar/SKILL.md +1 -1
  7. package/skills/lark-doc/SKILL.md +1 -0
  8. package/skills/lark-doc/references/lark-doc-history.md +13 -14
  9. package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
  10. package/skills/lark-drive/references/lark-drive-export.md +3 -0
  11. package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
  12. package/skills/lark-event/SKILL.md +7 -4
  13. package/skills/lark-event/references/lark-event-vc.md +8 -2
  14. package/skills/lark-im/SKILL.md +5 -5
  15. package/skills/lark-im/references/lark-im-chat-list.md +9 -2
  16. package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
  17. package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
  18. package/skills/lark-im/references/lark-im-chat-search.md +9 -2
  19. package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
  20. package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
  21. package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
  22. package/skills/lark-im/references/lark-im-flag-list.md +2 -2
  23. package/skills/lark-im/references/lark-im-messages-search.md +3 -2
  24. package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
  25. package/skills/lark-mail/references/lark-mail-triage.md +19 -4
  26. package/skills/lark-minutes/SKILL.md +1 -1
  27. package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
  28. package/skills/lark-shared/SKILL.md +3 -3
  29. package/skills/lark-slides/SKILL.md +25 -40
  30. package/skills/lark-slides/references/lark-slides-add-slide.md +92 -0
  31. package/skills/lark-slides/references/lark-slides-create.md +16 -35
  32. package/skills/lark-slides/references/lark-slides-delete-slide.md +65 -0
  33. package/skills/lark-slides/references/lark-slides-edit-workflows.md +5 -3
  34. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -25
  35. package/skills/lark-slides/references/lark-slides-replace-pages.md +6 -4
  36. package/skills/lark-slides/references/lark-slides-replace-slide.md +22 -1
  37. package/skills/lark-slides/references/lark-slides-screenshot.md +31 -13
  38. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +5 -5
  39. package/skills/lark-slides/references/slides_chart_demo.xml +1 -1
  40. package/skills/lark-slides/references/slides_xml_schema_definition.xml +48 -4
  41. package/skills/lark-slides/references/troubleshooting.md +1 -2
  42. package/skills/lark-slides/references/validation-checklist.md +3 -3
  43. package/skills/lark-slides/references/xml-schema-quick-ref.md +23 -9
  44. package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
  45. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +360 -76
  46. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +1138 -214
  47. package/skills/lark-wiki/SKILL.md +5 -3
  48. package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
  49. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
  50. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
@@ -31,13 +31,13 @@ lark-cli im +feed-group-list --as user --page-all \
31
31
  | Flag | Required | Description |
32
32
  |---|---|---|
33
33
  | `--page-size` | No | Records per page, 1–50 (default 50). Caps the combined `groups` + `deleted_groups` count, so a page may hold fewer live groups than the size suggests |
34
- | `--page-token` | No | Continuation token for a specific page |
34
+ | `--page-token` | No | Starting cursor, normally returned by a previous response |
35
35
  | `--page-all` | No | Auto-paginate and merge all pages (both lists) |
36
36
  | `--page-limit` | No | Max pages when `--page-all` is set, 1–1000 (default 20) |
37
37
  | `--start-time` | No | Update-time window start (Unix milliseconds as a decimal string) |
38
38
  | `--end-time` | No | Update-time window end (Unix milliseconds as a decimal string) |
39
39
 
40
- When `--page-token` is set explicitly, it wins over `--page-all` (you get exactly that page).
40
+ When `--page-token` and `--page-all` are supplied together, automatic pagination starts at that cursor and continues until exhaustion or `--page-limit`.
41
41
 
42
42
  ## Output
43
43
 
@@ -10,7 +10,7 @@ Lists **one page** of the **current user's** feed shortcuts.
10
10
 
11
11
  - Only **CHAT-type** shortcuts are exposed via OpenAPI today (others in the IDL are not yet whitelisted).
12
12
  - The shortcut is a **thin one-page wrapper** — there is no built-in auto-pagination. Callers drive their own loop when they actually need to paginate.
13
- - Server-side page size is controlled by the service; in normal use one page usually covers the list.
13
+ - Server-side page size is controlled by the service, so this command has no `--page-size` flag; in normal use one page usually covers the list.
14
14
  - Pagination tokens are opaque. If a token is rejected because the shortcut list changed, restart by omitting `--page-token`.
15
15
 
16
16
  ## Commands
@@ -8,7 +8,7 @@ This skill maps to shortcut: `lark-cli im +flag-list`. Underlying API: `GET /ope
8
8
 
9
9
  The API returns data sorted by `update_time` in **ascending order**, meaning **oldest first, newest last**. When `has_more=true`, continue pagination until `has_more=false`; only then is the last item in the merged result authoritative as the newest flag. If pagination stops while `has_more=true`, the last item is only the newest observed flag.
10
10
 
11
- `--page-all` enables automatic pagination but is still capped by `--page-limit`. The default cap is 20 pages; **20 is not the hard maximum**. Set `--page-limit` between 1 and 1000 when a larger scan is required. A response with `has_more=true` is incomplete, even when `flag_items` is empty; increase the limit or resume from the returned `page_token` before reporting an authoritative latest item or count.
11
+ `--page-all` enables automatic pagination but is still capped by `--page-limit`. When `--page-token` is also supplied, it sets the starting cursor and pagination continues from there. The default cap is 20 pages; **20 is not the hard maximum**. Set `--page-limit` between 1 and 1000 when a larger scan is required. A response with `has_more=true` is incomplete, even when `flag_items` is empty; increase the limit or resume from the returned `page_token` before reporting an authoritative latest item or count.
12
12
 
13
13
  ## Commands
14
14
 
@@ -40,7 +40,7 @@ lark-cli im +flag-list --as user --page-all --page-limit 1000
40
40
  | Parameter | Default | Description |
41
41
  |------|------|------|
42
42
  | `--page-size <n>` | 50 | Range 1-50 (server max is 50) |
43
- | `--page-token <token>` | empty | Pagination token from previous page; empty string must still be provided |
43
+ | `--page-token <token>` | empty | Starting cursor from a previous response; an empty cursor still selects the first page |
44
44
  | `--page-all` | false | Auto-paginate and merge results, capped by `--page-limit` |
45
45
  | `--page-limit <n>` | 20 | Max pages in `--page-all` mode; configurable range 1-1000 (20 is only the default) |
46
46
  | `--enrich-feed-thread` | true | Auto-enrich feed-layer thread entries with message content (calls `im.messages.mget`) |
@@ -80,7 +80,7 @@ lark-cli im +messages-search --query "test" --dry-run
80
80
  | `--start <time>` | No | Start time with local timezone offset required (e.g. `2026-03-24T00:00:00+08:00`) |
81
81
  | `--end <time>` | No | End time with local timezone offset required (e.g. `2026-03-25T23:59:59+08:00`) |
82
82
  | `--page-size <n>` | No | Page size (default 20, range 1-50) |
83
- | `--page-token <token>` | No | Pagination token for the next page |
83
+ | `--page-token <token>` | No | Starting cursor, normally returned by a previous response |
84
84
  | `--page-all` | No | Automatically paginate through all result pages (up to 40 pages) |
85
85
  | `--page-limit <n>` | No | Max pages to fetch when auto-pagination is enabled (default 20, max 40). Setting it explicitly also enables auto-pagination |
86
86
  | `--format <fmt>` | No | Output format: `json` (default) / `pretty` / `table` / `ndjson` / `csv` |
@@ -135,6 +135,7 @@ Each message in JSON output contains:
135
135
  - Default behavior is still **single-page**.
136
136
  - `--page-token` is the manual continuation mechanism when you already have a token from a previous response.
137
137
  - `--page-all` enables auto-pagination and uses a default cap of **40 pages**.
138
+ - With both flags, auto-pagination starts at `--page-token` and continues from that cursor.
138
139
  - `--page-limit <n>` enables auto-pagination with an explicit cap. If you pass `--page-limit` without `--page-all`, auto-pagination is still enabled.
139
140
  - When auto-pagination stops because of the configured page cap, the response still includes the last `has_more` / `page_token` so you can continue manually.
140
141
 
@@ -162,7 +163,7 @@ Use `im +messages-resources-download` if you need to fetch the underlying image
162
163
 
163
164
  Use `--query` only for real message keywords. If the user asks for activity review such as "最近一周我和哪些 Bot 有过交互" or "整理我和某人的聊天记录", and the useful constraints are sender type, chat, person, or time range, keep `--query ""` and rely on those filters. Do not put generic instruction words such as "看看", "总结", "交互内容", or "聊天记录" into `--query`; those words often over-constrain message search and hide the relevant messages.
164
165
 
165
- This guidance applies only when using user identity. `im +messages-search` is user-only; if the user explicitly asks for application/bot identity, do not try `--as bot`. For bot identity with a named group and history/listing intent, resolve the group with `im +chat-search --as bot`, then list messages with `im +chat-messages-list --as bot --chat-id <chat_id>`.
166
+ This guidance applies to both user and bot identity. If the user explicitly asks for application/bot identity, run `im +messages-search --as bot`; for named-group history/listing intents where search is not needed, resolving the group with `im +chat-search --as bot` and listing messages with `im +chat-messages-list --as bot --chat-id <chat_id>` is still a good narrower path.
166
167
 
167
168
  ```bash
168
169
  # Review recent bot interactions without forcing a keyword
@@ -23,6 +23,9 @@ lark-cli im +threads-messages-list --thread omt_xxx --page-size 20
23
23
  # Pagination
24
24
  lark-cli im +threads-messages-list --thread omt_xxx --page-token <PAGE_TOKEN>
25
25
 
26
+ # Fetch multiple pages automatically, up to 10 pages by default
27
+ lark-cli im +threads-messages-list --thread omt_xxx --page-all
28
+
26
29
  # Output format options
27
30
  lark-cli im +threads-messages-list --thread omt_xxx --format pretty
28
31
  lark-cli im +threads-messages-list --thread omt_xxx --format table
@@ -43,8 +46,10 @@ lark-cli im +threads-messages-list --thread omt_xxx --dry-run
43
46
  | `--no-reactions` | No | Skip auto-fetching the `reactions` block |
44
47
  | `--download-resources` | No | Download message resources (image/file/audio/video/media + post-embedded, excluding stickers) into `./lark-im-resources/` and attach a `resources` block. Off by default |
45
48
  | `--order <order>` | No | Sort order: `asc` (default) / `desc` |
46
- | `--page-size <n>` | No | Number of items per page (default 50, range 1-500) |
47
- | `--page-token <token>` | No | Pagination token for the next page |
49
+ | `--page-size <n>` | No | Number of items per page (default 50, range 1-50) |
50
+ | `--page-token <token>` | No | Starting cursor, normally returned by a previous response |
51
+ | `--page-all` | No | Automatically fetch and merge subsequent pages; capped by `--page-limit` |
52
+ | `--page-limit <n>` | No | Maximum pages fetched by `--page-all` (default 10, range 1-1000) |
48
53
  | `--format <fmt>` | No | Output format: `json` (default) / `pretty` / `table` / `ndjson` / `csv` |
49
54
  | `--as <identity>` | No | Identity type: `user` (default) / `bot` |
50
55
  | `--dry-run` | No | Print the request only, do not execute it |
@@ -61,8 +66,7 @@ Thread messages do not support `start_time` / `end_time` filtering because of Fe
61
66
 
62
67
  ### 3. Pagination (`has_more` / `page_token`)
63
68
 
64
- - When the result includes `has_more=true`, use `page_token` to fetch the next page
65
- - If you need the complete thread, keep paginating; if you only need an overview, the first page is often enough
69
+ Default is one page. With `--page-all`, `--page-token` sets the starting cursor; if `meta.pagination.complete=false`, resume from `meta.pagination.next_token` or raise `--page-limit`.
66
70
 
67
71
  ### 4. Recommended expansion strategy
68
72
 
@@ -13,6 +13,8 @@ lark-cli mail +triage
13
13
 
14
14
  # 查看收件箱未读
15
15
  lark-cli mail +triage --filter '{"folder":"inbox","is_unread":true}'
16
+ lark-cli mail +triage --folder INBOX --is-unread
17
+ lark-cli mail +triage --filter is_unread
16
18
 
17
19
  # 全文搜索
18
20
  lark-cli mail +triage --query "合同审批"
@@ -25,6 +27,8 @@ lark-cli mail +triage --query "项目评审" --filter '{"time_range":{"start_tim
25
27
 
26
28
  # 指定文件夹
27
29
  lark-cli mail +triage --filter '{"folder":"sent"}'
30
+ lark-cli mail +triage --filter folder=sent
31
+ lark-cli mail +triage --folder sent
28
32
 
29
33
  # 系统标签(可通过 folder 或 label 传入,搜索时自动转为 folder)
30
34
  lark-cli mail +triage --filter '{"folder":"flagged"}'
@@ -47,17 +51,28 @@ lark-cli mail +triage --page-size 10
47
51
 
48
52
  | 参数 | 默认 | 说明 |
49
53
  |------|------|------|
50
- | `--filter <json>` | — | 筛选条件(见下方字段说明) |
54
+ | `--filter <filter>` | — | 筛选条件(见下方字段说明) |
55
+ | `--folder <name-or-id>` | — | 文件夹名称或系统文件夹 ID 筛选;等价于设置 `filter.folder` |
56
+ | `--folder-id <id>` | — | 明确的文件夹 ID 筛选;等价于设置 `filter.folder_id` |
57
+ | `--is-unread` | — | 只看未读;等价于设置 `filter.is_unread=true` |
51
58
  | `--query <text>` | — | 全文搜索关键词 |
52
59
  | `--format <mode>` | `table` | `table` / `json` / `data`(`json` 和 `data` 均输出含分页信息的对象) |
53
60
  | `--max <n>` | `20` | 最大返回条数(1-400),内部自动分页拉取 |
54
- | `--page-size <n>` | — | `--max` 的别名,两者含义相同;同时指定时 `--page-size` 优先 |
61
+ | `--page-size <n>` | — | `--max` 的别名;重复指定时后出现的值生效 |
55
62
  | `--page-token <token>` | — | 上一次响应返回的分页令牌,传入后从该位置继续拉取。令牌带 `search:` 或 `list:` 前缀,标识来源路径,不可混用 |
56
63
  | `--labels` | — | table 格式时额外显示 labels 列 |
57
64
  | `--mailbox <id>` | `me` | 邮箱地址 |
58
65
 
59
66
  ### `--filter` 支持的字段
60
67
 
68
+ `--filter` 有三种写法:
69
+
70
+ - JSON 对象:`--filter '{"folder":"INBOX","is_unread":true}'`,用于组合多个字段或传数组/对象字段
71
+ - 单个 `key=value`:`--filter folder=INBOX`、`--filter is_unread=true`
72
+ - 裸未读快捷写法:`--filter is_unread`
73
+
74
+ 多个筛选条件请使用 JSON 对象,`folder=INBOX,is_unread=true` 这种逗号拼接的 key=value 不支持。
75
+
61
76
  | 字段 | 类型 | 说明 |
62
77
  |------|------|------|
63
78
  | `folder` | string | 文件夹名称筛选。系统文件夹固定值:`inbox`/`sent`/`draft`/`trash`/`spam`/`archive`/`priority`/`flagged`/`other`/`scheduled`,也支持自定义文件夹名称。子文件夹需用 `parent_name/child_name` 格式,可通过 folder list 接口查看 |
@@ -73,7 +88,7 @@ lark-cli mail +triage --page-size 10
73
88
 
74
89
  > **系统标签说明**:`IMPORTANT`/`FLAGGED`/`OTHER` 可通过 `folder` 或 `label` 传入(也支持中文别名 `重要邮件`/`已加旗标`/`其他邮件`、搜索名 `priority`/`flagged`/`other`)。搜索时自动转为 folder 字段,列表时自动转为 label_id。label list 接口不返回这三个系统标签。
75
90
  >
76
- > **⚠️ 注意**:查询未读请用 `"is_unread":true`。
91
+ > **⚠️ 注意**:查询未读可用 `--is-unread`、`--filter is_unread`、`--filter is_unread=true` 或 JSON 写法 `"is_unread":true`。
77
92
  可运行 `mail +triage --print-filter-schema` 查看完整字段说明。
78
93
 
79
94
  ## 输出
@@ -108,7 +123,7 @@ lark-cli mail +triage --page-size 10
108
123
 
109
124
  ### `table` 格式
110
125
 
111
- `page_token` 信息输出在 stderr,自动携带 `--query`/`--filter`/`--mailbox` 参数方便续页:
126
+ `page_token` 信息输出在 stderr,自动携带 `--query`/`--filter`/`--folder`/`--folder-id`/`--is-unread`/`--mailbox` 参数方便续页:
112
127
  ```text
113
128
  15 message(s)
114
129
  next page: mail +triage --query '合同审批' --page-token 'search:abc123...'
@@ -26,7 +26,7 @@ metadata:
26
26
 
27
27
  | Shortcut | 说明 |
28
28
  |----------|------|
29
- | [`+search`](references/lark-minutes-search.md) | 按关键词、所有者、参与者、时间范围搜索妙记 |
29
+ | [`+search`](references/lark-minutes-search.md) | 按关键词、所有者、参与者、时间范围搜索妙记;支持 user/bot 身份 |
30
30
  | [`+detail`](references/lark-minutes-detail.md) | 查询妙记详情(标题和关联的纪要note_id),按需获取 AI 产物(总结、待办、章节、逐字稿、关键词) |
31
31
  | [`+download`](references/lark-minutes-download.md) | 下载妙记音视频媒体文件 |
32
32
  | [`+upload`](references/lark-minutes-upload.md) | 上传 file_token 生成妙记 |
@@ -1,7 +1,7 @@
1
1
  # minutes +search
2
2
 
3
3
 
4
- 搜索妙记列表,支持关键词、所有者、参与者以及时间范围等多条件过滤。所有者与参与者都支持传入多个 open\_id,也支持传入 `me` 表示当前用户。只读操作,不修改任何妙记数据。
4
+ 搜索妙记列表,支持关键词、所有者、参与者以及时间范围等多条件过滤。支持 user 身份和 bot / 应用身份;所有者与参与者都支持传入多个 open\_id,user 身份下也支持传入 `me` 表示当前用户。只读操作,不修改任何妙记数据。
5
5
 
6
6
  本 skill 对应 shortcut:`lark-cli minutes +search`(调用 `POST /open-apis/minutes/v1/minutes/search`)。
7
7
 
@@ -81,14 +81,14 @@ lark-cli minutes +search --query "预算复盘" --format json
81
81
 
82
82
  所有参数均可选,但必须至少提供一个过滤条件:`--query`、`--owner-ids`、`--participant-ids`、`--start` 或 `--end`。
83
83
 
84
- ### 2. 仅支持 user 身份
84
+ ### 2. 支持 user 和 bot 身份
85
85
 
86
- 该接口仅支持 `user` 身份,使用前需完成 `lark-cli auth login` 并具备 `minutes:minutes.search:read` 权限。
86
+ 该接口支持 `--as user` 和 `--as bot`。user 身份需要完成 `lark-cli auth login` 并具备 `minutes:minutes.search:read` 权限;bot 身份使用应用的 tenant access token,需要确认当前应用已开通 `minutes:minutes.search:read` scope,且运行环境能获取有效的 TAT。
87
87
 
88
88
  ### 3. `me` 表示当前用户
89
89
 
90
- 在 `--owner-ids` 和 `--participant-ids` 中可使用 `me`,表示当前登录用户。该值会在本地解析为当前用户的 `open_id`,无需手动先查询自己的用户 ID。
91
- 若当前环境尚未完成用户登录,或 CLI 无法解析出当前用户的 `open_id`,则应先执行 `lark-cli auth login`,再重新执行搜索。
90
+ 在 `--owner-ids` 和 `--participant-ids` 中可使用 `me`,表示当前登录用户。该值会在本地解析为当前用户的 `open_id`,无需手动先查询自己的用户 ID。`me` 只适合 user 身份;bot 身份没有“当前用户”,请直接传 `ou_` open_id。
91
+ 若当前环境尚未完成用户登录,或 CLI 无法解析出当前用户的 `open_id`,则应先执行 `lark-cli auth login`,再重新执行搜索。该恢复方式只适用于 user 身份和 `me` 解析;bot 身份应检查 tenant access token 与应用 scope,不应通过 `auth login` 修复。
92
92
 
93
93
  ### 4. 自然语言中的“参与的妙记”默认按并集理解
94
94
 
@@ -182,7 +182,7 @@ lark-cli minutes +detail --minute-tokens <minute_token> --summary
182
182
  | 时间参数校验失败 | `--start` 或 `--end` 格式不合法 | 改用 ISO 8601 或 `YYYY-MM-DD` |
183
183
  | `owner-ids` 校验失败 | 传入的不是 open\_id,且也不是 `me`;或传了 `me` 但当前用户 open\_id 不可解析 | 改为 `ou_` 开头的用户 ID,或先完成 `auth login` 后再传 `me` |
184
184
  | `participant-ids` 校验失败 | 传入的不是 open\_id,且也不是 `me`;或传了 `me` 但当前用户 open\_id 不可解析 | 改为 `ou_` 开头的用户 ID,或先完成 `auth login` 后再传 `me` |
185
- | 权限不足 | 未授权 `minutes:minutes.search:read` | 使用 `auth login` 完成授权 |
185
+ | 权限不足 | 未授权 `minutes:minutes.search:read` | user 身份使用 `auth login` 完成用户授权;bot 身份检查 tenant access token 和应用 scope |
186
186
 
187
187
  ## 提示
188
188
 
@@ -199,4 +199,3 @@ lark-cli minutes +detail --minute-tokens <minute_token> --summary
199
199
  - [lark-minutes](../SKILL.md) -- 妙记相关命令
200
200
  - [lark-minutes-detail](lark-minutes-detail.md) -- 基于 `minute_token` 获取逐字稿、总结、待办、章节等产物
201
201
  - [lark-vc](../../lark-vc/SKILL.md) -- 视频会议全部命令
202
-
@@ -80,8 +80,8 @@ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 lark-cli a
80
80
  #### User 身份(`--as user`)
81
81
 
82
82
  ```bash
83
- lark-cli auth login --domain <domain> # 按业务域授权
84
- lark-cli auth login --scope "<missing_scope>" # 按具体 scope 授权(推荐,符合最小权限原则)
83
+ lark-cli auth login --domain <domain> --no-wait --json # 按业务域发起授权
84
+ lark-cli auth login --scope "<missing_scope>" --no-wait --json # 按具体 scope 发起授权(推荐,符合最小权限原则)
85
85
  ```
86
86
 
87
87
  **规则**:auth login 必须指定范围(`--domain` 或 `--scope`)。多次 login 的 scope 会累积(增量授权)。
@@ -124,7 +124,7 @@ lark-cli auth login --device-code <device_code>
124
124
 
125
125
  - **你必须亲自执行 `--device-code` 命令**,不要指示用户自行执行
126
126
  - **不要在同一轮中展示 URL 后立刻执行 `--device-code`**,这会导致用户看不到 URL
127
- - **禁止缓存 `verification_url` 或 `device_code`**:每次需要授权时,必须重新执行 `lark-cli auth login --no-wait --json` 生成新的链接。不要将授权链接和 device code 存入上下文供后续复用
127
+ - **禁止缓存 `verification_url` 或 `device_code`**:每次需要重新发起授权时,必须沿用所需的 `--scope`、`--domain` 或 `--recommend` 选择以及任何 `--exclude` 值,并附加 `--no-wait --json` 生成新的链接。不要复用已过期的授权链接或 device code
128
128
 
129
129
  ## 更新检查
130
130
 
@@ -79,12 +79,15 @@ metadata:
79
79
 
80
80
  | 用户需求 | 优先动作 | 关键文档 / 命令 |
81
81
  |----------|----------|-----------------|
82
- | 新建 PPT | 先规划 `slide_plan.json`,再按复杂度选择一步或两步创建 | `planning-layer.md`、`visual-planning.md`、`asset-planning.md`、`lark-slides-create.md`、`slides +create` |
82
+ | 新建 PPT | 先规划 `slide_plan.json`,再按复杂度选择一步或两步创建 | `planning-layer.md`、`visual-planning.md`、`asset-planning.md`、`lark-slides-create.md`、`slides +create`、`slides +add-slide`、`lark-slides-add-slide.md`(两步创建逐页添加) |
83
83
  | 用户要求使用模板,或提供 PPTX 文件要求修改、美化 | 将模板导入为 Slides 再编辑 | `lark-slides-pptx-template-workflows.md` |
84
84
  | 编辑单个标题、文本块、图片或局部元素 | 优先块级替换/插入,不改页序 | `slides +replace-slide`、`lark-slides-replace-slide.md` |
85
+ | 一页改动很多、要改背景或删除若干元素,或要整页重建一页/多页 | 在原 presentation 内按页重建,不创建新 Slides 链接 | `slides +replace-pages`、`lark-slides-replace-pages.md` |
86
+ | 给已有 PPT 追加或插入页面 | 一次一页,`--slide` 支持 `@file` 绕开 shell 转义 | `slides +add-slide`、`lark-slides-add-slide.md` |
87
+ | 删除页面 | 按 `slide_id` 单页删除,删前先回读确认 | `slides +delete-slide`、`lark-slides-delete-slide.md` |
85
88
  | 读取或分析已有 PPT | 解析 slides/wiki token,用 shortcut 回读全文 XML 或读取单页 XML,保存 `xml_presentation_id`、`slide_id`、`revision_id` | `slides +xml-get`、`xml_presentation.slide.get`、`lark-slides-xml-presentations-get.md` |
86
89
  | 查看或回滚历史版本 | 先用 `+history-list` 找 `history_version_id`,再 `+history-revert`,必要时 `+history-revert-status` 轮询 | [`lark-slides-history.md`](references/lark-slides-history.md) |
87
- | 获取幻灯片页面截图 | 用 `slide_id` 或页号指定页面,一次不超过 10 页 | `slides +screenshot`、`lark-slides-screenshot.md` |
90
+ | 获取幻灯片页面截图 | 按页码用 `--slide-number`,按 ID 用 `--slide-id`;单张用 `--output`,批量或全量用 `--output-dir`,每批最多 10 页串行执行;截图目录复用同一任务的 deck/task 标识,后续读取返回的实际路径 | `slides +screenshot`、`lark-slides-screenshot.md` |
88
91
  | 上传或使用图片 | 先上传为 `file_token`,禁止直接写 http(s) 外链 | `slides +media-upload`、`lark-slides-media-upload.md`,或 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符 |
89
92
  | 绘制图表 | 原生图表(柱状、条形、折线、面积、饼(环)、雷达、组合图)用 `<chart>`,其他(漏斗图、金字塔图、象限图、矩阵图等)用 `<shape>` + `<line>` 模拟 | `xml-schema-quick-ref.md`、`slides_chart_demo.xml` |
90
93
  | 绘制表格 | 优先用 `rect` 和 `text` 模拟,其他用 `<table>` | `xml-schema-quick-ref.md` |
@@ -103,13 +106,15 @@ metadata:
103
106
 
104
107
  **CRITICAL — 新建演示文稿或大幅改写页面时,规划 `asset_need` MUST 遵循 [asset-planning.md](references/asset-planning.md):只做元数据规划,必须有 `fallback_if_missing`,不得要求真实搜索、下载或上传素材。**
105
108
 
106
- **CRITICAL — 将完整 `<slide>` XML 提交给 `slides +create --slides`、`xml_presentation.slide create` 或 `slides +replace-pages` 之前,MUST 先把待提交 XML 保存到本地文件并运行唯一版式准出入口 [`scripts/xml_text_overlap_lint.py`](scripts/xml_text_overlap_lint.py);`summary.error_count` 必须为 0 才能调用接口,`summary.warning_count > 0` 时必须先做对应页面的截图复核。**
109
+ **CRITICAL — 将完整 `<slide>` XML 提交给 `slides +create --slides`、`slides +add-slide`、`xml_presentation.slide create` 或 `slides +replace-pages` 之前,MUST 先把待提交 XML 保存到本地文件并运行唯一版式准出入口 [`scripts/xml_text_overlap_lint.py`](scripts/xml_text_overlap_lint.py);`summary.error_count` 必须为 0 才能调用接口。**
107
110
 
108
111
  **CRITICAL — 创建或大幅改写后,MUST 按 [validation-checklist.md](references/validation-checklist.md) 做显式验证:回读全文 XML、核对页数和关键元素,并使用 [`scripts/xml_text_overlap_lint.py`](scripts/xml_text_overlap_lint.py) 统一检查 XML、越界、重叠、空白页和内容稀疏风险。**
109
112
 
110
113
  **CRITICAL — 创建前自检或失败排障时,MUST 按 [troubleshooting.md](references/troubleshooting.md) 检查 XML 转义、结构、shell 截断、图片 token、3350001 和布局风险。**
111
114
 
112
- **编辑已有幻灯片页面**:单个标题、文本块、图片或局部元素优先用 [`+replace-slide`](references/lark-slides-replace-slide.md)(块级替换/插入,不动页序);已有 Slides 的多页大改优先用 [`+replace-pages`](references/lark-slides-replace-pages.md) 在原 presentation 内批量重建页面,避免 `slides +create` 生成新链接。选择 action 和完整读-改-写流程见 [`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)。
115
+ **CRITICAL — 当前 Slide Engine 后端仍在灰度期间,`slides +replace-pages --help` 及其输出中的 `deprecated` 字段会提示改用 `+update-slide`,该提示在本 skill 生效期间暂不适用;MUST 忽略该提示并继续使用 `+replace-pages`,不得切换到 `+update-slide`。后端全量并由新版 skill 恢复路由后,再使用 `+update-slide`。**
116
+
117
+ **编辑已有幻灯片页面**:单个标题、文本块、图片或局部元素优先用 [`+replace-slide`](references/lark-slides-replace-slide.md)(块级替换/插入,不动页序);一页改动很多、要改背景或删除若干元素,以及一页或多页的整页重建,优先用 [`+replace-pages`](references/lark-slides-replace-pages.md) 在原 presentation 内按页重建,避免 `slides +create` 生成新链接。选择 action 和完整读-改-写流程见 [`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)。
113
118
 
114
119
  **用户要求使用模板**:按 [lark-slides-pptx-template-workflows.md](references/lark-slides-pptx-template-workflows.md) 处理。
115
120
 
@@ -145,7 +150,8 @@ lark-cli auth login --domain slides
145
150
 
146
151
  调用相关命令前必须读取相关的文档以了解命令的使用方式:
147
152
 
148
- - 创建:[`lark-slides-create.md`](references/lark-slides-create.md)、[`lark-slides-xml-presentation-slide-create.md`](references/lark-slides-xml-presentation-slide-create.md)(逐页添加)
153
+ - 创建:[`lark-slides-create.md`](references/lark-slides-create.md)、[`lark-slides-add-slide.md`](references/lark-slides-add-slide.md)(逐页添加 / 给已有 PPT 追加页面)
154
+ - 删除页面:[`lark-slides-delete-slide.md`](references/lark-slides-delete-slide.md)
149
155
  - 阅读:[`lark-slides-xml-presentations-get.md`](references/lark-slides-xml-presentations-get.md)
150
156
  - 编辑:[`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)、[`lark-slides-replace-slide.md`](references/lark-slides-replace-slide.md)、[`lark-slides-replace-pages.md`](references/lark-slides-replace-pages.md)
151
157
  - 历史版本:[`lark-slides-history.md`](references/lark-slides-history.md)
@@ -208,7 +214,7 @@ Step 2: 生成大纲 → 写入 slide_plan.json
208
214
  Step 3: 按 slide_plan.json 生成 XML → 创建
209
215
  - 逐页消费 plan:key_message 定主结论,layout_type 定几何,visual_focus 定主视觉,text_density 定文本量
210
216
  - 缺少真实素材时必须用 `fallback_if_missing` 生成替代图片,不要留空
211
- - 读 lark-slides-create.md 定一步创建还是两步创建,并据此构造 `slides +create`;两步创建再读 lark-slides-xml-presentation-slide-create.md 逐页添加
217
+ - 读 lark-slides-create.md 定一步创建还是两步创建,并据此构造 `slides +create`;两步创建再读 lark-slides-add-slide.md 用 `+add-slide` 逐页添加
212
218
  - 图片按 lark-slides-media-upload.md 处理;复杂 XML、转义和 3350001 排查按 troubleshooting.md 执行
213
219
 
214
220
  Step 4: 审查 & 交付
@@ -217,31 +223,6 @@ Step 4: 审查 & 交付
217
223
  - 没问题 → 交付:使用 NotifyHuman 工具交付 PPT 链接
218
224
  ```
219
225
 
220
- ### jq 命令模板(编辑已有 PPT 时使用)
221
-
222
- 以下 jq 模板适用于向已有演示文稿追加页面的场景,可以避免手动转义双引号:
223
-
224
- ```bash
225
- # 追加到末尾
226
- lark-cli slides xml_presentation.slide create \
227
- --as user \
228
- --params '{"xml_presentation_id":"YOUR_ID"}' \
229
- --data "$(jq -n --arg content '<slide xmlns="http://www.larkoffice.com/sml/2.0">
230
- <style><fill><fillColor color="BACKGROUND_COLOR"/></fill></style>
231
- <data>
232
- 在这里放置 shape、line、table、chart 等元素
233
- </data>
234
- </slide>' '{slide:{content:$content}}')"
235
-
236
- # 插到指定页之前:before_slide_id 必须在 --data body 里,与 slide 同级
237
- # ⚠️ 不要把 before_slide_id 写进 --params —— CLI 会当未知 query 参数静默下发,服务端忽略,新页跑到末尾
238
- lark-cli slides xml_presentation.slide create \
239
- --as user \
240
- --params '{"xml_presentation_id":"YOUR_ID"}' \
241
- --data "$(jq -n --arg content '<slide ...>...</slide>' --arg before 'TARGET_SLIDE_ID' \
242
- '{slide:{content:$content}, before_slide_id:$before}')"
243
- ```
244
-
245
226
  > 渐变色必须使用 `rgba()` 格式并带百分比停靠点,如 `linear-gradient(135deg,rgba(15,23,42,1) 0%,rgba(56,97,140,1) 100%)`。使用 `rgb()` 或省略停靠点会导致服务端回退为白色。
246
227
 
247
228
  ### 大纲模板
@@ -270,17 +251,19 @@ N. 结尾页:[结尾文案]
270
251
  | `/slides/` | `https://example.larkoffice.com/slides/xxxxxxxxxxxxx` | `xml_presentation_id` | URL 路径中的 token 直接作为 `xml_presentation_id` 使用 |
271
252
  | `/wiki/` | `https://example.larkoffice.com/wiki/wikcnxxxxxxxxx` | `wiki_token` | ⚠️ **不能直接使用**,需要先查询获取真实的 `obj_token` |
272
253
 
273
- > `+replace-slide` 和 `+media-upload` shortcut 会自动解析以上两种 URL;直接调用原生 API 时仍需手动解析 wiki 链接。
254
+ > 带 `--presentation` 的 slides shortcut 都会自动解析以上两种 URL;直接调用原生 API 时仍需手动解析 wiki 链接。
274
255
 
275
256
  ### Wiki 链接特殊处理(关键!)
276
257
 
277
- 知识库链接(`/wiki/TOKEN`)不能直接当 `xml_presentation_id`。直接调用原生 API 前,先查询 wiki 节点,确认 `node.obj_type == "slides"`,再用 `node.obj_token` 作为真实 presentation ID。
258
+ 知识库链接(`/wiki/TOKEN`)不能直接当 `xml_presentation_id`。直接调用原生 API 前,先用 Wiki shortcut 查询节点,确认 `data.obj_type == "slides"`,再用 `data.obj_token` 作为真实 presentation ID。
278
259
 
279
260
  ```bash
280
- lark-cli wiki spaces get_node --as user --params '{"token":"wiki_token"}'
261
+ lark-cli wiki +node-get --node-token '<wiki_url>' --as user --format json
281
262
  ```
282
263
 
283
- Shortcut `+replace-slide` 和 `+media-upload` 会自动解析 `/wiki/` URL;手动调用 `xml_presentations.*` / `xml_presentation.slide.*` 时才需要自己做这一步。
264
+ 节点解析必须与后续 Slides 操作使用相同身份;下游明确使用 `--as bot` 时,这里也改为 `--as bot`。
265
+
266
+ 带 `--presentation` 的 slides shortcut 都会自动解析 `/wiki/` URL 并校验 `obj_type`;手动调用 `xml_presentations.*` / `xml_presentation.slide.*` 时才需要自己做这一步。
284
267
 
285
268
  ### 资源关系
286
269
 
@@ -303,11 +286,13 @@ Shortcut 是对常用操作的高级封装(`lark-cli slides +<verb> [flags]`
303
286
  | Shortcut | 说明 |
304
287
  |----------|------|
305
288
  | [`+create`](references/lark-slides-create.md) | 创建 PPT,可选一步添加页面 |
289
+ | [`+add-slide`](references/lark-slides-add-slide.md) | 向已有演示文稿追加或插入**一页**(`--before-slide-id` 控制位置),XML 支持 `@file` / stdin,`<img src="@./path">` 占位符自动上传 |
290
+ | [`+delete-slide`](references/lark-slides-delete-slide.md) | 按 `slide_id` 删除**一页** |
306
291
  | [`+xml-get`](references/lark-slides-xml-presentations-get.md) | 读取全文 XML,用 `--presentation` 指定演示文稿的 `xml_presentation_id`,用 `--output` 把 XML 存到本地文件(必须是 CWD 内的相对路径,如 `.lark-slides/plan/<deck>/readback.xml`) |
307
- | [`+screenshot`](references/lark-slides-screenshot.md) | 把幻灯片页面截图保存为本地图片,用 `--slide-number` 指定页号(从 1 开始,多页重复传入,一次最多 10 页),用 `--output-dir` 指定保存目录(必须是 CWD 内的相对路径,默认 `.lark-slides/screenshots`),失败时降级到 XML 回读等非截图检查 |
292
+ | [`+screenshot`](references/lark-slides-screenshot.md) | 把幻灯片页面截图保存为本地图片;用 `--slide-number` 指定页码(从 1 开始,多页重复传入)或用 `--slide-id` 指定页面;单张用 `--output .lark-slides/screenshots/<deck-or-task-id>/page-01`,批量用 `--output-dir .lark-slides/screenshots/<deck-or-task-id>`(一次最多 10 页);后续必须读取返回的 `output` / `screenshots[].path` |
308
293
  | [`+media-upload`](references/lark-slides-media-upload.md) | 上传本地图片到指定演示文稿,返回 `file_token`(用作 `<img src="...">`),最大 20 MB |
309
294
  | [`+replace-slide`](references/lark-slides-replace-slide.md) | 对已有幻灯片页面进行块级替换/插入(`block_replace` / `block_insert`),自动注入 id 和 `<content/>`,不改变页序 |
310
- | [`+replace-pages`](references/lark-slides-replace-pages.md) | 在原演示文稿内批量重建多个页面:先创建新页到旧页前,再删除旧页;适合已有 Slides 的多页大改,不新建链接 |
295
+ | [`+replace-pages`](references/lark-slides-replace-pages.md) | 在原演示文稿内重建一页或多页:先创建新页到旧页前,再删除旧页;适合已有 Slides 的整页大改,不新建链接 |
311
296
 
312
297
  没有 Shortcut 覆盖时使用原生 API。高频资源:`slides +xml-get` 读取全文;`xml_presentation.slide.create/delete/get/replace` 管理单页。
313
298
 
@@ -323,10 +308,10 @@ lark-cli slides <resource> <method> [flags] # 调用 API
323
308
  1. **先规划再写 XML**:新建演示文稿或大幅改写页面时,必须先写入 `.lark-slides/plan/<deck-or-task-id>/slide_plan.json`;模板、风格和大纲只能作为规划输入,不能绕过规划层
324
309
  2. **创建流程**:新建演示文稿用 `slides +create`,一步创建还是两步创建按 [`lark-slides-create.md`](references/lark-slides-create.md) 判断
325
310
  3. **`<slide>` 直接子元素只有 `<style>`、`<data>`、`<note>`**:文本和图形必须放在 `<data>` 内
326
- 4. **文本通过 `<content>` 表达**:必须用 `<content><p>...</p></content>`,不能把文字直接写在 shape 内
311
+ 4. **文本通过 `<content>` 表达**:必须用 `<content><p>...</p></content>`,不能把文字直接写在 shape 内;注意 `<content>` 只是 XML 元素,不是 `--parts` 的字段名——part 里装 XML 的字段,`block_replace` 是 `replacement`,`block_insert` 是 `insertion`
327
312
  5. **保存关键 ID**:后续操作需要 `xml_presentation_id`、`slide_id`、`revision_id`
328
- 6. **删除谨慎**:删除操作不可逆,且至少保留一页幻灯片
329
- 7. **编辑已有页面优先原链接更新**:修改单个 shape/img 用 `+replace-slide`(`block_replace` / `block_insert`),不要整页重建;已有 Slides 的多页整页重建用 `+replace-pages`,不要用 `slides +create` 新建整份 PPT;只有没有 shortcut 覆盖的特殊单页整页操作才手动 `slide.create` + `slide.delete`
313
+ 6. **删除谨慎**:删除不可逆,删前先回读确认 `slide_id`
314
+ 7. **编辑已有页面优先原链接更新**:修改单个 shape/img 用 `+replace-slide`(`block_replace` / `block_insert`),不要整页重建;一页改动很多、要改背景或删除若干元素,以及一页或多页的整页重建,用 `+replace-pages`,不要用 `slides +create` 新建整份 PPT;追加/插入单页用 `+add-slide`、删除单页用 `+delete-slide`,只有这些 shortcut 未覆盖的参数才手动调 `slide.create` / `slide.delete`
330
315
  8. **`<img src>` 只能用上传到飞书 drive 的 `file_token`,禁止使用 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 在 PPT 里通常不显示或显示破图。流程必须是「先把图存到本地 → 用 `slides +media-upload` 上传,或在 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符自动上传 → 拿 `file_token` 写进 `<img src>`」。如果用户给了网图链接,先 `curl`/下载到 CWD 内再走上传流程,不要直接把外链 URL 塞进 `src`。**图片最大 20 MB**(slides upload API 不支持分片上传)。
331
316
 
332
317
  > **注意**:如果 md 内容与 `slides_xml_schema_definition.xml` 或 `lark-cli schema slides.<resource>.<method>` 输出不一致,以后两者为准。
@@ -0,0 +1,92 @@
1
+ # slides +add-slide(向已有演示文稿追加/插入单页)
2
+
3
+ 向已有演示文稿添加**一页**。这是两步创建流程的第二步:先 `+create` 建空壳,再逐页 `+add-slide`;也用于给已有 PPT 追加新页。
4
+
5
+ `--presentation` 接受 token / `/slides/` URL / `/wiki/` URL(wiki 自动解析),`--slide` 直接收 XML(支持 `@file` 和 stdin,复杂 XML 走文件可绕开 shell 转义),`<img src="@./local.png">` 占位符自动上传并替换成 `file_token`。
6
+
7
+ **CRITICAL — 提交前必须先跑版式 lint**:把待提交的 `<slide>` XML 存成本地文件,运行 [`scripts/xml_text_overlap_lint.py`](../scripts/xml_text_overlap_lint.py),`summary.error_count` 必须为 0。
8
+
9
+ ## 命令
10
+
11
+ ```bash
12
+ # 追加到末尾(XML 直接作为参数)
13
+ lark-cli slides +add-slide --as user \
14
+ --presentation "$PID" \
15
+ --slide '<slide xmlns="https://www.larkoffice.com/sml/2.0"><data></data></slide>'
16
+
17
+ # XML 从文件读(推荐:避免 shell 转义和长参数截断)
18
+ lark-cli slides +add-slide --as user \
19
+ --presentation "$PID" \
20
+ --slide @page3.xml
21
+
22
+ # XML 从 stdin 读
23
+ cat page3.xml | lark-cli slides +add-slide --as user --presentation "$PID" --slide -
24
+
25
+ # 插到某页之前
26
+ lark-cli slides +add-slide --as user \
27
+ --presentation "$PID" \
28
+ --slide @cover.xml \
29
+ --before-slide-id "$SID"
30
+
31
+ # wiki 链接(CLI 自动 wiki.spaces.get_node 解析,并校验 obj_type=slides)
32
+ lark-cli slides +add-slide --as user \
33
+ --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" \
34
+ --slide @page3.xml
35
+
36
+ # 预览请求,不实际写入
37
+ lark-cli slides +add-slide --presentation "$PID" --slide @page3.xml --dry-run
38
+ ```
39
+
40
+ ## 参数
41
+
42
+ | 参数 | 必需 | 说明 |
43
+ |------|------|------|
44
+ | `--presentation` | 是 | `xml_presentation_id`、`/slides/` URL 或 `/wiki/` URL |
45
+ | `--slide` | 是 | 一个完整的 `<slide>...</slide>` 文档;支持字面量、`@file`、stdin `-` |
46
+ | `--before-slide-id` | 否 | 插到该 `slide_id` 之前;**不传就是追加到末尾** |
47
+ | `--revision-id` | 否 | 演示文稿版本号,默认 `-1`(最新);传具体版本号做乐观锁 |
48
+ | `--dry-run` | 否 | 打印将要发起的请求(含图片上传步骤),不写入 |
49
+
50
+ `@file` 路径**必须在 CWD 内**(如 `@./plan/page3.xml`);绝对路径和 `../` 会被拒绝并报 `unsafe file path`。
51
+
52
+ ## 本地图片:`@路径` 占位符
53
+
54
+ XML 里写 `<img src="@./chart.png" .../>`,CLI 会:先把每个不重复的本地文件上传到这份演示文稿(`parent_type=slide_file`),再把 `src` 替换成返回的 `file_token`,最后才提交页面。
55
+
56
+ 占位符路径按**执行命令时的 CWD** 解析,跟 `--slide @file` 所在目录无关;`@./assets/x.png` 找的是 `$PWD/assets/x.png`。
57
+
58
+ ```bash
59
+ lark-cli slides +add-slide --as user \
60
+ --presentation "$PID" \
61
+ --slide '<slide xmlns="https://www.larkoffice.com/sml/2.0"><data><img src="@./chart.png" topLeftX="100" topLeftY="100" width="320" height="180"/></data></slide>'
62
+ ```
63
+
64
+ - 文件不存在、不是普通文件、超过 20 MB,都在**调用任何接口之前**报错,不会留下半成品。
65
+ - 去重只在**单次调用内**生效:多页共用同一张图时,逐页循环会把它每页重传一次。这种图先用 [`+media-upload`](lark-slides-media-upload.md) 传一次,把 `file_token` 写进各页的 `src`。
66
+
67
+ ## 成功输出
68
+
69
+ ```json
70
+ {
71
+ "xml_presentation_id": "slides_example_presentation_id",
72
+ "slide_id": "slide_example_id",
73
+ "revision_id": 42,
74
+ "before_slide_id": "slide_example_target_id",
75
+ "images_uploaded": 1,
76
+ "issues": "[issue=unsupported_attr tag=<strong> attr=style]"
77
+ }
78
+ ```
79
+
80
+ | 字段 | 说明 |
81
+ |------|------|
82
+ | `slide_id` | 新创建页面的唯一标识 |
83
+ | `issues` | 字符串,**只在服务端丢弃过内容时才出现**:页面创建成功,但括号里列出的标签/属性没写进去。出现就必须 `+screenshot` 复核,别当纯警告忽略;干净提交时这个字段不返回 |
84
+
85
+ ## 常见错误
86
+
87
+ | 现象 | 原因 | 解决 |
88
+ |------|------|------|
89
+ | `--slide is not a single complete <slide> document` | 传了 `<presentation>` 整份 XML,或多个 `<slide>` 拼在一起 | 一次只传一页,根元素必须是 `<slide>` |
90
+ | `--slide cannot be empty` | `@file` 指向空文件,或 stdin 没内容 | 检查文件内容 |
91
+ | 3350001 | XML 结构/转义有问题;**或 `--before-slide-id` 不是有效 `slide_id`** | 优先改用 `--slide @file` 绕开 shell 转义;插页失败先 `+xml-get` 回读确认 `slide_id`;再按 [troubleshooting.md](troubleshooting.md) 排查 |
92
+ | 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`,`@` 占位符另需 `docs:document.media:upload`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
@@ -12,8 +12,8 @@
12
12
  | 场景 | 推荐方式 |
13
13
  |------|----------|
14
14
  | 简单 XML(1-3 页、结构简单、几乎无复杂中文和特殊字符) | `slides +create --slides '[...]'` 一步创建 |
15
- | 复杂 XML(多页、含中文、大段文本、复杂布局、嵌套引号、特殊字符较多) | **两步创建**:先 `slides +create` 创建空白 PPT,再用 [`xml_presentation.slide create`](lark-slides-xml-presentation-slide-create.md) 逐页添加 |
16
- | 已有 PPT 继续追加或插入页面 | 使用 [`xml_presentation.slide create`](lark-slides-xml-presentation-slide-create.md),必要时配合 `before_slide_id` |
15
+ | 复杂 XML(多页、含中文、大段文本、复杂布局、嵌套引号、特殊字符较多) | **两步创建**:先 `slides +create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加(`--slide @file` 可绕开 shell 转义) |
16
+ | 已有 PPT 继续追加或插入页面 | 使用 [`+add-slide`](lark-slides-add-slide.md),必要时配合 `--before-slide-id` |
17
17
 
18
18
  > [!WARNING]
19
19
  > `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议使用两步创建法。
@@ -28,8 +28,8 @@ lark-cli slides +create --title "项目汇报"
28
28
 
29
29
  # 创建 PPT + 添加 slide 页面
30
30
  lark-cli slides +create --title "项目汇报" --slides '[
31
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>封面</p></content></shape></data></slide>",
32
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>第二页</p></content></shape></data></slide>"
31
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>封面</p></content></shape></data></slide>",
32
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>第二页</p></content></shape></data></slide>"
33
33
  ]'
34
34
 
35
35
  # 以应用身份创建(自动授权当前用户)
@@ -39,7 +39,7 @@ lark-cli slides +create --title "项目汇报" --as bot
39
39
  lark-cli slides +create --title "项目汇报" --slides '[...]' --dry-run
40
40
  ```
41
41
 
42
- 复杂内容建议按页保存 XML,再用 `jq --rawfile` 组装 `--slides` 参数:
42
+ 用 `--slides` 一步创建时,按页保存 XML,再用 `jq --rawfile` 组装参数,不要手写转义:
43
43
 
44
44
  ```bash
45
45
  lark-cli slides +create --as user --title "项目汇报" \
@@ -65,9 +65,9 @@ lark-cli slides +create --as user --title "项目汇报" \
65
65
  - **`permission_grant`**(object,可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限
66
66
 
67
67
  > [!IMPORTANT]
68
- > 不传 `--slides` 时,`slides +create` 只创建空白演示文稿。创建后需要使用 `xml_presentation.slide create` 逐页添加 slide 内容。
68
+ > 不传 `--slides` 时,`slides +create` 只创建空白演示文稿。创建后用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 slide 内容。
69
69
  >
70
- > 传了 `--slides` 时,CLI 先创建空白演示文稿,再逐页调用 `xml_presentation.slide create` 添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
70
+ > 传了 `--slides` 时,CLI 先创建空白演示文稿,再逐页调用 slide 创建接口添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
71
71
  >
72
72
  > 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
73
73
  >
@@ -83,14 +83,14 @@ lark-cli slides +create --as user --title "项目汇报" \
83
83
  | 参数 | 必填 | 说明 |
84
84
  |------|------|------|
85
85
  | `--title` | 否 | 演示文稿标题(不传则默认 "Untitled") |
86
- | `--slides` | 否 | slide 内容 JSON 数组,每个元素是一个 `<slide>` XML 字符串(最多 10 个;超过 10 页请先用 `+create` 创建空白 PPT,再用 `xml_presentation.slide create` 逐页添加) |
86
+ | `--slides` | 否 | slide 内容 JSON 数组,每个元素是一个 `<slide>` XML 字符串(最多 10 个;超过 10 页请先用 `+create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加) |
87
87
 
88
88
  ## `--slides` 参数格式
89
89
 
90
90
  ```json
91
91
  [
92
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第1页XML...</slide>",
93
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第2页XML...</slide>"
92
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\">...第1页XML...</slide>",
93
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\">...第2页XML...</slide>"
94
94
  ]
95
95
  ```
96
96
 
@@ -102,7 +102,7 @@ JSON string 数组,每个元素是一页 slide 的完整 XML。CLI 内部负
102
102
 
103
103
  ```bash
104
104
  lark-cli slides +create --as user --title "图测试" --slides '[
105
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><img src=\"@./assets/chart.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
105
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data><img src=\"@./assets/chart.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
106
106
  ]'
107
107
  ```
108
108
 
@@ -118,21 +118,6 @@ lark-cli slides +create --as user --title "图测试" --slides '[
118
118
  > [!IMPORTANT]
119
119
  > **路径必须在 CWD 内**:`@/abs/path/x.png` 或 `@../up/x.png` 这种会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
120
120
 
121
- ### 给已有 PPT 加带图新页
122
-
123
- `+create --slides` 只在新建 PPT 时使用 `@` 占位符。给已有 PPT 加带图新页要分两步(CLI 没封装这个组合):
124
-
125
- ```bash
126
- # 1) 上传图片
127
- TOKEN=$(lark-cli slides +media-upload --as user \
128
- --file ./pic.png --presentation $PRES_ID | jq -r .data.file_token)
129
-
130
- # 2) 用返回的 file_token 创建带图新页
131
- lark-cli slides xml_presentation.slide create --as user \
132
- --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
133
- --data "{\"slide\":{\"content\":\"<slide xmlns=\\\"http://www.larkoffice.com/sml/2.0\\\"><data><img src=\\\"$TOKEN\\\" topLeftX=\\\"100\\\" topLeftY=\\\"100\\\" width=\\\"200\\\" height=\\\"200\\\"/></data></slide>\"}}"
134
- ```
135
-
136
121
  ## 创建后续步骤
137
122
 
138
123
  如果没有使用 `--slides`,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
@@ -141,14 +126,10 @@ lark-cli slides xml_presentation.slide create --as user \
141
126
  # 第 1 步:创建空白 PPT
142
127
  PRES_ID=$(lark-cli slides +create --title "项目汇报" | jq -r '.data.xml_presentation_id')
143
128
 
144
- # 第 2 步:添加页面(使用返回的 xml_presentation_id)
145
- lark-cli slides xml_presentation.slide create --as user \
146
- --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
147
- --data '{
148
- "slide": {
149
- "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...</slide>"
150
- }
151
- }'
129
+ # 第 2 步:逐页添加(--slide 支持 @file,复杂 XML 优先走文件)
130
+ lark-cli slides +add-slide --as user \
131
+ --presentation "$PRES_ID" \
132
+ --slide @.lark-slides/plan/<deck>/page1.xml
152
133
  ```
153
134
 
154
135
  ## 常见错误
@@ -160,5 +141,5 @@ lark-cli slides xml_presentation.slide create --as user \
160
141
 
161
142
  ## 相关命令
162
143
 
163
- - [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 添加幻灯片页面
144
+ - [slides +add-slide](lark-slides-add-slide.md) — 追加/插入单页(两步创建的第二步)
164
145
  - [slides +xml-get](lark-slides-xml-presentations-get.md) — 读取 PPT 内容并保存到本地文件