@amaster.ai/pi-lark 0.1.8 → 0.1.10

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 (155) hide show
  1. package/README.md +1 -3
  2. package/package.json +2 -2
  3. package/skills/lark-apps/SKILL.md +3 -1
  4. package/skills/lark-apps/references/lark-apps-cache.md +38 -5
  5. package/skills/lark-apps/references/lark-apps-db.md +130 -2
  6. package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
  7. package/skills/lark-base/SKILL.md +172 -167
  8. package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
  9. package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
  10. package/skills/lark-base/references/lark-base-app.md +243 -0
  11. package/skills/lark-base/references/lark-base-cell-value.md +26 -19
  12. package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +65 -6
  13. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +1 -1
  14. package/skills/lark-base/references/lark-base-dashboard.md +38 -20
  15. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
  16. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
  17. package/skills/lark-base/references/lark-base-data-query.md +8 -11
  18. package/skills/lark-base/references/lark-base-field-create.md +7 -50
  19. package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
  20. package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
  21. package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +25 -101
  22. package/skills/lark-base/references/lark-base-field-update.md +13 -51
  23. package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
  24. package/skills/lark-base/references/lark-base-form-questions-create.md +36 -5
  25. package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
  26. package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
  27. package/skills/lark-base/references/lark-base-record-history-list.md +19 -2
  28. package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
  29. package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
  30. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  31. package/skills/lark-base/references/lark-base-template-center.md +195 -0
  32. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  33. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  34. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  35. package/skills/lark-calendar/SKILL.md +11 -6
  36. package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
  37. package/skills/lark-calendar/references/lark-calendar-transfer.md +89 -0
  38. package/skills/lark-doc/SKILL.md +3 -3
  39. package/skills/lark-doc/references/lark-doc-fetch.md +9 -4
  40. package/skills/lark-doc/references/lark-doc-update.md +12 -8
  41. package/skills/lark-drive/SKILL.md +5 -3
  42. package/skills/lark-drive/references/lark-drive-add-comment.md +2 -2
  43. package/skills/lark-drive/references/lark-drive-download.md +27 -1
  44. package/skills/lark-drive/references/lark-drive-export.md +1 -0
  45. package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
  46. package/skills/lark-drive/references/lark-drive-preview.md +21 -2
  47. package/skills/lark-drive/references/lark-drive-push.md +5 -1
  48. package/skills/lark-drive/references/lark-drive-search.md +2 -0
  49. package/skills/lark-im/SKILL.md +14 -3
  50. package/skills/lark-im/references/lark-im-message-read-status.md +96 -0
  51. package/skills/lark-mail/references/lark-mail-draft-create.md +12 -12
  52. package/skills/lark-mail/references/lark-mail-forward.md +17 -17
  53. package/skills/lark-mail/references/lark-mail-reply-all.md +8 -8
  54. package/skills/lark-mail/references/lark-mail-reply.md +6 -6
  55. package/skills/lark-mail/references/lark-mail-send.md +20 -20
  56. package/skills/lark-mail/references/lark-mail-template-create.md +7 -6
  57. package/skills/lark-mail/references/lark-mail-template-update.md +7 -6
  58. package/skills/lark-meeting/SKILL.md +146 -0
  59. package/skills/lark-meeting/references/lark-minutes-apply-permission.md +92 -0
  60. package/skills/lark-meeting/references/lark-minutes-detail.md +52 -0
  61. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-download.md +7 -7
  62. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-search.md +4 -34
  63. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-speaker-replace.md +3 -4
  64. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-summary.md +2 -5
  65. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-todo.md +5 -15
  66. package/skills/{lark-minutes → lark-meeting}/references/lark-minutes-update.md +2 -3
  67. package/skills/lark-meeting/references/lark-minutes-upload.md +65 -0
  68. package/skills/lark-meeting/references/lark-note-detail.md +15 -0
  69. package/skills/{lark-note → lark-meeting}/references/lark-note-transcript.md +5 -9
  70. package/skills/{lark-vc-agent → lark-meeting}/references/lark-vc-agent-meeting-join.md +4 -55
  71. package/skills/{lark-vc-agent → lark-meeting}/references/lark-vc-agent-meeting-leave.md +2 -41
  72. package/skills/lark-meeting/references/lark-vc-detail.md +31 -0
  73. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-meeting/references/lark-vc-meeting-events.md} +120 -109
  74. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-meeting/references/lark-vc-meeting-list-active.md} +4 -29
  75. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-meeting/references/lark-vc-meeting-message-send.md} +3 -5
  76. package/skills/{lark-vc → lark-meeting}/references/lark-vc-recording.md +5 -64
  77. package/skills/{lark-vc → lark-meeting}/references/lark-vc-search.md +9 -28
  78. package/skills/lark-meeting/scenes/create-and-edit-minutes.md +125 -0
  79. package/skills/lark-meeting/scenes/live-meeting-attend.md +107 -0
  80. package/skills/lark-meeting/scenes/live-meeting-interact.md +72 -0
  81. package/skills/lark-meeting/scenes/query-meeting-and-artifacts.md +90 -0
  82. package/skills/lark-meeting/scenes/query-minutes-and-artifacts.md +70 -0
  83. package/skills/lark-meeting/scenes/query-note-and-artifacts.md +127 -0
  84. package/skills/lark-minutes/SKILL.md +5 -197
  85. package/skills/lark-note/SKILL.md +5 -84
  86. package/skills/lark-shared/SKILL.md +25 -188
  87. package/skills/lark-shared/references/lark-shared-config-init.md +12 -0
  88. package/skills/lark-shared/references/lark-shared-high-risk-approval.md +38 -0
  89. package/skills/lark-shared/references/lark-shared-identity-and-permissions.md +105 -0
  90. package/skills/lark-shared/references/lark-shared-output-contract.md +17 -0
  91. package/skills/lark-shared/references/lark-shared-update-notice.md +23 -0
  92. package/skills/lark-slides/SKILL.md +56 -54
  93. package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
  94. package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
  95. package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
  96. package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
  97. package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
  98. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
  99. package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
  100. package/skills/lark-slides/references/{lark-slides-update-slide.md → cli/lark-slides-update-slide.md} +21 -4
  101. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
  102. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
  103. package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
  104. package/skills/lark-slides/references/iconpark-index.json +5 -41901
  105. package/skills/lark-slides/references/iconpark.md +3 -44
  106. package/skills/lark-slides/references/lark-slides-add-slide.md +3 -90
  107. package/skills/lark-slides/references/lark-slides-create.md +3 -174
  108. package/skills/lark-slides/references/lark-slides-delete-slide.md +3 -63
  109. package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -141
  110. package/skills/lark-slides/references/lark-slides-history.md +3 -130
  111. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -102
  112. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
  113. package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -256
  114. package/skills/lark-slides/references/lark-slides-screenshot.md +3 -113
  115. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
  116. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
  117. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -155
  118. package/skills/lark-slides/references/planning-layer.md +1 -1
  119. package/skills/lark-slides/references/slides_chart_demo.xml +5 -1415
  120. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3512
  121. package/skills/lark-slides/references/troubleshooting.md +3 -60
  122. package/skills/lark-slides/references/validation-checklist.md +3 -154
  123. package/skills/lark-slides/references/workflow/error-handling.md +62 -0
  124. package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
  125. package/skills/lark-slides/references/workflow/template-editing.md +85 -0
  126. package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
  127. package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
  128. package/skills/lark-slides/references/xml/iconpark.md +46 -0
  129. package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
  130. package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3601 -0
  131. package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
  132. package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -495
  133. package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
  134. package/skills/lark-slides/scripts/xml_lint.py +2989 -0
  135. package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
  136. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2975
  137. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -4712
  138. package/skills/lark-task/SKILL.md +13 -1
  139. package/skills/lark-task/references/lark-task-create.md +3 -1
  140. package/skills/lark-vc/SKILL.md +5 -195
  141. package/skills/lark-vc-agent/SKILL.md +5 -191
  142. package/skills/lark-wiki/SKILL.md +3 -1
  143. package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
  144. package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
  145. package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
  146. package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
  147. package/skills/lark-workflow-meeting-summary/SKILL.md +20 -13
  148. package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
  149. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -69
  150. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
  151. package/skills/lark-minutes/references/lark-minutes-detail.md +0 -62
  152. package/skills/lark-minutes/references/lark-minutes-upload.md +0 -104
  153. package/skills/lark-note/references/lark-note-detail.md +0 -26
  154. package/skills/lark-vc/references/lark-vc-detail.md +0 -44
  155. package/skills/lark-vc/references/vc-domain-boundaries.md +0 -196
@@ -1,132 +1,5 @@
1
- # slides history(历史版本与回滚)
1
+ # slides history(历史版本与回滚)(兼容入口)
2
2
 
3
- 用于查看 Slides XML presentation 历史版本、按 `history_version_id` 回滚,以及查询回滚任务状态。
3
+ 本文档已迁移至 [`cli/lark-slides-history.md`](cli/lark-slides-history.md)。
4
4
 
5
- `entries[].edit_time` 是 UTC RFC3339 时间字符串(例如 `2026-06-22T12:24:45Z`)。按时间匹配时先将其解析为时间值,再比较先后关系或时间差。
6
-
7
- ## 安全流程
8
-
9
- 1. 先用分页接口 `+history-list` 找到目标版本的 `history_version_id`。
10
- 2. 如果用户指定的是 `revision_id`,不要假设它唯一,也不要把 `revision_id` 直接传给 `+history-revert`。先拉一页并在 `entries[]` 中筛选 `revision_id` 相同的候选;如果未匹配到且 `has_more=true`,继续用 `page_token` 翻页;如果已匹配到候选,最多额外再拉一页补齐可能跨页的相邻候选。最终优先根据用户目标时间与 `edit_time` 的接近程度选择最合适的一条,取同一条的 `history_version_id`;如果没有目标时间,或多个候选无法可靠区分,再向用户展示候选版本(`history_version_id`、`revision_id`、`edit_time`、`name/description`)并确认后回滚。
11
- 3. 如果用户指定的是某一时刻但没有指定 `revision_id`,按 `entries[].edit_time` 匹配;优先选择不晚于目标时刻的最近一条历史记录,无法明确匹配时先向用户确认候选版本。
12
- 4. 使用 `+history-revert` 发起回滚。接口会立即返回 `task_id`,回滚任务在服务端异步执行。
13
- 5. 如果返回 `status: running`,保存 `task_id`,按照返回的 `poll_after_ms` 等待后调用 `+history-revert-status`。任务创建成功后,不得因为状态查询失败而重新发起回滚。
14
- 6. 状态变为 `done`、`partial_failed` 或 `failed` 后停止轮询;达到整体轮询上限时也停止轮询,并向用户返回 `task_id` 和当前状态。
15
- 7. 回滚完成后,用 `slides +xml-get` 或 `slides xml_presentations get` 读取演示文稿确认内容。
16
-
17
- ## 按 revision_id 或时间点回滚
18
-
19
- 当用户说“回滚到 revision_id=42”“恢复到昨天下午 3 点的版本”这类需求时,流程是:
20
-
21
- 1. 执行 `slides +history-list --presentation <presentation>` 获取第一页历史记录;`+history-list` 是分页接口,只有 `has_more=true` 且还需要更多候选时才继续传 `--page-token` 翻页。
22
- 2. 如果用户给出 `revision_id`:先筛选当前页中 `entries[].revision_id == 用户给出的 revision_id`。如果未命中且 `has_more=true`,继续拉下一页;如果已经命中候选,最多额外再拉一页,补齐同一个 `revision_id` 可能跨页出现的相邻 `history_version_id`。若用户同时给出目标时间,在候选里选择 `edit_time` 与目标时间最接近的一条;若未给目标时间但候选只有一条,可直接使用;若多个候选无法可靠区分,不要自行取第一条,向用户展示候选并确认。
23
- 3. 如果用户只给出时间:用 `entries[].edit_time` 匹配,选择目标时刻之前最近的一条;如果用户表达的是“最接近某时刻”,则选择绝对时间差最小的一条。
24
- 4. 从最终匹配条目读取 `history_version_id`。`history_version_id` 对应服务端 `minor_history.version`,这是回滚接口需要的 ID。
25
- 5. 执行 `slides +history-revert --presentation <presentation> --history-version-id <history_version_id>`。
26
-
27
- 候选确认时使用类似格式:
28
-
29
- ```text
30
- 同一个 revision_id 命中多个历史版本,请确认要回滚哪一条:
31
- - history_version_id=11 revision_id=42 edit_time=2026-06-22T12:24:45Z name=...
32
- - history_version_id=12 revision_id=42 edit_time=2026-06-22T12:25:14Z name=...
33
- ```
34
-
35
- ## 命令
36
-
37
- ```bash
38
- # 列出历史版本
39
- lark-cli slides +history-list --presentation "<slides_url_or_token>" --page-size 20
40
-
41
- # 翻页
42
- lark-cli slides +history-list --presentation "<slides_url_or_token>" --page-size 20 --page-token "<page_token>"
43
-
44
- # 发起回滚任务,立即返回 task_id
45
- lark-cli slides +history-revert --presentation "<slides_url_or_token>" --history-version-id 42
46
-
47
- # 查询回滚任务状态
48
- lark-cli slides +history-revert-status --presentation "<slides_url_or_token>" --task-id "<task_id>"
49
- ```
50
-
51
- ## 参数
52
-
53
- | 命令 | 参数 | 必填 | 说明 |
54
- |-|-|-|-|
55
- | `+history-list` | `--presentation` | 是 | `xml_presentation_id`、Slides URL,或可解析为 Slides 的 wiki URL |
56
- | `+history-list` | `--page-size` | 否 | 返回条数,范围 `1-20`,默认 `20` |
57
- | `+history-list` | `--page-token` | 否 | 上一页返回的 `page_token` |
58
- | `+history-revert` | `--presentation` | 是 | 同一个演示文稿 |
59
- | `+history-revert` | `--history-version-id` | 是 | `+history-list` 返回的 `history_version_id`,必须大于 0 |
60
- | `+history-revert-status` | `--presentation` | 是 | 同一个演示文稿 |
61
- | `+history-revert-status` | `--task-id` | 是 | `+history-revert` 返回的 `task_id` |
62
-
63
- ## 异步轮询策略
64
-
65
- 1. `+history-revert` 返回 `task_id` 后,认为回滚任务已经成功创建。
66
- 2. 如果 `status` 不是 `running`,不再调用状态接口。
67
- 3. 如果 `status` 是 `running`,等待响应中的 `poll_after_ms` 后调用 `+history-revert-status`;`poll_after_ms` 缺失、为 `0` 或非法时,默认等待 10 秒。
68
- 4. 状态查询返回 `running` 时继续轮询;返回 `done`、`partial_failed` 或 `failed` 时停止。
69
- 5. 除非用户另有要求,默认最多轮询 5 分钟。达到上限后停止轮询,向用户说明任务仍在运行并返回 `task_id`,不得将其描述为回滚失败。
70
- 6. 状态查询出现临时错误时,按相同间隔最多连续重试 3 次;只重试 `+history-revert-status`,不得重新调用 `+history-revert`。
71
- 7. `done` 后读取当前演示文稿内容进行验证。
72
- 8. `partial_failed` 或 `failed` 时展示 `failed_block_tokens`;除非用户明确确认,不得自动再次发起回滚。
73
-
74
- ## 返回值要点
75
-
76
- `+history-list` 返回:
77
-
78
- ```json
79
- {
80
- "entries": [
81
- {
82
- "revision_id": 42,
83
- "history_version_id": "11",
84
- "edit_time": "2026-06-22T12:24:45Z",
85
- "type": 1,
86
- "name": "版本名",
87
- "description": "版本说明",
88
- "editor_ids": ["ou_xxx"]
89
- }
90
- ],
91
- "has_more": true,
92
- "page_token": "page_token"
93
- }
94
- ```
95
-
96
- `+history-revert` 返回:
97
-
98
- ```json
99
- {
100
- "task_id": "task_xxx",
101
- "status": "running",
102
- "history_version_id": "11",
103
- "poll_after_ms": 10000
104
- }
105
- ```
106
-
107
- `+history-revert-status` 返回:
108
-
109
- ```json
110
- {
111
- "status": "partial_failed",
112
- "history_version_id": "11",
113
- "failed_block_tokens": ["blk_xxx"]
114
- }
115
- ```
116
-
117
- `status` 可能是 `running`、`done`、`partial_failed`、`failed`。当状态是 `partial_failed` 或 `failed` 时,优先检查 `failed_block_tokens`。
118
-
119
- ## 回滚后验证
120
-
121
- 回滚成功后必须读取一次当前内容确认:
122
-
123
- ```bash
124
- lark-cli slides +xml-get --presentation "<slides_url_or_token>" --output ./presentation.xml
125
- ```
126
-
127
- 如果只需要快速检查返回结构,也可以走 raw OpenAPI:
128
-
129
- ```bash
130
- lark-cli api get "/open-apis/slides_ai/v1/xml_presentations/<xml_presentation_id>" \
131
- --params '{"revision_id":-1}'
132
- ```
5
+ 此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -1,104 +1,5 @@
1
+ # slides +media-upload(兼容入口)
1
2
 
2
- # slides +media-upload(上传本地图片到飞书幻灯片)
3
+ 本文档已迁移至 [`cli/lark-slides-media-upload.md`](cli/lark-slides-media-upload.md)。
3
4
 
4
- 把本地图片上传到指定演示文稿的 drive 媒体库,返回 `file_token`。**返回的 token 作为 `<img src="...">` 的值塞进 slide XML 即可显示图片。**
5
-
6
- ## 命令
7
-
8
- ```bash
9
- # 直接传 xml_presentation_id
10
- lark-cli slides +media-upload --as user \
11
- --file ./pic.png \
12
- --presentation slidesXXXXXXXXXXXXXXXXXXXXXX
13
-
14
- # 传 slides URL 也行
15
- lark-cli slides +media-upload --as user \
16
- --file ./chart.png \
17
- --presentation "https://xxx.feishu.cn/slides/slidesXXXXXXXXXXXXXXXXXXXXXX"
18
-
19
- # 传 wiki URL(CLI 自动 wiki.spaces.get_node 解析为真实 token,校验 obj_type=slides)
20
- lark-cli slides +media-upload --as user \
21
- --file ./pic.png \
22
- --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX"
23
-
24
- # 预览(不实际上传)
25
- lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
26
- ```
27
-
28
- ## 返回值
29
-
30
- ```json
31
- {
32
- "file_token": "boxcnXXXXXXXXXXXXXXXXXXXXXX",
33
- "file_name": "pic.png",
34
- "size": 12345,
35
- "presentation_id": "slidesXXXXXXXXXXXXXXXXXXXXXX"
36
- }
37
- ```
38
-
39
- - **`file_token`**:把它写进 `<img src="...">`
40
- - **`file_name` / `size`**:上传文件元信息
41
- - **`presentation_id`**:解析后的真实 `xml_presentation_id`(wiki URL 解析后会变化)
42
-
43
- ## 参数
44
-
45
- | 参数 | 必填 | 说明 |
46
- |------|------|------|
47
- | `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(slides upload API 不支持分片上传) |
48
- | `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
49
-
50
- > [!IMPORTANT]
51
- > **路径必须在 CWD 内**:`--file /abs/path/x.png` 或 `--file ../up/x.png` 会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
52
-
53
- ## 使用流程
54
-
55
- > 新建 PPT([`+create --slides`](lark-slides-create.md))或给已有 PPT 加新页([`+add-slide`](lark-slides-add-slide.md))都不需要单独上传:XML 里把 `<img src>` 写成 `@<本地路径>`,CLI 会自动上传并替换成 `file_token`。
56
- > 本命令用于往**已有页**里加图,或需要自己拿着 `file_token` 拼 XML 的场景。
57
-
58
- ### 给已有 PPT 的已有页加图
59
-
60
- 拿到 `file_token` 后走 [`+replace-slide`](lark-slides-replace-slide.md) 的 `block_insert`,不用搬原 XML、不改 `slide_id`、不打乱页序:
61
-
62
- ```bash
63
- PRES_ID=xxx
64
- SID=yyy # 要加图的那一页
65
-
66
- # 1) 上传图片拿 file_token
67
- TOKEN=$(lark-cli slides +media-upload --as user \
68
- --file ./pic.png --presentation $PRES_ID | jq -r '.data.file_token')
69
-
70
- # 2) block_insert 到页末(或用 insert_before_block_id 指定插入位置)
71
- lark-cli slides +replace-slide --as user \
72
- --presentation "$PRES_ID" --slide-id "$SID" \
73
- --parts "$(jq -n --arg token "$TOKEN" \
74
- '[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>")}]')"
75
- ```
76
-
77
- 注意事项:
78
-
79
- 1. **`<img>` 坐标避开现有元素** —— 先读现有元素 bbox 挑空白区;空间不够就先用 `block_replace` 挪动/缩小现有元素后再放图
80
- 2. **`<img>` 的 `width:height` 对齐原图比例** —— 比例不一致会被裁剪,参见 [xml-schema-quick-ref.md](xml-schema-quick-ref.md) `<img>` 说明
81
-
82
- ## 工作原理
83
-
84
- `+media-upload` 内部调用 `POST /open-apis/drive/v1/medias/upload_all`(单次上传,最大 20 MB),固定使用:
85
-
86
- - `parent_type=slide_file`(slides 后端唯一接受的取值)
87
- - `parent_node=<xml_presentation_id>`
88
-
89
- **不要尝试用 `slides_image`、`slide_image` 等 parent_type**——后端会返回 1061001 / 1061002 错误。这是 slides 的特殊约定。
90
-
91
- ## 常见错误
92
-
93
- | 错误码 | 含义 | 解决方案 |
94
- |--------|------|----------|
95
- | 1061002 | params error / 不支持的 parent_type | 不要用原生 API 自己拼 parent_type;用 `+media-upload` 即可 |
96
- | 1061004 | forbidden:当前身份对该演示文稿无编辑权限 | 确认当前身份(user 或 bot)对目标 PPT 有编辑权限。bot 模式常见原因:PPT 不是该 bot 创建的——可用 `+create --as bot` 新建,或以 user 身份给 bot 授权 `lark-cli drive permission.members create --as user ...` |
97
- | 1061044 | parent node not exist | `--presentation` 给的 token 不对,或不是 slides 类型 |
98
- | 403 | 权限不足 | 检查 `docs:document.media:upload` scope;wiki URL 还需要 `wiki:node:read` |
99
-
100
- ## 相关命令
101
-
102
- - [+create](lark-slides-create.md) — 新建 PPT(支持 `@` 占位符自动上传图片)
103
- - [+replace-slide](lark-slides-replace-slide.md) — 给已有页加图 / 换图(`block_insert` / `block_replace`)
104
- - [+add-slide](lark-slides-add-slide.md) — 追加/插入单页(同样支持 `@` 占位符自动上传)
5
+ 此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -1,85 +1,5 @@
1
- # PPT Template Rewrite Principles
1
+ # PPT Template Rewrite Principles(兼容入口)
2
2
 
3
- 核心原则:模板不是风格参考,而是必须沿用的编辑底稿。
3
+ 本文档已迁移至 [`workflow/template-editing.md`](workflow/template-editing.md)。
4
4
 
5
- ## Import First
6
-
7
- 如果用户提供的模板是 PPTX 格式,先把模板导入成 Lark Slides。后续写入目标是导入后的 Slides,不是新建一个脱离模板的 deck,也不是先在本地重画 PPTX 再导入。
8
-
9
- 直接使用以下命令,不需要先加载 `lark-drive` Skill:
10
-
11
- ```bash
12
- lark-cli drive +import --as user --file "<template.pptx>" --type slides --json
13
- ```
14
-
15
- 可选参数:用 `--name "<title>"` 指定导入后的 Slides 标题;用 `--folder-token <FOLDER_TOKEN>` 指定目标文件夹。若返回 `ready=false` / `timed_out=true`,直接执行返回值里的 `next_command`;等价形式是:
16
-
17
- ```bash
18
- lark-cli drive +task_result --scenario import --ticket <TICKET>
19
- ```
20
-
21
- ## Read Before Editing
22
-
23
- 导入后必须阅读 Slides 内容,理解每页的真实版式、字体、层级、图片、图表、shape、表格和文本容器。阅读结果是后续编辑的事实来源。
24
-
25
- 阅读页面时至少判断:
26
-
27
- - 该页原本承担的角色,例如封面、章节页、目录、流程、对比、数据、总结。
28
- - 该页的主要版式结构,例如图文关系、箭头、时间线、节点、表格、图表、左右对照、背景图或产品图。
29
- - 哪些文本框、shape 标签、表格单元格或图表标签承载内容。
30
- - 原页面的字体、字号、颜色、对齐、层级和留白关系。
31
-
32
- ## Edit The Imported Slides Directly
33
-
34
- 理解页面后,直接在导入后的 Slides 上编辑。允许的操作包括:
35
-
36
- - 填写、替换、凝练或删除文字。
37
- - 替换或补充图片。
38
- - 更新图表、表格、数字标签或节点标签里的内容。
39
- - 按需复制、删除或重排模板页。
40
- - 在源页面没有合适承载位置时,做局部、小范围新增元素。
41
-
42
- 新增元素只能补足内容缺口,不能成为新的主版式。页面主体仍应由模板原有版式承载。
43
-
44
- ## Preserve Design
45
-
46
- 编辑必须严格沿用原版式和字体,只改内容,不做设计。
47
-
48
- 默认保留:
49
-
50
- - 页面布局、视觉层级、留白和对齐关系。
51
- - 原字体、字号体系、颜色、文本框位置和 shape 顺序。
52
- - 背景图、图片、logo、图表、表格、装饰形状、线条、图标和页面结构。
53
- - 模板中不同页型之间的差异。
54
-
55
- 不要把模板页改造成统一的通用卡片、空白板式布局、标题栏、三栏、2x2 卡片或大面积遮罩。不要把模板当作背景图后另起一套设计系统。
56
-
57
- ## Content Only
58
-
59
- 内容必须优先进入原页面已有的文本框、shape 标签、节点、表格单元格、图表标签或注释容器。
60
-
61
- 如果原容器空间不足,优先:
62
-
63
- - 凝练文字。
64
- - 降低字号但保持原字体体系。
65
- - 拆分到页面已有的邻近容器。
66
- - 使用模板已有的注释、标签或补充说明区域。
67
- - 复制同页或同模板中的原生容器样式做局部补充。
68
-
69
- 不要为了容纳长文案而重画页面主体结构。不要用新增大卡片遮住原图表、箭头、图片、背景或关键 shape。
70
-
71
- ## Readback And Tune
72
-
73
- 完成编辑后必须回读结果,并逐页微调。
74
-
75
- 回读时重点检查:
76
-
77
- - 文字是否溢出、截断、压线或超出容器。
78
- - 文本是否遮挡图片、图表、shape、箭头、节点或其他文字。
79
- - shape 顺序是否导致内容被覆盖或遮住。
80
- - 新内容是否仍然落在模板原有版式中,而不是覆盖模板结构。
81
- - 字体、字号、颜色、对齐和层级是否仍贴近原页。
82
-
83
- 发现文字溢出时,优先凝练文字或缩减字号。发现遮挡时,调整 shape 顺序、局部位置或复用原有空白区域解决。只有在这些方法都不能满足内容表达时,才做局部新增或删除。
84
-
85
- 完成标准是“原模板的版式、字体和视觉结构仍清晰存在,内容已经被准确替换,并且回读后没有溢出和遮挡”。
5
+ 此文件仅保留旧路径兼容性;后续引用请使用新路径。
@@ -1,258 +1,5 @@
1
- # slides +replace-slide(块级替换 / 插入)
1
+ # slides +replace-slide(兼容入口)
2
2
 
3
- 对指定 slide 做块级替换或插入。编辑已有 PPT 的主路径——`slide_id` 不变、页序不动、只影响被指定的块。
3
+ 本文档已迁移至 [`cli/lark-slides-replace-slide.md`](cli/lark-slides-replace-slide.md)。
4
4
 
5
- > **`--parts` 字段名是硬约束**:装 XML 片段的字段,`block_replace` 只认 `replacement`,`block_insert` 只认 `insertion`(都是字符串)。`content` / `xml` / `new_xml` / `block_xml` / `block` / `element` / `data` 这些写法,以及任何其他字段名,**一律被 CLI 直接拒绝**——常见的错法会直接告诉你该用哪个字段(`unknown field "content"; did you mean "replacement"?`),其余只列出该 action 的合法字段集。`<content>` 是 `<shape>` 的**子元素**,不是 part 的字段名——这是最常见的搞混点。
6
-
7
- 相比直接调 `xml_presentation.slide.replace`,这个 shortcut 的四个额外价值:
8
-
9
- 1. `--presentation` 接受 `xml_presentation_id` / `/slides/` URL / `/wiki/` URL(wiki 自动解析);
10
- 2. `block_replace` 的 `replacement` 根元素 `id="<block_id>"` 由 CLI 自动注入——底层 API 的硬约束(不注入返回 3350001);直接调原生 API 需自己加,用 Shortcut 则自动注入;
11
- 3. `<shape>` 元素缺少 `<content/>` 子元素时由 CLI 自动注入——SML 2.0 schema 要求每个 `<shape>` 必须有 `<content/>` 子元素,缺失同样触发 3350001;自闭合的 `<shape .../>` 也会被自动展开为 `<shape ...><content/></shape>`;
12
- 4. 3350001 错误时提供上下文感知的 hint,帮助 AI agent 和用户快速定位原因。
13
-
14
- ## 命令
15
-
16
- ```bash
17
- # block_insert:在页末追加一个新元素
18
- lark-cli slides +replace-slide --as user \
19
- --presentation slidesXXXXXXXXXXXXXXXXXXXXXX \
20
- --slide-id pfG \
21
- --parts '[{"action":"block_insert","insertion":"<shape type=\"rect\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"100\"/>"}]'
22
-
23
- # block_replace:已知某块 id,整块替换(replacement 根 id 自动注入为 bUn)
24
- lark-cli slides +replace-slide --as user \
25
- --presentation slidesXXXXXXXXXXXXXXXXXXXXXX \
26
- --slide-id pfG \
27
- --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
28
-
29
- # 大 --parts 走文件或 stdin(auto-gen 命令不支持 @file,但 shortcut 支持)
30
- lark-cli slides +replace-slide --as user \
31
- --presentation $PID --slide-id $SID --parts @parts.json
32
- cat parts.json | lark-cli slides +replace-slide --as user \
33
- --presentation $PID --slide-id $SID --parts -
34
-
35
- # wiki URL 直接传(CLI 自动 get_node → 拿真实 xml_presentation_id)
36
- lark-cli slides +replace-slide --as user \
37
- --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" --slide-id pfG \
38
- --parts '[{"action":"block_insert","insertion":"<shape type=\"rect\" width=\"100\" height=\"100\"/>"}]'
39
-
40
- # 预览(不实际调用)
41
- lark-cli slides +replace-slide --as user \
42
- --presentation $PID --slide-id $SID --parts "$PARTS" --dry-run
43
- ```
44
-
45
- ## 参数
46
-
47
- | 参数 | 必填 | 说明 |
48
- |------|------|------|
49
- | `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
50
- | `--slide-id` | 是 | 页面 ID(`xml_presentation.slide.get` / `slides +xml-get` 都能拿到) |
51
- | `--parts` | 是 | JSON 数组(`[{...}, ...]`),单次最多 200 条。支持 `@<file>` 和 `-`(stdin)读取 |
52
- | `--revision-id` | 否 | 基础版本号;默认 `-1` 表示基于最新版执行;传具体版本号时,服务端以该版本为 base 执行;**传不存在的版本号(超过当前 revision)返回 3350002** |
53
- | `--tid` | 否 | 并发事务 ID;多人协作长事务才用,单次单人调用留空 |
54
-
55
- ## parts 元素结构
56
-
57
- > **限制**:最多 200 条;`block_replace` 和 `block_insert` 可以在同一批次混用。**其他 action(含 `str_replace`)CLI 会直接报错拒绝**。
58
-
59
- 每条 part 按 `action` 取不同字段:
60
-
61
- ### action = `block_replace`
62
-
63
- | 字段 | 必填 | 说明 |
64
- |------|------|------|
65
- | `action` | 是 | `"block_replace"` |
66
- | `block_id` | 是 | 目标块的 3 位 short element ID(从 `slide.get` 返回 XML 里读) |
67
- | `replacement` | 是 | 新 XML 片段;**根元素 `id` 会被 CLI 自动注入为 `block_id`**,用户不用自己加(如果已经加了且不一致会被覆盖为正确值) |
68
-
69
- ### action = `block_insert`
70
-
71
- | 字段 | 必填 | 说明 |
72
- |------|------|------|
73
- | `action` | 是 | `"block_insert"` |
74
- | `insertion` | 是 | 要插入的 XML 片段 |
75
- | `insert_before_block_id` | 否 | 插到这个块之前;省略(不提供此字段)则追加到页末 |
76
-
77
- ### 错误字段名(CLI 直接拒绝)
78
-
79
- part 里出现上表以外的字段一律报错,不会被静默忽略。报错总会点名写错的那个字段,并按情况给出下一步:能对上正确字段时直接建议它(`did you mean "replacement"?`),字段属于另一个 action 时说明归属(`it belongs to block_insert`),都对不上时列出该 action 的合法字段集。无论哪种,**要改的是字段名,不是字段值**。
80
-
81
- ```jsonc
82
- // ❌ 全部被拒
83
- [{"action":"block_replace","block_id":"bUn","content":"<p>...</p>"}] // unknown field "content"; did you mean "replacement"?
84
- [{"action":"block_replace","block_id":"bUn","xml":"<shape.../>"}] // 同上(new_xml / block_xml / element / data 一样)
85
- [{"action":"block_replace","block_id":"bUn","block":{"content":"..."}}] // 不能把内容嵌一层 block
86
- [{"action":"block_replace","block_id":"bUn","insertion":"<shape/>"}] // insertion 属于 block_insert
87
- [{"action":"block_replace","block_id":"bUn","replacement":{"type":"..."}}] // replacement 必须是字符串,报 .replacement must be a string
88
-
89
- // ✅ 正确
90
- [{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\"><content><p>新内容</p></content></shape>"}]
91
- [{"action":"block_insert","insertion":"<shape type=\"rect\" width=\"100\" height=\"100\"/>"}]
92
- ```
93
-
94
- ## 合法根元素速查
95
-
96
- `block_replace.replacement` 和 `block_insert.insertion` 必须以 SML 2.0 定义的合法元素为根。完整权威定义看 [`slides_xml_schema_definition.xml`](slides_xml_schema_definition.xml);这里只列能作为**根**的类型 + 每种类型的最小可工作片段。
97
-
98
- | 元素 | 用途 | 关键点 |
99
- |---|---|---|
100
- | `<shape>` | 矩形/椭圆/三角/文本框等所有形状 | `type` 必填;`<content/>` 缺失时 CLI 会自动注入 |
101
- | `<line>` | 直线 | 需 `startX/startY/endX/endY` |
102
- | `<polyline>` | 折线 | `points` 读回时被服务端规整丢弃(几何已入库) |
103
- | `<img>` | 图片 | `src` 必须是 [`+media-upload`](lark-slides-media-upload.md) 返回的 `file_token`,不能是 URL |
104
- | `<icon>` | 图标 | `iconType` 取自 iconpark 资源;语义图标先用 `scripts/iconpark_tool.py search` 检索 |
105
- | `<table>` | 表格 | 整表替换会**重建内部 td id**,旧 td block_id 立即失效 |
106
- | `<td>` | 单元格局部替换 | 只能 `block_replace`,不能 `block_insert`;`block_id` 必须是最新 `slide.get` 拿到的 td id |
107
- | `<chart>` | 图表(line/bar/column/pie/area/radar/combo) | 必须嵌 `<chartPlotArea>` + `<chartData>` + `<dim1>/<dim2>/<chartField>` |
108
-
109
- **不可作为根元素**:
110
-
111
- - `<video>` / `<audio>` —— SML 2.0 没有这两个原生元素;`<undefined type="video|audio">` 是**导出时**的占位符(服务端遇到不支持的类型时用它代替),**不能写入**。尝试 insert/replace 都会返回 3350001。
112
-
113
- ### 最小 XML 片段(JSON 嵌入时记得把 `"` 转义成 `\"`)
114
-
115
- `<shape>`(文本框;`type` 还可选 `rect`/`ellipse`/`triangle`/`custom` 等):
116
- ```xml
117
- <shape type="text" topLeftX="80" topLeftY="80" width="800" height="120">
118
- <content textType="title"><p>标题</p></content>
119
- </shape>
120
- ```
121
-
122
- `<img>`:
123
- ```xml
124
- <img src="{file_token}" topLeftX="600" topLeftY="20" width="80" height="80"/>
125
- ```
126
-
127
- `<polyline>`:
128
- ```xml
129
- <polyline topLeftX="10" topLeftY="10" width="100" height="50" points="0,0 50,50 100,0"/>
130
- ```
131
-
132
- `<table>`(2×2):
133
- ```xml
134
- <table topLeftX="30" topLeftY="80">
135
- <colgroup><col span="2" width="110"/></colgroup>
136
- <tr><td><content><p>A</p></content></td><td><content><p>B</p></content></td></tr>
137
- <tr><td><content><p>C</p></content></td><td><content><p>D</p></content></td></tr>
138
- </table>
139
- ```
140
-
141
- `<td>`(`block_replace` 单元格;`block_id` 必须是最新 `slide.get` 拿到的 td id):
142
- ```xml
143
- <td><content><p>新内容</p></content></td>
144
- ```
145
-
146
- `<chart>`(`type` 改成 `bar`/`column`/`pie`/`area`/`radar`/`combo` 切换图型):
147
- ```xml
148
- <chart topLeftX="30" topLeftY="300" width="300" height="200">
149
- <chartPlotArea><chartPlot type="line"/></chartPlotArea>
150
- <chartData>
151
- <dim1><chartField name="x" valueType="string">Q1,Q2,Q3,Q4</chartField></dim1>
152
- <dim2><chartField name="Sales" valueType="number">10,20,15,30</chartField></dim2>
153
- </chartData>
154
- </chart>
155
- ```
156
-
157
- ## 返回值
158
-
159
- ```json
160
- {
161
- "xml_presentation_id": "slidesXXXXXXXXXXXXXXXXXXXXXX",
162
- "slide_id": "pfG",
163
- "parts_count": 1,
164
- "revision_id": 102
165
- }
166
- ```
167
-
168
- | 字段 | 说明 |
169
- |------|------|
170
- | `xml_presentation_id` | 解析后的真实 token(wiki URL 解析后会变化) |
171
- | `slide_id` | 与入参一致 |
172
- | `parts_count` | 本次提交的 parts 条数 |
173
- | `revision_id` | 成功后的新版本号,下次做乐观锁时用 |
174
- | `failed_part_index` | 有部分失败时存在,指向第几条 part 失败 |
175
- | `failed_reason` | 失败原因文字描述 |
176
-
177
- 整批作为原子事务:任一 part 失败则整批不生效,服务端通过 `failed_part_index` / `failed_reason` 告诉你是哪条;按此定位修正后重发。
178
-
179
- ## 使用流程
180
-
181
- ### 给已有页加图(典型场景)
182
-
183
- ```bash
184
- PID=xxx
185
- SID=yyy
186
-
187
- # 1) 上传图片
188
- TOKEN=$(lark-cli slides +media-upload --as user \
189
- --file ./pic.png --presentation "$PID" | jq -r '.data.file_token')
190
-
191
- # 2) block_insert 到页末
192
- lark-cli slides +replace-slide --as user \
193
- --presentation "$PID" --slide-id "$SID" \
194
- --parts "$(jq -n --arg token "$TOKEN" \
195
- '[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>")}]')"
196
- ```
197
-
198
- ### 改标题(block_replace)
199
-
200
- ```bash
201
- # 先拿原页 XML,从里面找到标题块的 3 位 short id(如 bUn)
202
- lark-cli slides xml_presentation.slide get --as user \
203
- --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}"
204
-
205
- # block_replace 换掉整个标题块(id 自动注入)
206
- lark-cli slides +replace-slide --as user \
207
- --presentation "$PID" --slide-id "$SID" \
208
- --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
209
- ```
210
-
211
- ### 批量:一次换标题 + 追加装饰图
212
-
213
- `block_replace` 和 `block_insert` 可以在同一个 `--parts` 里混用,整批原子执行。
214
-
215
- ```bash
216
- lark-cli slides +replace-slide --as user \
217
- --presentation "$PID" --slide-id "$SID" \
218
- --parts '[
219
- {"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>"},
220
- {"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
221
- ]'
222
- ```
223
-
224
- ### 乐观锁
225
-
226
- ```bash
227
- # 读时记录 revision_id
228
- REV=$(lark-cli slides xml_presentation.slide get --as user \
229
- --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
230
- | jq '.data.revision_id')
231
-
232
- # 写时传 --revision-id;传不存在的版本号(超过当前 revision)返回 3350002
233
- lark-cli slides +replace-slide --as user \
234
- --presentation "$PID" --slide-id "$SID" --revision-id "$REV" \
235
- --parts "$PARTS"
236
- ```
237
-
238
- ## 常见错误
239
-
240
- | 现象 | 原因 | 对策 |
241
- |------|------|------|
242
- | 3350001 + hint "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新 `slide.get` 拿最新 XML,按里面的 short ID 再填 |
243
- | 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用 `slide.get` 拿到的有效 `revision_id` |
244
- | `--parts[i] action "str_replace" is not supported` | CLI 不暴露 `str_replace` | 把替换需求改写成 `block_replace` / `block_insert` |
245
- | `--parts contains N items, exceeds maximum of 200` | 一次提交 parts 太多 | 拆多次调用 |
246
- | `--parts[i] unknown field "content"; did you mean "replacement"?` | XML 塞进了不存在的字段名(`content` / `xml` / `block` / `data` 等) | 只改字段名:`block_replace` 用 `replacement`,`block_insert` 用 `insertion`;报错自带一行正确写法的 hint |
247
- | `--parts[i] unknown field "insertion"; it belongs to block_insert` | 字段和 `action` 不配对 | 按 action 取字段:`block_replace` = `block_id` + `replacement`;`block_insert` = `insertion` (+ `insert_before_block_id`) |
248
- | `--parts[i] (block_replace) requires non-empty block_id` / `replacement` | 字段名对,但值缺失或是空串 | 按 parts 元素结构补齐值 |
249
- | `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 [`+media-upload`](lark-slides-media-upload.md) 拿到的 `file_token` |
250
- | 3350001 | `replacement` 不是合法单根 XML 片段,或 `block_id` 不存在 | CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,重新 `slide.get` 拿最新 XML 确认 `block_id` 存在;检查 XML 结构是否合法;坐标是否超出 960×540 |
251
- | 403 | 权限不足 | 需要 `slides:presentation:update` 或 `slides:presentation:write_only`;wiki URL 还需要 `wiki:node:read` |
252
-
253
- ## 相关命令
254
-
255
- - [xml_presentation.slide get](lark-slides-xml-presentation-slide-get.md) — 读原页拿 `block_id` / `revision_id`
256
- - [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
257
- - [+media-upload](lark-slides-media-upload.md) — 上传图片拿 `file_token`
258
- - [lark-slides-edit-workflows.md](lark-slides-edit-workflows.md) — 读-改-写闭环 + 决策树
5
+ 此文件仅保留旧路径兼容性;后续引用请使用新路径。