@amaster.ai/pi-lark 0.1.8 → 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 (116) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +2 -0
  3. package/skills/lark-apps/references/lark-apps-db.md +130 -2
  4. package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
  5. package/skills/lark-base/SKILL.md +155 -167
  6. package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
  7. package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
  8. package/skills/lark-base/references/lark-base-app.md +225 -0
  9. package/skills/lark-base/references/lark-base-cell-value.md +26 -19
  10. package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +37 -5
  11. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +1 -1
  12. package/skills/lark-base/references/lark-base-dashboard.md +9 -9
  13. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
  14. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
  15. package/skills/lark-base/references/lark-base-data-query.md +8 -11
  16. package/skills/lark-base/references/lark-base-field-create.md +7 -50
  17. package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
  18. package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
  19. package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +15 -100
  20. package/skills/lark-base/references/lark-base-field-update.md +13 -51
  21. package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
  22. package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
  23. package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
  24. package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
  25. package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
  26. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  27. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  28. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  29. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  30. package/skills/lark-calendar/SKILL.md +2 -0
  31. package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
  32. package/skills/lark-doc/SKILL.md +3 -3
  33. package/skills/lark-doc/references/lark-doc-fetch.md +8 -3
  34. package/skills/lark-doc/references/lark-doc-update.md +12 -8
  35. package/skills/lark-drive/SKILL.md +5 -3
  36. package/skills/lark-drive/references/lark-drive-download.md +27 -1
  37. package/skills/lark-drive/references/lark-drive-export.md +1 -0
  38. package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
  39. package/skills/lark-drive/references/lark-drive-preview.md +21 -2
  40. package/skills/lark-drive/references/lark-drive-push.md +5 -1
  41. package/skills/lark-drive/references/lark-drive-search.md +2 -0
  42. package/skills/lark-im/SKILL.md +6 -1
  43. package/skills/lark-minutes/SKILL.md +11 -5
  44. package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
  45. package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
  46. package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
  47. package/skills/lark-note/SKILL.md +13 -9
  48. package/skills/lark-note/references/lark-note-detail.md +5 -2
  49. package/skills/lark-note/references/lark-note-transcript.md +2 -0
  50. package/skills/lark-shared/SKILL.md +36 -0
  51. package/skills/lark-slides/SKILL.md +54 -54
  52. package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
  53. package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
  54. package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
  55. package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
  56. package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
  57. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
  58. package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
  59. package/skills/lark-slides/references/{lark-slides-update-slide.md → cli/lark-slides-update-slide.md} +21 -4
  60. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
  61. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
  62. package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
  63. package/skills/lark-slides/references/iconpark-index.json +5 -41901
  64. package/skills/lark-slides/references/iconpark.md +3 -44
  65. package/skills/lark-slides/references/lark-slides-add-slide.md +3 -90
  66. package/skills/lark-slides/references/lark-slides-create.md +3 -174
  67. package/skills/lark-slides/references/lark-slides-delete-slide.md +3 -63
  68. package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -141
  69. package/skills/lark-slides/references/lark-slides-history.md +3 -130
  70. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -102
  71. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
  72. package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -256
  73. package/skills/lark-slides/references/lark-slides-screenshot.md +3 -113
  74. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
  75. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
  76. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -155
  77. package/skills/lark-slides/references/planning-layer.md +1 -1
  78. package/skills/lark-slides/references/slides_chart_demo.xml +5 -1415
  79. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3512
  80. package/skills/lark-slides/references/troubleshooting.md +3 -60
  81. package/skills/lark-slides/references/validation-checklist.md +3 -154
  82. package/skills/lark-slides/references/workflow/error-handling.md +62 -0
  83. package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
  84. package/skills/lark-slides/references/workflow/template-editing.md +85 -0
  85. package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
  86. package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
  87. package/skills/lark-slides/references/xml/iconpark.md +46 -0
  88. package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
  89. package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3514 -0
  90. package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
  91. package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -495
  92. package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
  93. package/skills/lark-slides/scripts/xml_lint.py +2989 -0
  94. package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
  95. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2975
  96. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -4712
  97. package/skills/lark-task/SKILL.md +12 -0
  98. package/skills/lark-task/references/lark-task-create.md +3 -1
  99. package/skills/lark-vc/SKILL.md +15 -5
  100. package/skills/lark-vc/references/lark-vc-detail.md +11 -6
  101. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
  102. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
  103. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
  104. package/skills/lark-vc/references/lark-vc-recording.md +8 -6
  105. package/skills/lark-vc/references/vc-domain-boundaries.md +8 -1
  106. package/skills/lark-vc-agent/SKILL.md +24 -9
  107. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
  108. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
  109. package/skills/lark-wiki/SKILL.md +3 -1
  110. package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
  111. package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
  112. package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
  113. package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
  114. package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
  115. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -69
  116. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
@@ -10,7 +10,9 @@ metadata:
10
10
 
11
11
  # note (v1)
12
12
 
13
- 身份:仅使用 `--as user`。使用前阅读 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)。
13
+ 身份:`+detail` 支持 `--as user` / `--as bot`;`+transcript` 仅支持 `--as user`。`note_id` 若由某个身份取得(例如 `vc +detail --as bot`),`+detail` 必须显式沿用同一个 `--as`——不要依赖 profile 默认身份。完整身份延续规则见 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),使用前必读。
14
+
15
+ `+detail` 返回的 `note_doc_token` / `verbatim_doc_token` / `shared_doc_tokens` 交给 [lark-doc](../lark-doc/SKILL.md) 读正文时,仍要显式带上同一个 `--as`。lark-doc 对普通文档推荐 `--as user`,**不覆盖这些纪要文档 token 的来源身份**。
14
16
 
15
17
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-vc/references/vc-domain-boundaries.md`](../lark-vc/references/vc-domain-boundaries.md)**,不读将导致命令使用、会议产物决策、领域边界职责判断错误:
16
18
  > 1. 了解日历 & VC、会议产物 & 文档的关联关系和职责划分
@@ -36,13 +38,15 @@ Note 域只接受显式 `note_id`:用户直接提供,或 `docs +fetch` 返
36
38
 
37
39
  | `note +detail` 结果 | 用户要逐字稿 / 原始记录时 |
38
40
  |------|---------------|
39
- | `normal` + `verbatim_doc_token` 非空 | `docs +fetch --doc <verbatim_doc_token>` |
41
+ | `normal` + `verbatim_doc_token` 非空 | `docs +fetch --doc <verbatim_doc_token>`(沿用 `+detail` 用的身份) |
40
42
  | `unknown` + `verbatim_doc_token` 非空 | 先按独立文档处理;不要猜成 unified |
41
43
  | `unknown` + 无逐字稿 token | 停止重试并说明无法确定逐字稿入口 |
42
- | `unified` | `note +transcript --note-id <note_id>` |
44
+ | `unified` | `note +transcript --note-id <note_id>`(仅支持 `--as user`) |
43
45
 
44
46
  判别键是 `note_display_type`,不是 `verbatim_doc_token` 是否为空:unified 纪要也可能返回非空 `verbatim_doc_token`。
45
47
 
48
+ > **bot + unified 的边界**:`+transcript` 目前仅支持 `--as user`。如果 `+detail --as bot` 返回 `unified`,不要静默切到 `--as user` 继续——先停下来向用户说明"该纪要逐字稿只能以 user 身份读取",只有用户明确同意才切换身份重试。
49
+
46
50
  ## 关键字段
47
51
 
48
52
  - `note_id`:Note 域唯一入口。
@@ -83,12 +87,12 @@ Note 域只接受显式 `note_id`:用户直接提供,或 `docs +fetch` 返
83
87
  3. 获取到文档 Token 后,可使用 `docs +fetch` 读取文档内容,或使用 `drive metas batch_query` 获取文档元信息。
84
88
 
85
89
  ```bash
86
- # 1. 从会议获取 note_id
87
- lark-cli vc +detail --meeting-ids <meeting_id>
90
+ # 1. 从会议获取 note_id(这里以 bot 身份为例)
91
+ lark-cli vc +detail --meeting-ids <meeting_id> --as bot
88
92
 
89
- # 2. 用 note_id 拿文档 Token
90
- lark-cli note +detail --note-id <note_id>
93
+ # 2. 用 note_id 拿文档 Token;沿用第 1 步的身份,不要省略 --as
94
+ lark-cli note +detail --note-id <note_id> --as bot
91
95
 
92
- # 3. 读取纪要文档内容
93
- lark-cli docs +fetch --doc <note_doc_token> --doc-format markdown
96
+ # 3. 读取纪要文档内容;同样沿用第 1 步的身份
97
+ lark-cli docs +fetch --doc <note_doc_token> --doc-format markdown --as bot
94
98
  ```
@@ -1,11 +1,12 @@
1
1
  # note +detail
2
2
 
3
- 通过 `note_id` 查询会议纪要详情,获取下挂文档 Token(AI 智能纪要、逐字稿、会中共享文档)。只读,仅支持 `--as user`。
3
+ 通过 `note_id` 查询会议纪要详情,获取下挂文档 Token(AI 智能纪要、逐字稿、会中共享文档)。只读,支持 `--as user` / `--as bot`。bot 身份下能否读到数据取决于应用对纪要主文档是否有 view 权限。
4
4
 
5
5
  ## 命令
6
6
 
7
7
  ```bash
8
8
  lark-cli note +detail --note-id <note_id>
9
+ lark-cli note +detail --note-id <note_id> --as bot
9
10
  ```
10
11
 
11
12
  ## `note_id` 来源
@@ -21,6 +22,8 @@ lark-cli note +detail --note-id <note_id>
21
22
  | `note_doc_token` | 读纪要正文 / 总结 / 待办 / 章节:`docs +fetch --doc <note_doc_token>` |
22
23
  | `note_display_type=normal` + `verbatim_doc_token` | 读逐字稿:`docs +fetch --doc <verbatim_doc_token>` |
23
24
  | `note_display_type=unknown` + `verbatim_doc_token` | 先按普通独立逐字稿文档读取;不要猜成 unified |
24
- | `note_display_type=unified` | 读逐字稿 / 原始记录:转 [`note +transcript`](lark-note-transcript.md) |
25
+ | `note_display_type=unified` | 读逐字稿 / 原始记录:转 [`note +transcript`](lark-note-transcript.md)(仅支持 `--as user`) |
25
26
 
26
27
  判别键是 `note_display_type`。即使 unified 纪要返回了非空 `verbatim_doc_token`,逐字稿仍按 unified 路由。
28
+
29
+ > **bot + unified 的边界**:如果本命令用 `--as bot` 拿到 `note_display_type=unified`,`note +transcript` 只支持 `--as user`,不能直接沿用 bot 身份。停下来向用户说明这个边界,只有用户明确同意才切到 `--as user` 继续,不要静默切换身份。
@@ -2,6 +2,8 @@
2
2
 
3
3
  只在 `note +detail` 已确认 `note_display_type=unified` 时使用。普通纪要逐字稿是独立 Docx 文档,应回到 [lark-doc](../../lark-doc/SKILL.md) 读取 `verbatim_doc_token`。
4
4
 
5
+ 只支持 `--as user`,不支持 `--as bot`。如果 `note +detail --as bot` 返回 `unified`,不要在这里静默省略 `--as` 或改用 user 身份继续——先停下来向用户说明"该纪要逐字稿只能以 user 身份读取",只有用户明确同意才切换身份重试。
6
+
5
7
  ```bash
6
8
  lark-cli note +transcript --note-id NOTE_ID
7
9
  ```
@@ -64,6 +64,32 @@ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 lark-cli a
64
64
  - **User 权限**:后台开通 scope + 用户通过 `auth login` 授权,两层都要满足
65
65
 
66
66
 
67
+ ### 身份延续(跨命令工作流)
68
+
69
+ 身份是**整个工作流的状态**,不是单条命令的局部参数。CLI 不会在进程之间继承"上一步用的身份"——省略 `--as` 不代表"保持当前身份",而是把身份选择交回下面这条优先级链:
70
+
71
+ ```text
72
+ 显式 --as > profile default-as > credential auto-detect
73
+ ```
74
+
75
+ 因此,只要用户显式选择了身份,或某个 ID / Token 是通过某个身份取得的(例如 `vc +detail --as bot` 返回的 `note_id`),**后续每一条消费该 ID/Token 的命令都必须显式带上相同的 `--as`**,跨 skill 传递也不例外:
76
+
77
+ - 禁止依赖 profile 默认身份让后续命令"自动"沿用同一身份。
78
+ - 禁止仅仅因为遇到权限错误就切换身份去绕过它——先如实报告,只有用户明确同意才切换。
79
+ - 下游命令根本不支持来源身份时(如 `--as bot` 拿到的 `note_id` 指向 `note_display_type=unified`,而 `note +transcript` 仅支持 `--as user`),停止并向用户说明这个边界,不要静默省略 `--as` 把身份交给默认值。
80
+ - 命令支持的精确身份以 `<command> --help` / `schema` 为准;各 skill 的身份小节只标注会影响路由决策的例外,不重复维护完整矩阵。
81
+
82
+ ```bash
83
+ # GOOD — note_id 来自 bot 链路,下一步显式沿用 bot
84
+ lark-cli vc +detail --meeting-ids <meeting_id> --as bot
85
+ lark-cli note +detail --note-id <note_id> --as bot
86
+ lark-cli docs +fetch --doc <note_doc_token> --as bot
87
+
88
+ # BAD — 省略 --as,身份可能被 profile 默认值悄悄换成 user
89
+ lark-cli vc +detail --meeting-ids <meeting_id> --as bot
90
+ lark-cli note +detail --note-id <note_id>
91
+ ```
92
+
67
93
  ### 权限不足处理
68
94
 
69
95
  遇到权限相关错误时,**根据当前身份类型采取不同解决方案**。
@@ -73,6 +99,16 @@ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 lark-cli a
73
99
  - `console_url`:飞书开发者后台的权限配置链接
74
100
  - `hint`:建议的修复命令
75
101
 
102
+ **missing_scope 与资源 ACL(无权访问某具体资源)是两类不同问题**,恢复方式也不同:
103
+
104
+ | 失败类型 | user | bot |
105
+ |---------|---------|---------|
106
+ | missing scope(应用/用户完全没有这个权限) | `auth login --scope ...` | 使用错误中的 `console_url` 去开发者后台开通,**禁止** `auth login` |
107
+ | 资源 ACL(有 scope,但对这一条具体资源没有访问权限) | 请求资源所有者给当前用户授权 | 请求资源所有者给当前应用/bot 授权 |
108
+ | 资源在当前身份下不可见 | 保持当前身份,如实报告不可见,不要切换身份重试 | 保持当前身份,如实报告不可见,不要切换身份重试 |
109
+
110
+ 任何权限恢复完成后,都必须用**触发错误时的原身份**重试,不要在恢复过程中换成另一个身份。
111
+
76
112
  #### Bot 身份(`--as bot`)
77
113
 
78
114
  将错误中的 `console_url` 原样提供给用户,引导去后台开通 scope。**禁止**对 bot 执行 `auth login`。
@@ -38,8 +38,8 @@ metadata:
38
38
  - `<td>` 直接子元素只有 `<fill>`(背景)、`<content>`(文字)和边框配置(一般不用),不能嵌套 `<shape>`、`<img>`、`<icon>`。
39
39
  - `<shape type="rect">` 只是形状不是容器,`<icon>`、`<img>`、`<shape type="text">` 和其他 `<shape>` 必须与它平级靠坐标叠放。
40
40
  - 填充渐变颜色必须用 `<fill><fillColor color="linear-gradient(135deg, rgba(R,G,B,A) 0%, rgba(R,G,B,A) 100%)"/></fill>`。
41
- - 编辑页面前必须阅读 [`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)。
42
- - 绘制图表前必须阅读 [`slides_chart_demo.xml`](references/slides_chart_demo.xml)。
41
+ - 编辑页面前必须阅读 [`workflow/slides-editing.md`](references/workflow/slides-editing.md)。
42
+ - 绘制图表前必须阅读 [`xml/slides_chart_demo.xml`](references/xml/slides_chart_demo.xml)。
43
43
  - 当用户要求无损复述历史上下文时,必须无损复述以上权威经验、必读的技能文档(需要重新阅读)和易错元素语法(尤其是 `<table>` 和 `<chart>`)。
44
44
 
45
45
  ## 豆包设计原则
@@ -79,26 +79,26 @@ metadata:
79
79
 
80
80
  | 用户需求 | 优先动作 | 关键文档 / 命令 |
81
81
  |----------|----------|-----------------|
82
- | 新建 PPT | 先规划 `slide_plan.json`,再按页数选择一步或两步创建 | `planning-layer.md`、`visual-planning.md`、`asset-planning.md`、`lark-slides-create.md`、`slides +create`、`slides +add-slide`、`lark-slides-add-slide.md`(两步创建逐页添加) |
83
- | 用户要求使用模板,或提供 PPTX 文件要求修改、美化 | 将模板导入为 Slides 再编辑 | `lark-slides-pptx-template-workflows.md` |
84
- | 编辑单个标题、文本块、图片或局部元素 | 块级替换/插入,**只动点名的 block,同页其他元素不受影响**;不改页序 | `slides +replace-slide`、`lark-slides-replace-slide.md` |
82
+ | 新建 PPT | 先规划 `slide_plan.json`,再按页数选择一步或两步创建 | `planning-layer.md`、`visual-planning.md`、`asset-planning.md`、`cli/lark-slides-create.md`、`slides +create`、`slides +add-slide`、`cli/lark-slides-add-slide.md`(两步创建逐页添加) |
83
+ | 用户要求使用模板,或提供 PPTX 文件要求修改、美化 | 将模板导入为 Slides 再编辑 | `workflow/template-editing.md` |
84
+ | 编辑单个标题、文本块、图片或局部元素 | 块级替换/插入,**只动点名的 block,同页其他元素不受影响**;不改页序 | `slides +replace-slide`、`cli/lark-slides-replace-slide.md` |
85
85
  | 一页改动很多(批量字体/配色)、要改页面背景、要删掉若干元素 | 整页覆盖,`slide_id` 和页序不变;带原 `id` 写回的元素保留 id,不带 `id` 的会作为新元素插入并拿到新 id;**代价是没写进 `--content` 的元素会被删除,所以改个别元素不要用它** | `slides +update-slide`、`lark-slides-update-slide.md` |
86
- | 给已有 PPT 追加或插入页面 | 一次一页,`--slide` 支持 `@file` 绕开 shell 转义 | `slides +add-slide`、`lark-slides-add-slide.md` |
87
- | 删除页面 | 按 `slide_id` 单页删除,删前先回读确认 | `slides +delete-slide`、`lark-slides-delete-slide.md` |
88
- | 读取或分析已有 PPT | 解析 slides/wiki token,用 shortcut 回读全文 XML 或读取单页 XML,保存 `xml_presentation_id`、`slide_id`、`revision_id` | `slides +xml-get`、`xml_presentation.slide.get`、`lark-slides-xml-presentations-get.md` |
89
- | 查看或回滚历史版本 | 先用 `+history-list` 找 `history_version_id`,再 `+history-revert`,必要时 `+history-revert-status` 轮询 | [`lark-slides-history.md`](references/lark-slides-history.md) |
90
- | 获取幻灯片页面截图 | 按页码用 `--slide-number`,按 ID 用 `--slide-id`;单张用 `--output`,批量或全量用 `--output-dir`,每批最多 10 页串行执行;截图目录复用同一任务的 deck/task 标识,后续读取返回的实际路径 | `slides +screenshot`、`lark-slides-screenshot.md` |
91
- | 上传或使用图片 | 先上传为 `file_token`,禁止直接写 http(s) 外链 | `slides +media-upload`、`lark-slides-media-upload.md`,或 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符 |
92
- | 绘制图表 | 原生图表(柱状、条形、折线、面积、饼(环)、雷达、组合图)用 `<chart>`,其他(漏斗图、金字塔图、象限图、矩阵图等)用 `<shape>` + `<line>` 模拟 | `xml-schema-quick-ref.md`、`slides_chart_demo.xml` |
93
- | 绘制表格 | 优先用 `rect` 和 `text` 模拟,其他用 `<table>` | `xml-schema-quick-ref.md` |
94
- | 使用图标 | 禁止盲猜 iconType,必须先检索 IconPark,再写 `<icon iconType="...">`,图标必须填充颜色并和背景有足够对比,禁止使用 emoji 图标 | `iconpark_tool.py search → resolve`、`iconpark.md` |
95
- | 创建失败、空白页、3350001、布局异常 | 先回读状态,再按排障清单修复,不假设原操作原子成功 | `troubleshooting.md`、`validation-checklist.md` |
86
+ | 给已有 PPT 追加或插入页面 | 一次一页,`--slide` 支持 `@file` 绕开 shell 转义 | `slides +add-slide`、`cli/lark-slides-add-slide.md` |
87
+ | 删除页面 | 按 `slide_id` 单页删除,删前先回读确认 | `slides +delete-slide`、`cli/lark-slides-delete-slide.md` |
88
+ | 读取或分析已有 PPT | 解析 slides/wiki token,用 shortcut 回读全文 XML 或读取单页 XML,保存 `xml_presentation_id`、`slide_id`、`revision_id` | `slides +xml-get`、`xml_presentation.slide.get`、`cli/lark-slides-xml-presentations-get.md` |
89
+ | 查看或回滚历史版本 | 先用 `+history-list` 找 `history_version_id`,再 `+history-revert`,必要时 `+history-revert-status` 轮询 | [`cli/lark-slides-history.md`](references/cli/lark-slides-history.md) |
90
+ | 获取幻灯片页面截图 | 按页码用 `--slide-number`,按 ID 用 `--slide-id`;单张用 `--output`,批量或全量用 `--output-dir`,每批最多 10 页串行执行;截图目录复用同一任务的 deck/task 标识,后续读取返回的实际路径 | `slides +screenshot`、`cli/lark-slides-screenshot.md` |
91
+ | 上传或使用图片 | 先上传为 `file_token`,禁止直接写 http(s) 外链 | `slides +media-upload`、`cli/lark-slides-media-upload.md`,或 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符 |
92
+ | 绘制图表 | 原生图表(柱状、条形、折线、面积、饼(环)、雷达、组合图)用 `<chart>`,其他(漏斗图、金字塔图、象限图、矩阵图等)用 `<shape>` + `<line>` 模拟 | `xml/xml-schema-quick-ref.md`、`xml/slides_chart_demo.xml` |
93
+ | 绘制表格 | 优先用 `rect` 和 `text` 模拟,其他用 `<table>` | `xml/xml-schema-quick-ref.md` |
94
+ | 使用图标 | 禁止盲猜 iconType,必须先检索 IconPark,再写 `<icon iconType="...">`,图标必须填充颜色并和背景有足够对比,禁止使用 emoji 图标 | `iconpark_tool.py search → resolve`、`xml/iconpark.md` |
95
+ | 创建失败、空白页、3350001、布局异常 | 先回读状态,再按排障清单修复,不假设原操作原子成功 | `workflow/error-handling.md`、`workflow/validation-xml.md` |
96
96
 
97
97
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),认证、权限和全局参数均以 lark-shared 为准。**
98
98
 
99
- **CRITICAL — 查看或回滚历史版本前,MUST 先读取 [`lark-slides-history.md`](references/lark-slides-history.md)。回滚接口只接受 `history_version_id`,不要把 `revision_id` 直接传给 `+history-revert`。**
99
+ **CRITICAL — 查看或回滚历史版本前,MUST 先读取 [`cli/lark-slides-history.md`](references/cli/lark-slides-history.md)。回滚接口只接受 `history_version_id`,不要把 `revision_id` 直接传给 `+history-revert`。**
100
100
 
101
- **CRITICAL — 生成任何 XML 之前,MUST 先用 Read 工具读取 [xml-schema-quick-ref.md](references/xml-schema-quick-ref.md),禁止凭记忆猜测 XML 结构。**
101
+ **CRITICAL — 生成任何 XML 之前,MUST 先用 Read 工具读取 [xml/xml-schema-quick-ref.md](references/xml/xml-schema-quick-ref.md),禁止凭记忆猜测 XML 结构。**
102
102
 
103
103
  **CRITICAL — 新建演示文稿或大幅改写页面时,MUST 先生成 `.lark-slides/plan/<deck-or-task-id>/slide_plan.json`,再生成 XML。先创建对应目录,规划层规则和中间产物生命周期见 [planning-layer.md](references/planning-layer.md)。仅替换一个标题、插入一个块等小型已有页编辑可豁免。**
104
104
 
@@ -106,15 +106,15 @@ metadata:
106
106
 
107
107
  **CRITICAL — 新建演示文稿或大幅改写页面时,规划 `asset_need` MUST 遵循 [asset-planning.md](references/asset-planning.md):只做元数据规划,必须有 `fallback_if_missing`,不得要求真实搜索、下载或上传素材。**
108
108
 
109
- **CRITICAL — 将完整 `<slide>` XML 提交给 `slides +create`、`slides +add-slide` 或 `slides +update-slide` 之前,MUST 先把待提交 XML 保存到本地文件并运行唯一版式准出入口 [`scripts/xml_text_overlap_lint.py`](scripts/xml_text_overlap_lint.py);`summary.error_count` 必须为 0 才能调用接口。**
109
+ **CRITICAL — 将完整 `<slide>` XML 提交给 `slides +create`、`slides +add-slide` 或 `slides +update-slide` 之前,MUST 先把待提交 XML 保存到本地文件并运行唯一版式准出入口 [`scripts/xml_lint.py`](scripts/xml_lint.py);`summary.error_count` 必须为 0 才能调用接口。**
110
110
 
111
- **CRITICAL — 创建、大幅改写或每次通过 `slides +update-slide` 整页写回后,MUST 按 [validation-checklist.md](references/validation-checklist.md) 做显式验证:回读全文 XML、核对页数和关键元素,并使用 [`scripts/xml_text_overlap_lint.py`](scripts/xml_text_overlap_lint.py) 统一检查 XML、越界、重叠、空白页和内容稀疏风险。**
111
+ **CRITICAL — 创建、大幅改写或整页写回后,MUST 按 [workflow/validation-xml.md](references/workflow/validation-xml.md) 做显式验证:回读全文 XML、核对页数和关键元素,并使用 [`scripts/xml_lint.py`](scripts/xml_lint.py) 统一检查 XML、越界、重叠、空白页和内容稀疏风险。**
112
112
 
113
- **CRITICAL — 创建前自检或失败排障时,MUST 按 [troubleshooting.md](references/troubleshooting.md) 检查 XML 转义、结构、shell 截断、图片 token、3350001 和布局风险。**
113
+ **CRITICAL — 创建前自检或失败排障时,MUST 按 [workflow/error-handling.md](references/workflow/error-handling.md) 检查 XML 转义、结构、shell 截断、图片 token、3350001 和布局风险。**
114
114
 
115
- **编辑已有幻灯片页面**:单个标题、文本块、图片或局部元素优先用 [`+replace-slide`](references/lark-slides-replace-slide.md)(块级替换/插入,不动页序);一页里改动很多(例如批量换字体)、要改背景、或要删掉若干元素时用 [`+update-slide`](references/lark-slides-update-slide.md) 整页覆盖(`slide_id` 和页序不变,但没写进 `--content` 的元素会被删除);**多页大改就对每一页各跑一次 `+update-slide`**。选择 action 和完整读-改-写流程见 [`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)。
115
+ **编辑已有幻灯片页面**:单个标题、文本块、图片或局部元素优先用 [`+replace-slide`](references/cli/lark-slides-replace-slide.md)(块级替换/插入,不动页序);一页里改动很多(例如批量换字体)、要改背景、或要删掉若干元素时用 [`+update-slide`](references/cli/lark-slides-update-slide.md) 整页覆盖(`slide_id` 和页序不变,但没写进 `--content` 的元素会被删除);**多页大改就对每一页各跑一次 `+update-slide`**。选择 action 和完整读-改-写流程见 [`workflow/slides-editing.md`](references/workflow/slides-editing.md)。
116
116
 
117
- **用户要求使用模板**:按 [lark-slides-pptx-template-workflows.md](references/lark-slides-pptx-template-workflows.md) 处理。
117
+ **用户要求使用模板**:按 [workflow/template-editing.md](references/workflow/template-editing.md) 处理。
118
118
 
119
119
  ## 身份选择
120
120
 
@@ -136,29 +136,29 @@ lark-cli auth login --domain slides
136
136
 
137
137
  ## 执行前必做
138
138
 
139
- > **重要**:`references/slides_xml_schema_definition.xml` 是此 skill 唯一正确的 XML 协议来源;其他 md 仅是对它和 CLI schema 的摘要。
139
+ > **重要**:`references/xml/slides_xml_schema_definition.xml` 是此 skill 唯一正确的 XML 协议来源;其他 md 仅是对它和 CLI schema 的摘要。
140
140
 
141
141
  高频只读:
142
142
 
143
- - [xml-schema-quick-ref.md](references/xml-schema-quick-ref.md)
143
+ - [xml/xml-schema-quick-ref.md](references/xml/xml-schema-quick-ref.md)
144
144
  - [planning-layer.md](references/planning-layer.md)(新建 / 大幅改写)
145
145
  - [visual-planning.md](references/visual-planning.md)(新建 / 大幅改写)
146
146
  - [asset-planning.md](references/asset-planning.md)(新建 / 大幅改写)
147
- - [validation-checklist.md](references/validation-checklist.md)(创建 / 大幅改写后)
147
+ - [workflow/validation-xml.md](references/workflow/validation-xml.md)(创建 / 大幅改写后)
148
148
 
149
149
  调用相关命令前必须读取相关的文档以了解命令的使用方式:
150
150
 
151
- - 创建:[`lark-slides-create.md`](references/lark-slides-create.md)、[`lark-slides-add-slide.md`](references/lark-slides-add-slide.md)(逐页添加 / 给已有 PPT 追加页面)
152
- - 删除页面:[`lark-slides-delete-slide.md`](references/lark-slides-delete-slide.md)
153
- - 阅读:[`lark-slides-xml-presentations-get.md`](references/lark-slides-xml-presentations-get.md)
154
- - 编辑:[`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)、[`lark-slides-replace-slide.md`](references/lark-slides-replace-slide.md)、[`lark-slides-update-slide.md`](references/lark-slides-update-slide.md)
155
- - 历史版本:[`lark-slides-history.md`](references/lark-slides-history.md)
156
- - 截图:[`lark-slides-screenshot.md`](references/lark-slides-screenshot.md)
157
- - 图片:[`lark-slides-media-upload.md`](references/lark-slides-media-upload.md)
158
- - 图表:[`slides_chart_demo.xml`](references/slides_chart_demo.xml)
159
- - 图标:[`iconpark.md`](references/iconpark.md)、[`scripts/iconpark_tool.py`](scripts/iconpark_tool.py)
160
- - 排障:[`troubleshooting.md`](references/troubleshooting.md)
161
- - 完整协议:[`slides_xml_schema_definition.xml`](references/slides_xml_schema_definition.xml)
151
+ - 创建:[`cli/lark-slides-create.md`](references/cli/lark-slides-create.md)、[`cli/lark-slides-add-slide.md`](references/cli/lark-slides-add-slide.md)(逐页添加 / 给已有 PPT 追加页面)
152
+ - 删除页面:[`cli/lark-slides-delete-slide.md`](references/cli/lark-slides-delete-slide.md)
153
+ - 阅读:[`cli/lark-slides-xml-presentations-get.md`](references/cli/lark-slides-xml-presentations-get.md)
154
+ - 编辑:[`workflow/slides-editing.md`](references/workflow/slides-editing.md)、[`cli/lark-slides-replace-slide.md`](references/cli/lark-slides-replace-slide.md)、[`lark-slides-update-slide.md`](references/cli/lark-slides-update-slide.md)
155
+ - 历史版本:[`cli/lark-slides-history.md`](references/cli/lark-slides-history.md)
156
+ - 截图:[`cli/lark-slides-screenshot.md`](references/cli/lark-slides-screenshot.md)
157
+ - 图片:[`cli/lark-slides-media-upload.md`](references/cli/lark-slides-media-upload.md)
158
+ - 图表:[`xml/slides_chart_demo.xml`](references/xml/slides_chart_demo.xml)
159
+ - 图标:[`xml/iconpark.md`](references/xml/iconpark.md)、[`scripts/iconpark_tool.py`](scripts/iconpark_tool.py)
160
+ - 排障:[`workflow/error-handling.md`](references/workflow/error-handling.md)
161
+ - 完整协议:[`xml/slides_xml_schema_definition.xml`](references/xml/slides_xml_schema_definition.xml)
162
162
 
163
163
 
164
164
  ## Workflow
@@ -200,9 +200,9 @@ lark-cli auth login --domain slides
200
200
  ```text
201
201
  Step 1: 需求分析 & 读取知识
202
202
  - 分析主题、受众、页数、风格;
203
- - 若用户要求使用模板,按 lark-slides-pptx-template-workflows.md 处理
204
- - 读取 xml-schema-quick-ref.md;新建 / 大幅改写时还要读取 planning-layer.md、visual-planning.md、asset-planning.md
205
- - 涉及图表读取 slides_chart_demo.xml
203
+ - 若用户要求使用模板,按 workflow/template-editing.md 处理
204
+ - 读取 xml/xml-schema-quick-ref.md;新建 / 大幅改写时还要读取 planning-layer.md、visual-planning.md、asset-planning.md
205
+ - 涉及图表读取 xml/slides_chart_demo.xml
206
206
 
207
207
  Step 2: 生成大纲 → 写入 slide_plan.json
208
208
  - 生成结构化大纲
@@ -212,12 +212,12 @@ Step 2: 生成大纲 → 写入 slide_plan.json
212
212
  Step 3: 按 slide_plan.json 生成 XML → 创建
213
213
  - 逐页消费 plan:key_message 定主结论,layout_type 定几何,visual_focus 定主视觉,text_density 定文本量
214
214
  - 缺少真实素材时必须用 `fallback_if_missing` 生成替代图片,不要留空
215
- - 读 lark-slides-create.md 定一步创建还是两步创建,并据此构造 `slides +create`;两步创建再读 lark-slides-add-slide.md 用 `+add-slide` 逐页添加
216
- - 图片按 lark-slides-media-upload.md 处理;复杂 XML、转义和 3350001 排查按 troubleshooting.md 执行
215
+ - 读 cli/lark-slides-create.md 定一步创建还是两步创建,并据此构造 `slides +create`;两步创建再读 cli/lark-slides-add-slide.md 用 `+add-slide` 逐页添加
216
+ - 图片按 cli/lark-slides-media-upload.md 处理;复杂 XML、转义和 3350001 排查按 workflow/error-handling.md 执行
217
217
 
218
218
  Step 4: 审查 & 交付
219
- - 创建完成后,必须用 `slides +xml-get --presentation <xml_presentation_id>` 读取全文 XML,并按 validation-checklist.md 做显式验证记录,包括 XML 文本重叠检查
220
- - 失败或部分成功按 troubleshooting.md 处理;局部问题优先用 `+replace-slide` 修正
219
+ - 创建完成后,必须用 `slides +xml-get --presentation <xml_presentation_id>` 读取全文 XML,并按 workflow/validation-xml.md 做显式验证记录,包括 XML 文本重叠检查
220
+ - 失败或部分成功按 workflow/error-handling.md 处理;局部问题优先用 `+replace-slide` 修正
221
221
  - 没问题 → 交付:使用 NotifyHuman 工具交付 PPT 链接
222
222
  ```
223
223
 
@@ -283,14 +283,14 @@ Shortcut 是对常用操作的高级封装(`lark-cli slides +<verb> [flags]`
283
283
 
284
284
  | Shortcut | 说明 |
285
285
  |----------|------|
286
- | [`+create`](references/lark-slides-create.md) | 创建 PPT,可选一步添加页面 |
287
- | [`+add-slide`](references/lark-slides-add-slide.md) | 向已有演示文稿追加或插入**一页**(`--before-slide-id` 控制位置),XML 支持 `@file` / stdin,`<img src="@./path">` 占位符自动上传 |
288
- | [`+delete-slide`](references/lark-slides-delete-slide.md) | 按 `slide_id` 删除**一页** |
289
- | [`+xml-get`](references/lark-slides-xml-presentations-get.md) | 读取全文 XML,用 `--presentation` 指定演示文稿的 `xml_presentation_id`,用 `--output` 把 XML 存到本地文件(必须是 CWD 内的相对路径,如 `.lark-slides/plan/<deck>/readback.xml`) |
290
- | [`+screenshot`](references/lark-slides-screenshot.md) | 把幻灯片页面截图保存为本地图片;用 `--slide-number` 指定页码(从 1 开始,多页重复传入)或用 `--slide-id` 指定页面;单张用 `--output .lark-slides/screenshots/<deck-or-task-id>/page-01`,批量用 `--output-dir .lark-slides/screenshots/<deck-or-task-id>`(一次最多 10 页);后续必须读取返回的 `output` / `screenshots[].path` |
291
- | [`+media-upload`](references/lark-slides-media-upload.md) | 上传本地图片到指定演示文稿,返回 `file_token`(用作 `<img src="...">`),最大 20 MB |
292
- | [`+replace-slide`](references/lark-slides-replace-slide.md) | 对已有幻灯片页面进行块级替换/插入(`block_replace` / `block_insert`),自动注入 id 和 `<content/>`,不改变页序 |
293
- | [`+update-slide`](references/lark-slides-update-slide.md) | 把一整页 XML 交给已有页面,页面变成 `--content` 描述的样子;能一次改样式/插入/删除/备注/背景,`slide_id` 和页序不变。**没写进 `--content` 的元素会被删除** |
286
+ | [`+create`](references/cli/lark-slides-create.md) | 创建 PPT,可选一步添加页面 |
287
+ | [`+add-slide`](references/cli/lark-slides-add-slide.md) | 向已有演示文稿追加或插入**一页**(`--before-slide-id` 控制位置),XML 支持 `@file` / stdin,`<img src="@./path">` 占位符自动上传 |
288
+ | [`+delete-slide`](references/cli/lark-slides-delete-slide.md) | 按 `slide_id` 删除**一页** |
289
+ | [`+xml-get`](references/cli/lark-slides-xml-presentations-get.md) | 读取全文 XML,用 `--presentation` 指定演示文稿的 `xml_presentation_id`,用 `--output` 把 XML 存到本地文件(必须是 CWD 内的相对路径,如 `.lark-slides/plan/<deck>/readback.xml`) |
290
+ | [`+screenshot`](references/cli/lark-slides-screenshot.md) | 把幻灯片页面截图保存为本地图片;用 `--slide-number` 指定页码(从 1 开始,多页重复传入)或用 `--slide-id` 指定页面;单张用 `--output .lark-slides/screenshots/<deck-or-task-id>/page-01`,批量用 `--output-dir .lark-slides/screenshots/<deck-or-task-id>`(一次最多 10 页);后续必须读取返回的 `output` / `screenshots[].path` |
291
+ | [`+media-upload`](references/cli/lark-slides-media-upload.md) | 上传本地图片到指定演示文稿,返回 `file_token`(用作 `<img src="...">`),最大 20 MB |
292
+ | [`+replace-slide`](references/cli/lark-slides-replace-slide.md) | 对已有幻灯片页面进行块级替换/插入(`block_replace` / `block_insert`),自动注入 id 和 `<content/>`,不改变页序 |
293
+ | [`+update-slide`](references/cli/lark-slides-update-slide.md) | 把一整页 XML 交给已有页面,页面变成 `--content` 描述的样子;能一次改样式/插入/删除/备注/背景,`slide_id` 和页序不变。**没写进 `--content` 的元素会被删除** |
294
294
 
295
295
  没有 Shortcut 覆盖时使用原生 API。高频资源:`slides +xml-get` 读取全文;`xml_presentation.slide.create/delete/get/replace` 管理单页。
296
296
 
@@ -304,12 +304,12 @@ lark-cli slides <resource> <method> [flags] # 调用 API
304
304
  ## 核心规则
305
305
 
306
306
  1. **先规划再写 XML**:新建演示文稿或大幅改写页面时,必须先写入 `.lark-slides/plan/<deck-or-task-id>/slide_plan.json`;模板、风格和大纲只能作为规划输入,不能绕过规划层
307
- 2. **创建流程**:新建演示文稿用 `slides +create`,一步创建还是两步创建按 [`lark-slides-create.md`](references/lark-slides-create.md) 判断
307
+ 2. **创建流程**:新建演示文稿用 `slides +create`,一步创建还是两步创建按 [`cli/lark-slides-create.md`](references/cli/lark-slides-create.md) 判断
308
308
  3. **`<slide>` 直接子元素只有 `<style>`、`<data>`、`<note>`**:文本和图形必须放在 `<data>` 内
309
- 4. **文本通过 `<content>` 表达**:必须用 `<content><p>...</p></content>`,不能把文字直接写在 shape 内;注意 `<content>` 只是 XML 元素,不是 `--parts` 的字段名——part 里装 XML 的字段,`block_replace` 是 `replacement`,`block_insert` 是 `insertion`
309
+ 4. **文本通过 `<content>` 表达**:必须用 `<content><p>...</p></content>`,不能把文字直接写在 shape 内;不要混淆 XML 元素 `<content>` 和 `--parts` 的 JSON 字段:编写 `--parts` 时,`block_replace` 装载 XML 使用标准字段 `replacement`,`block_insert` 使用 `insertion`
310
310
  5. **保存关键 ID**:后续操作需要 `xml_presentation_id`、`slide_id`、`revision_id`
311
311
  6. **删除谨慎**:删除不可逆,删前先回读确认 `slide_id`
312
312
  7. **编辑已有页面优先原链接更新**:修改单个 shape/img 用 `+replace-slide`(`block_replace` / `block_insert`),不要整页重建;一页改动很多或要改背景用 `+update-slide` 整页覆盖(保 `slide_id` 和页序),多页整页重建就对每页各跑一次 `+update-slide`,不要用 `slides +create` 新建整份 PPT;追加/插入单页用 `+add-slide`、删除单页用 `+delete-slide`,只有这些 shortcut 未覆盖的参数才手动调 `slide.create` / `slide.delete`
313
313
  8. **`<img src>` 只能用上传到飞书 drive 的 `file_token`,禁止使用 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 在 PPT 里通常不显示或显示破图。流程必须是「先把图存到本地 → 用 `slides +media-upload` 上传,或在 `+create --slides` 的 XML 里写 `<img src="@./path">` 占位符自动上传 → 拿 `file_token` 写进 `<img src>`」。如果用户给了网图链接,先 `curl`/下载到 CWD 内再走上传流程,不要直接把外链 URL 塞进 `src`。**图片最大 20 MB**(slides upload API 不支持分片上传)。
314
314
 
315
- > **注意**:如果 md 内容与 `slides_xml_schema_definition.xml` 或 `lark-cli schema slides.<resource>.<method>` 输出不一致,以后两者为准。
315
+ > **注意**:如果 md 内容与 `xml/slides_xml_schema_definition.xml` 或 `lark-cli schema slides.<resource>.<method>` 输出不一致,以后两者为准。
@@ -0,0 +1,92 @@
1
+ # slides +add-slide(向已有演示文稿追加/插入单页)
2
+
3
+ 向已有演示文稿添加**一页**。这是两步创建流程的第二步:先 `+create` 建空壳,再逐页 `+add-slide`;也用于给已有 PPT 追加新页。
4
+
5
+ `--presentation` 接受 token / `/slides/` URL / `/wiki/` URL(wiki 自动解析),`--slide` 直接收 XML(支持 `@file` 和 stdin,复杂 XML 走文件可绕开 shell 转义),`<img src="@./local.png">` 占位符自动上传并替换成 `file_token`。
6
+
7
+ **CRITICAL — 提交前必须先跑版式 lint**:把待提交的 `<slide>` XML 存成本地文件,运行 [`scripts/xml_lint.py`](../../scripts/xml_lint.py),`summary.error_count` 必须为 0。
8
+
9
+ ## 命令
10
+
11
+ ```bash
12
+ # 追加到末尾(XML 直接作为参数)
13
+ lark-cli slides +add-slide --as user \
14
+ --presentation "$PID" \
15
+ --slide '<slide xmlns="https://www.larkoffice.com/sml/2.0"><data></data></slide>'
16
+
17
+ # XML 从文件读(推荐:避免 shell 转义和长参数截断)
18
+ lark-cli slides +add-slide --as user \
19
+ --presentation "$PID" \
20
+ --slide @page3.xml
21
+
22
+ # XML 从 stdin 读
23
+ cat page3.xml | lark-cli slides +add-slide --as user --presentation "$PID" --slide -
24
+
25
+ # 插到某页之前
26
+ lark-cli slides +add-slide --as user \
27
+ --presentation "$PID" \
28
+ --slide @cover.xml \
29
+ --before-slide-id "$SID"
30
+
31
+ # wiki 链接(CLI 自动 wiki.spaces.get_node 解析,并校验 obj_type=slides)
32
+ lark-cli slides +add-slide --as user \
33
+ --presentation "https://xxx.feishu.cn/wiki/wikcnXXXXXX" \
34
+ --slide @page3.xml
35
+
36
+ # 预览请求,不实际写入
37
+ lark-cli slides +add-slide --presentation "$PID" --slide @page3.xml --dry-run
38
+ ```
39
+
40
+ ## 参数
41
+
42
+ | 参数 | 必需 | 说明 |
43
+ |------|------|------|
44
+ | `--presentation` | 是 | `xml_presentation_id`、`/slides/` URL 或 `/wiki/` URL |
45
+ | `--slide` | 是 | 一个完整的 `<slide>...</slide>` 文档;支持字面量、`@file`、stdin `-` |
46
+ | `--before-slide-id` | 否 | 插到该 `slide_id` 之前;**不传就是追加到末尾** |
47
+ | `--revision-id` | 否 | 演示文稿版本号,默认 `-1`(最新);传具体版本号做乐观锁 |
48
+ | `--dry-run` | 否 | 打印将要发起的请求(含图片上传步骤),不写入 |
49
+
50
+ `@file` 路径**必须在 CWD 内**(如 `@./plan/page3.xml`);绝对路径和 `../` 会被拒绝并报 `unsafe file path`。
51
+
52
+ ## 本地图片:`@路径` 占位符
53
+
54
+ XML 里写 `<img src="@./chart.png" .../>`,CLI 会:先把每个不重复的本地文件上传到这份演示文稿(`parent_type=slide_file`),再把 `src` 替换成返回的 `file_token`,最后才提交页面。
55
+
56
+ 占位符路径按**执行命令时的 CWD** 解析,跟 `--slide @file` 所在目录无关;`@./assets/x.png` 找的是 `$PWD/assets/x.png`。
57
+
58
+ ```bash
59
+ lark-cli slides +add-slide --as user \
60
+ --presentation "$PID" \
61
+ --slide '<slide xmlns="https://www.larkoffice.com/sml/2.0"><data><img src="@./chart.png" topLeftX="100" topLeftY="100" width="320" height="180"/></data></slide>'
62
+ ```
63
+
64
+ - 文件不存在、不是普通文件、超过 20 MB,都在**调用任何接口之前**报错,不会留下半成品。
65
+ - 去重只在**单次调用内**生效:多页共用同一张图时,逐页循环会把它每页重传一次。这种图先用 [`+media-upload`](lark-slides-media-upload.md) 传一次,把 `file_token` 写进各页的 `src`。
66
+
67
+ ## 成功输出
68
+
69
+ ```json
70
+ {
71
+ "xml_presentation_id": "slides_example_presentation_id",
72
+ "slide_id": "slide_example_id",
73
+ "revision_id": 42,
74
+ "before_slide_id": "slide_example_target_id",
75
+ "images_uploaded": 1,
76
+ "issues": "[issue=unsupported_attr tag=<strong> attr=style]"
77
+ }
78
+ ```
79
+
80
+ | 字段 | 说明 |
81
+ |------|------|
82
+ | `slide_id` | 新创建页面的唯一标识 |
83
+ | `issues` | 字符串,**只在服务端丢弃过内容时才出现**:页面创建成功,但括号里列出的标签/属性没写进去。出现就必须 `+screenshot` 复核,别当纯警告忽略;干净提交时这个字段不返回 |
84
+
85
+ ## 常见错误
86
+
87
+ | 现象 | 原因 | 解决 |
88
+ |------|------|------|
89
+ | `--slide is not a single complete <slide> document` | 传了 `<presentation>` 整份 XML,或多个 `<slide>` 拼在一起 | 一次只传一页,根元素必须是 `<slide>` |
90
+ | `--slide cannot be empty` | `@file` 指向空文件,或 stdin 没内容 | 检查文件内容 |
91
+ | 3350001 | XML 结构/转义有问题;**或 `--before-slide-id` 不是有效 `slide_id`** | 优先改用 `--slide @file` 绕开 shell 转义;插页失败先 `+xml-get` 回读确认 `slide_id`;再按 [workflow/error-handling.md](../workflow/error-handling.md) 排查 |
92
+ | 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`,`@` 占位符另需 `docs:document.media:upload`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
@@ -0,0 +1,176 @@
1
+
2
+ # slides +create(创建飞书幻灯片)
3
+
4
+ 创建一个新的飞书幻灯片演示文稿,可选一步添加页面内容。
5
+
6
+ 提交源必须是直接生成的单页 `<slide>` XML。禁止从完整 `<presentation>` XML 解析、拆分、重序列化出 slide 数组再提交。
7
+
8
+ 本命令只从零创建演示文稿,没有导入本地 PPT 文件的参数。要把已有 PPTX 变成 Slides,用 `drive +import --file <x.pptx> --type slides`,再在导入结果上编辑,流程见 [template-editing.md](../workflow/template-editing.md)。
9
+
10
+ ## 创建方式选择
11
+
12
+ | 场景 | 推荐方式 |
13
+ |------|----------|
14
+ | 不超过 10 页 | 每页存一个 XML 文件,`slides +create --slide @page-01.xml --slide @page-02.xml ...` 一步创建 |
15
+ | 超过 10 页 | **两步创建**:先 `slides +create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 |
16
+ | 已有 PPT 继续追加或插入页面 | 使用 [`+add-slide`](lark-slides-add-slide.md),必要时配合 `--before-slide-id` |
17
+
18
+ > [!IMPORTANT]
19
+ > `slides +create` 带页面时底层会逐页创建,不是原子操作。中途失败时先记录 `xml_presentation_id`,回读确认当前状态,再继续修复或追加。
20
+
21
+ **CRITICAL — 提交前必须先跑版式 lint**:把待提交的 `<slide>` XML 存成本地文件,运行 [`scripts/xml_lint.py`](../../scripts/xml_lint.py),`summary.error_count` 必须为 0。
22
+
23
+ ## 命令
24
+
25
+ ```bash
26
+ # 创建空白 PPT
27
+ lark-cli slides +create --title "项目汇报"
28
+
29
+ # 创建 PPT + 添加页面:每页一个 XML 文件,重复 --slide,顺序即页序
30
+ lark-cli slides +create --as user --title "项目汇报" \
31
+ --slide @.lark-slides/plan/project/slide-01.xml \
32
+ --slide @.lark-slides/plan/project/slide-02.xml
33
+
34
+ # 已有组装好的 JSON 数组:从文件或 stdin 读
35
+ lark-cli slides +create --as user --title "项目汇报" --slides @./deck.json
36
+ cat deck.json | lark-cli slides +create --as user --title "项目汇报" --slides -
37
+
38
+ # 以应用身份创建(自动授权当前用户)
39
+ lark-cli slides +create --title "项目汇报" --as bot
40
+
41
+ # 预览(不执行)
42
+ lark-cli slides +create --title "项目汇报" --slide @./slide-01.xml --dry-run
43
+ ```
44
+
45
+ ## 返回值
46
+
47
+ 工具成功执行后,返回一个 JSON 对象,包含以下字段:
48
+
49
+ - **`xml_presentation_id`**(string):演示文稿的唯一标识符,后续添加页面时需要此 ID
50
+ - **`title`**(string):演示文稿标题
51
+ - **`url`**(string,可选):演示文稿的在线链接,如有返回则务必展示给用户(需要 drive 相关权限;若获取失败则不返回此字段)
52
+ - **`revision_id`**(integer):演示文稿版本号
53
+ - **`slide_ids`**(string[],可选):带页面创建时返回,成功添加的页面 ID 列表
54
+ - **`slides_added`**(integer,可选):带页面创建时返回,成功添加的页面数量
55
+ - **`images_uploaded`**(integer,可选):页面 XML 中含 `@<本地路径>` 占位符时返回,已上传的去重后图片数量
56
+ - **`permission_grant`**(object,可选):仅 `--as bot` 时返回,说明是否已自动为当前 CLI 用户授予可管理权限
57
+
58
+ > [!IMPORTANT]
59
+ > 不带页面参数时,`slides +create` 只创建空白演示文稿。创建后用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加 slide 内容。
60
+ >
61
+ > 带了页面时,CLI 先创建空白演示文稿,再逐页调用 slide 创建接口添加页面。如果某一页添加失败,CLI 会停止并报错,已创建的演示文稿和已添加的页面会保留。
62
+ >
63
+ > 如果演示文稿是**以应用身份(bot)创建**的,如 `lark-cli slides +create --as bot`,CLI 会**尝试为当前 CLI 用户自动授予该演示文稿的 `full_access`(可管理权限)**。
64
+ >
65
+ > 以应用身份创建时,结果里会额外返回 `permission_grant` 字段,明确说明授权结果:
66
+ > - `status = granted`:当前 CLI 用户已获得该演示文稿的可管理权限
67
+ > - `status = skipped`:本地没有可用的当前用户 `open_id`,因此不会自动授权
68
+ > - `status = failed`:演示文稿已创建成功,但自动授权用户失败
69
+ >
70
+ > **不要擅自执行 owner 转移。** 如果用户需要把 owner 转给自己,必须单独确认。
71
+
72
+ ## 参数
73
+
74
+ | 参数 | 必填 | 说明 |
75
+ |------|------|------|
76
+ | `--title` | 否 | 演示文稿标题(不传则默认 "Untitled") |
77
+ | `--slide` | 否 | 一页 `<slide>` XML,或 `@路径`;可重复,最多 10 次。格式见[页面输入形式](#页面输入形式) |
78
+ | `--slides` | 否 | 页面 XML 的 JSON 字符串数组,最多 10 个;支持 `@文件` 和 `-`(stdin)。格式见[页面输入形式](#页面输入形式) |
79
+
80
+ 10 页是 CLI 的上限,服务端每次只接收一页。超过 10 页时先用 `+create` 创建空白 PPT,再用 [`+add-slide`](lark-slides-add-slide.md) 逐页添加。
81
+
82
+ 两种形式的每一页都会在发请求前校验成「单个完整的 `<slide>` 文档」。不合格的页在创建演示文稿之前报错并指出页序号,不会留下空壳演示文稿。
83
+
84
+ ## 页面输入形式
85
+
86
+ 页面内容有 `--slide` 和 `--slides` 两种传法,二选一,同时传会报错。
87
+
88
+ 两种形式的 `@路径` 都必须是 CWD 内的相对路径(如 `./slide-01.xml`);绝对路径和 `../` 会被拒(报 `invalid file path`)。XML 写在别的目录时,先 `cd` 过去或把文件拷进 CWD 再执行。
89
+
90
+ ### `--slide`:一页一个文件
91
+
92
+ 可重复,重复次数即页数,出现顺序即页序。值是一页完整的 `<slide>` XML,或读取该 XML 的 `@路径`。
93
+
94
+ 文件内容就是这一页 XML 本身,外面没有引号或方括号:
95
+
96
+ ```xml
97
+ <slide xmlns="https://www.larkoffice.com/sml/2.0">
98
+ <data>…第1页…</data>
99
+ </slide>
100
+ ```
101
+
102
+ 文件内容不需要转义:引号、换行、中文原样写。
103
+
104
+ ### `--slides`:一个 JSON 数组
105
+
106
+ 值是 JSON 字符串数组,每个元素是一整页 XML,支持 `@文件` 和 `-`(stdin)。
107
+
108
+ 文件内容是一个 JSON 文档,XML 以 JSON 字符串出现,其中的 `"` 写作 `\"`,换行写作 `\n`:
109
+
110
+ ```json
111
+ [
112
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data>…第1页…</data></slide>",
113
+ "<slide xmlns=\"https://www.larkoffice.com/sml/2.0\"><data>…第2页…</data></slide>"
114
+ ]
115
+ ```
116
+
117
+ 数组元素是页面 XML 原文。包装成 API 所需的 `{"slide": {"content": …}}` 并逐页调用由 CLI 完成。
118
+
119
+ > [!WARNING]
120
+ > `--slides '[...]'` 的风险点主要在 shell 参数传递,而不是单纯页数。即使只有 1 页,只要 XML 足够复杂,也建议改用 `--slide @page-01.xml` 逐页传文件。
121
+
122
+ ## 本地图片:`@<path>` 占位符
123
+
124
+ `<img>` 元素的 `src` 属性如果以 `@` 开头,CLI 会把它当作本地文件路径,自动上传到当前演示文稿,并把占位符替换为返回的 `file_token`。
125
+
126
+ `slide-01.xml`:
127
+
128
+ ```xml
129
+ <slide xmlns="https://www.larkoffice.com/sml/2.0">
130
+ <data>
131
+ <img src="@./assets/chart.png" topLeftX="100" topLeftY="100" width="320" height="180"/>
132
+ </data>
133
+ </slide>
134
+ ```
135
+
136
+ ```bash
137
+ lark-cli slides +create --as user --title "图测试" --slide @./slide-01.xml
138
+ ```
139
+
140
+ 行为:
141
+
142
+ - 路径相对于**当前工作目录**(CWD)解析;**必须是 CWD 内的相对路径**(如 `./pic.png`、`./assets/x.png`)
143
+ - 同一份图被多次引用时**只上传一次**(按路径去重)
144
+ - `src` 不以 `@` 开头的会原样保留,但**只允许写 `slides +media-upload` 拿到的 `file_token`**;**禁止写 http(s) 外链 URL**:飞书 slides 渲染端不会代理外链图片,外链 src 通常显示破图。要用网图必须先下载到 CWD 内、再走上传流程
145
+ - 单张图片最大 20 MB(slides upload API 不支持分片上传)
146
+ - 校验阶段就会检查所有占位符文件存在及大小;缺文件或超限直接报错,不会创建空白 PPT 占位
147
+ - 创空白 PPT → 上传所有图 → 替换 token → 逐页创建 slide,按这个顺序执行
148
+
149
+ > [!IMPORTANT]
150
+ > **路径必须在 CWD 内**:`@/abs/path/x.png` 或 `@../up/x.png` 这种会被 CLI 拒绝(报 `unsafe file path`)。如果素材在别的目录,先 `cd` 过去再执行。
151
+
152
+ ## 创建后续步骤
153
+
154
+ 创建空白 PPT 时,`slides +create` 返回的 `xml_presentation_id` 用于后续操作:
155
+
156
+ ```bash
157
+ # 第 1 步:创建空白 PPT
158
+ PRES_ID=$(lark-cli slides +create --title "项目汇报" --jq '.data.xml_presentation_id')
159
+
160
+ # 第 2 步:逐页添加(--slide 支持 @file,复杂 XML 优先走文件)
161
+ lark-cli slides +add-slide --as user \
162
+ --presentation "$PRES_ID" \
163
+ --slide @.lark-slides/plan/<deck>/page1.xml
164
+ ```
165
+
166
+ ## 常见错误
167
+
168
+ | 错误码 | 含义 | 解决方案 |
169
+ |--------|------|----------|
170
+ | 400 | 参数错误 | 检查参数格式是否正确 |
171
+ | 403 | 权限不足 | 检查是否拥有 `slides:presentation:create` 和 `slides:presentation:write_only` scope |
172
+
173
+ ## 相关命令
174
+
175
+ - [slides +add-slide](lark-slides-add-slide.md) — 追加/插入单页(两步创建的第二步)
176
+ - [slides +xml-get](lark-slides-xml-presentations-get.md) — 读取 PPT 内容并保存到本地文件