pi-feishu-cli 0.1.0

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 (407) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/src/bot.d.ts +29 -0
  4. package/dist/src/bot.js +75 -0
  5. package/dist/src/cards.d.ts +6 -0
  6. package/dist/src/cards.js +87 -0
  7. package/dist/src/config.d.ts +3 -0
  8. package/dist/src/config.js +28 -0
  9. package/dist/src/daemon.d.ts +2 -0
  10. package/dist/src/daemon.js +151 -0
  11. package/dist/src/extension.d.ts +2 -0
  12. package/dist/src/extension.js +124 -0
  13. package/dist/src/poller.d.ts +33 -0
  14. package/dist/src/poller.js +94 -0
  15. package/dist/src/renderer.d.ts +8 -0
  16. package/dist/src/renderer.js +31 -0
  17. package/dist/src/session-registry.d.ts +15 -0
  18. package/dist/src/session-registry.js +82 -0
  19. package/dist/src/types.d.ts +25 -0
  20. package/dist/src/types.js +1 -0
  21. package/dist/tests/bot.test.d.ts +1 -0
  22. package/dist/tests/bot.test.js +89 -0
  23. package/dist/tests/cards.test.d.ts +1 -0
  24. package/dist/tests/cards.test.js +39 -0
  25. package/dist/tests/config.test.d.ts +1 -0
  26. package/dist/tests/config.test.js +59 -0
  27. package/dist/tests/renderer.test.d.ts +1 -0
  28. package/dist/tests/renderer.test.js +61 -0
  29. package/dist/tests/session-registry.test.d.ts +1 -0
  30. package/dist/tests/session-registry.test.js +92 -0
  31. package/dist/tests/types.test.d.ts +1 -0
  32. package/dist/tests/types.test.js +30 -0
  33. package/package.json +35 -0
  34. package/skills/lark-approval/SKILL.md +56 -0
  35. package/skills/lark-apps/SKILL.md +92 -0
  36. package/skills/lark-apps/references/lark-apps-access-scope-get.md +104 -0
  37. package/skills/lark-apps/references/lark-apps-access-scope-set.md +126 -0
  38. package/skills/lark-apps/references/lark-apps-create.md +112 -0
  39. package/skills/lark-apps/references/lark-apps-html-publish.md +151 -0
  40. package/skills/lark-apps/references/lark-apps-list.md +95 -0
  41. package/skills/lark-apps/references/lark-apps-update.md +86 -0
  42. package/skills/lark-attendance/SKILL.md +57 -0
  43. package/skills/lark-base/SKILL.md +359 -0
  44. package/skills/lark-base/references/dashboard-block-data-config.md +350 -0
  45. package/skills/lark-base/references/examples.md +140 -0
  46. package/skills/lark-base/references/formula-field-guide.md +737 -0
  47. package/skills/lark-base/references/lark-base-advperm-disable.md +83 -0
  48. package/skills/lark-base/references/lark-base-advperm-enable.md +80 -0
  49. package/skills/lark-base/references/lark-base-base-copy.md +74 -0
  50. package/skills/lark-base/references/lark-base-base-create.md +68 -0
  51. package/skills/lark-base/references/lark-base-base-get.md +39 -0
  52. package/skills/lark-base/references/lark-base-cell-value.md +151 -0
  53. package/skills/lark-base/references/lark-base-dashboard-arrange.md +83 -0
  54. package/skills/lark-base/references/lark-base-dashboard-block-create.md +108 -0
  55. package/skills/lark-base/references/lark-base-dashboard-block-delete.md +46 -0
  56. package/skills/lark-base/references/lark-base-dashboard-block-get.md +57 -0
  57. package/skills/lark-base/references/lark-base-dashboard-block-list.md +53 -0
  58. package/skills/lark-base/references/lark-base-dashboard-block-update.md +84 -0
  59. package/skills/lark-base/references/lark-base-dashboard-create.md +73 -0
  60. package/skills/lark-base/references/lark-base-dashboard-delete.md +44 -0
  61. package/skills/lark-base/references/lark-base-dashboard-get.md +59 -0
  62. package/skills/lark-base/references/lark-base-dashboard-list.md +52 -0
  63. package/skills/lark-base/references/lark-base-dashboard-update.md +69 -0
  64. package/skills/lark-base/references/lark-base-dashboard.md +240 -0
  65. package/skills/lark-base/references/lark-base-data-analysis-sop.md +88 -0
  66. package/skills/lark-base/references/lark-base-data-query.md +375 -0
  67. package/skills/lark-base/references/lark-base-field-create.md +104 -0
  68. package/skills/lark-base/references/lark-base-field-delete.md +51 -0
  69. package/skills/lark-base/references/lark-base-field-get.md +42 -0
  70. package/skills/lark-base/references/lark-base-field-list.md +44 -0
  71. package/skills/lark-base/references/lark-base-field-search-options.md +48 -0
  72. package/skills/lark-base/references/lark-base-field-update.md +97 -0
  73. package/skills/lark-base/references/lark-base-field.md +22 -0
  74. package/skills/lark-base/references/lark-base-form-create.md +87 -0
  75. package/skills/lark-base/references/lark-base-form-delete.md +64 -0
  76. package/skills/lark-base/references/lark-base-form-detail.md +198 -0
  77. package/skills/lark-base/references/lark-base-form-get.md +68 -0
  78. package/skills/lark-base/references/lark-base-form-list.md +73 -0
  79. package/skills/lark-base/references/lark-base-form-questions-create.md +118 -0
  80. package/skills/lark-base/references/lark-base-form-questions-delete.md +68 -0
  81. package/skills/lark-base/references/lark-base-form-questions-list.md +84 -0
  82. package/skills/lark-base/references/lark-base-form-questions-update.md +92 -0
  83. package/skills/lark-base/references/lark-base-form-questions.md +23 -0
  84. package/skills/lark-base/references/lark-base-form-submit.md +171 -0
  85. package/skills/lark-base/references/lark-base-form-update.md +82 -0
  86. package/skills/lark-base/references/lark-base-form.md +25 -0
  87. package/skills/lark-base/references/lark-base-history.md +16 -0
  88. package/skills/lark-base/references/lark-base-record-batch-create.md +58 -0
  89. package/skills/lark-base/references/lark-base-record-batch-update.md +53 -0
  90. package/skills/lark-base/references/lark-base-record-delete.md +62 -0
  91. package/skills/lark-base/references/lark-base-record-history-list.md +86 -0
  92. package/skills/lark-base/references/lark-base-record-share-link-create.md +72 -0
  93. package/skills/lark-base/references/lark-base-record-upsert.md +64 -0
  94. package/skills/lark-base/references/lark-base-record.md +31 -0
  95. package/skills/lark-base/references/lark-base-role-create.md +89 -0
  96. package/skills/lark-base/references/lark-base-role-delete.md +83 -0
  97. package/skills/lark-base/references/lark-base-role-get.md +87 -0
  98. package/skills/lark-base/references/lark-base-role-list.md +81 -0
  99. package/skills/lark-base/references/lark-base-role-update.md +94 -0
  100. package/skills/lark-base/references/lark-base-shortcut-field-properties.md +481 -0
  101. package/skills/lark-base/references/lark-base-table-create.md +62 -0
  102. package/skills/lark-base/references/lark-base-table-delete.md +51 -0
  103. package/skills/lark-base/references/lark-base-table-get.md +46 -0
  104. package/skills/lark-base/references/lark-base-table-list.md +43 -0
  105. package/skills/lark-base/references/lark-base-table-update.md +49 -0
  106. package/skills/lark-base/references/lark-base-table.md +20 -0
  107. package/skills/lark-base/references/lark-base-view-create.md +50 -0
  108. package/skills/lark-base/references/lark-base-view-delete.md +48 -0
  109. package/skills/lark-base/references/lark-base-view-get-card.md +38 -0
  110. package/skills/lark-base/references/lark-base-view-get-filter.md +38 -0
  111. package/skills/lark-base/references/lark-base-view-get-group.md +38 -0
  112. package/skills/lark-base/references/lark-base-view-get-sort.md +38 -0
  113. package/skills/lark-base/references/lark-base-view-get-timebar.md +38 -0
  114. package/skills/lark-base/references/lark-base-view-get-visible-fields.md +28 -0
  115. package/skills/lark-base/references/lark-base-view-get.md +38 -0
  116. package/skills/lark-base/references/lark-base-view-list.md +44 -0
  117. package/skills/lark-base/references/lark-base-view-rename.md +44 -0
  118. package/skills/lark-base/references/lark-base-view-set-card.md +55 -0
  119. package/skills/lark-base/references/lark-base-view-set-filter.md +181 -0
  120. package/skills/lark-base/references/lark-base-view-set-group.md +65 -0
  121. package/skills/lark-base/references/lark-base-view-set-sort.md +63 -0
  122. package/skills/lark-base/references/lark-base-view-set-timebar.md +51 -0
  123. package/skills/lark-base/references/lark-base-view-set-visible-fields.md +46 -0
  124. package/skills/lark-base/references/lark-base-view.md +44 -0
  125. package/skills/lark-base/references/lark-base-workflow-create.md +180 -0
  126. package/skills/lark-base/references/lark-base-workflow-disable.md +94 -0
  127. package/skills/lark-base/references/lark-base-workflow-enable.md +94 -0
  128. package/skills/lark-base/references/lark-base-workflow-get.md +147 -0
  129. package/skills/lark-base/references/lark-base-workflow-guide.md +718 -0
  130. package/skills/lark-base/references/lark-base-workflow-list.md +124 -0
  131. package/skills/lark-base/references/lark-base-workflow-schema.md +935 -0
  132. package/skills/lark-base/references/lark-base-workflow-update.md +167 -0
  133. package/skills/lark-base/references/lark-base-workflow.md +23 -0
  134. package/skills/lark-base/references/lark-base-workspace.md +18 -0
  135. package/skills/lark-base/references/lookup-field-guide.md +512 -0
  136. package/skills/lark-base/references/role-config.md +539 -0
  137. package/skills/lark-calendar/SKILL.md +154 -0
  138. package/skills/lark-calendar/references/lark-calendar-agenda.md +78 -0
  139. package/skills/lark-calendar/references/lark-calendar-create.md +109 -0
  140. package/skills/lark-calendar/references/lark-calendar-freebusy.md +124 -0
  141. package/skills/lark-calendar/references/lark-calendar-room-find.md +113 -0
  142. package/skills/lark-calendar/references/lark-calendar-rsvp.md +42 -0
  143. package/skills/lark-calendar/references/lark-calendar-schedule-meeting.md +265 -0
  144. package/skills/lark-calendar/references/lark-calendar-suggestion.md +125 -0
  145. package/skills/lark-calendar/references/lark-calendar-update.md +105 -0
  146. package/skills/lark-contact/SKILL.md +45 -0
  147. package/skills/lark-contact/references/lark-contact-get-user.md +19 -0
  148. package/skills/lark-contact/references/lark-contact-search-user.md +124 -0
  149. package/skills/lark-doc/SKILL.md +65 -0
  150. package/skills/lark-doc/references/lark-doc-create.md +89 -0
  151. package/skills/lark-doc/references/lark-doc-fetch.md +141 -0
  152. package/skills/lark-doc/references/lark-doc-md.md +71 -0
  153. package/skills/lark-doc/references/lark-doc-media-download.md +50 -0
  154. package/skills/lark-doc/references/lark-doc-media-insert.md +114 -0
  155. package/skills/lark-doc/references/lark-doc-media-preview.md +41 -0
  156. package/skills/lark-doc/references/lark-doc-update.md +252 -0
  157. package/skills/lark-doc/references/lark-doc-whiteboard.md +100 -0
  158. package/skills/lark-doc/references/lark-doc-xml.md +169 -0
  159. package/skills/lark-doc/references/style/lark-doc-create-workflow.md +56 -0
  160. package/skills/lark-doc/references/style/lark-doc-style.md +106 -0
  161. package/skills/lark-doc/references/style/lark-doc-update-workflow.md +54 -0
  162. package/skills/lark-drive/SKILL.md +369 -0
  163. package/skills/lark-drive/references/lark-drive-add-comment.md +182 -0
  164. package/skills/lark-drive/references/lark-drive-apply-permission.md +77 -0
  165. package/skills/lark-drive/references/lark-drive-create-folder.md +73 -0
  166. package/skills/lark-drive/references/lark-drive-create-shortcut.md +103 -0
  167. package/skills/lark-drive/references/lark-drive-delete.md +79 -0
  168. package/skills/lark-drive/references/lark-drive-download.md +31 -0
  169. package/skills/lark-drive/references/lark-drive-export-download.md +50 -0
  170. package/skills/lark-drive/references/lark-drive-export.md +119 -0
  171. package/skills/lark-drive/references/lark-drive-import.md +159 -0
  172. package/skills/lark-drive/references/lark-drive-inspect.md +50 -0
  173. package/skills/lark-drive/references/lark-drive-move.md +120 -0
  174. package/skills/lark-drive/references/lark-drive-pull.md +137 -0
  175. package/skills/lark-drive/references/lark-drive-push.md +162 -0
  176. package/skills/lark-drive/references/lark-drive-reactions.md +113 -0
  177. package/skills/lark-drive/references/lark-drive-search.md +266 -0
  178. package/skills/lark-drive/references/lark-drive-status.md +198 -0
  179. package/skills/lark-drive/references/lark-drive-task-result.md +302 -0
  180. package/skills/lark-drive/references/lark-drive-upload.md +67 -0
  181. package/skills/lark-drive/references/lark-drive-version-delete.md +38 -0
  182. package/skills/lark-drive/references/lark-drive-version-get.md +71 -0
  183. package/skills/lark-drive/references/lark-drive-version-history.md +73 -0
  184. package/skills/lark-drive/references/lark-drive-version-revert.md +198 -0
  185. package/skills/lark-event/SKILL.md +145 -0
  186. package/skills/lark-event/references/lark-event-im.md +86 -0
  187. package/skills/lark-im/SKILL.md +162 -0
  188. package/skills/lark-im/references/lark-im-chat-create.md +162 -0
  189. package/skills/lark-im/references/lark-im-chat-identity.md +55 -0
  190. package/skills/lark-im/references/lark-im-chat-list.md +198 -0
  191. package/skills/lark-im/references/lark-im-chat-messages-list.md +148 -0
  192. package/skills/lark-im/references/lark-im-chat-search.md +136 -0
  193. package/skills/lark-im/references/lark-im-chat-update.md +84 -0
  194. package/skills/lark-im/references/lark-im-flag-cancel.md +198 -0
  195. package/skills/lark-im/references/lark-im-flag-create.md +67 -0
  196. package/skills/lark-im/references/lark-im-flag-list.md +100 -0
  197. package/skills/lark-im/references/lark-im-messages-mget.md +95 -0
  198. package/skills/lark-im/references/lark-im-messages-reply.md +228 -0
  199. package/skills/lark-im/references/lark-im-messages-resources-download.md +94 -0
  200. package/skills/lark-im/references/lark-im-messages-search.md +232 -0
  201. package/skills/lark-im/references/lark-im-messages-send.md +229 -0
  202. package/skills/lark-im/references/lark-im-reactions.md +297 -0
  203. package/skills/lark-im/references/lark-im-threads-messages-list.md +111 -0
  204. package/skills/lark-mail/SKILL.md +648 -0
  205. package/skills/lark-mail/references/lark-mail-decline-receipt.md +115 -0
  206. package/skills/lark-mail/references/lark-mail-draft-create.md +123 -0
  207. package/skills/lark-mail/references/lark-mail-draft-edit.md +400 -0
  208. package/skills/lark-mail/references/lark-mail-forward.md +173 -0
  209. package/skills/lark-mail/references/lark-mail-message.md +230 -0
  210. package/skills/lark-mail/references/lark-mail-messages.md +108 -0
  211. package/skills/lark-mail/references/lark-mail-reply-all.md +206 -0
  212. package/skills/lark-mail/references/lark-mail-reply.md +242 -0
  213. package/skills/lark-mail/references/lark-mail-send-receipt.md +198 -0
  214. package/skills/lark-mail/references/lark-mail-send.md +216 -0
  215. package/skills/lark-mail/references/lark-mail-share-to-chat.md +198 -0
  216. package/skills/lark-mail/references/lark-mail-signature.md +98 -0
  217. package/skills/lark-mail/references/lark-mail-template-create.md +129 -0
  218. package/skills/lark-mail/references/lark-mail-template-update.md +198 -0
  219. package/skills/lark-mail/references/lark-mail-thread.md +111 -0
  220. package/skills/lark-mail/references/lark-mail-triage.md +122 -0
  221. package/skills/lark-mail/references/lark-mail-watch.md +94 -0
  222. package/skills/lark-minutes/SKILL.md +139 -0
  223. package/skills/lark-minutes/references/lark-minutes-download.md +137 -0
  224. package/skills/lark-minutes/references/lark-minutes-search.md +206 -0
  225. package/skills/lark-minutes/references/lark-minutes-upload.md +104 -0
  226. package/skills/lark-okr/SKILL.md +133 -0
  227. package/skills/lark-okr/references/lark-okr-contentblock.md +359 -0
  228. package/skills/lark-okr/references/lark-okr-cycle-detail.md +84 -0
  229. package/skills/lark-okr/references/lark-okr-cycle-list.md +90 -0
  230. package/skills/lark-okr/references/lark-okr-entities.md +329 -0
  231. package/skills/lark-okr/references/lark-okr-image-upload.md +116 -0
  232. package/skills/lark-okr/references/lark-okr-progress-create.md +81 -0
  233. package/skills/lark-okr/references/lark-okr-progress-delete.md +47 -0
  234. package/skills/lark-okr/references/lark-okr-progress-get.md +62 -0
  235. package/skills/lark-okr/references/lark-okr-progress-list.md +80 -0
  236. package/skills/lark-okr/references/lark-okr-progress-update.md +81 -0
  237. package/skills/lark-openapi-explorer/SKILL.md +153 -0
  238. package/skills/lark-shared/SKILL.md +144 -0
  239. package/skills/lark-sheets/SKILL.md +343 -0
  240. package/skills/lark-sheets/references/lark-sheets-cell-data.md +197 -0
  241. package/skills/lark-sheets/references/lark-sheets-cell-images.md +59 -0
  242. package/skills/lark-sheets/references/lark-sheets-cell-style-and-merge.md +141 -0
  243. package/skills/lark-sheets/references/lark-sheets-dropdown.md +133 -0
  244. package/skills/lark-sheets/references/lark-sheets-filter-views.md +193 -0
  245. package/skills/lark-sheets/references/lark-sheets-float-images.md +125 -0
  246. package/skills/lark-sheets/references/lark-sheets-formula.md +88 -0
  247. package/skills/lark-sheets/references/lark-sheets-row-column-management.md +151 -0
  248. package/skills/lark-sheets/references/lark-sheets-sheet-management.md +164 -0
  249. package/skills/lark-sheets/references/lark-sheets-spreadsheet-management.md +140 -0
  250. package/skills/lark-skill-maker/SKILL.md +85 -0
  251. package/skills/lark-slides/SKILL.md +296 -0
  252. package/skills/lark-slides/assets/templates/administration--all_hands_meeting.xml +1999 -0
  253. package/skills/lark-slides/assets/templates/administration--annual_gala.xml +1160 -0
  254. package/skills/lark-slides/assets/templates/administration--company_intro.xml +1376 -0
  255. package/skills/lark-slides/assets/templates/administration--corporate_culture.xml +1765 -0
  256. package/skills/lark-slides/assets/templates/hr--employee_training.xml +912 -0
  257. package/skills/lark-slides/assets/templates/hr--employee_training_workshop.xml +1504 -0
  258. package/skills/lark-slides/assets/templates/hr--onboarding.xml +933 -0
  259. package/skills/lark-slides/assets/templates/marketing--brand_communication.xml +1367 -0
  260. package/skills/lark-slides/assets/templates/marketing--brand_logo_design.xml +1347 -0
  261. package/skills/lark-slides/assets/templates/marketing--brand_operations_plan.xml +1309 -0
  262. package/skills/lark-slides/assets/templates/marketing--business_plan.xml +1646 -0
  263. package/skills/lark-slides/assets/templates/marketing--marketing_plan.xml +198 -0
  264. package/skills/lark-slides/assets/templates/marketing--marketing_strategy.xml +1484 -0
  265. package/skills/lark-slides/assets/templates/marketing--product_whitepaper.xml +198 -0
  266. package/skills/lark-slides/assets/templates/marketing--roadshow_business_plan.xml +1506 -0
  267. package/skills/lark-slides/assets/templates/misc--book_sharing.xml +198 -0
  268. package/skills/lark-slides/assets/templates/misc--club_event_plan.xml +4885 -0
  269. package/skills/lark-slides/assets/templates/misc--student_career_plan.xml +1854 -0
  270. package/skills/lark-slides/assets/templates/office--dark_general.xml +3763 -0
  271. package/skills/lark-slides/assets/templates/office--dept_annual_report.xml +1192 -0
  272. package/skills/lark-slides/assets/templates/office--light_general.xml +3378 -0
  273. package/skills/lark-slides/assets/templates/office--project_kickoff.xml +3152 -0
  274. package/skills/lark-slides/assets/templates/office--quarterly_review.xml +1253 -0
  275. package/skills/lark-slides/assets/templates/office--work_report.xml +1099 -0
  276. package/skills/lark-slides/assets/templates/office--work_summary.xml +4420 -0
  277. package/skills/lark-slides/assets/templates/office--work_summary_report.xml +1523 -0
  278. package/skills/lark-slides/assets/templates/operations--brand_logo_design.xml +1347 -0
  279. package/skills/lark-slides/assets/templates/operations--brand_operations_plan.xml +1309 -0
  280. package/skills/lark-slides/assets/templates/operations--marketing_plan.xml +1469 -0
  281. package/skills/lark-slides/assets/templates/operations--product_promotion.xml +687 -0
  282. package/skills/lark-slides/assets/templates/personal--experience_sharing.xml +2242 -0
  283. package/skills/lark-slides/assets/templates/personal--personal_resume.xml +2047 -0
  284. package/skills/lark-slides/assets/templates/personal--promotion_defense.xml +1099 -0
  285. package/skills/lark-slides/assets/templates/personal--promotion_report.xml +1039 -0
  286. package/skills/lark-slides/assets/templates/personal--self_intro.xml +696 -0
  287. package/skills/lark-slides/assets/templates/personal--teaching_sharing.xml +3013 -0
  288. package/skills/lark-slides/assets/templates/product--business_case_analysis.xml +1341 -0
  289. package/skills/lark-slides/assets/templates/product--market_analysis.xml +898 -0
  290. package/skills/lark-slides/assets/templates/product--product_analysis.xml +1537 -0
  291. package/skills/lark-slides/assets/templates/product--product_intro.xml +2838 -0
  292. package/skills/lark-slides/assets/templates/product--product_promotion.xml +687 -0
  293. package/skills/lark-slides/assets/templates/product--product_promotion_2.xml +198 -0
  294. package/skills/lark-slides/references/asset-planning.md +124 -0
  295. package/skills/lark-slides/references/examples.md +261 -0
  296. package/skills/lark-slides/references/lark-slides-create.md +137 -0
  297. package/skills/lark-slides/references/lark-slides-edit-workflows.md +142 -0
  298. package/skills/lark-slides/references/lark-slides-media-upload.md +128 -0
  299. package/skills/lark-slides/references/lark-slides-replace-slide.md +239 -0
  300. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +220 -0
  301. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +123 -0
  302. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +110 -0
  303. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +186 -0
  304. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +98 -0
  305. package/skills/lark-slides/references/planning-layer.md +219 -0
  306. package/skills/lark-slides/references/slide-templates.md +201 -0
  307. package/skills/lark-slides/references/slides_demo.xml +226 -0
  308. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3004 -0
  309. package/skills/lark-slides/references/template-catalog.md +463 -0
  310. package/skills/lark-slides/references/template-index.json +198 -0
  311. package/skills/lark-slides/references/troubleshooting.md +198 -0
  312. package/skills/lark-slides/references/validation-checklist.md +102 -0
  313. package/skills/lark-slides/references/visual-planning.md +250 -0
  314. package/skills/lark-slides/references/xml-format-guide.md +369 -0
  315. package/skills/lark-slides/references/xml-schema-quick-ref.md +215 -0
  316. package/skills/lark-slides/scripts/template_tool.py +970 -0
  317. package/skills/lark-slides/scripts/template_tool_test.py +177 -0
  318. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +367 -0
  319. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +263 -0
  320. package/skills/lark-task/SKILL.md +165 -0
  321. package/skills/lark-task/references/lark-task-assign.md +38 -0
  322. package/skills/lark-task/references/lark-task-comment.md +28 -0
  323. package/skills/lark-task/references/lark-task-complete.md +27 -0
  324. package/skills/lark-task/references/lark-task-create.md +57 -0
  325. package/skills/lark-task/references/lark-task-followers.md +35 -0
  326. package/skills/lark-task/references/lark-task-get-my-tasks.md +55 -0
  327. package/skills/lark-task/references/lark-task-get-related-tasks.md +53 -0
  328. package/skills/lark-task/references/lark-task-reminder.md +36 -0
  329. package/skills/lark-task/references/lark-task-reopen.md +27 -0
  330. package/skills/lark-task/references/lark-task-search.md +41 -0
  331. package/skills/lark-task/references/lark-task-set-ancestor.md +32 -0
  332. package/skills/lark-task/references/lark-task-subscribe-event.md +86 -0
  333. package/skills/lark-task/references/lark-task-tasklist-create.md +35 -0
  334. package/skills/lark-task/references/lark-task-tasklist-members.md +36 -0
  335. package/skills/lark-task/references/lark-task-tasklist-search.md +38 -0
  336. package/skills/lark-task/references/lark-task-tasklist-task-add.md +38 -0
  337. package/skills/lark-task/references/lark-task-update.md +37 -0
  338. package/skills/lark-task/references/lark-task-upload-attachment.md +59 -0
  339. package/skills/lark-vc/SKILL.md +168 -0
  340. package/skills/lark-vc/references/lark-vc-notes.md +126 -0
  341. package/skills/lark-vc/references/lark-vc-recording.md +153 -0
  342. package/skills/lark-vc/references/lark-vc-search.md +193 -0
  343. package/skills/lark-vc-agent/SKILL.md +121 -0
  344. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +247 -0
  345. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +133 -0
  346. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +111 -0
  347. package/skills/lark-whiteboard/SKILL.md +144 -0
  348. package/skills/lark-whiteboard/references/connectors.md +102 -0
  349. package/skills/lark-whiteboard/references/content.md +40 -0
  350. package/skills/lark-whiteboard/references/image.md +80 -0
  351. package/skills/lark-whiteboard/references/lark-whiteboard-query.md +49 -0
  352. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +100 -0
  353. package/skills/lark-whiteboard/references/layout.md +374 -0
  354. package/skills/lark-whiteboard/references/schema.md +357 -0
  355. package/skills/lark-whiteboard/references/style.md +318 -0
  356. package/skills/lark-whiteboard/references/typography.md +73 -0
  357. package/skills/lark-whiteboard/routes/dsl.md +107 -0
  358. package/skills/lark-whiteboard/routes/mermaid.md +27 -0
  359. package/skills/lark-whiteboard/routes/svg.md +54 -0
  360. package/skills/lark-whiteboard/scenes/architecture.md +433 -0
  361. package/skills/lark-whiteboard/scenes/bar-chart.md +187 -0
  362. package/skills/lark-whiteboard/scenes/comparison.md +135 -0
  363. package/skills/lark-whiteboard/scenes/fishbone.md +238 -0
  364. package/skills/lark-whiteboard/scenes/flowchart.md +198 -0
  365. package/skills/lark-whiteboard/scenes/flywheel.md +195 -0
  366. package/skills/lark-whiteboard/scenes/funnel.md +198 -0
  367. package/skills/lark-whiteboard/scenes/line-chart.md +214 -0
  368. package/skills/lark-whiteboard/scenes/mermaid.md +130 -0
  369. package/skills/lark-whiteboard/scenes/milestone.md +139 -0
  370. package/skills/lark-whiteboard/scenes/organization.md +173 -0
  371. package/skills/lark-whiteboard/scenes/photo-showcase.md +198 -0
  372. package/skills/lark-whiteboard/scenes/pyramid.md +99 -0
  373. package/skills/lark-whiteboard/scenes/swimlane.md +371 -0
  374. package/skills/lark-whiteboard/scenes/treemap.md +198 -0
  375. package/skills/lark-wiki/SKILL.md +119 -0
  376. package/skills/lark-wiki/references/lark-wiki-delete-space.md +205 -0
  377. package/skills/lark-wiki/references/lark-wiki-member-add.md +66 -0
  378. package/skills/lark-wiki/references/lark-wiki-member-list.md +76 -0
  379. package/skills/lark-wiki/references/lark-wiki-member-remove.md +61 -0
  380. package/skills/lark-wiki/references/lark-wiki-move.md +183 -0
  381. package/skills/lark-wiki/references/lark-wiki-node-copy.md +72 -0
  382. package/skills/lark-wiki/references/lark-wiki-node-create.md +127 -0
  383. package/skills/lark-wiki/references/lark-wiki-node-delete.md +62 -0
  384. package/skills/lark-wiki/references/lark-wiki-node-get.md +56 -0
  385. package/skills/lark-wiki/references/lark-wiki-node-list.md +198 -0
  386. package/skills/lark-wiki/references/lark-wiki-space-create.md +46 -0
  387. package/skills/lark-wiki/references/lark-wiki-space-list.md +198 -0
  388. package/skills/lark-workflow-meeting-summary/SKILL.md +104 -0
  389. package/skills/lark-workflow-standup-report/SKILL.md +120 -0
  390. package/skills/mmx-cli/SKILL.md +440 -0
  391. package/src/bot.ts +109 -0
  392. package/src/cards.ts +105 -0
  393. package/src/config.ts +33 -0
  394. package/src/daemon.ts +217 -0
  395. package/src/extension.ts +132 -0
  396. package/src/poller.ts +135 -0
  397. package/src/renderer.ts +47 -0
  398. package/src/session-registry.ts +90 -0
  399. package/src/types.ts +29 -0
  400. package/tests/bot.test.ts +104 -0
  401. package/tests/cards.test.ts +48 -0
  402. package/tests/config.test.ts +59 -0
  403. package/tests/renderer.test.ts +74 -0
  404. package/tests/session-registry.test.ts +94 -0
  405. package/tests/types.test.ts +35 -0
  406. package/tsconfig.json +16 -0
  407. package/vitest.config.ts +7 -0
@@ -0,0 +1,137 @@
1
+
2
+ # slides +create(创建飞书幻灯片)
3
+
4
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
5
+
6
+ 创建一个新的飞书幻灯片演示文稿,可选一步添加页面内容。
7
+
8
+ ## 命令
9
+
10
+ ```bash
11
+ # 创建空白 PPT
12
+ lark-cli slides +create --title "项目汇报"
13
+
14
+ # 创建 PPT + 添加 slide 页面
15
+ lark-cli slides +create --title "项目汇报" --slides '[
16
+ "<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>",
17
+ "<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>"
18
+ ]'
19
+
20
+ # 以应用身份创建(自动授权当前用户)
21
+ lark-cli slides +create --title "项目汇报" --as bot
22
+
23
+ # 预览(不执行)
24
+ lark-cli slides +create --title "项目汇报" --slides '[...]' --dry-run
25
+ ```
26
+
27
+ ## 返回值
28
+
29
+ 工具成功执行后,返回一个 JSON 对象,包含以下字段:
30
+
31
+ - **`xml_presentation_id`**(string):演示文稿的唯一标识符,后续添加页面时需要此 ID
32
+ - **`title`**(string):演示文稿标题
33
+ - **`url`**(string,可选):演示文稿的在线链接,如有返回则务必展示给用户(需要 drive 相关权限;若获取失败则不返回此字段)
34
+ - **`revision_id`**(integer):演示文稿版本号
35
+ - **`slide_ids`**(string[],可选):仅传 `--slides` 时返回,成功添加的页面 ID 列表
36
+ - **`slides_added`**(integer,可选):仅传 `--slides` 时返回,成功添加的页面数量
37
+ - **`images_uploaded`**(integer,可选):仅 `--slides` 中含 `@<本地路径>` 占位符时返回,已上传的去重后图片数量
38
+ - **`permission_grant`**(object,可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限
39
+
40
+ > [!IMPORTANT]
41
+ > 不传 `--slides` 时,`slides +create` 只创建空白演示文稿。创建后需要使用 `xml_presentation.slide create` 逐页添加 slide 内容。
42
+ >
43
+ > 传了 `--slides` 时,CLI 先创建空白演示文稿,再逐页调用 `xml_presentation.slide create` 添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
44
+ >
45
+ > 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
46
+ >
47
+ > 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:
48
+ > - `status = granted`:当前 CLI 用户已获得该演示文稿的可管理权限
49
+ > - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权
50
+ > - `status = failed`:演示文稿已创建成功,但自动授权用户失败
51
+ >
52
+ > **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
53
+
54
+ ## 参数
55
+
56
+ | 参数 | 必填 | 说明 |
57
+ |------|------|------|
58
+ | `--title` | 否 | 演示文稿标题(不传则默认 "Untitled") |
59
+ | `--slides` | 否 | slide 内容 JSON 数组,每个元素是一个 `<slide>` XML 字符串(最多 10 个;超过 10 页请先用 `+create` 创建空白 PPT,再用 `xml_presentation.slide create` 逐页添加) |
60
+
61
+ ## `--slides` 参数格式
62
+
63
+ ```json
64
+ [
65
+ "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第1页XML...</slide>",
66
+ "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...第2页XML...</slide>"
67
+ ]
68
+ ```
69
+
70
+ JSON string 数组,每个元素是一页 slide 的完整 XML。CLI 内部负责包装成 API 所需的 `{"slide": {"content": "..."}}` 格式并逐页调用。
71
+
72
+ ### 本地图片:`@<path>` 占位符
73
+
74
+ `<img>` 元素的 `src` 属性如果以 `@` 开头,CLI 会把它当作本地文件路径,自动上传到当前演示文稿,并把占位符替换为返回的 `file_token`。
75
+
76
+ ```bash
77
+ lark-cli slides +create --as user --title "图测试" --slides '[
78
+ "<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>"
79
+ ]'
80
+ ```
81
+
82
+ 行为:
83
+
84
+ - 路径相对于**当前工作目录**(CWD)解析;**必须是 CWD 内的相对路径**(如 `./pic.png`、`./assets/x.png`)
85
+ - 同一份图被多次引用时**只上传一次**(按路径去重)
86
+ - `src` 不以 `@` 开头的会原样保留,但**只允许写 `slides +media-upload` 拿到的 `file_token`**;**禁止写 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 通常显示破图。要用网图必须先下载到 CWD 内、再走上传流程
87
+ - 单张图片最大 20 MB(slides upload API 不支持分片上传)
88
+ - 校验阶段就会检查所有占位符文件存在及大小;缺文件或超限直接报错,不会创建空白 PPT 占位
89
+ - 创空白 PPT → 上传所有图 → 替换 token → 逐页创建 slide,按这个顺序执行
90
+
91
+ > [!IMPORTANT]
92
+ > **路径必须在 CWD 内**:`@/abs/path/x.png` 或 `@../up/x.png` 这种会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
93
+
94
+ ### 给已有 PPT 加带图新页
95
+
96
+ `+create --slides` 只在新建 PPT 时使用 `@` 占位符。给已有 PPT 加带图新页要分两步(CLI 没封装这个组合):
97
+
98
+ ```bash
99
+ # 1) 上传图片
100
+ TOKEN=$(lark-cli slides +media-upload --as user \
101
+ --file ./pic.png --presentation $PRES_ID | jq -r .data.file_token)
102
+
103
+ # 2) 用返回的 file_token 创建带图新页
104
+ lark-cli slides xml_presentation.slide create --as user \
105
+ --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
106
+ --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>\"}}"
107
+ ```
108
+
109
+ ## 创建后续步骤
110
+
111
+ 如果没有使用 `--slides`,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
112
+
113
+ ```bash
114
+ # 第 1 步:创建空白 PPT
115
+ PRES_ID=$(lark-cli slides +create --title "项目汇报" | jq -r '.data.xml_presentation_id')
116
+
117
+ # 第 2 步:添加页面(使用返回的 xml_presentation_id)
118
+ lark-cli slides xml_presentation.slide create --as user \
119
+ --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
120
+ --data '{
121
+ "slide": {
122
+ "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...</slide>"
123
+ }
124
+ }'
125
+ ```
126
+
127
+ ## 常见错误
128
+
129
+ | 错误码 | 含义 | 解决方案 |
130
+ |--------|------|----------|
131
+ | 400 | 参数错误 | 检查参数格式是否正确 |
132
+ | 403 | 权限不足 | 检查是否拥有 `slides:presentation:create` 和 `slides:presentation:write_only` scope |
133
+
134
+ ## 相关命令
135
+
136
+ - [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 添加幻灯片页面
137
+ - [xml_presentations get](lark-slides-xml-presentations-get.md) — 读取 PPT 内容
@@ -0,0 +1,142 @@
1
+ # 编辑已有 PPT:读-改-写闭环
2
+
3
+ 编辑走 **shortcut [`+replace-slide`](lark-slides-replace-slide.md)**(块级替换 / 插入),配合 `xml_presentation.slide.get` 读原页拿 `block_id`。
4
+
5
+ > 生成 XML 前**必读** [xml-schema-quick-ref.md](xml-schema-quick-ref.md)。
6
+
7
+ ## 决策树:block_replace vs block_insert
8
+
9
+ | 需求 | 推荐 action | 理由 |
10
+ |------|------------|------|
11
+ | 已知某块的 `block_id`,要换这块内容(改标题、换图、挪坐标) | `block_replace` | 精准替换,原子性好;`replacement` 根 `id` 由 CLI 自动注入为 `block_id` |
12
+ | 只加 1~N 个元素、不动现有布局 | `block_insert` | 新增不覆盖,可选 `insert_before_block_id` 指定位置 |
13
+ | 一次动多个元素(如:换标题 + 加图) | 单次 `--parts` 里拼多条 | 整批作为原子事务,任一失败整批不生效;`block_replace` 和 `block_insert` 可混用 |
14
+
15
+ > **没有字段级 patch**:即便只想改一个 `shape` 的 `topLeftX`,也得把整个块的新 XML 写出来用 `block_replace`。这不是"微调",是块级重写。
16
+
17
+ ## 最小读-改-写闭环
18
+
19
+ ```bash
20
+ PID="xml_presentation_id_here"
21
+ SID="slide_id_here"
22
+
23
+ # 1. 读原页,从 XML 里挑出要改的块的 3 位 short id(如 bUn / bab)
24
+ lark-cli slides xml_presentation.slide get --as user \
25
+ --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}"
26
+
27
+ # 2. 用 +replace-slide 直接改那个块(不需要搬原 XML)
28
+ lark-cli slides +replace-slide --as user \
29
+ --presentation "$PID" --slide-id "$SID" \
30
+ --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
31
+ ```
32
+
33
+ `slide_id` / 页序不会变。`block_replace` 的 `replacement` 根元素 `id` 会自动注入为 `block_id`,用户手写 XML 时不需要自己加。
34
+
35
+ ## `revision_id` 参数
36
+
37
+ `--revision-id` 默认 `-1`,表示基于当前最新版执行。传具体版本号时,服务端以该版本为 base 应用变更:
38
+
39
+ ```bash
40
+ # 读时拿当前 revision_id
41
+ REV=$(lark-cli slides xml_presentation.slide get --as user \
42
+ --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
43
+ | jq '.data.revision_id')
44
+
45
+ # 写时传该版本号,服务端以此为 base
46
+ lark-cli slides +replace-slide --as user \
47
+ --presentation "$PID" --slide-id "$SID" --revision-id "$REV" \
48
+ --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"rect\" topLeftX=\"100\" topLeftY=\"100\" width=\"200\" height=\"100\"/>"}]'
49
+ ```
50
+
51
+ 注意:传不存在的版本号(超过当前 revision)会返回 3350002 not found;不确定时用 `-1` 即可。
52
+
53
+ ## `--tid` 事务锁
54
+
55
+ 跨请求的并发事务 ID,多人协作长事务才用得上。**单人单次调用留空**即可。
56
+
57
+ ## 两种 action 详解
58
+
59
+ ### block_replace — 整块替换
60
+
61
+ 适合"已知块 ID,要换这块整体内容"的场景。`replacement` 根元素的 `id="<block_id>"` 由 CLI 自动注入(用户手写的 XML 如果没带 `id` 直接省略即可;如果带了错的会被覆盖为正确值)。
62
+
63
+ ```bash
64
+ lark-cli slides +replace-slide --as user \
65
+ --presentation "$PID" --slide-id "$SID" \
66
+ --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>"}]'
67
+ ```
68
+
69
+ 字段说明:
70
+
71
+ | 字段 | 必填 | 说明 |
72
+ |------|------|------|
73
+ | `action` | 是 | 固定为 `block_replace` |
74
+ | `block_id` | 是 | 目标块的 3 位 short element ID(从 `slide.get` 返回的 XML 里读)|
75
+ | `replacement` | 是 | 新 XML 片段;根元素 `id` 会被 CLI 自动注入为 `block_id` |
76
+
77
+ ### block_insert — 整块插入
78
+
79
+ 适合"只想加一个元素,不动现有元素"的场景(典型:给已有页加图)。
80
+
81
+ ```bash
82
+ lark-cli slides +replace-slide --as user \
83
+ --presentation "$PID" --slide-id "$SID" \
84
+ --parts "$(jq -n --arg token "$FILE_TOKEN" \
85
+ '[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>"),insert_before_block_id:"baa"}]')"
86
+ ```
87
+
88
+ 字段说明:
89
+
90
+ | 字段 | 必填 | 说明 |
91
+ |------|------|------|
92
+ | `action` | 是 | 固定为 `block_insert` |
93
+ | `insertion` | 是 | 要插入的完整 XML 片段 |
94
+ | `insert_before_block_id` | 否 | 插到这个块之前;省略(不提供此字段)则追加到页面末尾 |
95
+
96
+ > **`<img>` 必须用 `file_token`**,不能用外链 URL——先 `slides +media-upload --file ./pic.png --presentation $PID` 拿 token。
97
+
98
+ ### 批量 parts
99
+
100
+ 一次 `--parts` 最多 200 条,按数组顺序串行执行。`block_replace` 和 `block_insert` 可以在同一批次混用。举例:一次性把标题块替换、然后在末尾追加一个装饰图。
101
+
102
+ ```bash
103
+ lark-cli slides +replace-slide --as user \
104
+ --presentation "$PID" --slide-id "$SID" \
105
+ --parts '[
106
+ {"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>"},
107
+ {"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
108
+ ]'
109
+ ```
110
+
111
+ 整批作为原子事务:任一条失败整批不生效。失败时后端通常返回 3350001;若响应中带 `failed_part_index` / `failed_reason` 字段,shortcut 会原样透传。
112
+
113
+ ## 大 --parts 用 jq 或 stdin 组装
114
+
115
+ `--parts` 支持 `@file`(读文件)和 `-`(stdin)作为值来源,适合批量 XML 场景:
116
+
117
+ ```bash
118
+ # 从文件读
119
+ lark-cli slides +replace-slide --as user --presentation "$PID" --slide-id "$SID" \
120
+ --parts @parts.json
121
+
122
+ # 从 stdin 读
123
+ cat parts.json | lark-cli slides +replace-slide --as user --presentation "$PID" --slide-id "$SID" \
124
+ --parts -
125
+ ```
126
+
127
+ ## 错误排查
128
+
129
+ | 现象 | 原因 | 对策 |
130
+ |------|------|------|
131
+ | 3350001,hint 含 "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新 `slide.get` 拿最新 XML,按里面的 short ID 再填 |
132
+ | 3350002 not found | `--revision-id` 传了不存在的版本号 | 用 `-1` 或实际存在的 `revision_id` |
133
+ | `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 `+media-upload` 拿到的 `file_token` |
134
+ | 3350001(block_replace 返回) | 正常情况下 CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,确认 `block_id` 在当前页存在(重新 `slide.get`),检查 XML 结构是否合法;坐标是否超出 960×540 范围 | — |
135
+
136
+ ## 相关文档
137
+
138
+ - [lark-slides-replace-slide.md](lark-slides-replace-slide.md) — +replace-slide shortcut 参数详情
139
+ - [lark-slides-xml-presentation-slide-get.md](lark-slides-xml-presentation-slide-get.md) — slide.get 参考(拿 `block_id` / `revision_id`)
140
+ - [lark-slides-xml-presentation-slide-replace.md](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考(一般直接用 shortcut 即可)
141
+ - [lark-slides-media-upload.md](lark-slides-media-upload.md) — 上传图片拿 file_token
142
+ - [xml-schema-quick-ref.md](xml-schema-quick-ref.md) — XML 元素和属性速查
@@ -0,0 +1,128 @@
1
+
2
+ # slides +media-upload(上传本地图片到飞书幻灯片)
3
+
4
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
5
+
6
+ 把本地图片上传到指定演示文稿的 drive 媒体库,返回 `file_token`。**返回的 token 作为 `<img src="...">` 的值塞进 slide XML 即可显示图片。**
7
+
8
+ ## 命令
9
+
10
+ ```bash
11
+ # 直接传 xml_presentation_id
12
+ lark-cli slides +media-upload --as user \
13
+ --file ./pic.png \
14
+ --presentation slidesXXXXXXXXXXXXXXXXXXXXXX
15
+
16
+ # 传 slides URL 也行
17
+ lark-cli slides +media-upload --as user \
18
+ --file ./chart.png \
19
+ --presentation "https://xxx.feishu.cn/slides/slidesXXXXXXXXXXXXXXXXXXXXXX"
20
+
21
+ # 传 wiki URL(CLI 自动 wiki.spaces.get_node 解析为真实 token,校验 obj_type=slides)
22
+ lark-cli slides +media-upload --as user \
23
+ --file ./pic.png \
24
+ --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX"
25
+
26
+ # 预览(不实际上传)
27
+ lark-cli slides +media-upload --file ./pic.png --presentation $PRES_ID --dry-run
28
+ ```
29
+
30
+ ## 返回值
31
+
32
+ ```json
33
+ {
34
+ "file_token": "boxcnXXXXXXXXXXXXXXXXXXXXXX",
35
+ "file_name": "pic.png",
36
+ "size": 12345,
37
+ "presentation_id": "slidesXXXXXXXXXXXXXXXXXXXXXX"
38
+ }
39
+ ```
40
+
41
+ - **`file_token`**:把它写进 `<img src="...">`
42
+ - **`file_name` / `size`**:上传文件元信息
43
+ - **`presentation_id`**:解析后的真实 `xml_presentation_id`(wiki URL 解析后会变化)
44
+
45
+ ## 参数
46
+
47
+ | 参数 | 必填 | 说明 |
48
+ |------|------|------|
49
+ | `--file` | 是 | 本地图片路径,**必须是 CWD 内的相对路径**(如 `./pic.png`)。**最大 20 MB**(slides upload API 不支持分片上传) |
50
+ | `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
51
+
52
+ > [!IMPORTANT]
53
+ > **路径必须在 CWD 内**:`--file /abs/path/x.png` 或 `--file ../up/x.png` 会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
54
+
55
+ ## 使用流程
56
+
57
+ ### 给已有 PPT 加带图新页
58
+
59
+ ```bash
60
+ # 1) 上传图片
61
+ TOKEN=$(lark-cli slides +media-upload --as user \
62
+ --file ./pic.png \
63
+ --presentation $PRES_ID | jq -r .data.file_token)
64
+
65
+ # 2) 用 file_token 创建带图新页
66
+ lark-cli slides xml_presentation.slide create --as user \
67
+ --params "{\"xml_presentation_id\":\"$PRES_ID\"}" \
68
+ --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>\"}}"
69
+ ```
70
+
71
+ ### 新建带图 PPT(推荐用 `+create --slides` 的 `@` 占位符,一步到位)
72
+
73
+ ```bash
74
+ # 不需要单独 +media-upload,写 src="@<本地路径>" 即可
75
+ lark-cli slides +create --as user --title "图测试" --slides '[
76
+ "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><img src=\"@./pic.png\" topLeftX=\"100\" topLeftY=\"100\" width=\"320\" height=\"180\"/></data></slide>"
77
+ ]'
78
+ ```
79
+
80
+ 详见 [+create 文档](lark-slides-create.md#本地图片path-占位符)。
81
+
82
+ ### 给已有 PPT 的已有页加图
83
+
84
+ 拿到 `file_token` 后走 [`+replace-slide`](lark-slides-replace-slide.md) 的 `block_insert`,不用搬原 XML、不改 `slide_id`、不打乱页序:
85
+
86
+ ```bash
87
+ PRES_ID=xxx
88
+ SID=yyy # 要加图的那一页
89
+
90
+ # 1) 上传图片拿 file_token
91
+ TOKEN=$(lark-cli slides +media-upload --as user \
92
+ --file ./pic.png --presentation $PRES_ID | jq -r '.data.file_token')
93
+
94
+ # 2) block_insert 到页末(或用 insert_before_block_id 指定插入位置)
95
+ lark-cli slides +replace-slide --as user \
96
+ --presentation "$PRES_ID" --slide-id "$SID" \
97
+ --parts "$(jq -n --arg token "$TOKEN" \
98
+ '[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>")}]')"
99
+ ```
100
+
101
+ 注意事项:
102
+
103
+ 1. **`<img>` 坐标避开现有元素** —— 先读现有元素 bbox 挑空白区;空间不够就先用 `block_replace` 挪动/缩小现有元素后再放图
104
+ 2. **`<img>` 的 `width:height` 对齐原图比例** —— 比例不一致会被裁剪,参见 [xml-schema-quick-ref.md](xml-schema-quick-ref.md) `<img>` 说明
105
+
106
+ ## 工作原理
107
+
108
+ `+media-upload` 内部调用 `POST /open-apis/drive/v1/medias/upload_all`(单次上传,最大 20 MB),固定使用:
109
+
110
+ - `parent_type=slide_file`(slides 后端唯一接受的取值,已实测验证)
111
+ - `parent_node=<xml_presentation_id>`
112
+
113
+ **不要尝试用 `slides_image`、`slide_image` 等 parent_type**——后端会返回 1061001 / 1061002 错误。这是 slides 的特殊约定。
114
+
115
+ ## 常见错误
116
+
117
+ | 错误码 | 含义 | 解决方案 |
118
+ |--------|------|----------|
119
+ | 1061002 | params error / 不支持的 parent_type | 不要用原生 API 自己拼 parent_type;用 `+media-upload` 即可 |
120
+ | 1061004 | forbidden:当前身份对该演示文稿无编辑权限 | 确认当前身份(user 或 bot)对目标 PPT 有编辑权限。bot 模式常见原因:PPT 不是该 bot 创建的——可用 `+create --as bot` 新建,或以 user 身份给 bot 授权 `lark-cli drive permission.members create --as user ...` |
121
+ | 1061044 | parent node not exist | `--presentation` 给的 token 不对,或不是 slides 类型 |
122
+ | 403 | 权限不足 | 检查 `docs:document.media:upload` scope;wiki URL 还需要 `wiki:node:read` |
123
+
124
+ ## 相关命令
125
+
126
+ - [+create](lark-slides-create.md) — 新建 PPT(支持 `@` 占位符自动上传图片)
127
+ - [+replace-slide](lark-slides-replace-slide.md) — 给已有页加图 / 换图(`block_insert` / `block_replace`)
128
+ - [xml_presentation.slide create](lark-slides-xml-presentation-slide-create.md) — 创建 slide 页面(拿到 file_token 后塞进 XML)
@@ -0,0 +1,239 @@
1
+ # slides +replace-slide(块级替换 / 插入)
2
+
3
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ 对指定 slide 做块级替换或插入。编辑已有 PPT 的主路径——`slide_id` 不变、页序不动、只影响被指定的块。
6
+
7
+ 相比直接调 `xml_presentation.slide.replace`,这个 shortcut 的四个额外价值:
8
+
9
+ 1. `--presentation` 接受 `xml_presentation_id` / `/slides/` URL / `/wiki/` URL(wiki 自动解析);
10
+ 2. `block_replace` 的 `replacement` 根元素 `id="<block_id>"` 由 CLI 自动注入——底层 API 的硬约束(不注入返回 3350001);直接调原生 API 需自己加,用 Shortcut 则自动注入;
11
+ 3. `<shape>` 元素缺少 `<content/>` 子元素时由 CLI 自动注入——SML 2.0 schema 要求每个 `<shape>` 必须有 `<content/>` 子元素,缺失同样触发 3350001;自闭合的 `<shape .../>` 也会被自动展开为 `<shape ...><content/></shape>`;
12
+ 4. 3350001 错误时提供上下文感知的 hint,帮助 AI agent 和用户快速定位原因。
13
+
14
+ ## 命令
15
+
16
+ ```bash
17
+ # block_insert:在页末追加一个新元素
18
+ lark-cli slides +replace-slide --as user \
19
+ --presentation slidesXXXXXXXXXXXXXXXXXXXXXX \
20
+ --slide-id pfG \
21
+ --parts '[{"action":"block_insert","insertion":"<shape type=\"rect\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"100\"/>"}]'
22
+
23
+ # block_replace:已知某块 id,整块替换(replacement 根 id 自动注入为 bUn)
24
+ lark-cli slides +replace-slide --as user \
25
+ --presentation slidesXXXXXXXXXXXXXXXXXXXXXX \
26
+ --slide-id pfG \
27
+ --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
28
+
29
+ # 大 --parts 走文件或 stdin(auto-gen 命令不支持 @file,但 shortcut 支持)
30
+ lark-cli slides +replace-slide --as user \
31
+ --presentation $PID --slide-id $SID --parts @parts.json
32
+ cat parts.json | lark-cli slides +replace-slide --as user \
33
+ --presentation $PID --slide-id $SID --parts -
34
+
35
+ # wiki URL 直接传(CLI 自动 get_node → 拿真实 xml_presentation_id)
36
+ lark-cli slides +replace-slide --as user \
37
+ --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" --slide-id pfG \
38
+ --parts '[{"action":"block_insert","insertion":"<shape type=\"rect\" width=\"100\" height=\"100\"/>"}]'
39
+
40
+ # 预览(不实际调用)
41
+ lark-cli slides +replace-slide --as user \
42
+ --presentation $PID --slide-id $SID --parts "$PARTS" --dry-run
43
+ ```
44
+
45
+ ## 参数
46
+
47
+ | 参数 | 必填 | 说明 |
48
+ |------|------|------|
49
+ | `--presentation` | 是 | `xml_presentation_id`、`/slides/<token>` URL,或 `/wiki/<token>` URL |
50
+ | `--slide-id` | 是 | 页面 ID(`xml_presentation.slide.get` / `xml_presentations.get` 都能拿到) |
51
+ | `--parts` | 是 | JSON 数组(`[{...}, ...]`),单次最多 200 条。支持 `@<file>` 和 `-`(stdin)读取 |
52
+ | `--revision-id` | 否 | 基础版本号;默认 `-1` 表示基于最新版执行;传具体版本号时,服务端以该版本为 base 执行;**传不存在的版本号(超过当前 revision)返回 3350002** |
53
+ | `--tid` | 否 | 并发事务 ID;多人协作长事务才用,单次单人调用留空 |
54
+
55
+ ## parts 元素结构
56
+
57
+ > **限制**:最多 200 条;`block_replace` 和 `block_insert` 可以在同一批次混用。**其他 action(含 `str_replace`)CLI 会直接报错拒绝**。
58
+
59
+ 每条 part 按 `action` 取不同字段:
60
+
61
+ ### action = `block_replace`
62
+
63
+ | 字段 | 必填 | 说明 |
64
+ |------|------|------|
65
+ | `action` | 是 | `"block_replace"` |
66
+ | `block_id` | 是 | 目标块的 3 位 short element ID(从 `slide.get` 返回 XML 里读) |
67
+ | `replacement` | 是 | 新 XML 片段;**根元素 `id` 会被 CLI 自动注入为 `block_id`**,用户不用自己加(如果已经加了且不一致会被覆盖为正确值) |
68
+
69
+ ### action = `block_insert`
70
+
71
+ | 字段 | 必填 | 说明 |
72
+ |------|------|------|
73
+ | `action` | 是 | `"block_insert"` |
74
+ | `insertion` | 是 | 要插入的 XML 片段 |
75
+ | `insert_before_block_id` | 否 | 插到这个块之前;省略(不提供此字段)则追加到页末 |
76
+
77
+ ## 合法根元素速查
78
+
79
+ `block_replace.replacement` 和 `block_insert.insertion` 必须以 SML 2.0 定义的合法元素为根。完整权威定义看 [`slides_xml_schema_definition.xml`](slides_xml_schema_definition.xml);这里只列能作为**根**的类型 + 每种类型的最小可工作片段。
80
+
81
+ | 元素 | 用途 | 关键点 |
82
+ |---|---|---|
83
+ | `<shape>` | 矩形/椭圆/三角/文本框等所有形状 | `type` 必填;`<content/>` 缺失时 CLI 会自动注入 |
84
+ | `<line>` | 直线 | 需 `startX/startY/endX/endY` |
85
+ | `<polyline>` | 折线 | `points` 读回时被服务端规整丢弃(几何已入库) |
86
+ | `<img>` | 图片 | `src` 必须是 [`+media-upload`](lark-slides-media-upload.md) 返回的 `file_token`,不能是 URL |
87
+ | `<icon>` | 图标 | `iconType` 取自 iconpark 资源 |
88
+ | `<table>` | 表格 | 整表替换会**重建内部 td id**,旧 td block_id 立即失效 |
89
+ | `<td>` | 单元格局部替换 | 只能 `block_replace`,不能 `block_insert`;`block_id` 必须是最新 `slide.get` 拿到的 td id |
90
+ | `<chart>` | 图表(line/bar/column/pie/area/radar/combo) | 必须嵌 `<chartPlotArea>` + `<chartData>` + `<dim1>/<dim2>/<chartField>` |
91
+
92
+ **不可作为根元素**:
93
+
94
+ - `<video>` / `<audio>` / `<whiteboard>` —— SML 2.0 没有这三个原生元素;`<undefined type="video|audio|whiteboard">` 是**导出时**的占位符(服务端遇到不支持的类型时用它代替),**不能写入**。尝试 insert/replace 都会返回 3350001。
95
+
96
+ ### 最小 XML 片段(JSON 嵌入时记得把 `"` 转义成 `\"`)
97
+
98
+ `<shape>`(文本框;`type` 还可选 `rect`/`ellipse`/`triangle`/`custom` 等):
99
+ ```xml
100
+ <shape type="text" topLeftX="80" topLeftY="80" width="800" height="120">
101
+ <content textType="title"><p>标题</p></content>
102
+ </shape>
103
+ ```
104
+
105
+ `<img>`:
106
+ ```xml
107
+ <img src="{file_token}" topLeftX="600" topLeftY="20" width="80" height="80"/>
108
+ ```
109
+
110
+ `<polyline>`:
111
+ ```xml
112
+ <polyline topLeftX="10" topLeftY="10" width="100" height="50" points="0,0 50,50 100,0"/>
113
+ ```
114
+
115
+ `<table>`(2×2):
116
+ ```xml
117
+ <table topLeftX="30" topLeftY="80">
118
+ <colgroup><col span="2" width="110"/></colgroup>
119
+ <tr><td><content><p>A</p></content></td><td><content><p>B</p></content></td></tr>
120
+ <tr><td><content><p>C</p></content></td><td><content><p>D</p></content></td></tr>
121
+ </table>
122
+ ```
123
+
124
+ `<td>`(`block_replace` 单元格;`block_id` 必须是最新 `slide.get` 拿到的 td id):
125
+ ```xml
126
+ <td><content><p>新内容</p></content></td>
127
+ ```
128
+
129
+ `<chart>`(`type` 改成 `bar`/`column`/`pie`/`area`/`radar`/`combo` 切换图型):
130
+ ```xml
131
+ <chart topLeftX="30" topLeftY="300" width="300" height="200">
132
+ <chartPlotArea><chartPlot type="line"/></chartPlotArea>
133
+ <chartData>
134
+ <dim1><chartField name="x" valueType="string">Q1,Q2,Q3,Q4</chartField></dim1>
135
+ <dim2><chartField name="Sales" valueType="number">10,20,15,30</chartField></dim2>
136
+ </chartData>
137
+ </chart>
138
+ ```
139
+
140
+ ## 返回值
141
+
142
+ ```json
143
+ {
144
+ "xml_presentation_id": "slidesXXXXXXXXXXXXXXXXXXXXXX",
145
+ "slide_id": "pfG",
146
+ "parts_count": 1,
147
+ "revision_id": 102
148
+ }
149
+ ```
150
+
151
+ | 字段 | 说明 |
152
+ |------|------|
153
+ | `xml_presentation_id` | 解析后的真实 token(wiki URL 解析后会变化) |
154
+ | `slide_id` | 与入参一致 |
155
+ | `parts_count` | 本次提交的 parts 条数 |
156
+ | `revision_id` | 成功后的新版本号,下次做乐观锁时用 |
157
+ | `failed_part_index` | 有部分失败时存在,指向第几条 part 失败 |
158
+ | `failed_reason` | 失败原因文字描述 |
159
+
160
+ 整批作为原子事务:任一 part 失败则整批不生效,服务端通过 `failed_part_index` / `failed_reason` 告诉你是哪条;按此定位修正后重发。
161
+
162
+ ## 使用流程
163
+
164
+ ### 给已有页加图(典型场景)
165
+
166
+ ```bash
167
+ PID=xxx
168
+ SID=yyy
169
+
170
+ # 1) 上传图片
171
+ TOKEN=$(lark-cli slides +media-upload --as user \
172
+ --file ./pic.png --presentation "$PID" | jq -r '.data.file_token')
173
+
174
+ # 2) block_insert 到页末
175
+ lark-cli slides +replace-slide --as user \
176
+ --presentation "$PID" --slide-id "$SID" \
177
+ --parts "$(jq -n --arg token "$TOKEN" \
178
+ '[{action:"block_insert",insertion:("<img src=\""+$token+"\" topLeftX=\"500\" topLeftY=\"100\" width=\"200\" height=\"150\"/>")}]')"
179
+ ```
180
+
181
+ ### 改标题(block_replace)
182
+
183
+ ```bash
184
+ # 先拿原页 XML,从里面找到标题块的 3 位 short id(如 bUn)
185
+ lark-cli slides xml_presentation.slide get --as user \
186
+ --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}"
187
+
188
+ # block_replace 换掉整个标题块(id 自动注入)
189
+ lark-cli slides +replace-slide --as user \
190
+ --presentation "$PID" --slide-id "$SID" \
191
+ --parts '[{"action":"block_replace","block_id":"bUn","replacement":"<shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新标题</p></content></shape>"}]'
192
+ ```
193
+
194
+ ### 批量:一次换标题 + 追加装饰图
195
+
196
+ `block_replace` 和 `block_insert` 可以在同一个 `--parts` 里混用,整批原子执行。
197
+
198
+ ```bash
199
+ lark-cli slides +replace-slide --as user \
200
+ --presentation "$PID" --slide-id "$SID" \
201
+ --parts '[
202
+ {"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>"},
203
+ {"action":"block_insert","insertion":"<img src=\"<file_token>\" topLeftX=\"700\" topLeftY=\"400\" width=\"180\" height=\"100\"/>"}
204
+ ]'
205
+ ```
206
+
207
+ ### 乐观锁
208
+
209
+ ```bash
210
+ # 读时记录 revision_id
211
+ REV=$(lark-cli slides xml_presentation.slide get --as user \
212
+ --params "{\"xml_presentation_id\":\"$PID\",\"slide_id\":\"$SID\"}" \
213
+ | jq '.data.revision_id')
214
+
215
+ # 写时传 --revision-id;传不存在的版本号(超过当前 revision)返回 3350002
216
+ lark-cli slides +replace-slide --as user \
217
+ --presentation "$PID" --slide-id "$SID" --revision-id "$REV" \
218
+ --parts "$PARTS"
219
+ ```
220
+
221
+ ## 常见错误
222
+
223
+ | 现象 | 原因 | 对策 |
224
+ |------|------|------|
225
+ | 3350001 + hint "block_id not found" | `parts[i].block_id` 在当前页不存在 | 重新 `slide.get` 拿最新 XML,按里面的 short ID 再填 |
226
+ | 3350002 not found | `--revision-id` 传了不存在的版本号(超过当前 revision) | 用 `-1` 或用 `slide.get` 拿到的有效 `revision_id` |
227
+ | `--parts[i] action "str_replace" is not supported` | CLI 不暴露 `str_replace` | 把替换需求改写成 `block_replace` / `block_insert` |
228
+ | `--parts contains N items, exceeds maximum of 200` | 一次提交 parts 太多 | 拆多次调用 |
229
+ | `--parts[i] (block_replace) requires non-empty block_id` / `replacement` | 字段缺失 | 按 parts 元素结构补齐 |
230
+ | `<img>` 不显示 / 显示破图 | `src` 写了外链 URL | 换成通过 [`+media-upload`](lark-slides-media-upload.md) 拿到的 `file_token` |
231
+ | 3350001 | `replacement` 不是合法单根 XML 片段,或 `block_id` 不存在 | CLI 已自动注入 `id` 和 `<content/>`;如果仍报错,重新 `slide.get` 拿最新 XML 确认 `block_id` 存在;检查 XML 结构是否合法;坐标是否超出 960×540 |
232
+ | 403 | 权限不足 | 需要 `slides:presentation:update` 或 `slides:presentation:write_only`;wiki URL 还需要 `wiki:node:read` |
233
+
234
+ ## 相关命令
235
+
236
+ - [xml_presentation.slide get](lark-slides-xml-presentation-slide-get.md) — 读原页拿 `block_id` / `revision_id`
237
+ - [xml_presentation.slide replace](lark-slides-xml-presentation-slide-replace.md) — 底层 replace API 参考
238
+ - [+media-upload](lark-slides-media-upload.md) — 上传图片拿 `file_token`
239
+ - [lark-slides-edit-workflows.md](lark-slides-edit-workflows.md) — 读-改-写闭环 + 决策树