@amaster.ai/pi-lark 0.1.7 → 0.1.8

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 (135) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +39 -6
  3. package/skills/lark-apps/references/lark-apps-cloud-dev.md +5 -4
  4. package/skills/lark-apps/references/lark-apps-create.md +6 -3
  5. package/skills/lark-apps/references/lark-apps-get.md +1 -1
  6. package/skills/lark-apps/references/lark-apps-list.md +1 -1
  7. package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
  8. package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
  9. package/skills/lark-base/SKILL.md +14 -6
  10. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +17 -1
  11. package/skills/lark-base/references/lark-base-dashboard.md +17 -4
  12. package/skills/lark-base/references/lark-base-data-query-guide.md +8 -0
  13. package/skills/lark-base/references/lark-base-field-create.md +19 -8
  14. package/skills/lark-base/references/lark-base-field-json.md +5 -2
  15. package/skills/lark-calendar/SKILL.md +1 -1
  16. package/skills/lark-doc/SKILL.md +26 -61
  17. package/skills/lark-doc/references/genres/business-analysis.md +30 -0
  18. package/skills/lark-doc/references/genres/data-report.md +32 -0
  19. package/skills/lark-doc/references/genres/email.md +38 -0
  20. package/skills/lark-doc/references/genres/execution-plan.md +27 -0
  21. package/skills/lark-doc/references/genres/formal-doc.md +37 -0
  22. package/skills/lark-doc/references/genres/meeting-minutes.md +24 -0
  23. package/skills/lark-doc/references/genres/memo-brief.md +25 -0
  24. package/skills/lark-doc/references/genres/official-redhead.md +73 -0
  25. package/skills/lark-doc/references/genres/prd.md +26 -0
  26. package/skills/lark-doc/references/genres/proposal.md +24 -0
  27. package/skills/lark-doc/references/genres/research-report.md +32 -0
  28. package/skills/lark-doc/references/genres/retrospective.md +25 -0
  29. package/skills/lark-doc/references/genres/route-consumer.md +37 -0
  30. package/skills/lark-doc/references/genres/route-creative.md +36 -0
  31. package/skills/lark-doc/references/genres/route-knowledge.md +39 -0
  32. package/skills/lark-doc/references/genres/route-marketing.md +40 -0
  33. package/skills/lark-doc/references/genres/route-media.md +36 -0
  34. package/skills/lark-doc/references/genres/route-opinion.md +38 -0
  35. package/skills/lark-doc/references/genres/route-personal-brand.md +36 -0
  36. package/skills/lark-doc/references/genres/route-platform.md +9 -0
  37. package/skills/lark-doc/references/genres/route-report.md +10 -0
  38. package/skills/lark-doc/references/genres/route-workplace.md +17 -0
  39. package/skills/lark-doc/references/genres/sop-tutorial.md +41 -0
  40. package/skills/lark-doc/references/genres/technical-doc.md +39 -0
  41. package/skills/lark-doc/references/genres/wechat.md +39 -0
  42. package/skills/lark-doc/references/genres/weekly-report.md +24 -0
  43. package/skills/lark-doc/references/genres/white-paper.md +32 -0
  44. package/skills/lark-doc/references/genres/xiaohongshu.md +38 -0
  45. package/skills/lark-doc/references/lark-doc-create-workflow.md +121 -0
  46. package/skills/lark-doc/references/lark-doc-create.md +22 -48
  47. package/skills/lark-doc/references/lark-doc-fetch.md +75 -92
  48. package/skills/lark-doc/references/lark-doc-history.md +16 -15
  49. package/skills/lark-doc/references/lark-doc-md.md +5 -1
  50. package/skills/lark-doc/references/lark-doc-media-download.md +2 -1
  51. package/skills/lark-doc/references/lark-doc-script.md +76 -0
  52. package/skills/lark-doc/references/lark-doc-update.md +70 -222
  53. package/skills/lark-doc/references/lark-doc-whiteboard.md +5 -9
  54. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +17 -12
  55. package/skills/lark-doc/references/lark-doc-xml.md +38 -167
  56. package/skills/lark-drive/SKILL.md +7 -5
  57. package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
  58. package/skills/lark-drive/references/lark-drive-copy.md +87 -0
  59. package/skills/lark-drive/references/lark-drive-download.md +2 -1
  60. package/skills/lark-drive/references/lark-drive-export.md +3 -0
  61. package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
  62. package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
  63. package/skills/lark-event/SKILL.md +7 -4
  64. package/skills/lark-event/references/lark-event-vc.md +8 -2
  65. package/skills/lark-im/SKILL.md +8 -8
  66. package/skills/lark-im/references/lark-im-chat-list.md +9 -2
  67. package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
  68. package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
  69. package/skills/lark-im/references/lark-im-chat-search.md +9 -2
  70. package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
  71. package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
  72. package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
  73. package/skills/lark-im/references/lark-im-flag-list.md +2 -2
  74. package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
  75. package/skills/lark-im/references/lark-im-messages-resources-download.md +19 -25
  76. package/skills/lark-im/references/lark-im-messages-search.md +4 -5
  77. package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
  78. package/skills/lark-mail/references/lark-mail-triage.md +19 -4
  79. package/skills/lark-minutes/SKILL.md +1 -1
  80. package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
  81. package/skills/lark-shared/SKILL.md +3 -3
  82. package/skills/lark-sheets/SKILL.md +83 -82
  83. package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
  84. package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
  85. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
  86. package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
  87. package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
  88. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
  89. package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
  90. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
  91. package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
  92. package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
  93. package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
  94. package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
  95. package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
  96. package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
  97. package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
  98. package/skills/lark-sheets/scripts/sheets_df.py +21 -3
  99. package/skills/lark-slides/SKILL.md +27 -44
  100. package/skills/lark-slides/references/lark-slides-add-slide.md +92 -0
  101. package/skills/lark-slides/references/lark-slides-create.md +77 -65
  102. package/skills/lark-slides/references/lark-slides-delete-slide.md +65 -0
  103. package/skills/lark-slides/references/lark-slides-edit-workflows.md +6 -7
  104. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -25
  105. package/skills/lark-slides/references/lark-slides-replace-slide.md +22 -1
  106. package/skills/lark-slides/references/lark-slides-screenshot.md +31 -13
  107. package/skills/lark-slides/references/lark-slides-update-slide.md +146 -0
  108. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +31 -8
  109. package/skills/lark-slides/references/slides_chart_demo.xml +1 -2
  110. package/skills/lark-slides/references/slides_xml_schema_definition.xml +48 -4
  111. package/skills/lark-slides/references/troubleshooting.md +7 -8
  112. package/skills/lark-slides/references/validation-checklist.md +4 -4
  113. package/skills/lark-slides/references/xml-schema-quick-ref.md +23 -11
  114. package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
  115. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +360 -76
  116. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +1138 -214
  117. package/skills/lark-whiteboard/SKILL.md +15 -8
  118. package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
  119. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
  120. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
  121. package/skills/lark-whiteboard/routes/dsl.md +8 -2
  122. package/skills/lark-whiteboard/routes/mermaid.md +1 -1
  123. package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
  124. package/skills/lark-whiteboard/routes/svg.md +3 -1
  125. package/skills/lark-whiteboard/scenes/mention.md +71 -0
  126. package/skills/lark-wiki/SKILL.md +5 -3
  127. package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
  128. package/skills/lark-doc/references/lark-doc-word-stat.md +0 -93
  129. package/skills/lark-doc/references/style/lark-doc-create-workflow.md +0 -47
  130. package/skills/lark-doc/references/style/lark-doc-style.md +0 -68
  131. package/skills/lark-doc/references/style/lark-doc-update-workflow.md +0 -48
  132. package/skills/lark-doc/scripts/doc_word_stat.py +0 -1243
  133. package/skills/lark-slides/references/lark-slides-replace-pages.md +0 -95
  134. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
  135. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
@@ -11,14 +11,14 @@
11
11
 
12
12
  | 场景 | 推荐方式 |
13
13
  |------|----------|
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` |
14
+ | 不超过 10 页 | 每页存一个 XML 文件,`slides +create --slide @page-01.xml --slide @page-02.xml ...` 一步创建 |
15
+ | 超过 10 页 | **两步创建**:先 `slides +create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 |
16
+ | 已有 PPT 继续追加或插入页面 | 使用 [`+add-slide`](lark-slides-add-slide.md),必要时配合 `--before-slide-id` |
17
17
 
18
- > [!WARNING]
19
- > `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议使用两步创建法。
20
18
  > [!IMPORTANT]
21
- > `slides +create --slides` 底层会逐页创建,不是原子操作。中途失败时先记录 `xml_presentation_id`,回读确认当前状态,再继续修复或追加。
19
+ > `slides +create` 带页面时底层会逐页创建,不是原子操作。中途失败时先记录 `xml_presentation_id`,回读确认当前状态,再继续修复或追加。
20
+
21
+ **CRITICAL — 提交前必须先跑版式 lint**:把待提交的 `<slide>` XML 存成本地文件,运行 [`scripts/xml_text_overlap_lint.py`](../scripts/xml_text_overlap_lint.py),`summary.error_count` 必须为 0。
22
22
 
23
23
  ## 命令
24
24
 
@@ -26,31 +26,22 @@
26
26
  # 创建空白 PPT
27
27
  lark-cli slides +create --title "项目汇报"
28
28
 
29
- # 创建 PPT + 添加 slide 页面
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>"
33
- ]'
29
+ # 创建 PPT + 添加页面:每页一个 XML 文件,重复 --slide,顺序即页序
30
+ lark-cli slides +create --as user --title "项目汇报" \
31
+ --slide @.lark-slides/plan/project/slide-01.xml \
32
+ --slide @.lark-slides/plan/project/slide-02.xml
33
+
34
+ # 已有组装好的 JSON 数组:从文件或 stdin 读
35
+ lark-cli slides +create --as user --title "项目汇报" --slides @./deck.json
36
+ cat deck.json | lark-cli slides +create --as user --title "项目汇报" --slides -
34
37
 
35
38
  # 以应用身份创建(自动授权当前用户)
36
39
  lark-cli slides +create --title "项目汇报" --as bot
37
40
 
38
41
  # 预览(不执行)
39
- lark-cli slides +create --title "项目汇报" --slides '[...]' --dry-run
40
- ```
41
-
42
- 复杂内容建议按页保存 XML,再用 `jq --rawfile` 组装 `--slides` 参数:
43
-
44
- ```bash
45
- lark-cli slides +create --as user --title "项目汇报" \
46
- --slides "$(jq -n \
47
- --rawfile s1 .lark-slides/plan/project/slide-01.xml \
48
- --rawfile s2 .lark-slides/plan/project/slide-02.xml \
49
- '[$s1, $s2]')"
42
+ lark-cli slides +create --title "项目汇报" --slide @./slide-01.xml --dry-run
50
43
  ```
51
44
 
52
- `--rawfile` 会把文件内容作为字符串读入 JSON,自动处理 XML 中的引号和换行;不要手动拼接带大量转义符的 JSON 字符串。
53
-
54
45
  ## 返回值
55
46
 
56
47
  工具成功执行后,返回一个 JSON 对象,包含以下字段:
@@ -59,15 +50,15 @@ lark-cli slides +create --as user --title "项目汇报" \
59
50
  - **`title`**(string):演示文稿标题
60
51
  - **`url`**(string,可选):演示文稿的在线链接,如有返回则务必展示给用户(需要 drive 相关权限;若获取失败则不返回此字段)
61
52
  - **`revision_id`**(integer):演示文稿版本号
62
- - **`slide_ids`**(string[],可选):仅传 `--slides` 时返回,成功添加的页面 ID 列表
63
- - **`slides_added`**(integer,可选):仅传 `--slides` 时返回,成功添加的页面数量
64
- - **`images_uploaded`**(integer,可选):仅 `--slides` 中含 `@<本地路径>` 占位符时返回,已上传的去重后图片数量
53
+ - **`slide_ids`**(string[],可选):带页面创建时返回,成功添加的页面 ID 列表
54
+ - **`slides_added`**(integer,可选):带页面创建时返回,成功添加的页面数量
55
+ - **`images_uploaded`**(integer,可选):页面 XML 中含 `@<本地路径>` 占位符时返回,已上传的去重后图片数量
65
56
  - **`permission_grant`**(object,可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限
66
57
 
67
58
  > [!IMPORTANT]
68
- > 不传 `--slides` 时,`slides +create` 只创建空白演示文稿。创建后需要使用 `xml_presentation.slide create` 逐页添加 slide 内容。
59
+ > 不带页面参数时,`slides +create` 只创建空白演示文稿。创建后用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 slide 内容。
69
60
  >
70
- > 传了 `--slides` 时,CLI 先创建空白演示文稿,再逐页调用 `xml_presentation.slide create` 添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
61
+ > 带了页面时,CLI 先创建空白演示文稿,再逐页调用 slide 创建接口添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
71
62
  >
72
63
  > 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
73
64
  >
@@ -83,27 +74,67 @@ lark-cli slides +create --as user --title "项目汇报" \
83
74
  | 参数 | 必填 | 说明 |
84
75
  |------|------|------|
85
76
  | `--title` | 否 | 演示文稿标题(不传则默认 "Untitled") |
86
- | `--slides` | 否 | slide 内容 JSON 数组,每个元素是一个 `<slide>` XML 字符串(最多 10 个;超过 10 页请先用 `+create` 创建空白 PPT,再用 `xml_presentation.slide create` 逐页添加) |
77
+ | `--slide` | 否 | 一页 `<slide>` XML,或 `@路径`;可重复,最多 10 次。格式见[页面输入形式](#页面输入形式) |
78
+ | `--slides` | 否 | 页面 XML 的 JSON 字符串数组,最多 10 个;支持 `@文件` 和 `-`(stdin)。格式见[页面输入形式](#页面输入形式) |
79
+
80
+ 10 页是 CLI 的上限,服务端每次只接收一页。超过 10 页时先用 `+create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加。
81
+
82
+ 两种形式的每一页都会在发请求前校验成「单个完整的 `<slide>` 文档」。不合格的页在创建演示文稿之前报错并指出页序号,不会留下空壳演示文稿。
83
+
84
+ ## 页面输入形式
85
+
86
+ 页面内容有 `--slide` 和 `--slides` 两种传法,二选一,同时传会报错。
87
+
88
+ 两种形式的 `@路径` 都必须是 CWD 内的相对路径(如 `./slide-01.xml`);绝对路径和 `../` 会被拒(报 `invalid file path`)。XML 写在别的目录时,先 `cd` 过去或把文件拷进 CWD 再执行。
89
+
90
+ ### `--slide`:一页一个文件
91
+
92
+ 可重复,重复次数即页数,出现顺序即页序。值是一页完整的 `<slide>` XML,或读取该 XML 的 `@路径`。
87
93
 
88
- ## `--slides` 参数格式
94
+ 文件内容就是这一页 XML 本身,外面没有引号或方括号:
95
+
96
+ ```xml
97
+ <slide xmlns="https://www.larkoffice.com/sml/2.0">
98
+ <data>…第1页…</data>
99
+ </slide>
100
+ ```
101
+
102
+ 文件内容不需要转义:引号、换行、中文原样写。
103
+
104
+ ### `--slides`:一个 JSON 数组
105
+
106
+ 值是 JSON 字符串数组,每个元素是一整页 XML,支持 `@文件` 和 `-`(stdin)。
107
+
108
+ 文件内容是一个 JSON 文档,XML 以 JSON 字符串出现,其中的 `"` 写作 `\"`,换行写作 `\n`:
89
109
 
90
110
  ```json
91
111
  [
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>"
112
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data>…第1页…</data></slide>",
113
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data>…第2页…</data></slide>"
94
114
  ]
95
115
  ```
96
116
 
97
- JSON string 数组,每个元素是一页 slide 的完整 XML。CLI 内部负责包装成 API 所需的 `{"slide": {"content": "..."}}` 格式并逐页调用。
117
+ 数组元素是页面 XML 原文。包装成 API 所需的 `{"slide": {"content": …}}` 并逐页调用由 CLI 完成。
118
+
119
+ > [!WARNING]
120
+ > `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议改用 `--slide @page-01.xml` 逐页传文件。
98
121
 
99
- ### 本地图片:`@<path>` 占位符
122
+ ## 本地图片:`@<path>` 占位符
100
123
 
101
124
  `<img>` 元素的 `src` 属性如果以 `@` 开头,CLI 会把它当作本地文件路径,自动上传到当前演示文稿,并把占位符替换为返回的 `file_token`。
102
125
 
126
+ `slide-01.xml`:
127
+
128
+ ```xml
129
+ <slide xmlns="https://www.larkoffice.com/sml/2.0">
130
+ <data>
131
+ <img src="@./assets/chart.png" topLeftX="100" topLeftY="100" width="320" height="180"/>
132
+ </data>
133
+ </slide>
134
+ ```
135
+
103
136
  ```bash
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>"
106
- ]'
137
+ lark-cli slides +create --as user --title "图测试" --slide @./slide-01.xml
107
138
  ```
108
139
 
109
140
  行为:
@@ -118,37 +149,18 @@ lark-cli slides +create --as user --title "图测试" --slides '[
118
149
  > [!IMPORTANT]
119
150
  > **路径必须在 CWD 内**:`@/abs/path/x.png` 或 `@../up/x.png` 这种会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
120
151
 
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
152
  ## 创建后续步骤
137
153
 
138
- 如果没有使用 `--slides`,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
154
+ 创建空白 PPT 时,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
139
155
 
140
156
  ```bash
141
157
  # 第 1 步:创建空白 PPT
142
- PRES_ID=$(lark-cli slides +create --title "项目汇报" | jq -r '.data.xml_presentation_id')
143
-
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
- }'
158
+ PRES_ID=$(lark-cli slides +create --title "项目汇报" --jq '.data.xml_presentation_id')
159
+
160
+ # 第 2 步:逐页添加(--slide 支持 @file,复杂 XML 优先走文件)
161
+ lark-cli slides +add-slide --as user \
162
+ --presentation "$PRES_ID" \
163
+ --slide @.lark-slides/plan/<deck>/page1.xml
152
164
  ```
153
165
 
154
166
  ## 常见错误
@@ -160,5 +172,5 @@ lark-cli slides xml_presentation.slide create --as user \
160
172
 
161
173
  ## 相关命令
162
174
 
163
- - [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 添加幻灯片页面
175
+ - [slides +add-slide](lark-slides-add-slide.md) — 追加/插入单页(两步创建的第二步)
164
176
  - [slides +xml-get](lark-slides-xml-presentations-get.md) — 读取 PPT 内容并保存到本地文件
@@ -0,0 +1,65 @@
1
+ # slides +delete-slide(按 slide_id 删除单页)
2
+
3
+ 从演示文稿删除**一页**,按 `slide_id` 指定。只改一页里的局部内容用 [`+replace-slide`](lark-slides-replace-slide.md),不要删了重建。
4
+
5
+ `--presentation` 接受 token / `/slides/` URL / `/wiki/` URL,ID 是普通 flag 而不是 `--params` JSON 串。
6
+
7
+ > `--slide-id` 只接受单个 ID —— 不支持逗号分隔的列表(`+screenshot` 的 `--slide-id` 支持,这个不支持),也不支持按页号删。
8
+
9
+ ## 命令
10
+
11
+ ```bash
12
+ # 直接传 xml_presentation_id
13
+ lark-cli slides +delete-slide --as user \
14
+ --presentation "$PID" \
15
+ --slide-id "$SID"
16
+
17
+ # slides URL / wiki URL 都可以(wiki 会自动解析并校验 obj_type=slides)
18
+ lark-cli slides +delete-slide --as user \
19
+ --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" \
20
+ --slide-id "$SID"
21
+
22
+ # 删之前先确认打到哪份 PPT、哪一页
23
+ lark-cli slides +delete-slide --presentation "$PID" --slide-id "$SID" --dry-run
24
+ ```
25
+
26
+ ## 参数
27
+
28
+ | 参数 | 必需 | 说明 |
29
+ |------|------|------|
30
+ | `--presentation` | 是 | `xml_presentation_id`、`/slides/` URL 或 `/wiki/` URL |
31
+ | `--slide-id` | 是 | 要删除的页面 ID |
32
+ | `--revision-id` | 否 | 演示文稿版本号,默认 `-1`(最新);传具体版本号做乐观锁 |
33
+ | `--dry-run` | 否 | 打印将要发起的请求,不删除 |
34
+
35
+ ## 成功输出
36
+
37
+ ```json
38
+ {
39
+ "xml_presentation_id": "slides_example_presentation_id",
40
+ "slide_id": "slide_example_id",
41
+ "deleted": true,
42
+ "revision_id": 43
43
+ }
44
+ ```
45
+
46
+ ## 怎么拿 `slide_id`
47
+
48
+ `slide_id` 是服务端短 ID,**不能从 XML 里推导**。两个来源:
49
+
50
+ 1. `+create` / `+add-slide` 的返回值里存下来;
51
+ 2. 事后回读:`slides +xml-get --presentation "$PID" --output .lark-slides/plan/<deck>/readback.xml`。
52
+
53
+ 删错页的代价高于多跑一次回读 —— 不确定就先回读 + `+screenshot` 看一眼再删。
54
+
55
+ ## 删错了怎么办
56
+
57
+ 删除在原地不可撤销,但可以走历史版本回滚:`+history-list` 找 `history_version_id` → `+history-revert`(只接受 `history_version_id`,不能传 `revision_id`)→ `+history-revert-status` 轮询。命令用法见 [lark-slides-history.md](lark-slides-history.md)。
58
+
59
+ ## 常见错误
60
+
61
+ | 现象 | 原因 | 解决 |
62
+ |------|------|------|
63
+ | `--slide-id cannot be empty` | 传了空串或纯空格 | 检查变量有没有取到值 |
64
+ | 3350001 `invalid param` | `slide_id` 写错或该页已被删 | `+xml-get` 回读确认 `slide_id` 还在 |
65
+ | 403 / 权限不足 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
@@ -1,6 +1,6 @@
1
1
  # 编辑已有 PPT:读-改-写闭环
2
2
 
3
- 局部编辑走 **shortcut [`+replace-slide`](lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id`。已有 Slides 的多页整页重建走 **[`+replace-pages`](lark-slides-replace-pages.md)**,保持原 presentation 链接不变。
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
- | 多页版式重建、整页坐标重排 | `+replace-pages` | 原 presentation 内批量 create-before/delete-old,不生成新 Slides 链接 |
14
+ | 整页版式重建、整页坐标重排、改页面背景、删若干元素 | `+update-slide`(每页一次) | 原地整页覆盖,`slide_id` 和页序不变;带原 `id` 的元素保留 id,不带 `id` 的作为新元素插入,遗漏的被删除 |
15
15
 
16
16
  > **没有字段级 patch**:即便只想改一个 `shape` 的 `topLeftX`,也得把整个块的新 XML 写出来用 `block_replace`。这不是"微调",是块级重写。
17
17
 
@@ -33,6 +33,8 @@ lark-cli slides +replace-slide --as user \
33
33
 
34
34
  `slide_id` / 页序不会变。`block_replace` 的 `replacement` 根元素 `id` 会自动注入为 `block_id`,用户手写 XML 时不需要自己加。
35
35
 
36
+ > **part 的字段名是 `block_id` + `replacement`(XML 字符串)**:写成 `content` / `xml` / `block` 会被 CLI 拒绝(报 `unknown field "content"; did you mean "replacement"?`)。收到这个报错时改字段名,不要改字段值。
37
+
36
38
  ## `revision_id` 参数
37
39
 
38
40
  `--revision-id` 默认 `-1`,表示基于当前最新版执行。传具体版本号时,服务端以该版本为 base 应用变更:
@@ -103,10 +105,7 @@ lark-cli slides +replace-slide --as user \
103
105
  ```bash
104
106
  lark-cli slides +replace-slide --as user \
105
107
  --presentation "$PID" --slide-id "$SID" \
106
- --parts '[
107
- {"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>"},
108
- {"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
109
- ]'
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\"/>"}]'
110
109
  ```
111
110
 
112
111
  整批作为原子事务:任一条失败整批不生效。失败时后端通常返回 3350001;若响应中带 `failed_part_index` / `failed_reason` 字段,shortcut 会原样透传。
@@ -137,7 +136,7 @@ cat parts.json | lark-cli slides +replace-slide --as user --presentation "$PID"
137
136
  ## 相关文档
138
137
 
139
138
  - [lark-slides-replace-slide.md](lark-slides-replace-slide.md) — +replace-slide shortcut 参数详情
140
- - [lark-slides-replace-pages.md](lark-slides-replace-pages.md) — 多页整页重建 shortcut
139
+ - [lark-slides-update-slide.md](lark-slides-update-slide.md) — +update-slide shortcut 参数详情(整页覆盖)
141
140
  - [lark-slides-xml-presentation-slide-get.md](lark-slides-xml-presentation-slide-get.md) — slide.get 参考(拿 `block_id` / `revision_id`)
142
141
  - [lark-slides-xml-presentation-slide-replace.md](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考(一般直接用 shortcut 即可)
143
142
  - [lark-slides-media-upload.md](lark-slides-media-upload.md) — 上传图片拿 file_token
@@ -52,30 +52,8 @@ lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
52
52
 
53
53
  ## 使用流程
54
54
 
55
- ### 给已有 PPT 加带图新页
56
-
57
- ```bash
58
- # 1) 上传图片
59
- TOKEN=$(lark-cli slides +media-upload --as user \
60
- --file ./pic.png \
61
- --presentation $PRES_ID | jq -r .data.file_token)
62
-
63
- # 2) 用 file_token 创建带图新页
64
- lark-cli slides xml_presentation.slide create --as user \
65
- --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
66
- --data "{\"slide\":{\"content\":\"<slide xmlns=\\\"http://www.larkoffice.com/sml/2.0\\\"><data><img src=\\\"$TOKEN\\\" topLeftX=\\\"100\\\" topLeftY=\\\"100\\\" width=\\\"320\\\" height=\\\"180\\\"/></data></slide>\"}}"
67
- ```
68
-
69
- ### 新建带图 PPT(推荐用 `+create --slides` 的 `@` 占位符,一步到位)
70
-
71
- ```bash
72
- # 不需要单独 +media-upload,写 src="@<本地路径>" 即可
73
- lark-cli slides +create --as user --title "图测试" --slides '[
74
- "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><img src=\"@./pic.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
75
- ]'
76
- ```
77
-
78
- 详见 [+create 文档](lark-slides-create.md#本地图片path-占位符)。
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 的场景。
79
57
 
80
58
  ### 给已有 PPT 的已有页加图
81
59
 
@@ -123,4 +101,4 @@ lark-cli slides +replace-slide --as user \
123
101
 
124
102
  - [+create](lark-slides-create.md) — 新建 PPT(支持 `@` 占位符自动上传图片)
125
103
  - [+replace-slide](lark-slides-replace-slide.md) — 给已有页加图 / 换图(`block_insert` / `block_replace`)
126
- - [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 创建 slide 页面(拿到 file_token 后塞进 XML)
104
+ - [+add-slide](lark-slides-add-slide.md) — 追加/插入单页(同样支持 `@` 占位符自动上传)
@@ -2,6 +2,8 @@
2
2
 
3
3
  对指定 slide 做块级替换或插入。编辑已有 PPT 的主路径——`slide_id` 不变、页序不动、只影响被指定的块。
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
+
5
7
  相比直接调 `xml_presentation.slide.replace`,这个 shortcut 的四个额外价值:
6
8
 
7
9
  1. `--presentation` 接受 `xml_presentation_id` / `/slides/` URL / `/wiki/` URL(wiki 自动解析);
@@ -72,6 +74,23 @@ lark-cli slides +replace-slide --as user \
72
74
  | `insertion` | 是 | 要插入的 XML 片段 |
73
75
  | `insert_before_block_id` | 否 | 插到这个块之前;省略(不提供此字段)则追加到页末 |
74
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
+
75
94
  ## 合法根元素速查
76
95
 
77
96
  `block_replace.replacement` 和 `block_insert.insertion` 必须以 SML 2.0 定义的合法元素为根。完整权威定义看 [`slides_xml_schema_definition.xml`](slides_xml_schema_definition.xml);这里只列能作为**根**的类型 + 每种类型的最小可工作片段。
@@ -224,7 +243,9 @@ lark-cli slides +replace-slide --as user \
224
243
  | 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用 `slide.get` 拿到的有效 `revision_id` |
225
244
  | `--parts[i] action "str_replace" is not supported` | CLI 不暴露 `str_replace` | 把替换需求改写成 `block_replace` / `block_insert` |
226
245
  | `--parts contains N items, exceeds maximum of 200` | 一次提交 parts 太多 | 拆多次调用 |
227
- | `--parts[i] (block_replace) requires non-empty block_id` / `replacement` | 字段缺失 | 按 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 元素结构补齐值 |
228
249
  | `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 [`+media-upload`](lark-slides-media-upload.md) 拿到的 `file_token` |
229
250
  | 3350001 | `replacement` 不是合法单根 XML 片段,或 `block_id` 不存在 | CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,重新 `slide.get` 拿最新 XML 确认 `block_id` 存在;检查 XML 结构是否合法;坐标是否超出 960×540 |
230
251
  | 403 | 权限不足 | 需要 `slides:presentation:update` 或 `slides:presentation:write_only`;wiki URL 还需要 `wiki:node:read` |
@@ -21,25 +21,40 @@ lark-cli slides +screenshot --as user \
21
21
  --content @slide.xml
22
22
  ```
23
23
 
24
+ ## 截图全部页面
25
+
26
+ 枚举全部页面的 `slide_id` 或页码,按每批最多 10 页分组并串行调用 `slides +screenshot`,复用同一个 `--output-dir`;记录失败批次,已完成批次不重复执行。
27
+
24
28
  ## 参数
25
29
 
26
30
  | 参数 | 必需 | 说明 |
27
31
  |------|------|------|
28
32
  | `--presentation` | list 模式必需 | `xml_presentation_id`、`/slides/` URL,或解析后为 slides 的 `/wiki/` URL。传 `--content` 时不能使用 |
29
- | `--slide-id` | list 模式至少提供 `--slide-id` / `--slide-number` 之一 | 页面 short ID;多页截图时重复传入,或用逗号分隔一次传多个(如 `--slide-id slide_1,slide_2`);一次最多 10 页(`--slide-id` + `--slide-number` 合计小于等于 10) |
30
- | `--slide-number` | list 模式至少提供 `--slide-id` / `--slide-number` 之一 | 页面页号;多页截图时重复传入,或用逗号分隔一次传多个(如 `--slide-number 1,2,3`);一次最多 10 页(`--slide-id` + `--slide-number` 合计小于等于 10) |
33
+ | `--slide-id` | list 模式与 `--slide-number` 二选一 | 页面 short ID;不能与 `--slide-number` 同时使用;多页截图时重复传入,或用逗号分隔一次传多个(如 `--slide-id slide_1,slide_2`);一次最多 10 个 ID |
34
+ | `--slide-number` | list 模式与 `--slide-id` 二选一 | 页面页号;不能与 `--slide-id` 同时使用;多页截图时重复传入,或用逗号分隔一次传多个(如 `--slide-number 1,2,3`);一次最多 10 个页码 |
31
35
  | `--content` | render 模式必需 | 要直接渲染的 `<slide>` XML 片段;支持直接传值、`@file`、`-` stdin。传入后不能同时传 `--slide-id` / `--slide-number` |
36
+ | `--output` | 否 | 单张截图的期望相对输出路径,可不写扩展名,显式扩展名只支持 `.png`、`.jpg`、`.jpeg`。只能选择一页,不能与 `--output-dir` / `--output-name` 同时使用;最终路径以返回的 `output` 为准 |
32
37
  | `--output-dir` | 否 | 输出目录,默认 `.lark-slides/screenshots`;必须是当前目录内的相对路径 |
33
- | `--output-name` | 否 | render 模式的输出文件名 stem;未指定时优先用返回的 `slide_id`,否则用 `rendered-slide`。若目标文件已存在,会自动追加递增后缀避免覆盖 |
38
+ | `--output-name` | 否 | 仅用于 `--content` render 模式设置输出文件名 stem。普通页面截图传入该参数会返回 `validation/invalid_argument`(`param: --output-name`)并提示改用 `--output` |
34
39
 
35
40
  ## 示例
36
41
 
37
- ### 单页截图
42
+ ### 单页截图并固定路径
38
43
 
39
44
  ```bash
40
45
  lark-cli slides +screenshot --as user \
41
46
  --presentation slides_example_presentation_id \
42
- --slide-number 1
47
+ --slide-number 1 \
48
+ --output .lark-slides/screenshots/example-deck-task/page-01
49
+ ```
50
+
51
+ 按 `slide_id` 选择单页时同样使用 `--output`:
52
+
53
+ ```bash
54
+ lark-cli slides +screenshot --as user \
55
+ --presentation slides_example_presentation_id \
56
+ --slide-id slide_example_id \
57
+ --output .lark-slides/screenshots/example-deck-task/page-01
43
58
  ```
44
59
 
45
60
  ### 多页截图
@@ -51,7 +66,7 @@ lark-cli slides +screenshot --as user \
51
66
  --presentation slides_example_presentation_id \
52
67
  --slide-number 1 \
53
68
  --slide-number 2 \
54
- --output-dir .lark-slides/screenshots/demo
69
+ --output-dir .lark-slides/screenshots/example-deck-task
55
70
  ```
56
71
 
57
72
  ### 渲染 XML 预览
@@ -59,7 +74,7 @@ lark-cli slides +screenshot --as user \
59
74
  ```bash
60
75
  lark-cli slides +screenshot --as user \
61
76
  --content @.lark-slides/out/demo/slide.xml \
62
- --output-name preview
77
+ --output .lark-slides/screenshots/example-deck-task/preview
63
78
  ```
64
79
 
65
80
  ## 返回值
@@ -72,13 +87,13 @@ lark-cli slides +screenshot --as user \
72
87
  "identity": "user",
73
88
  "data": {
74
89
  "xml_presentation_id": "slides_example_presentation_id",
75
- "output_dir": ".lark-slides/screenshots",
90
+ "output": "/abs/path/.lark-slides/screenshots/example-deck-task/page-01.jpg",
76
91
  "screenshots": [
77
92
  {
78
93
  "slide_id": "slide_example_id",
79
94
  "slide_number": 1,
80
- "format": "png",
81
- "path": "/abs/path/.lark-slides/screenshots/slides_example_presentation_id_p001_slide_example_id.png",
95
+ "format": "jpeg",
96
+ "path": "/abs/path/.lark-slides/screenshots/example-deck-task/page-01.jpg",
82
97
  "size": 12345
83
98
  }
84
99
  ]
@@ -92,6 +107,9 @@ lark-cli slides +screenshot --as user \
92
107
  2. 已存在 PPT 页面截图时,不传 `--content`,用 `--presentation` + `--slide-id` 或 `--slide-number`。
93
108
  3. 本地 XML 预览时,传 `--content @file` 或 `--content -`,内容应为单个 `<slide>` XML 片段;此时不要传 `--presentation` / `--slide-id` / `--slide-number`。
94
109
  4. `slide_id` 是页面 short ID,页码请用 `--slide-number`。
95
- 5. list 模式一次最多传 10 页(`--slide-id` + `--slide-number` 合计小于等于 10);更多页面请分批截图。
96
- 6. list 模式默认文件名包含 presentation ID、页码和/或 slide ID;文件已存在时自动追加 `_2`、`_3` 等后缀,避免覆盖旧截图。
97
- 7. 截图来自服务端渲染结果,适合创建/替换后验证页面是否为空白、破图或布局明显异常。
110
+ 5. list 模式下 `--slide-id` 与 `--slide-number` 必须二选一;同一类型 selector 一次最多传 10 个,更多页面请分批截图。
111
+ 6. 单张使用 `--output`,多张使用 `--output-dir`,由 CLI 按页面信息生成文件名。新建或大幅改写 Deck 时,截图目录复用 planning 阶段的 `<deck-or-task-id>`;已有 Deck 没有 task ID 时,使用 presentation ID 作为目录名。
112
+ 7. CLI 不转换图片格式,也不要求模型预判服务端格式。未写扩展名时自动追加真实扩展名;请求扩展名与真实格式不一致时保留目录和名称、修正扩展名,例如请求 `slide3.png` 而服务端返回 JPEG 时实际保存为 `slide3.jpg`。
113
+ 8. 发生扩展名修正或同名避让时会返回原始 `requested_output`、实际绝对路径 `output` 和 `output_adjusted: true`;后续必须使用 `output` / `screenshots[].path`,不要继续猜测请求路径。
114
+ 9. list 模式默认文件名包含 presentation ID、页码和/或 slide ID。
115
+ 10. 截图来自服务端渲染结果,适合创建/替换后验证页面是否为空白、破图或布局明显异常。