@amaster.ai/pi-lark 0.1.7 → 0.1.9

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 (215) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +41 -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-db.md +130 -2
  6. package/skills/lark-apps/references/lark-apps-get.md +1 -1
  7. package/skills/lark-apps/references/lark-apps-list.md +1 -1
  8. package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
  9. package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
  10. package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
  11. package/skills/lark-base/SKILL.md +155 -159
  12. package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
  13. package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
  14. package/skills/lark-base/references/lark-base-app.md +225 -0
  15. package/skills/lark-base/references/lark-base-cell-value.md +26 -19
  16. package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +37 -5
  17. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +18 -2
  18. package/skills/lark-base/references/lark-base-dashboard.md +25 -12
  19. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
  20. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
  21. package/skills/lark-base/references/lark-base-data-query.md +8 -11
  22. package/skills/lark-base/references/lark-base-field-create.md +13 -45
  23. package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
  24. package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
  25. package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +18 -100
  26. package/skills/lark-base/references/lark-base-field-update.md +13 -51
  27. package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
  28. package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
  29. package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
  30. package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
  31. package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
  32. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  33. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  34. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  35. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  36. package/skills/lark-calendar/SKILL.md +3 -1
  37. package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
  38. package/skills/lark-doc/SKILL.md +26 -61
  39. package/skills/lark-doc/references/genres/business-analysis.md +30 -0
  40. package/skills/lark-doc/references/genres/data-report.md +32 -0
  41. package/skills/lark-doc/references/genres/email.md +38 -0
  42. package/skills/lark-doc/references/genres/execution-plan.md +27 -0
  43. package/skills/lark-doc/references/genres/formal-doc.md +37 -0
  44. package/skills/lark-doc/references/genres/meeting-minutes.md +24 -0
  45. package/skills/lark-doc/references/genres/memo-brief.md +25 -0
  46. package/skills/lark-doc/references/genres/official-redhead.md +73 -0
  47. package/skills/lark-doc/references/genres/prd.md +26 -0
  48. package/skills/lark-doc/references/genres/proposal.md +24 -0
  49. package/skills/lark-doc/references/genres/research-report.md +32 -0
  50. package/skills/lark-doc/references/genres/retrospective.md +25 -0
  51. package/skills/lark-doc/references/genres/route-consumer.md +37 -0
  52. package/skills/lark-doc/references/genres/route-creative.md +36 -0
  53. package/skills/lark-doc/references/genres/route-knowledge.md +39 -0
  54. package/skills/lark-doc/references/genres/route-marketing.md +40 -0
  55. package/skills/lark-doc/references/genres/route-media.md +36 -0
  56. package/skills/lark-doc/references/genres/route-opinion.md +38 -0
  57. package/skills/lark-doc/references/genres/route-personal-brand.md +36 -0
  58. package/skills/lark-doc/references/genres/route-platform.md +9 -0
  59. package/skills/lark-doc/references/genres/route-report.md +10 -0
  60. package/skills/lark-doc/references/genres/route-workplace.md +17 -0
  61. package/skills/lark-doc/references/genres/sop-tutorial.md +41 -0
  62. package/skills/lark-doc/references/genres/technical-doc.md +39 -0
  63. package/skills/lark-doc/references/genres/wechat.md +39 -0
  64. package/skills/lark-doc/references/genres/weekly-report.md +24 -0
  65. package/skills/lark-doc/references/genres/white-paper.md +32 -0
  66. package/skills/lark-doc/references/genres/xiaohongshu.md +38 -0
  67. package/skills/lark-doc/references/lark-doc-create-workflow.md +121 -0
  68. package/skills/lark-doc/references/lark-doc-create.md +22 -48
  69. package/skills/lark-doc/references/lark-doc-fetch.md +80 -92
  70. package/skills/lark-doc/references/lark-doc-history.md +16 -15
  71. package/skills/lark-doc/references/lark-doc-md.md +5 -1
  72. package/skills/lark-doc/references/lark-doc-media-download.md +2 -1
  73. package/skills/lark-doc/references/lark-doc-script.md +76 -0
  74. package/skills/lark-doc/references/lark-doc-update.md +73 -221
  75. package/skills/lark-doc/references/lark-doc-whiteboard.md +5 -9
  76. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +17 -12
  77. package/skills/lark-doc/references/lark-doc-xml.md +38 -167
  78. package/skills/lark-drive/SKILL.md +11 -7
  79. package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
  80. package/skills/lark-drive/references/lark-drive-copy.md +87 -0
  81. package/skills/lark-drive/references/lark-drive-download.md +29 -2
  82. package/skills/lark-drive/references/lark-drive-export.md +4 -0
  83. package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
  84. package/skills/lark-drive/references/lark-drive-preview.md +21 -2
  85. package/skills/lark-drive/references/lark-drive-push.md +5 -1
  86. package/skills/lark-drive/references/lark-drive-search.md +2 -0
  87. package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
  88. package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
  89. package/skills/lark-event/SKILL.md +7 -4
  90. package/skills/lark-event/references/lark-event-vc.md +8 -2
  91. package/skills/lark-im/SKILL.md +14 -9
  92. package/skills/lark-im/references/lark-im-chat-list.md +9 -2
  93. package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
  94. package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
  95. package/skills/lark-im/references/lark-im-chat-search.md +9 -2
  96. package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
  97. package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
  98. package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
  99. package/skills/lark-im/references/lark-im-flag-list.md +2 -2
  100. package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
  101. package/skills/lark-im/references/lark-im-messages-resources-download.md +19 -25
  102. package/skills/lark-im/references/lark-im-messages-search.md +4 -5
  103. package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
  104. package/skills/lark-mail/references/lark-mail-triage.md +19 -4
  105. package/skills/lark-minutes/SKILL.md +12 -6
  106. package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
  107. package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
  108. package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
  109. package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
  110. package/skills/lark-note/SKILL.md +13 -9
  111. package/skills/lark-note/references/lark-note-detail.md +5 -2
  112. package/skills/lark-note/references/lark-note-transcript.md +2 -0
  113. package/skills/lark-shared/SKILL.md +39 -3
  114. package/skills/lark-sheets/SKILL.md +83 -82
  115. package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
  116. package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
  117. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
  118. package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
  119. package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
  120. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
  121. package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
  122. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
  123. package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
  124. package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
  125. package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
  126. package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
  127. package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
  128. package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
  129. package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
  130. package/skills/lark-sheets/scripts/sheets_df.py +21 -3
  131. package/skills/lark-slides/SKILL.md +64 -81
  132. package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
  133. package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
  134. package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
  135. package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
  136. package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
  137. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
  138. package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
  139. package/skills/lark-slides/references/cli/lark-slides-update-slide.md +163 -0
  140. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
  141. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
  142. package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
  143. package/skills/lark-slides/references/iconpark-index.json +5 -41901
  144. package/skills/lark-slides/references/iconpark.md +3 -44
  145. package/skills/lark-slides/references/lark-slides-add-slide.md +5 -0
  146. package/skills/lark-slides/references/lark-slides-create.md +3 -162
  147. package/skills/lark-slides/references/lark-slides-delete-slide.md +5 -0
  148. package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -142
  149. package/skills/lark-slides/references/lark-slides-history.md +3 -130
  150. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -124
  151. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
  152. package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -235
  153. package/skills/lark-slides/references/lark-slides-screenshot.md +3 -95
  154. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
  155. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
  156. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -132
  157. package/skills/lark-slides/references/planning-layer.md +1 -1
  158. package/skills/lark-slides/references/slides_chart_demo.xml +5 -1416
  159. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3468
  160. package/skills/lark-slides/references/troubleshooting.md +3 -61
  161. package/skills/lark-slides/references/validation-checklist.md +3 -154
  162. package/skills/lark-slides/references/workflow/error-handling.md +62 -0
  163. package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
  164. package/skills/lark-slides/references/workflow/template-editing.md +85 -0
  165. package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
  166. package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
  167. package/skills/lark-slides/references/xml/iconpark.md +46 -0
  168. package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
  169. package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3514 -0
  170. package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
  171. package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -483
  172. package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
  173. package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
  174. package/skills/lark-slides/scripts/xml_lint.py +2989 -0
  175. package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
  176. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2691
  177. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -3788
  178. package/skills/lark-task/SKILL.md +12 -0
  179. package/skills/lark-task/references/lark-task-create.md +3 -1
  180. package/skills/lark-vc/SKILL.md +15 -5
  181. package/skills/lark-vc/references/lark-vc-detail.md +11 -6
  182. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
  183. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
  184. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
  185. package/skills/lark-vc/references/lark-vc-recording.md +8 -6
  186. package/skills/lark-vc/references/vc-domain-boundaries.md +8 -1
  187. package/skills/lark-vc-agent/SKILL.md +24 -9
  188. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
  189. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
  190. package/skills/lark-whiteboard/SKILL.md +15 -8
  191. package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
  192. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
  193. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
  194. package/skills/lark-whiteboard/routes/dsl.md +8 -2
  195. package/skills/lark-whiteboard/routes/mermaid.md +1 -1
  196. package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
  197. package/skills/lark-whiteboard/routes/svg.md +3 -1
  198. package/skills/lark-whiteboard/scenes/mention.md +71 -0
  199. package/skills/lark-wiki/SKILL.md +8 -4
  200. package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
  201. package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
  202. package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
  203. package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
  204. package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
  205. package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
  206. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -61
  207. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
  208. package/skills/lark-doc/references/lark-doc-word-stat.md +0 -93
  209. package/skills/lark-doc/references/style/lark-doc-create-workflow.md +0 -47
  210. package/skills/lark-doc/references/style/lark-doc-style.md +0 -68
  211. package/skills/lark-doc/references/style/lark-doc-update-workflow.md +0 -48
  212. package/skills/lark-doc/scripts/doc_word_stat.py +0 -1243
  213. package/skills/lark-slides/references/lark-slides-replace-pages.md +0 -95
  214. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
  215. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
@@ -134,6 +134,8 @@ lark-cli drive +push --local-dir ./repo --folder-token fldcnxxxxxxxxx \
134
134
 
135
135
  `+push` 的失败项带结构化字段,agent 必须优先读 `items[].error_class` / `phase` / `code`,不要只看自然语言 `error` 文本。`summary.aborted=true` 表示命令已经遇到终止性错误并停止后续批处理;这时**不要原样重试**,先修复根因。
136
136
 
137
+ `retryable=true` 只表示修复根因或等待后可以再次尝试,不表示应该立即、无限重放整个 push;重试时采用有上限的指数退避和抖动。
138
+
137
139
  常见终止性错误:
138
140
 
139
141
  | `error_class` | 常见 `code` | 含义 | Agent 应对 |
@@ -144,8 +146,10 @@ lark-cli drive +push --local-dir ./repo --folder-token fldcnxxxxxxxxx \
144
146
  | `invalid_api_parameters` | `1061002` | API 参数被服务端拒绝 | 停止重试,检查 `--folder-token`、覆盖模式、`file_token`、文件名和上传参数;不要对同一参数组合批量重试 |
145
147
  | `parent_node_missing` | `1061044` | 上传 / 建目录使用的父文件夹不存在或当前身份不可见 | 停止重试,检查 `--folder-token` 是否仍存在、是否有权限、父目录是否在 push 过程中被删除;不要继续上传同一目录树 |
146
148
  | `parent_sibling_limit` | `1062507` | 目标父文件夹单层子节点数量超过上限 | 停止重试,清理目标目录、换一个 `--folder-token`,或把上传内容拆到多个子目录 |
149
+ | `quota_exceeded` | `1061101` / `1061061` | 租户或当前用户的 Drive 容量配额已满 | 停止重试,释放容量、调整目标位置或扩容后再执行 push |
147
150
  | `rate_limited` | `99991400` | 触发频控 | 停止当前批次,退避后再重试 |
148
- | `server_error` | `1061001` / `2200` | Drive 服务端异常 | 停止当前批次,稍后重试;保留 `log_id` 便于排查 |
151
+ | `conflict` | `1061045` | 同一目标发生资源竞争 | 停止当前批次,避免并发操作同一目标;退避后有限重试 |
152
+ | `server_error` | `1663` / `1061001` / `2200` / HTTP 5xx | Drive 服务端或网关异常 | 停止当前批次,稍后有限重试 |
149
153
 
150
154
  非终止但需要解释的状态:
151
155
 
@@ -25,6 +25,8 @@
25
25
  >
26
26
  > **`--query` 最长 30 个字符**:按字符数(Unicode 码点)算,中文每字算 1 个,与 ASCII 同口径;超过 30 会被服务端拒绝(`99992402 field validation failed`,**是报错不是截断**)。长关键词必须先压缩成核心实体 + 主题词(如把整句问题压成「项目名 + 主题」再搜),不要把整句原问塞进 `--query`。
27
27
  >
28
+ > **按完整标题定位:** 使用 `--only-title`;标题不超过 30 个字符时直接查询,超长标题使用不超过限制的稳定片段召回,再按返回标题严格匹配。使用相同 query 和过滤条件按 `page_token` 检查,最多 3 页;仅在 `has_more=false` 且跨页恰好一个严格匹配时继续写操作,否则请用户缩小范围或补充信息。`drive files list` 只用于枚举已知文件夹的直接子项。
29
+ >
28
30
  > **列表型请求不要硬塞关键词**:如果用户只是要求"我这月创建的所有文档"、"最近半年我编辑过的文档"、"按类型分类统计"这类范围浏览 / 汇总请求,且没有给出标题片段或业务关键词,应使用 `--query ""` 搭配 `--created-by-me`、`--mine`、`--created-*`、`--edited-*`、`--doc-types` 等过滤条件。不要把"查找"、"所有文档"、"最近更新过"、"按类型分类统计"这类动作词或统计意图放进 `--query`,否则会把本来应靠 filter 命中的结果过度收窄。
29
31
  >
30
32
  > **标题词 + 正文词联合搜索**:如果用户同时给出标题关键词和正文关键词,并要求同一资源同时满足两项条件,优先执行一条普通联合搜索:`lark-cli drive +search --query "标题词 正文词"`,并在同一条命令中叠加用户指定的 `--folder-tokens`、`--doc-types` 等过滤条件。不要把这种联合搜索拆成“标题搜索 + 正文搜索”后自行拼交集;也不要把 `--only-title` 或 `intitle:` 用作主候选路径。只有用户明确只查标题时,才使用 `--only-title` 或 `intitle:`。
@@ -329,6 +329,9 @@ lark-cli drive +export --token <SOURCE_DOC_TOKEN> --doc-type docx --file-extensi
329
329
  # 2. 继续查询导出结果
330
330
  lark-cli drive +task_result --scenario export --ticket <EXPORT_TICKET> --file-token <SOURCE_DOC_TOKEN>
331
331
 
332
+ # 如果返回 rate_limit / 99991400:至少等待 1 分钟后重试同一条 +task_result;
333
+ # 若仍限频,以 1 分钟为起点继续指数退避。
334
+
332
335
  # 3. 拿到 file_token 后下载
333
336
  lark-cli drive +export-download --file-token <EXPORTED_FILE_TOKEN>
334
337
  ```
@@ -0,0 +1,78 @@
1
+ # drive +update-title
2
+
3
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ 重命名云空间(云盘/云存储)里的文件、文件夹、在线文档或知识库节点。
6
+
7
+ ## 命令
8
+
9
+ ```bash
10
+ # 推荐:传 URL(自动识别类型和 token)
11
+ lark-cli drive +update-title \
12
+ --url 'https://example.larksuite.com/docx/<DOCX_TOKEN>' \
13
+ --title '<NEW_TITLE>'
14
+
15
+ # 裸 token 必须显式传 --type
16
+ lark-cli drive +update-title \
17
+ --token <FILE_TOKEN> \
18
+ --type file \
19
+ --title '<NEW_TITLE>.xlsx'
20
+
21
+ # 知识库节点:传 /wiki/ URL 里的 node_token
22
+ lark-cli drive +update-title \
23
+ --url 'https://example.larksuite.com/wiki/<NODE_TOKEN>' \
24
+ --title '<NEW_TITLE>'
25
+ ```
26
+
27
+ ## 参数
28
+
29
+ | 参数 | 必填 | 说明 |
30
+ |------|------|------|
31
+ | `--url` | 与 `--token` 二选一 | 目标 URL,支持 `/docx/`、`/sheets/`、`/base/`、`/bitable/`、`/slides/`、`/file/`、`/drive/folder/`、`/wiki/` |
32
+ | `--token` | 与 `--url` 二选一 | 目标 token 或 URL;裸 token 必须配合 `--type` |
33
+ | `--type` | 裸 token 时必填 | `docx`、`sheet`、`bitable`(`base` 为兼容别名)、`slides`、`file`、`folder`、`wiki`;传 URL 时可省略,显式传入时必须与 URL 类型一致 |
34
+ | `--title` | 是 | 新标题,别名 `--new-title`;不能为空或纯空白,首尾空格会被去掉 |
35
+ | `--on-extension-mismatch` | 否 | 仅 `--type file`:`keep`(默认,标题缺后缀时自动补上当前后缀,后缀不一致时报错)/ `allow`(跳过校验,原样提交)。传给其他 `--type` 会报错 |
36
+
37
+ ## 行为说明
38
+
39
+ - **空标题会被拒绝**:CLI 拒绝空或纯空白的 `--title`
40
+ - **`file` 类型会校验后缀**:`--type file` 的标题就是完整文件名。CLI 会比对 `--title` 与当前文件名的后缀:没有后缀时默认补上当前后缀(输出里用 `extension_appended` 说明),后缀不一致时拦截(`a.md` → `a.txt`)。要跳过校验加 `--on-extension-mismatch=allow`
41
+ - **wiki 不解包**:`--type wiki` 用 `/wiki/` URL 里的 `wiki_token`,传底层文档 token 会 `981003`
42
+ - **不支持旧版 doc 和思维笔记**:服务端不支持改这两类的标题(`type=doc` / `type=mindnote` 返回 `981002 params error`),CLI 在本地就拒绝,不会白发一次写请求
43
+ - **不支持妙搭 apps**:要改妙搭应用标题,切换到 [`lark-apps`](../../lark-apps/SKILL.md) 业务域处理
44
+
45
+ ## 输出
46
+
47
+ ```json
48
+ {
49
+ "updated": true,
50
+ "file_token": "<file_token>",
51
+ "type": "docx",
52
+ "title": "<new_title>",
53
+ "url": "https://example.feishu.cn/docx/<file_token>"
54
+ }
55
+ ```
56
+
57
+ `--type file` 且未用 `allow` 时,额外返回改名前的文件名,改错了可以据此一条命令改回去;自动补了后缀还会带上 `extension_appended`:
58
+
59
+ ```json
60
+ {
61
+ "updated": true,
62
+ "title": "<new_title>.txt",
63
+ "previous_title": "<old_title>.txt",
64
+ "extension_appended": ".txt"
65
+ }
66
+ ```
67
+
68
+ ## 常见错误
69
+
70
+ | 错误码 | 含义 | 处理 |
71
+ |---|---|---|
72
+ | `99991672` / `99991679` | 缺失 scope | 按错误里的 `missing_scopes`、`hint` 申请/授权所需 scope 后重试 |
73
+ | `99991400` | 命中接口限频 | 等待一段时间后重试;批量改名时保持串行并降低频率 |
74
+
75
+ ## 参考
76
+
77
+ - [lark-drive](../SKILL.md) -- 云空间(云盘/云存储)全部命令
78
+ - [lark-shared](../../lark-shared/SKILL.md) -- 认证和全局参数
@@ -32,7 +32,7 @@ metadata:
32
32
  | `--max-events N` | Exit after N events. Default 0 = unlimited |
33
33
  | `--timeout D` | Exit after duration D (e.g. `30s`, `2m`). Default 0 = no timeout. Whichever of `--max-events` / `--timeout` fires first wins |
34
34
  | `--output-dir <dir>` | Write each event as a file (relative paths only; prevents traversal) |
35
- | `--quiet` | Suppress stderr diagnostics. **AI should not use this** — it silences the ready marker |
35
+ | `--quiet` | Suppress ready/exit markers and per-event stderr diagnostics, including drop warnings. This can hide event loss. **AI should not use this** — it removes readiness and integrity signals |
36
36
  | `--as user\|bot\|auto` | Identity for the session (see lark-shared) |
37
37
 
38
38
 
@@ -42,6 +42,9 @@ metadata:
42
42
  # Default: stream every event for the key (no filter, no projection)
43
43
  lark-cli event consume im.message.receive_v1 --as bot
44
44
 
45
+ # List every EventKey of one domain (the authoritative, always-current catalog)
46
+ lark-cli event list --domain vc --json
47
+
45
48
  # Grab one sample event to inspect payload shape
46
49
  lark-cli event consume im.message.receive_v1 --max-events 1 --timeout 30s --as bot
47
50
 
@@ -57,7 +60,7 @@ wait
57
60
 
58
61
  ## Call flow
59
62
 
60
- 1. `lark-cli event list --json` → pick a legal key
63
+ 1. `lark-cli event list --json` → pick a legal key. `--domain <d>` narrows to one domain; the domains are `application`, `approval`, `board`, `card`, `im`, `minutes`, `task`, `vc`. An unknown domain fails with the valid set listed in the hint.
61
64
  2. `lark-cli event schema <key> --json` → read `resolved_output_schema` + `jq_root_path` to determine field paths
62
65
  3. `lark-cli event consume <key> [--jq '<expr>']` → consume
63
66
 
@@ -94,7 +97,7 @@ Orchestrators should treat `reason: limit/timeout/signal` (all exit 0) as "busin
94
97
 
95
98
  ### Never `kill -9`
96
99
 
97
- **Avoid `kill -9` on consume processes**: for EventKeys with a **PreConsume hook** (those that register server-side subscriptions via OAPI), `kill -9` skips the OAPI unsubscribe and leaks server-side subscriptions (symptoms: "subscription already exists" on restart, duplicate event delivery). Prefer SIGTERM or closing stdin.
100
+ **Avoid `kill -9` on consume processes** for EventKeys whose PreConsume registers a server-side subscription **and** unsubscribes on exit (minutes, vc, board keys): `kill -9` skips the OAPI unsubscribe and leaks the server-side subscription (symptoms: "subscription already exists" on restart, duplicate event delivery). Keys whose subscription is a durable relation with no cleanup (task, approval keys) do not leak this way, but SIGTERM or closing stdin remains the right shutdown for every key.
98
101
 
99
102
  ### One consume, one EventKey (multi-key = multi-shell)
100
103
 
@@ -151,6 +154,6 @@ Lark-defined semantic tags (**not** JSON Schema's standard `format`). Common val
151
154
  | Approval | [`references/lark-event-approval.md`](references/lark-event-approval.md) | Catalog of 2 Approval EventKeys (`approval.instance.status_changed_v4`, `approval.task.status_changed_v4`) + optional/multi `subscription_type` pre-registration + user-auth subscription lifecycle + flat output field reference |
152
155
  | IM | [`references/lark-event-im.md`](references/lark-event-im.md) | Catalog of 12 IM EventKeys + shape notes (flat vs V2 envelope) + `im.message.receive_v1` field gotchas (`sender_id` is open_id only; `.content` is plain text except for `interactive` cards) + common jq recipes (filter by chat_type / message_type / sender); for `card.action.trigger` see also [`../lark-im/references/lark-im-card-action-reply.md`](../lark-im/references/lark-im-card-action-reply.md) |
153
156
  | Task | [`references/lark-event-task.md`](references/lark-event-task.md) | Catalog of 1 Task EventKey (`task.task.update_user_access_v2`) + Native V2 envelope shape + task commit types + user/bot subscription notes |
154
- | VC | [`references/lark-event-vc.md`](references/lark-event-vc.md) | Catalog of 4 VC EventKeys (`vc.meeting.participant_meeting_started_v1`, `vc.meeting.participant_meeting_joined_v1`, `vc.meeting.participant_meeting_ended_v1`, `vc.note.generated_v1`) + field reference + source type semantics (meeting only) |
157
+ | VC | [`references/lark-event-vc.md`](references/lark-event-vc.md) | Catalog of 7 VC EventKeys (meeting lifecycle `participant_meeting_started/joined/ended_v1`, `vc.note.generated_v1`, recording `recording_started/transcript_generated/ended_v1`) + field reference + source type semantics; the live list is always `lark-cli event list --domain vc --json` |
155
158
  | Minutes | [`references/lark-event-minutes.md`](references/lark-event-minutes.md) | Catalog of 1 Minutes EventKey (`minutes.minute.generated_v1`) + field reference + source type semantics (meeting only) |
156
159
  | Whiteboard | [`references/lark-event-whiteboard.md`](references/lark-event-whiteboard.md) | Catalog of 1 Board EventKey (`board.whiteboard.updated_v1`) + per-whiteboard subscription model (requires `-p whiteboard_id=<token>`) + payload field reference (whiteboard_id / operator_ids triple-id) |
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Prerequisite:** Read [`../SKILL.md`](../SKILL.md) first for the `event consume` essentials (commands, subprocess contract, jq usage).
4
4
 
5
- ## Key catalog (4)
5
+ ## Key catalog (7)
6
6
 
7
7
  | EventKey | Purpose |
8
8
  |---|---|
@@ -10,8 +10,11 @@
10
10
  | `vc.meeting.participant_meeting_joined_v1` | The current user has joined a meeting |
11
11
  | `vc.meeting.participant_meeting_ended_v1` | A meeting the current user participates in has ended |
12
12
  | `vc.note.generated_v1` | A note has been generated (meeting, recording, upload, etc.) |
13
+ | `vc.recording.recording_started_v1` | A recording_bean recording has started (Feishu software only) |
14
+ | `vc.recording.recording_transcript_generated_v1` | Recording_bean transcript items were generated (Feishu software only) |
15
+ | `vc.recording.recording_ended_v1` | A recording_bean recording ended and uploaded successfully (Feishu software only) |
13
16
 
14
- All four keys use a **Custom schema** (flat output) and carry a **PreConsume hook** that auto-subscribes / unsubscribes via OAPI on first / last consumer. All require `--as user`.
17
+ All seven keys use a **Custom schema** (flat output) and carry a **PreConsume hook** that auto-subscribes / unsubscribes via OAPI on first / last consumer. All require `--as user`.
15
18
 
16
19
  ## Scopes & auth
17
20
 
@@ -21,6 +24,9 @@ All four keys use a **Custom schema** (flat output) and carry a **PreConsume hoo
21
24
  | `vc.meeting.participant_meeting_joined_v1` | `vc:meeting.meetingevent:read` | user |
22
25
  | `vc.meeting.participant_meeting_ended_v1` | `vc:meeting.meetingevent:read` | user |
23
26
  | `vc.note.generated_v1` | `vc:note:read` | user |
27
+ | `vc.recording.recording_started_v1` | `vc:recording:read` | user |
28
+ | `vc.recording.recording_transcript_generated_v1` | `vc:recording:read` | user |
29
+ | `vc.recording.recording_ended_v1` | `vc:recording:read` | user |
24
30
 
25
31
  ---
26
32
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lark-im
3
3
  version: 1.0.0
4
- description: "飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件(支持大文件分片下载)、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。"
4
+ description: "飞书即时通讯:收发消息和管理群聊。发送和回复消息、搜索聊天记录、管理群聊成员、上传下载图片和文件、管理表情回复、发送应用内/短信/电话加急、发送和处理交互卡片(Interactive Card)、监听卡片按钮回调(card.action.trigger)。当用户需要发消息、查看或搜索聊天记录、下载聊天中的文件、查看群成员、搜索群、创建群聊或话题群、管理标记数据、管理 Feed 置顶(添加/移除/查询置顶会话)、管理标签数据、处理卡片回调时使用。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
@@ -56,7 +56,7 @@ The four message-pulling shortcuts (`+messages-mget`, `+chat-messages-list`, `+m
56
56
 
57
57
  ### Opt-in resource auto-download (`--download-resources`)
58
58
 
59
- `+chat-messages-list`, `+messages-mget`, and `+threads-messages-list` accept `--download-resources` (**off by default** — no `resources` block and no extra requests when omitted). When set, eligible message resources (image/file/audio/video/media + post-embedded; **stickers excluded**) are downloaded into `./lark-im-resources/` and each message gains a `resources` array of `{message_id, key, type, local_path, size_bytes}`. Downloads are deduped by `(message_id, file_key)`, run with bounded concurrency, and isolate single-resource failures (`error: true` + stderr warning). **Scope:** requires `im:message:readonly` (already declared by the listing commands — no extra scope); works under both user and bot identity. For one-off downloads use [`+messages-resources-download`](references/lark-im-messages-resources-download.md). Full contract: [`references/lark-im-message-enrichment.md`](references/lark-im-message-enrichment.md).
59
+ `+chat-messages-list`, `+messages-mget`, and `+threads-messages-list` accept `--download-resources` to save eligible attachments into `./lark-im-resources/` and add a `resources` array to each message. It is off by default; stickers are not downloadable. A failed attachment is reported on that resource without aborting the message pull. Use [`+messages-resources-download`](references/lark-im-messages-resources-download.md) for one attachment. See [`references/lark-im-message-enrichment.md`](references/lark-im-message-enrichment.md) for the output contract.
60
60
 
61
61
  ### Card Messages (Interactive)
62
62
 
@@ -104,17 +104,17 @@ Shortcut 是对常用操作的高级封装(`lark-cli im +<verb> [flags]`)。
104
104
  | Shortcut | 说明 |
105
105
  |----------|------|
106
106
  | [`+chat-create`](references/lark-im-chat-create.md) | Create a group chat or topic chat; user/bot; --chat-mode group|topic; private/public; invites users/bots; optionally sets bot manager |
107
- | [`+chat-list`](references/lark-im-chat-list.md) | List chats the current user/bot is a member of; defaults to groups; pass --types=p2p,group to include p2p single chats (user-only); user/bot; supports sorting, pagination, --exclude-muted (user-only) |
107
+ | [`+chat-list`](references/lark-im-chat-list.md) | List chats the current user/bot is a member of; defaults to groups; pass --types=p2p,group to include p2p single chats (user-only); user/bot; supports sorting, auto-pagination, --exclude-muted (user-only) |
108
108
  | [`+chat-members-list`](references/lark-im-chat-members-list.md) | List members of a chat; returns separate users[] / bots[] buckets; callable as user or bot; --member-types filters which kinds to return; --page-all pagination; surfaces truncations[] when the server caps a bucket |
109
- | [`+chat-messages-list`](references/lark-im-chat-messages-list.md) | List messages in a chat or P2P conversation; user/bot; accepts --chat-id or --user-id, resolves P2P chat_id, supports time range/sort/pagination |
110
- | [`+chat-search`](references/lark-im-chat-search.md) | Search visible group chats by --query keyword and/or --member-ids; user/bot; e.g. look up chat_id by group name; supports type filters, sorting, pagination, and --exclude-muted (user identity only) |
109
+ | [`+chat-messages-list`](references/lark-im-chat-messages-list.md) | List messages in a chat or P2P conversation; user/bot; accepts --chat-id or --user-id, resolves P2P chat_id, supports time range, --order asc/desc sorting, auto-pagination |
110
+ | [`+chat-search`](references/lark-im-chat-search.md) | Search visible group chats by --query keyword and/or --member-ids; user/bot; e.g. look up chat_id by group name; supports type filters, sorting, auto-pagination, and --exclude-muted (user identity only) |
111
111
  | [`+chat-update`](references/lark-im-chat-update.md) | Update group chat name or description; user/bot; updates a chat's name or description |
112
112
  | [`+messages-mget`](references/lark-im-messages-mget.md) | Batch get messages by IDs; user/bot; fetches up to 50 om_ message IDs, formats sender names, expands thread replies |
113
113
  | [`+messages-reply`](references/lark-im-messages-reply.md) | Reply to a message (supports thread replies); user/bot; supports text/markdown/post/media replies, reply-in-thread, idempotency key |
114
- | [`+messages-resources-download`](references/lark-im-messages-resources-download.md) | Download images/files from a message; user/bot; supports automatic chunked download for large files (8MB chunks), auto-detects file extension from Content-Type |
115
- | [`+messages-search`](references/lark-im-messages-search.md) | Search messages across chats (supports keyword, sender, time range filters) with user identity; user-only; filters by chat/sender/attachment/time, supports auto-pagination via `--page-all` / `--page-limit`, enriches results via batched mget and chats batch_query |
114
+ | [`+messages-resources-download`](references/lark-im-messages-resources-download.md) | Download an image or file attached to a message; user/bot |
115
+ | [`+messages-search`](references/lark-im-messages-search.md) | Search messages across chats (supports keyword, sender, time range filters) with user or bot identity; filters by chat/sender/attachment/time, supports auto-pagination via `--page-all` / `--page-limit`, enriches results via batched mget and chats batch_query |
116
116
  | [`+messages-send`](references/lark-im-messages-send.md) | Send a message to a chat or direct message; user/bot; sends to chat-id or user-id with text/markdown/post/media, supports idempotency key |
117
- | [`+threads-messages-list`](references/lark-im-threads-messages-list.md) | List messages in a thread; user/bot; accepts om_/omt_ input, resolves message IDs to thread_id, supports sort/pagination |
117
+ | [`+threads-messages-list`](references/lark-im-threads-messages-list.md) | List messages in a thread; user/bot; accepts om_/omt_ input, resolves message IDs to thread_id, supports --order asc/desc sorting, auto-pagination |
118
118
  | [`+flag-create`](references/lark-im-flag-create.md) | Create a bookmark on a message; user-only; defaults to message-layer flag; use --flag-type feed for feed-layer flag (item_type auto-detected from chat mode) |
119
119
  | [`+flag-cancel`](references/lark-im-flag-cancel.md) | Cancel (remove) a bookmark. When no --flag-type is given, best-effort double-cancel: removes message layer and (when chat_type is determinable) feed layer |
120
120
  | [`+flag-list`](references/lark-im-flag-list.md) | List bookmarks; user-only; auto-enriches feed-type thread entries with message content; `--page-all` is capped by `--page-limit` (default 20, max 1000), and `has_more=true` means the result is incomplete |
@@ -190,7 +190,11 @@ lark-cli im <resource> <method> [flags] # 调用 API
190
190
 
191
191
  ### images
192
192
 
193
- - `create` — 上传图片。Identity: `bot` only (`tenant_access_token`).
193
+ - `create` — 上传图片。Identity: supports `user` and `bot`; user identity requires `im:resource` scope on the UAT.
194
+
195
+ ### files
196
+
197
+ - `create` — 上传文件。Identity: supports `user` and `bot`; user identity requires `im:resource` scope on the UAT.
194
198
 
195
199
  ### pins
196
200
 
@@ -238,6 +242,7 @@ lark-cli im <resource> <method> [flags] # 调用 API
238
242
  | `reactions.list` | `im:message.reactions:read` |
239
243
  | `threads.forward` | `im:message` |
240
244
  | `images.create` | `im:resource` |
245
+ | `files.create` | `im:resource` |
241
246
  | `pins.create` | `im:message.pins:write_only` |
242
247
  | `pins.delete` | `im:message.pins:write_only` |
243
248
  | `pins.list` | `im:message.pins:read` |
@@ -23,6 +23,9 @@ lark-cli im +chat-list --page-size 50
23
23
  # Pagination
24
24
  lark-cli im +chat-list --page-token "xxx"
25
25
 
26
+ # Fetch multiple pages automatically, up to 10 pages by default
27
+ lark-cli im +chat-list --page-all
28
+
26
29
  # Drop muted chats (user identity only)
27
30
  lark-cli im +chat-list --exclude-muted
28
31
 
@@ -50,13 +53,17 @@ lark-cli im +chat-list --as user --types p2p
50
53
  | `--types <strings>` | No | `group`, `p2p` (comma-separated or repeated) | Chat types to include. Omitted = groups only (backward compatible). `p2p` requires user identity (`--as user`); under `--as bot`, `--types=p2p` alone is rejected and `--types=p2p,group` is silently downgraded to `group` |
51
54
  | `--sort <field>` | No | `create_time` (default, ascending), `active_time` (descending) | Result ordering |
52
55
  | `--page-size <n>` | No | 1-100, default 20 | Number of results per page |
53
- | `--page-token <token>` | No | - | Pagination token from the previous response |
56
+ | `--page-token <token>` | No | - | Starting cursor, normally returned by a previous response |
57
+ | `--page-all` | No | - | Automatically fetch and merge subsequent pages; capped by `--page-limit` |
58
+ | `--page-limit <n>` | No | 1-1000, default 10 | Maximum pages fetched by `--page-all` |
54
59
  | `--exclude-muted` | No | User identity only | Drop chats the current user has muted (do-not-disturb). Under `--as bot`, the flag is silently inactive; see "Filtering muted chats" below |
55
60
  | `--format json` | No | - | Output as JSON |
56
61
  | `--dry-run` | No | - | Preview the request without executing it |
57
62
 
58
63
  > **Note:** Supports both `--as user` (default) and `--as bot`. When using bot identity, the app must have bot capability enabled.
59
64
 
65
+ 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
+
60
67
  ## Output Fields
61
68
 
62
69
  | Field | Description |
@@ -156,7 +163,7 @@ done
156
163
 
157
164
  | Symptom | Root Cause | Solution |
158
165
  |---------|---------|---------|
159
- | `--page-size must be an integer between 1 and 100` | page-size is out of range or not an integer | Use an integer between 1 and 100 |
166
+ | `invalid --page-size 101: must be between 1 and 100` | page-size is out of range | Use an integer between 1 and 100 |
160
167
  | Permission denied (99991672) | The bot app does not have `im:chat:read` TAT permission enabled | Enable the permission for the app in the Open Platform console |
161
168
  | Permission denied (99991679) with `--as user` | UAT is not authorized for `im:chat:read` | Run `lark-cli auth login --scope "im:chat:read"` |
162
169
  | `Bot ability is not activated` (232025) | The app does not have bot capability enabled | Enable bot capability in the Open Platform console |
@@ -19,9 +19,12 @@ lark-cli im +chat-members-list --chat-id oc_xxx --member-types user,bot
19
19
  # Walk every page (capped by --page-limit; 0 = unlimited)
20
20
  lark-cli im +chat-members-list --chat-id oc_xxx --page-all --page-limit 0
21
21
 
22
- # Resume from a specific cursor (single page; --page-all is ignored)
22
+ # Fetch one page starting at a specific cursor
23
23
  lark-cli im +chat-members-list --chat-id oc_xxx --page-token "xxx"
24
24
 
25
+ # Continue automatically from a specific cursor
26
+ lark-cli im +chat-members-list --chat-id oc_xxx --page-token "xxx" --page-all
27
+
25
28
  # JSON output / preview the request
26
29
  lark-cli im +chat-members-list --chat-id oc_xxx --format json
27
30
  lark-cli im +chat-members-list --chat-id oc_xxx --dry-run
@@ -35,7 +38,7 @@ lark-cli im +chat-members-list --chat-id oc_xxx --dry-run
35
38
  | `--member-types <strings>` | No | `user`, `bot` (comma-separated or repeated) | Member types to return. Omitted = all |
36
39
  | `--member-id-type <type>` | No | `open_id` (default), `union_id`, `user_id` | ID type for `member_id` in the response |
37
40
  | `--page-size <n>` | No | 1-100, default 20 | Results per page. With `--page-all` and no explicit `--page-size`, the max (100) is used automatically to minimize round-trips |
38
- | `--page-token <token>` | No | - | Pagination cursor; **implies a single-page fetch** (disables auto-pagination) |
41
+ | `--page-token <token>` | No | - | Starting cursor, normally returned by a previous response |
39
42
  | `--page-all` | No | - | Automatically walk every page (capped by `--page-limit`) |
40
43
  | `--page-limit <n>` | No | default 10, `0` = unlimited | Max pages to fetch with `--page-all` |
41
44
  | `--page-delay <ms>` | No | default 200, `0` = no delay | Delay between pages during `--page-all` (throttle to avoid rate limits on large lists) |
@@ -70,7 +73,7 @@ A truncated result is *not* fixable by paging further — it is a server-side ca
70
73
  - With `--page-all` and no explicit `--page-size`, the shortcut uses the maximum page size (100) so a full walk takes the fewest round-trips. An explicit `--page-size` is always honored.
71
74
  - `--page-all` sleeps `--page-delay` ms (default 200) between pages to avoid hammering the API when a tenant has no server-side member cap and the list spans many pages. Set `--page-delay 0` to disable.
72
75
  - `--page-all` stops at `--page-limit` pages (default 10). When it stops early, `has_more` stays `true` so you know the result is incomplete; re-run with `--page-limit 0` for everything.
73
- - `--page-token` and `--page-all` together: `--page-token` wins (single-page fetch from the supplied cursor); a stderr warning is emitted.
76
+ - `--page-token` and `--page-all` together: automatic pagination starts at the supplied cursor and continues until exhaustion or `--page-limit`.
74
77
  - Across pages, `users[]` and `bots[]` are concatenated; `truncations` / `has_more` / `page_token` come from the last page fetched.
75
78
 
76
79
  ## Common Errors and Troubleshooting
@@ -78,6 +81,6 @@ A truncated result is *not* fixable by paging further — it is a server-side ca
78
81
  | Symptom | Root Cause | | Solution |
79
82
  |---------|---------|---|---------|
80
83
  | `--chat-id is required` | `--chat-id` omitted | | Provide the `oc_xxx` chat ID |
81
- | `--page-size must be an integer between 1 and 100` | out of range | | Use 1-100 |
84
+ | `invalid --page-size 101: must be between 1 and 100` | out of range | | Use 1-100 |
82
85
  | `--member-types contains invalid value` | value other than `user`/`bot` | | Use `user`, `bot`, or both |
83
86
  | Permission denied | missing `im:chat.members:read` | | Bot: enable the scope in the console. User: `lark-cli auth login --scope "im:chat.members:read"` |
@@ -29,6 +29,9 @@ lark-cli im +chat-messages-list --chat-id oc_xxx --order asc --page-size 20
29
29
  # Pagination
30
30
  lark-cli im +chat-messages-list --chat-id oc_xxx --page-token "xxx"
31
31
 
32
+ # Fetch multiple pages automatically, up to 10 pages by default
33
+ lark-cli im +chat-messages-list --chat-id oc_xxx --page-all
34
+
32
35
  # JSON output
33
36
  lark-cli im +chat-messages-list --chat-id oc_xxx --format json
34
37
  ```
@@ -43,7 +46,9 @@ lark-cli im +chat-messages-list --chat-id oc_xxx --format json
43
46
  | `--end <time>` | No | End time (ISO 8601 or date only) |
44
47
  | `--order <order>` | No | Sort order: `asc` / `desc` (default `desc`) |
45
48
  | `--page-size <n>` | No | Page size (default 50, max 50) |
46
- | `--page-token <token>` | No | Pagination token |
49
+ | `--page-token <token>` | No | Starting cursor, normally returned by a previous response |
50
+ | `--page-all` | No | Automatically fetch and merge subsequent pages; capped by `--page-limit` |
51
+ | `--page-limit <n>` | No | Maximum pages fetched by `--page-all` (default 10, range 1-1000) |
47
52
  | `--no-reactions` | No | Skip auto-fetching the `reactions` block |
48
53
  | `--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; no extra requests when omitted |
49
54
 
@@ -106,12 +111,14 @@ Each message contains:
106
111
 
107
112
  ## Pagination (`has_more` / `page_token`)
108
113
 
109
- `im +chat-messages-list` returns `has_more` and `page_token` when more data is available. Use `--page-token` to continue:
114
+ By default, `im +chat-messages-list` fetches one page. It returns `has_more` and `page_token` when more data is available. Use `--page-token` to continue:
110
115
 
111
116
  ```bash
112
117
  lark-cli im +chat-messages-list --chat-id oc_xxx --page-token <PAGE_TOKEN>
113
118
  ```
114
119
 
120
+ With `--page-all`, `--page-token` sets the starting cursor. If `meta.pagination.complete=false`, resume from `meta.pagination.next_token` or raise `--page-limit`.
121
+
115
122
  You can also fall back to the generic API:
116
123
 
117
124
  ```bash
@@ -149,7 +156,7 @@ lark-cli api GET /open-apis/im/v1/messages \
149
156
  lark-cli im +chat-search --as bot --query "<chat name keyword>" --format json
150
157
  lark-cli im +chat-messages-list --as bot --chat-id <chat_id> --page-size 50 --format json
151
158
  ```
152
- Do not use `im +messages-search --as bot`; `+messages-search` is user-only. Continue with `--page-token` if `has_more=true`.
159
+ If the request is keyword search across message content, `im +messages-search --as bot` is also supported. Continue with `--page-token` if `has_more=true`.
153
160
 
154
161
  ## References
155
162
 
@@ -33,6 +33,9 @@ lark-cli im +chat-search --query "project" --page-size 10
33
33
  # Pagination
34
34
  lark-cli im +chat-search --query "project" --page-token "xxx"
35
35
 
36
+ # Fetch multiple pages automatically, up to 10 pages by default
37
+ lark-cli im +chat-search --query "project" --page-all
38
+
36
39
  # JSON output
37
40
  lark-cli im +chat-search --query "project" --format json
38
41
 
@@ -52,13 +55,17 @@ lark-cli im +chat-search --query "project" --dry-run
52
55
  | `--disable-search-by-user` | No | - | Disable member-name-based matching and search by group name only |
53
56
  | `--sort <field>` | No | `create_time`, `update_time`, `member_count` | Sort field (always descending) |
54
57
  | `--page-size <n>` | No | 1-100, default 20 | Number of results per page |
55
- | `--page-token <token>` | No | - | Pagination token from the previous response |
58
+ | `--page-token <token>` | No | - | Starting cursor, normally returned by a previous response |
59
+ | `--page-all` | No | - | Automatically fetch and merge subsequent pages; capped by `--page-limit` |
60
+ | `--page-limit <n>` | No | 1-1000, default 10 | Maximum pages fetched by `--page-all` |
56
61
  | `--exclude-muted` | No | User identity only | Drop chats the current user has muted (do-not-disturb). Under `--as bot`, the flag is silently inactive (mute is a per-user setting); see "Filtering muted chats" below |
57
62
  | `--format json` | No | - | Output as JSON |
58
63
  | `--dry-run` | No | - | Preview the request without executing it |
59
64
 
60
65
  > **Note:** Supports both `--as user` (default) and `--as bot`. When using bot identity, the app must have bot capability enabled.
61
66
 
67
+ With `--page-all`, `--page-token` sets the starting cursor. If `meta.pagination.complete=false`, resume from `meta.pagination.next_token` or raise `--page-limit`.
68
+
62
69
  > **CAUTION:** `--sort` is **always descending** — the search API only ranks the chosen field high-to-low (e.g. `member_count` = most members first). There is no ascending option. If the user asks for "fewest first / ascending / 从少到多", tell them the search API does not support ascending order; any low-to-high view requires re-sorting the fetched page client-side and is not an upstream sort. Do **not** invent values like `member_count_asc` or pass `asc` (they are rejected).
63
70
 
64
71
  ## Output Fields
@@ -121,7 +128,7 @@ lark-cli im +messages-send --chat-id "$CHAT_ID" --text "Today's progress update"
121
128
  |---------|---------|---------|
122
129
  | `--query and --member-ids cannot both be empty` | Both were omitted | Provide at least `--query` or `--member-ids` |
123
130
  | Empty results | No visible chats matched the keyword or filters | Relax the keyword or filters and try again |
124
- | `--page-size must be an integer between 1 and 100` | page-size is out of range or not an integer | Use an integer between 1 and 100 |
131
+ | `invalid --page-size 101: must be between 1 and 100` | page-size is out of range | Use an integer between 1 and 100 |
125
132
  | Permission denied (99991672) | The bot app does not have `im:chat:read` TAT permission enabled | Enable the permission for the app in the Open Platform console |
126
133
  | Permission denied (99991679) with `--as user` | UAT is not authorized for `im:chat:read` | Run `lark-cli auth login --scope "im:chat:read"` |
127
134
  | `Bot ability is not activated` (232025) | The app does not have bot capability enabled | Enable bot capability in the Open Platform console |
@@ -34,13 +34,13 @@ lark-cli im +feed-group-list-item --as user --feed-group-id ofg_xxx \
34
34
  |---|---|---|
35
35
  | `--feed-group-id` | Yes | Feed group ID (`ofg_xxx`); path parameter |
36
36
  | `--page-size` | No | Records per page, 1–50 (default 50) |
37
- | `--page-token` | No | Continuation token for a specific page |
37
+ | `--page-token` | No | Starting cursor, normally returned by a previous response |
38
38
  | `--page-all` | No | Auto-paginate and merge all pages |
39
39
  | `--page-limit` | No | Max pages when `--page-all` is set, 1–1000 (default 20) |
40
40
  | `--start-time` | No | Update-time window start (Unix milliseconds as a decimal string) |
41
41
  | `--end-time` | No | Update-time window end (Unix milliseconds as a decimal string) |
42
42
 
43
- When `--page-token` is set explicitly, it wins over `--page-all` (you get exactly that page).
43
+ When `--page-token` and `--page-all` are supplied together, automatic pagination starts at that cursor and continues until exhaustion or `--page-limit`.
44
44
 
45
45
  ## Output
46
46
 
@@ -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`) |
@@ -36,7 +36,7 @@ Use `--download-resources` when you want the binaries on disk in one pass; other
36
36
 
37
37
  ## Scope requirement
38
38
 
39
- The default enrichment requires `im:message.reactions:read`, already declared in each shortcut's `UserScopes` / `BotScopes` (or `Scopes` for the user-only search command), so the framework's pre-flight check surfaces a `missing_scope` error before the request is sent. Bots that were registered before this scope was added need an incremental authorization in the Feishu developer console; users can run:
39
+ The default enrichment requires `im:message.reactions:read`, already declared in each shortcut's `UserScopes` / `BotScopes` (or `Scopes` for the search command), so the framework's pre-flight check surfaces a `missing_scope` error before the request is sent. Bots that were registered before this scope was added need an incremental authorization in the Feishu developer console; users can run:
40
40
 
41
41
  ```bash
42
42
  lark-cli auth login --scope "im:message.reactions:read"
@@ -2,11 +2,11 @@
2
2
 
3
3
  > **Prerequisite:** Read [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) first to understand authentication, global parameters, and safety rules.
4
4
 
5
- Download image or file resources from a message. Supports **automatic chunked download for large files** using HTTP Range requests. Resources are identified by the combination of `message_id` + `file_key`, both of which come directly from message content returned by `im +chat-messages-list`.
5
+ Download an image or file attached to a message. Use the `message_id` and resource key returned by a message-reading command; do not guess or combine identifiers from different messages.
6
6
 
7
7
  > **Note:** read-only message commands render resource keys in message content, but they do not download binaries automatically. Use this command whenever you need to fetch the actual image/file bytes or save them to a specific path.
8
8
 
9
- This skill maps to the shortcut: `lark-cli im +messages-resources-download` (internally calls `GET /open-apis/im/v1/messages/{message_id}/resources/{file_key}`).
9
+ Shortcut: `lark-cli im +messages-resources-download`.
10
10
 
11
11
  ## Commands
12
12
 
@@ -34,27 +34,11 @@ lark-cli im +messages-resources-download --message-id om_xxx --file-key img_v3_x
34
34
  | `--message-id <id>` | Yes | Message ID (`om_xxx` format) |
35
35
  | `--file-key <key>` | Yes | Resource key (`img_xxx` or `file_xxx`) |
36
36
  | `--type <type>` | Yes | Resource type: `image` or `file` |
37
- | `--output <path>` | No | Output path (relative paths only; `..` traversal is not allowed). When omitted, the server's original filename from `Content-Disposition` is used if available; otherwise defaults to `file_key`. File extension is automatically inferred from `Content-Disposition` or `Content-Type` if not provided |
37
+ | `--output <path>` | No | Relative output path; absolute paths and `..` traversal are rejected. When omitted, the command uses the attachment name when available and otherwise falls back to the resource key |
38
38
  | `--as <identity>` | No | Identity type: `user` (default) or `bot` |
39
39
  | `--dry-run` | No | Print the request only, do not execute it |
40
40
 
41
- ## Large File Download (Auto Chunking)
42
-
43
- When downloading large files, the command automatically uses **HTTP Range requests** for reliable chunked downloading:
44
-
45
- | Behavior | Details |
46
- |----------|---------|
47
- | Probe chunk | First 128 KB to detect file size and Content-Type |
48
- | Chunk size | 8 MB per subsequent request |
49
- | Workers | Single-threaded sequential download (ensures reliability) |
50
- | Retries | Up to 2 retries for transient request failures, with exponential backoff |
51
-
52
- **Benefits:**
53
- - Reduces the impact of transient request failures during large downloads
54
- - Preserves the server's original filename via `Content-Disposition` (supports RFC 5987 UTF-8 encoding); falls back to `Content-Type`-based extension inference
55
- - Validates file size integrity after download completion
56
-
57
- ## `file_key` Sources
41
+ ## Choose `--type`
58
42
 
59
43
  Different resource markers in message content correspond to different `file_key` and `type` values:
60
44
 
@@ -65,6 +49,17 @@ Different resource markers in message content correspond to different `file_key`
65
49
  | Audio | `file_xxx` | `file_xxx` | `file` |
66
50
  | Video | `file_xxx` | `file_xxx` | `file` |
67
51
 
52
+ Stickers cannot be downloaded with this command.
53
+
54
+ ## Output
55
+
56
+ On success, read:
57
+
58
+ | Field | Meaning |
59
+ |------|---------|
60
+ | `data.saved_path` | Saved local path |
61
+ | `data.size_bytes` | Saved byte count |
62
+
68
63
  ## Usage Scenario
69
64
 
70
65
  ### Scenario: Extract and download an image from a message
@@ -82,11 +77,10 @@ lark-cli im +messages-resources-download --message-id om_xxx --file-key img_v3_x
82
77
 
83
78
  | Symptom | Root Cause | Solution |
84
79
  |---------|---------|---------|
85
- | Download failed | `file_key` does not match the `message_id` | Make sure the `file_key` came from that message's content |
86
- | Hit error code 234002 or 14005 | No permission, **not** missing API scope | no access to this chat or file was deleted — do not retry, return the error to the user |
87
- | Permission denied | `im:message:readonly` is not authorized | Run `auth login --scope "im:message:readonly"` |
88
- | File size mismatch | Chunked download integrity check failed | Network instability during download; retry the command |
89
- | Content-Range error | Server returned invalid range header | Transient API issue; retry the command |
80
+ | Resource does not match the message | `file_key` and `message_id` came from different messages | Read the message again and use its matching identifiers |
81
+ | Permission denied | `im:message:readonly` is not authorized | For user identity, run `lark-cli auth login --scope "im:message:readonly"`; for bot identity, grant the scope to the app in the developer console |
82
+ | Attachment unavailable | The message or resource is deleted, hidden, restricted, or inaccessible to the caller | Do not retry unchanged; report the exact CLI error |
83
+ | Retryable network error | The transfer did not complete | Retry the same command |
90
84
 
91
85
  ## References
92
86