@amaster.ai/pi-lark 0.1.2-beta.41 → 0.1.2-beta.43

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 (92) hide show
  1. package/package.json +3 -3
  2. package/skills/lark-apps/SKILL.md +18 -10
  3. package/skills/lark-apps/references/lark-apps-access-scope-set.md +1 -1
  4. package/skills/lark-apps/references/lark-apps-automation.md +164 -0
  5. package/skills/lark-apps/references/lark-apps-db-execute.md +185 -1
  6. package/skills/lark-apps/references/lark-apps-db.md +1 -1
  7. package/skills/lark-apps/references/lark-apps-get.md +43 -0
  8. package/skills/lark-apps/references/lark-apps-html-publish.md +7 -2
  9. package/skills/lark-apps/references/lark-apps-init.md +1 -2
  10. package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
  11. package/skills/lark-apps/references/lark-apps-release-create.md +3 -1
  12. package/skills/lark-apps/references/lark-apps-role.md +133 -0
  13. package/skills/lark-base/SKILL.md +2 -2
  14. package/skills/lark-base/references/dashboard-block-data-config.md +28 -2
  15. package/skills/lark-base/references/lark-base-cell-value.md +9 -4
  16. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +7 -7
  17. package/skills/lark-base/references/lark-base-dashboard.md +11 -2
  18. package/skills/lark-base/references/lark-base-data-query.md +9 -7
  19. package/skills/lark-base/references/lark-base-field-create.md +4 -2
  20. package/skills/lark-base/references/lark-base-field-json.md +52 -15
  21. package/skills/lark-base/references/lark-base-field-update.md +4 -2
  22. package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
  23. package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +2 -1
  24. package/skills/lark-drive/SKILL.md +14 -6
  25. package/skills/lark-drive/references/lark-drive-comment-location.md +16 -4
  26. package/skills/lark-drive/references/lark-drive-comments-guide.md +16 -8
  27. package/skills/lark-drive/references/lark-drive-delete.md +23 -11
  28. package/skills/lark-drive/references/lark-drive-export.md +39 -10
  29. package/skills/lark-drive/references/lark-drive-list-comments.md +125 -0
  30. package/skills/lark-drive/references/lark-drive-member-add.md +1 -1
  31. package/skills/lark-drive/references/lark-drive-move.md +5 -3
  32. package/skills/lark-drive/references/lark-drive-pull.md +3 -3
  33. package/skills/lark-drive/references/lark-drive-push.md +1 -1
  34. package/skills/lark-drive/references/lark-drive-status.md +12 -14
  35. package/skills/lark-drive/references/lark-drive-task-result.md +58 -5
  36. package/skills/lark-im/SKILL.md +5 -4
  37. package/skills/lark-im/references/lark-im-messages-reply.md +1 -1
  38. package/skills/lark-im/references/lark-im-messages-send.md +1 -1
  39. package/skills/lark-minutes/SKILL.md +19 -4
  40. package/skills/lark-minutes/references/lark-minutes-todo.md +2 -2
  41. package/skills/lark-shared/SKILL.md +9 -9
  42. package/skills/lark-sheets/SKILL.md +98 -29
  43. package/skills/lark-sheets/references/lark-sheets-batch-update.md +18 -9
  44. package/skills/lark-sheets/references/lark-sheets-changeset.md +105 -0
  45. package/skills/lark-sheets/references/lark-sheets-chart.md +4 -2
  46. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +2 -0
  47. package/skills/lark-sheets/references/lark-sheets-filter-view.md +1 -1
  48. package/skills/lark-sheets/references/lark-sheets-float-image.md +6 -6
  49. package/skills/lark-sheets/references/lark-sheets-formula-translation.md +12 -3
  50. package/skills/lark-sheets/references/lark-sheets-formula-verify.md +77 -0
  51. package/skills/lark-sheets/references/lark-sheets-history.md +93 -0
  52. package/skills/lark-sheets/references/lark-sheets-pivot-table.md +7 -2
  53. package/skills/lark-sheets/references/lark-sheets-range-operations.md +44 -14
  54. package/skills/lark-sheets/references/lark-sheets-read-data.md +3 -3
  55. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +4 -4
  56. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +4 -4
  57. package/skills/lark-sheets/references/lark-sheets-workbook.md +29 -4
  58. package/skills/lark-sheets/references/lark-sheets-write-cells.md +21 -11
  59. package/skills/lark-slides/SKILL.md +29 -18
  60. package/skills/lark-slides/references/asset-planning.md +0 -1
  61. package/skills/lark-slides/references/examples.md +57 -227
  62. package/skills/lark-slides/references/iconpark.md +2 -2
  63. package/skills/lark-slides/references/lark-slides-create.md +21 -2
  64. package/skills/lark-slides/references/lark-slides-media-upload.md +0 -1
  65. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +89 -0
  66. package/skills/lark-slides/references/lark-slides-replace-pages.md +1 -1
  67. package/skills/lark-slides/references/lark-slides-replace-slide.md +1 -1
  68. package/skills/lark-slides/references/lark-slides-screenshot.md +11 -8
  69. package/skills/lark-slides/references/lark-slides-xml-get.md +100 -0
  70. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +9 -7
  71. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +4 -4
  72. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +12 -10
  73. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +14 -13
  74. package/skills/lark-slides/references/planning-layer.md +1 -1
  75. package/skills/lark-slides/references/slides_xml_schema_definition.xml +7 -2
  76. package/skills/lark-slides/references/troubleshooting.md +7 -25
  77. package/skills/lark-slides/references/validation-checklist.md +18 -9
  78. package/skills/lark-slides/references/visual-planning.md +4 -3
  79. package/skills/lark-slides/references/xml-format-guide.md +20 -0
  80. package/skills/lark-slides/references/xml-schema-quick-ref.md +6 -2
  81. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +647 -52
  82. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +529 -0
  83. package/skills/lark-task/SKILL.md +1 -0
  84. package/skills/lark-vc-agent/SKILL.md +11 -4
  85. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +1 -1
  86. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +1 -1
  87. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-list-active.md +2 -2
  88. package/skills/lark-wiki/SKILL.md +4 -2
  89. package/skills/lark-wiki/references/lark-wiki-move-to-drive.md +122 -0
  90. package/skills/lark-wiki/references/lark-wiki-move.md +5 -3
  91. package/skills/lark-sheets/references/lark-sheets-core-operations.md +0 -103
  92. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -220
@@ -3,7 +3,7 @@
3
3
 
4
4
  > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
5
5
 
6
- 查询异步任务结果。该 shortcut 聚合了导入、导出、移动/删除文件夹、Wiki 节点 / 文档迁入 Wiki 等多种异步任务的结果查询,统一接口方便调用。
6
+ 查询异步任务结果。该 shortcut 聚合了导入、导出、Drive 文件/文件夹移动/删除、Wiki 节点 / 文档迁入 Wiki、Wiki 节点移出 Wiki、Wiki 删除等多种异步任务的结果查询,统一接口方便调用。
7
7
 
8
8
  > [!IMPORTANT]
9
9
  > 对于 `import` 场景,如果使用 `--as bot` 且这次查询**已经拿到最终在线文档目标**(`ready=true` 且返回了最终 `token` / `url`),CLI 会**再次尝试为当前 CLI 用户自动授予该资源的 `full_access`(可管理权限)**。
@@ -31,7 +31,7 @@ lark-cli drive +task_result \
31
31
  --ticket <EXPORT_TICKET> \
32
32
  --file-token <SOURCE_DOC_TOKEN>
33
33
 
34
- # 查询移动/删除文件夹任务状态
34
+ # 查询 Drive 文件/文件夹移动/删除任务状态
35
35
  lark-cli drive +task_result \
36
36
  --scenario task_check \
37
37
  --task-id <TASK_ID>
@@ -41,6 +41,11 @@ lark-cli drive +task_result \
41
41
  --scenario wiki_move \
42
42
  --task-id <TASK_ID>
43
43
 
44
+ # 查询 Wiki 节点移出知识库任务结果(wiki +move-to-drive 异步超时后的续跑)
45
+ lark-cli drive +task_result \
46
+ --scenario wiki_move_to_drive \
47
+ --task-id <TASK_ID>
48
+
44
49
  # 查询 Wiki 删除知识空间任务结果(wiki +delete-space 异步超时后的续跑)
45
50
  lark-cli drive +task_result \
46
51
  --scenario wiki_delete_space \
@@ -51,9 +56,9 @@ lark-cli drive +task_result \
51
56
 
52
57
  | 参数 | 必填 | 说明 |
53
58
  |------|------|------|
54
- | `--scenario` | 是 | 任务场景,可选值:`import` (导入任务)、`export` (导出任务)、`task_check` (移动/删除文件夹任务)、`wiki_move` (Wiki 移动任务)、`wiki_delete_space` (Wiki 删除知识空间任务) |
59
+ | `--scenario` | 是 | 任务场景,可选值:`import` (导入任务)、`export` (导出任务)、`task_check` (Drive 文件/文件夹移动/删除任务)、`wiki_move` (Wiki 移动任务)、`wiki_move_to_drive` (Wiki 节点移出知识库任务)、`wiki_delete_space` (Wiki 删除知识空间任务)、`wiki_delete_node` (Wiki 删除节点任务) |
55
60
  | `--ticket` | 条件必填 | 异步任务 ticket,**import/export 场景必填** |
56
- | `--task-id` | 条件必填 | 异步任务 ID,**task_check / wiki_move / wiki_delete_space 场景必填** |
61
+ | `--task-id` | 条件必填 | 异步任务 ID,**task_check 及所有 wiki 场景必填**;必须原样传递完整 ID |
57
62
  | `--file-token` | 条件必填 | 导出任务对应的源文档 token,**export 场景必填** |
58
63
 
59
64
  ## 场景说明
@@ -62,9 +67,11 @@ lark-cli drive +task_result \
62
67
  |------|------|----------|
63
68
  | `import` | 文档导入任务(如将本地文件导入为云文档) | `--ticket` |
64
69
  | `export` | 文档导出任务(如云文档导出为 PDF/Word) | `--ticket`、`--file-token` |
65
- | `task_check` | 文件夹移动/删除任务 | `--task-id` |
70
+ | `task_check` | Drive 文件/文件夹移动/删除任务 | `--task-id` |
66
71
  | `wiki_move` | Wiki 移动任务(`wiki +move` 的 docs-to-wiki 异步流程,超时后续跑用) | `--task-id` |
72
+ | `wiki_move_to_drive` | Wiki 节点移出知识库任务(`wiki +move-to-drive` 超时后续跑用) | `--task-id` |
67
73
  | `wiki_delete_space` | Wiki 删除知识空间任务(`wiki +delete-space` 的异步流程,超时后续跑用) | `--task-id` |
74
+ | `wiki_delete_node` | Wiki 删除节点任务(`wiki +node-delete` 的异步流程,超时后续跑用) | `--task-id` |
68
75
 
69
76
  ## 返回结果
70
77
 
@@ -196,6 +203,29 @@ lark-cli drive +task_result \
196
203
  - `space_id`、`obj_token`、`obj_type`、`title` 等:从首个 `move_results[0].node` 平铺到顶层,方便直接引用
197
204
  - `move_results`: 保留完整列表(适用于一次任务移动多个文档的场景)
198
205
 
206
+ ### Wiki_move_to_drive 场景返回
207
+
208
+ ```json
209
+ {
210
+ "scenario": "wiki_move_to_drive",
211
+ "task_id": "<OPAQUE_TASK_ID>",
212
+ "ready": true,
213
+ "failed": false,
214
+ "status": 0,
215
+ "status_msg": "success",
216
+ "obj_token": "doxcnXXX",
217
+ "obj_type": "docx",
218
+ "url": "https://example.feishu.cn/docx/doxcnXXX"
219
+ }
220
+ ```
221
+
222
+ **字段说明:**
223
+ - `ready`: `move_wiki_to_docs_result.status=0` 时为 `true`
224
+ - `failed`: `status<0` 时为 `true`;`status=1` 表示仍在处理
225
+ - `status` / `status_msg`: 协议返回的数值状态与可读消息;不要把字符串状态当作成功值解析
226
+ - `obj_token` / `obj_type` / `url`: 成功后新 Drive 文档的资源信息
227
+ - `task_id`: 签名后的 opaque ID,可能包含多个连字符;服务端响应省略 `task.task_id` 时回退为请求中的完整 ID
228
+
199
229
  ### Wiki_delete_space 场景返回
200
230
 
201
231
  ```json
@@ -256,6 +286,26 @@ lark-cli drive +task_result --scenario wiki_move --task-id <TASK_ID> --as user
256
286
 
257
287
  > **身份保持一致**:续跑命令的 `--as` 必须与原 `wiki +move` 调用一致;`wiki +move` 的 `next_command` 已自动带上正确的 `--as`。
258
288
 
289
+ ### 配合 wiki +move-to-drive 使用
290
+
291
+ ```bash
292
+ # 1. 把 Wiki 节点移到 Drive 文件夹;省略 --folder-token 表示当前身份的“我的空间”根目录
293
+ lark-cli wiki +move-to-drive \
294
+ --node-token <WIKI_NODE_TOKEN> \
295
+ --folder-token <TARGET_FOLDER_TOKEN> \
296
+ --as user
297
+ # 若轮询窗口内完成:直接返回 ready=true、obj_token、obj_type 和 url
298
+ # 若轮询窗口结束仍未完成:返回 ready=false、完整 task_id、timed_out=true 和 next_command
299
+
300
+ # 2. 使用完整 task_id 和相同身份续跑
301
+ lark-cli drive +task_result \
302
+ --scenario wiki_move_to_drive \
303
+ --task-id <COMPLETE_TASK_ID> \
304
+ --as user
305
+ ```
306
+
307
+ > **调用上下文和 ID 都要保持原样**:续跑的 `--profile` 与 `--as` 必须与初始移动一致;`task_id` 可能包含多个连字符,不要拆分或截断。`wiki +move-to-drive` 返回的 `next_command` 会保留 profile 与身份。
308
+
259
309
  ### 配合 wiki +delete-space 使用
260
310
 
261
311
  ```bash
@@ -291,7 +341,9 @@ lark-cli drive +export-download --file-token <EXPORTED_FILE_TOKEN>
291
341
  | export | `drive:drive.metadata:readonly` |
292
342
  | task_check | `drive:drive.metadata:readonly` |
293
343
  | wiki_move | `wiki:space:read` |
344
+ | wiki_move_to_drive | `wiki:space:read` |
294
345
  | wiki_delete_space | `wiki:space:read` |
346
+ | wiki_delete_node | `wiki:space:read` |
295
347
 
296
348
  > [!NOTE]
297
349
  > `import` 场景在 `--as bot` 且任务最终就绪时,还可能额外尝试一次协作者授权;如果 `permission_grant.status = failed`,请根据失败信息检查应用是否具备相应的文档协作者授权能力。
@@ -299,4 +351,5 @@ lark-cli drive +export-download --file-token <EXPORTED_FILE_TOKEN>
299
351
  ## 参考
300
352
 
301
353
  - [lark-drive](../SKILL.md) -- 云空间(云盘/云存储)全部命令
354
+ - [wiki +move-to-drive](../../lark-wiki/references/lark-wiki-move-to-drive.md) -- 将 Wiki 节点移出知识库并放入 Drive
302
355
  - [lark-shared](../../lark-shared/SKILL.md) -- 认证和全局参数
@@ -41,13 +41,14 @@ Chat (oc_xxx)
41
41
  - `--as bot` means **bot identity** and uses `tenant_access_token`. Calls run as the app bot, so behavior depends on the bot's membership, app visibility, availability range, and bot-specific scopes.
42
42
  - If an IM API says it supports both `user` and `bot`, the token type changes who the operator is. The same API can succeed with one identity and fail with the other because owner/admin status, chat membership, tenant boundary, or app availability are checked against the current caller.
43
43
 
44
- ### Sender Name Resolution with Bot Identity
44
+ ### Sender Name Resolution
45
45
 
46
- When using bot identity (`--as bot`) to fetch messages (e.g. `+chat-messages-list`, `+threads-messages-list`, `+messages-mget`), sender names may not be resolved (shown as open_id instead of display name). This happens when the bot cannot access the user's contact info.
46
+ When fetching messages (`+chat-messages-list`, `+threads-messages-list`, `+messages-mget`, `+messages-search`), the CLI shows a display name for both user and bot senders:
47
47
 
48
- **Root cause**: The bot's app visibility settings do not include the message sender, so the contact API returns no name.
48
+ - **Server-provided name**: the read APIs return `sender_name` (plus the full-i18n `sender_i18n_names` map) on each message `sender`; the CLI surfaces it as the sender's `name` for users and bots alike. No name lookup and no extra permission are needed — **no contact scope** and no `application:bot.basic_info:read`.
49
+ - **Fallback to id**: when the server does not provide a name, the sender is shown by its id and the command still exits 0. There is no contact-directory fallback.
49
50
 
50
- **Solution**: Check the app's visibility settings in the Lark Developer Console — ensure the app's visible range covers the users whose names need to be resolved. Alternatively, use `--as user` to fetch messages with user identity, which typically has broader contact access.
51
+ The raw `sender_name` is not duplicated in output (its value is in `name`); the full `sender_i18n_names` map (all locales) is preserved for consumers that need a specific language, alongside an optional `open_bot_id` (`ou_`) for bot senders aligned with the message-receive event channel. System messages (`msg_type: system`) have no sender name — that is normal, not an error.
51
52
 
52
53
  ### Default message enrichment (reactions / update_time)
53
54
 
@@ -188,7 +188,7 @@ lark-cli im +messages-reply --message-id om_xxx --msg-type interactive --content
188
188
  | `--video-cover <path\|url\|key>` | **Required with `--video`** | Cwd-relative local cover image path, URL, or `image_key` (`img_xxx`) |
189
189
  | `--audio <path\|url\|key>` | One content option | Voice-message audio key, URL, or cwd-relative local path. Local paths and URLs must be Opus (`.opus` or Ogg Opus `.ogg`) |
190
190
  | `--reply-in-thread` | No | Reply inside the thread. The reply appears in the target message's thread instead of the main chat stream |
191
- | `--idempotency-key <key>` | No | Idempotency key; the same key sends only one reply within 1 hour |
191
+ | `--idempotency-key <key>` | No | Idempotency key, max 50 characters; the same key sends only one reply within 1 hour |
192
192
  | `--as <identity>` | No | Identity type: `bot` or `user` (default `bot`) |
193
193
  | `--dry-run` | No | Print the request only, do not execute it |
194
194
 
@@ -191,7 +191,7 @@ lark-cli im +messages-send --chat-id oc_xxx --msg-type interactive --content '<c
191
191
  | `--video-cover <path\|url\|key>` | **Required with `--video`** | Cwd-relative local cover image path, URL, or `image_key` (`img_xxx`). Local paths and URLs are uploaded automatically |
192
192
  | `--audio <path\|url\|key>` | One content option | Voice-message audio key, URL, or cwd-relative local path. Local paths and URLs must be Opus (`.opus` or Ogg Opus `.ogg`) |
193
193
  | `--msg-type <type>` | No | Message type (default `text`). If you use `--text` / `--markdown` / media flags, the effective type is inferred automatically. Explicitly setting a conflicting `--msg-type` fails validation |
194
- | `--idempotency-key <key>` | No | Idempotency key; the same key sends only one message within 1 hour |
194
+ | `--idempotency-key <key>` | No | Idempotency key, max 50 characters; the same key sends only one message within 1 hour |
195
195
  | `--as <identity>` | No | Identity type: `bot` or `user` (default `bot`) |
196
196
  | `--dry-run` | No | Print the request only, do not execute it |
197
197
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lark-minutes
3
3
  version: 1.0.0
4
- description: "飞书妙记:搜索妙记、查看妙记基础信息、下载/上传音视频、读取或编辑妙记的产物内容、改标题、替换说话人/关键词。当给出minute_token、本地音视频文件,要查/改/转妙记产物时使用;本地音视频转纪要/逐字稿优先走本 skill,不要用 ffmpeg/whisper 本地转写。不负责:获取会议关联妙记,或仅按自然语言标题定位纪要"
4
+ description: "飞书妙记:搜索妙记、查看妙记基础信息、下载/上传音视频、读取或编辑妙记的产物内容、改标题、替换说话人/关键词、申请妙记查看/编辑权限。当给出minute_token、本地音视频文件,要查/改/转妙记产物,或用户明确要主动申请妙记权限时使用;本地音视频转纪要/逐字稿优先走本 skill,不要用 ffmpeg/whisper 本地转写。不负责:获取会议关联妙记,或仅按自然语言标题定位纪要"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
@@ -31,6 +31,7 @@ metadata:
31
31
  | [`+download`](references/lark-minutes-download.md) | 下载妙记音视频媒体文件 |
32
32
  | [`+upload`](references/lark-minutes-upload.md) | 上传 file_token 生成妙记 |
33
33
  | [`+update`](references/lark-minutes-update.md) | 更新妙记标题 |
34
+ | `+apply-permission` | 申请妙记查看或编辑权限 |
34
35
  | [`+speaker-replace`](references/lark-minutes-speaker-replace.md) | 替换妙记逐字稿中的说话人(须先 `lark-cli api GET .../speakerlist` 取 `speaker_id`) |
35
36
  | `+word-replace` | 批量替换逐字稿关键词(详见 `lark-cli minutes +word-replace --help`) |
36
37
  | [`+summary`](references/lark-minutes-summary.md) | 替换妙记 AI 总结全文 |
@@ -52,6 +53,7 @@ metadata:
52
53
  | 在妙记里增加 / 更改 / 删除 AI 待办 | `+todo`(**禁止走 lark-task**) |
53
54
  | 替换妙记的AI 总结 | `+summary` |
54
55
  | 重命名妙记/改妙记标题 | `+update` |
56
+ | 申请妙记权限(查看/编辑) | `+apply-permission --perm view\|edit` |
55
57
  | 替换说话人/把 A 的发言改成 B/重新归属发言人/把外部(非飞书)说话人改成飞书用户" | 先 `lark-cli api GET .../transcript/speakerlist` 取 `speaker_id`,再 [`minutes +speaker-replace`](references/lark-minutes-speaker-replace.md);`--from-speaker-id` 只传 id,不传展示名 |
56
58
  | 批量替换逐字稿关键词 | `+word-replace` |
57
59
  | 用户同时提到"会议/开会"和"妙记" | 先 [lark-vc](../lark-vc/SKILL.md)(`+search` → `+recording`)获取 `minute_token`,再本 skill |
@@ -75,8 +77,21 @@ metadata:
75
77
  2. 如果是会议 / 日程上下文中的妙记基础信息,先通过 VC/Calendar 链路拿到 `minute_token`,再调用 `minutes minutes get`。
76
78
  3. 用户意图不明确时,默认先给基础元信息,帮助确认是否命中目标妙记。
77
79
 
80
+ ### 3. 申请妙记权限
78
81
 
79
- ### 3. 上传音视频文件生成妙记(并可继续获取纪要 / 逐字稿)
82
+ 遇到妙记没有查看或编辑权限时,引导用户申请对应权限;只有用户明确要申请时,才调用 `minutes +apply-permission`。
83
+
84
+ 只有当用户明确要求"申请查看权限"、"申请编辑权限"、"帮我申请这条妙记权限"时,才调用:
85
+
86
+ ```bash
87
+ lark-cli minutes +apply-permission --minute-token <token> --perm view|edit
88
+ ```
89
+
90
+ 这是向妙记所有者发起权限申请,不代表立即获得权限。
91
+
92
+ **安全约束**:遇到无权限错误时,不要自动调用 `+apply-permission`;先把无权限事实告知用户,只有用户明确要求申请权限时才发起申请。
93
+
94
+ ### 4. 上传音视频文件生成妙记(并可继续获取纪要 / 逐字稿)
80
95
 
81
96
  1. 当用户说"把音视频文件转成纪要""把录音转成逐字稿/文字稿/撰写文字""把 mp4/mp3 转成总结/待办/章节"时,也先走这个入口。
82
97
  2. **处理流程**:
@@ -120,9 +135,9 @@ lark-cli minutes +todo --minute-token <token> --as user --todos '[
120
135
 
121
136
  **更新 / 删除前**:先用 `minutes +detail --minute-tokens <token> --todo` 读取 `todos[].todo_id`(按 `content` 匹配目标条目;列表顺序不保证稳定,**不要**用"第 2 条"代替 `todo_id`)。
122
137
 
123
- **无编辑权限**:若 CLI 返回 `error.type=no_edit_permission`,表示对**这条妙记**没有编辑权,应请所有者授权;**不要**误走 `auth login --scope`。
138
+ **无编辑权限**:若 CLI 返回 `error.subtype=permission_denied`,表示对**这条妙记**没有编辑权,应请所有者授权;**不要**误走 `auth login --scope`。
124
139
 
125
- **逐字稿关键词替换无命中**:`minutes +word-replace` 时,若 CLI 返回 `error.type=words_not_found`,表示传入的 `source_word` 在该妙记逐字稿中**一个都没匹配到**,未做任何替换。这是**参数问题不是权限问题**:先用 `minutes +detail --minute-tokens <token> --transcript` 读取当前逐字稿,核对 `source_word` 的精确写法与大小写后重试。
140
+ **逐字稿关键词替换无命中**:`minutes +word-replace` 时,若 CLI 返回 `error.subtype=not_found`,表示传入的 `source_word` 在该妙记逐字稿中**一个都没匹配到**,未做任何替换。这是**参数问题不是权限问题**:先用 `minutes +detail --minute-tokens <token> --transcript` 读取当前逐字稿,核对 `source_word` 的精确写法与大小写后重试。
126
141
 
127
142
  **替换 AI 总结全文**:见 [minutes +summary](references/lark-minutes-summary.md)。
128
143
 
@@ -126,8 +126,8 @@ lark-cli minutes +todo --minute-token obcnxxxxxxxxxxxxxxxxxxxx --operation add -
126
126
  | 未指定操作 | 单条模式传 `--operation`,或批量传 `--todos` |
127
127
  | `--todos` 与单条 flags 冲突 | 二选一 |
128
128
  | `todos[i]` 校验失败 | 检查该条 `operation` 与字段组合 |
129
- | `error.type` = `no_edit_permission` | **妙记资源无编辑权**:向妙记所有者申请该妙记的编辑/协作权限;**不要**走 `auth login --scope` |
130
- | 缺少 OAuth scope(`permission_violations` 含 `minutes:minutes:update`) | `lark-cli auth login --scope "minutes:minutes:update"` |
129
+ | `error.subtype` = `permission_denied` | **妙记资源无编辑权**:向妙记所有者申请该妙记的编辑/协作权限;**不要**走 `auth login --scope` |
130
+ | 缺少 OAuth scope(`error.missing_scopes` 含 `minutes:minutes:update`) | `lark-cli auth login --scope "minutes:minutes:update"` |
131
131
 
132
132
  ## 参考
133
133
 
@@ -69,7 +69,7 @@ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 lark-cli a
69
69
  遇到权限相关错误时,**根据当前身份类型采取不同解决方案**。
70
70
 
71
71
  错误响应中包含关键信息:
72
- - `permission_violations`:列出缺失的 scope (N选1)
72
+ - `missing_scopes`:列出缺失的 scope (N选1)
73
73
  - `console_url`:飞书开发者后台的权限配置链接
74
74
  - `hint`:建议的修复命令
75
75
 
@@ -159,7 +159,7 @@ lark-cli update
159
159
  错误信封写入 **stderr**(退出码非 0):
160
160
 
161
161
  ```json
162
- { "ok": false, "identity": "user", "error": { "type": "api", "subtype": "...", "code": 99991679, "message": "...", "hint": "..." } }
162
+ { "ok": false, "identity": "user", "error": { "type": "authorization", "subtype": "missing_scope", "code": 99991679, "message": "...", "hint": "...", "missing_scopes": ["..."] } }
163
163
  ```
164
164
 
165
165
  **判断成功必须用 `ok == true`(或进程退出码 0),不要用 `code == 0`**:成功信封没有顶层 `code` / `msg` 字段,`code` 只出现在错误信封的 `error` 内,含义是上游 OpenAPI 的 numeric code。按 OpenAPI 老格式 `{"code": 0, "msg": "ok"}` 判断会把所有成功调用误判为失败;封装写入类命令(如 `task +create`)时尤其危险,误判会绕过幂等逻辑导致重复创建。
@@ -178,22 +178,22 @@ lark-cli 对高风险写操作(`risk: "high-risk-write"`)有强制确认门
178
178
  ```json
179
179
  {
180
180
  "ok": false,
181
+ "identity": "bot",
181
182
  "error": {
182
- "type": "confirmation_required",
183
+ "type": "confirmation",
184
+ "subtype": "confirmation_required",
183
185
  "message": "drive +delete requires confirmation",
184
186
  "hint": "add --yes to confirm",
185
- "risk": {
186
- "level": "high-risk-write",
187
- "action": "drive +delete"
188
- }
187
+ "risk": "high-risk-write",
188
+ "action": "drive +delete"
189
189
  }
190
190
  }
191
191
  ```
192
192
 
193
193
  **遇到这种情况,不要当普通错误放弃。** 按以下流程处理:
194
194
 
195
- 1. **识别**:看到子进程 exit code = `10` 且 stderr JSON 里 `error.type == "confirmation_required"`
196
- 2. **向用户确认**:把 `error.risk.action` 和关键参数展示给用户,明确告知"这是高风险操作",等待用户显式同意
195
+ 1. **识别**:看到子进程 exit code = `10` 且 stderr JSON 里 `error.type == "confirmation"`、`error.subtype == "confirmation_required"`
196
+ 2. **向用户确认**:把 `error.action`、`error.risk` 和关键参数展示给用户,明确告知"这是高风险操作",等待用户显式同意
197
197
  3. **用户同意** → 在你**原始 argv 的末尾追加 `--yes`** 后重试
198
198
  4. **用户拒绝** → 终止流程,不要擅自改写参数或跳过门禁
199
199
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lark-sheets
3
- version: 3.0.0
3
+ version: 3.0.2
4
4
  description: "飞书电子表格:创建和操作电子表格。支持创建表格、管理工作表与行列结构(增删/合并/调整尺寸/隐藏/冻结)、读写单元格(值/公式/样式/批注/单元格图片)、查找替换、多操作原子批量更新,以及图表、透视表、条件格式、筛选器、迷你图、浮动图片等对象的创建与维护。当用户需要创建电子表格、管理工作表、批量读写或编辑数据、统计汇总与可视化、表格美化、公式计算(含 Excel 公式迁移)、金融/财务建模(DCF、三张表、预算、Sensitivity 等)等任务时使用。若用户是想按名称或关键词搜索云空间(云盘/云存储)里的表格文件,请改用 lark-drive 的 drive +search 先定位资源。当用户给出 doubao.com 的 /sheets/ URL/token 时,也应直接使用本 skill,不要因为域名不是飞书而回退到 WebFetch;路由依据是 URL 路径模式和 token,而不是域名。"
5
5
  metadata:
6
6
  requires:
@@ -32,57 +32,124 @@ metadata:
32
32
  | 透视表 pivot | `--pivot-table-id` | 迷你图(按组) | `--group-id` |
33
33
  | 浮动图片 | `--float-image-id` | | |
34
34
 
35
- ## 场景 → 命令速查(拿不准命令名先查这里,别按直觉拼)
35
+ ## 飞书表格编辑准则(动手前必守,所有编辑类任务一律生效)
36
36
 
37
- 把高频意图映射到**真实存在**的 shortcut / flag。agent 常从 Excel / Google Sheets / 飞书 OpenAPI 误迁移命令名或 flag,先对照本表,避免一次必然失败的试错。完整 shortcut 见各工具参考。
37
+ 下列准则横切所有飞书表格任务,**动手前先过一遍**——即使你是被索引直接路由进某个工具参考也一律生效。每条只给一句话纲要,展开与边界见括注的 reference。
38
38
 
39
- | 你要做的事 | ✅ 正确写法 | ❌ 不存在(会被 cobra 拒) |
40
- | --- | --- | --- |
41
- | 读数据(纯值 / CSV) | `+csv-get`(范围用 `--range`) | `+get-range`、`+range-get`、`+cells-read` |
42
- | 读值 + 公式 / 样式 / 批注 | `+cells-get --include value,formula,style,comment,data_validation` | `+get-cell`、`+cell-get`、`--with-styles`、`--with-merges`、`--include-merged-cells` |
43
- | 写纯文本值(整块 CSV 平铺,列里没有需保留的数值 / 日期语义) | `+csv-put`(定位用 `--start-cell`,单个左上角锚点格;也接受 `--range` 别名,区间自动取左上角) | — |
44
- | 写带类型的数据到**已有**表(列里有数字 / 金额 / 百分比 / 日期 / 计数,要可排序 / 求和 / 入图表 / 透视) | `+table-put --sheets` 完整 payload `{"sheets":[{...}]}`(列名走 `columns`、二维数据走 `data`、列 pandas dtype 走 `dtypes`、列展示格式走 `formats`;来源不限 DataFrame——Counter / dict / list 同理,详见 write-cells) | 在本地把数字拼成 `"$1,234"` / `"30.5%"` 字符串再 `+csv-put`(会落成文本、丢失计算能力) |
45
- | **新建**电子表格并写带类型的数据(类型保真需求同上,但目标表还不存在) | `+workbook-create --sheets`(协议与 `+table-put` 同构、一步建表 + typed 写入,无需先建空表再 `+table-put`;date / number 不丢,详见 workbook) | 用 `--values` 灌日期 / 数字(会落成文本、丢类型) |
46
- | 写值 / 公式 / 样式 | `+cells-set`(定位用 `--range`) | — |
47
- | 插图:图片**绑定到某条记录**、随行走(凭证 / 证件照 / 商品图 / 头像 / 二维码 / 每行配图) | `+cells-set-image`(单格 `--range`,嵌入单元格内) | — |
48
- | 插图:**自由摆放、不绑数据**的装饰 / 标识(logo / 水印 / 封面大图 / banner) | `+float-image-create`(浮动图片,自由定位 + 尺寸 + 层级) | — |
49
- | 查找单元格 | `+cells-search`(关键字用 `--find`) | `+cells-find`、`+find`、`--query` |
50
- | 查找并替换 | `+cells-replace` | — |
51
- | 看子表结构(合并 / 行高列宽 / 冻结 / 隐藏) | `+sheet-info` | `+sheet-get`、`+structure-get`、`+sheet-structure-get` |
52
- | 看工作簿 / 子表清单 | `+workbook-info` | `+sheet-list`、`+workbook-get`、`+workbook-list` |
53
- | 导出 xlsx / 单表 csv | `+workbook-export` | — |
54
- | 导入本地 xlsx/xls/csv 文件为飞书电子表格 | `+workbook-import --file ./x.xlsx`(本地表格文件 → 飞书电子表格的正解;仅要导成多维表格 bitable 时才用 `drive +import --type bitable`) | `drive +import`(导电子表格时绕了 drive 通道、还要多给 `--type`,应直接用 `+workbook-import`)、把 .xlsx 在本地读成数据再 `+workbook-create` 重灌 |
55
- | 清除内容 / 格式 | `+cells-clear`(范围维度用 `--scope`,取值 content / formats / all) | `--type` |
56
- | 批量清除多区域 | `+cells-batch-clear`(`--scope`) | `--target` |
57
- | 调整列宽 / 行高 | `+cols-resize` / `+rows-resize`(行、列是两个独立命令) | `--dimension`(无此 flag) |
58
- | 分组汇总 / 透视 | `+pivot-create`(默认不传落点 flag → 自动新建子表,零覆盖) | 用 SUMIF / 本地脚本拼一张假透视表 |
39
+ 1. **最小改动**:除任务要改的单元格 / 列外,原表其它单元格、行列结构、Sheet 名、合并区、格式 1:1 保持;中间结果放原数据右侧或新建空白 Sheet,**禁止删 / 改名 / 隐藏 / 移动已存在 Sheet**;改写类任务精确圈定行列,不该转的原值 1:1 保留。
40
+ 2. **真实写回 + 回读校验**:交付必须是对在线表格的真实写入,写完用 `+csv-get` / `+cells-get` / `+<对象>-list` 回读确认实际生效——**写操作返回 `ok` 只代表请求被接受、不代表结果符合预期**;写公式后查错误码、筛选 / 排序后核对前几行、删除 / 清空后确认已空。禁止只在文本里声称"已完成"。
41
+ 3. **读全再写**:批量填充 / 补齐 / 修正类任务先确认真实数据末行再写,只探前 N 行会漏写表尾(确定末行流程见 `lark-sheets-read-data`)。
42
+ 4. **公式优先于硬编码**:能用公式表达的计算(总计 / 占比 / 增长率 / 提取 / 查找)一律写公式而非静态值;**凡可由表内其它单元格推导的派生值默认就用公式,即使用户没说"联动 / 自动更新"**;写任何飞书公式前先读 `lark-sheets-formula-translation`,而且**只要公式真实写入表格,收尾默认就要继续跑 `lark-sheets-formula-verify` 的 `+formula-verify`,直到 `status='success'`**。
43
+ 5. **续写 / 扩展继承样式**:续写、补齐、复制区块、新增行列时禁止只读值只写值,必须连带 `cell_styles` + `border_styles` + 合并 + 行高一起继承(清单见 `lark-sheets-write-cells`,四边框最易漏)。
44
+ 6. **多步写入合并 `+batch-update`**:多个连续写入、或同一工具对多区域重复调用,合并为单次原子 `+batch-update`(语义见 `lark-sheets-batch-update`)。
45
+ 7. **分组汇总用透视表**:"按 X 统计 Y / 分组汇总 / 各类数量金额"用 `+pivot-{create|update|delete}`,禁止用 SUMIF / 本地脚本拼一张假透视表。
46
+ 8. **拆成可验证 checklist**:落地前把指令拆成所有"独立可验证子要点",逐点 `assert` 全过才交付(多维排序每维一点、多目标每目标一点、范围类核起 / 末 / 边界);只做第一个要点属违规。
47
+ 9. **全量处理前置断言条数**:翻译 / 打标 / 批量公式落地等逐条任务,先把预期条数硬编码再 `assert actual == expected`,禁止输出"已完成前 N 条,剩余继续"的半成品。
48
+
49
+ > 上述准则的实操展开——读取路径、原生工具优先级、脚本配合、易漏陷阱——见下方「执行要点」节;端到端工作流为:了解结构(`+workbook-info`)→ 读数据 → 理解语义 → 原生工具优先 → 写入 → 回读验证。
50
+
51
+ ## 场景 → 命令速查(拿不准命令名先查这里,别按直觉拼)
59
52
 
53
+ 把高频意图映射到**真实存在**的 shortcut / flag。agent 常从 Excel / Google Sheets / 飞书 OpenAPI 误迁移命令名或 flag,先对照本表,避免一次必然失败的试错。完整 shortcut 见各工具参考。**选定命令后别急着写——先读「动手前读」列指向的 reference 再动手**:命令名对得上不代表用法对,写入 / 清除 / 透视类尤其容易漏掉 reference 里的防错、类型与样式继承规则。
54
+
55
+ | 你要做的事 | ✅ 正确写法 | 动手前读 | ❌ 不存在(会被 cobra 拒) |
56
+ | --- | --- | --- | --- |
57
+ | 读数据(纯值 / CSV) | `+csv-get`(范围用 `--range`) | `lark-sheets-read-data` | `+get-range`、`+range-get`、`+cells-read` |
58
+ | 读值 + 公式 / 样式 / 批注 | `+cells-get --include value,formula,style,comment,data_validation` | `lark-sheets-read-data` | `+get-cell`、`+cell-get`、`--with-styles`、`--with-merges`、`--include-merged-cells` |
59
+ | 写纯文本值(整块 CSV 平铺;列里**没有**需字面保真的数值 / 日期标签 / 编号——点分日期 `12.10`、编号 `001` 会被 csv-put 数值化,不算纯文本) | `+csv-put`(定位用 `--start-cell`,单个左上角锚点格;也接受 `--range` 别名,区间自动取左上角) | `lark-sheets-write-cells` | 把含点分日期(`12.10`)/编号(`001`)的列裸灌 `+csv-put`——会被数值化(`12.10`→`12.1`、`001`→`1`,尾零/前导零丢失),改用 `+table-put` 声明 `dtypes:object` |
60
+ | 写带类型的数据到**已有**表(列里有数字 / 金额 / 百分比 / 日期 / 计数等**本质是量值**的数据——不看当下要不要排序 / 求和,量值一律走这里) | `+table-put --sheets` 完整 payload `{"sheets":[{...}]}`(列名走 `columns`、二维数据走 `data`、列 pandas dtype 走 `dtypes`、列展示格式走 `formats`;来源不限 DataFrame——Counter / dict / list 同理;要同时美化加 `--styles` 一步带样式(区域底色 / 边框 / 列宽 / 行高 / 合并),不必事后再刷;payload 里不存在的 sheet 名会自动建子表,详见 write-cells) | `lark-sheets-write-cells` | 在本地把数字拼成 `"$1,234"` / `"30.5%"` 字符串再 `+csv-put`(会落成文本、丢失计算能力;常见借口见下方 ⚠️) |
61
+ | **新建**电子表格并写带类型的数据(类型保真需求同上,但目标表还不存在) | `+workbook-create --sheets`(协议与 `+table-put` 同构、一步建表 + typed 写入,无需先建空表再 `+table-put`;date / number 不丢;`--styles` 同样可在建表同一步带全套样式,详见 workbook) | `lark-sheets-workbook` | 用 `--values` 灌日期 / 数字(会落成文本、丢类型) |
62
+ | 写公式 / 富写入(样式 · 批注 · 图片 · 富文本),或需精确矩形定位的值 | `+cells-set`(定位用 `--range`;批注 / 图片 / 富文本只能用它,公式也可;**公式落表后继续 `+formula-verify` 收尾**) | `lark-sheets-write-cells` | — |
63
+ | 插图:图片**绑定到某条记录**、随行走(凭证 / 证件照 / 商品图 / 头像 / 二维码 / 每行配图) | `+cells-set-image`(单格 `--range`,嵌入单元格内) | `lark-sheets-write-cells` | — |
64
+ | 插图:**自由摆放、不绑数据**的装饰 / 标识(logo / 水印 / 封面大图 / banner) | `+float-image-create`(浮动图片,自由定位 + 尺寸 + 层级) | `lark-sheets-float-image` | — |
65
+ | 查找 / 替换文本 | `+cells-search`(找,关键字用 `--find`)、`+cells-replace`(替换) | `lark-sheets-search-replace` | `+cells-find`、`+find`、`--query` |
66
+ | 看子表结构(合并 / 行高列宽 / 冻结 / 隐藏) | `+sheet-info` | `lark-sheets-sheet-structure` | `+sheet-get`、`+structure-get`、`+sheet-structure-get` |
67
+ | 看工作簿 / 子表清单 | `+workbook-info` | `lark-sheets-workbook` | `+sheet-list`、`+workbook-get`、`+workbook-list` |
68
+ | 复核某次(AI)编辑改了什么 / 取两个版本间的变更 | `+changeset-get --start-revision <编辑前版本>`(省略 `--end-revision` 取到最新;版本差 ≤ 20) | `lark-sheets-changeset` | — |
69
+ | 取当前文档 revision(版本号) | `+revision-get` | `lark-sheets-workbook` | — |
70
+ | 导出 xlsx / 单表 csv | `+workbook-export` | `lark-sheets-workbook` | — |
71
+ | 导入本地 xlsx/xls/csv 文件为飞书电子表格 | `+workbook-import --file ./x.xlsx`(本地表格文件 → 飞书电子表格的正解;仅要导成多维表格 bitable 时才用 `drive +import --type bitable`) | `lark-sheets-workbook` | `drive +import`(导电子表格时绕了 drive 通道、还要多给 `--type`,应直接用 `+workbook-import`)、把 .xlsx 在本地读成数据再 `+workbook-create` 重灌(多此一举,应直接 `+workbook-import`)、要把文件并入某个**已有在线工作簿**(给它加子表)却用它——import 只会新建独立表,加子表应走 `+sheet-copy` / `+sheet-create` |
72
+ | 参考某个**已有在线表**、把多个本地文件 / 数据各作为一张子表**追加**进去(不另起独立表) | 先 `+workbook-info` 拿模板子表 `sheet_id` → `+sheet-copy` 逐张复制模板子表(公式 / 合并 / 分组底色 / 列宽 / 条件格式全继承)再用 `+cells-*` 只改数据;无模板可继承时 `+sheet-create` 建空子表 + `+table-put --sheets/--styles` 写入 | `lark-sheets-workbook` | 把文件 `+workbook-import` / `+workbook-create` 另起一张**独立新表**(目标是并入已有工作簿时就跑偏了;这两条只产新表、不接受已有表定位) |
73
+ | 清除内容 / 格式 | `+cells-clear`(范围维度用 `--scope`,取值 content / formats / all) | `lark-sheets-range-operations` | `--type` |
74
+ | 批量清除多区域 | `+cells-batch-clear`(`--scope`) | `lark-sheets-batch-update` | `--target` |
75
+ | 调整列宽 / 行高 | `+cols-resize` / `+rows-resize`(行、列是两个独立命令) | `lark-sheets-range-operations` | `--dimension`(无此 flag) |
76
+ | 分组汇总 / 透视 | `+pivot-create`(默认不传落点 flag → 自动新建子表,零覆盖) | `lark-sheets-pivot-table` | 用 SUMIF / 本地脚本拼一张假透视表 |
77
+ | 画图表 / 可视化(柱 / 折线 / 饼 / 条 / 散点 / 组合…) | `+chart-create` | `lark-sheets-chart` | matplotlib / 本地画图再贴图(原生图表可交互、随数据更新) |
78
+ | 条件高亮 / 数据条 / 色阶 / 重复值标记 | `+cond-format-create` | `lark-sheets-conditional-format` | `+highlight`、`+conditional-format`、逐格 `+cells-set-style` 硬凑 |
79
+ | 筛选 / 只看符合条件的行 | `+filter-create` | `lark-sheets-filter` | pandas filter 后覆盖写回(会毁原数据;要保存多份筛选状态用 `+filter-view-create`) |
80
+
81
+ > ⚠️ **动手前的触发式必读(按动作判定,不看主场景)**:本次操作只要**涉及样式 / 美化**(底色 / 边框 / 字号 / 对齐 / 数字格式 / 汇总行 / 配色 / 列宽行高),动手前先读 `lark-sheets-visual-standards`;只要**要写飞书公式**,动手前先读 `lark-sheets-formula-translation`(飞书函数与 Excel 有差异,凭直觉迁移易错),**写完后再读 `lark-sheets-formula-verify` 并执行 `+formula-verify` 收尾**。哪怕主任务是"建表 / 展开数据 / 录入",只要动作里含美化或写公式就适用——别因"这不算专门的美化 / 公式任务"而跳过。
60
82
  > ⚠️ **两种图片别选错**:图若**绑定某条记录、要随行排序 / 筛选 / 增删**(凭证 / 证件照 / 每行配图,话里带「对应 / 每行 / 这列」等绑定词)→ 单元格图片 `+cells-set-image`;只是自由摆放的装饰(logo / 水印 / 封面)→ 浮动图片 `+float-image-create`。别因「浮动图更好控制 / 更熟」默认选浮动图。
61
- > ⚠️ **纯文本还是数值语义**:要写的列里有数字 / 金额 / 百分比 / 日期 / 计数 → `+table-put`(写入已有表;外层 `{"sheets":[...]}` 包裹、列 pandas dtype 用 `dtypes`、展示格式用 `formats`,保留排序 / 求和 / 图表 / 透视能力;**目标表还不存在就用 `+workbook-create --sheets`**,同 typed 协议、一步建表 + 写入,别先建空表再 `+table-put`);只有纯文本才用 `+csv-put`。两者写完显示可以完全相同,但 `+csv-put` 落的是文本、不能参与计算——别把数值在本地拼成带 `$` / `%` 的字符串再走 `+csv-put`。
83
+ > ⚠️ **纯文本还是数值语义(看数据本质,不看当下用途)**:金额 / 百分比 / 比率 / 计数 / 日期等**本质是量值**的数据 → 一律数值写入,常规二维表用 `+table-put`(`dtypes` 声明类型 + `formats` 设展示格式),版式装不下(多级 / 合并表头的宽表 leaderboard 等)改用 `+cells-set` 传数字(百分比传小数 `0.4`)+ `number_format`,照样显示 `40%` 且数值无损。只有编号 / 身份证 / 单据号这类**本质是标识符**、要字面保真的才用 `+csv-put` 平铺。**几个常见借口都不成立**——"只是 leaderboard / 报表展示不用算""版式复杂""样式以后再刷、先铺文本"都不是把百分比写成 `"40%"` 字符串灌 `+csv-put` 的理由(展示不改变它是数值;类型不能后补,落成文本就回不来)。判据与操作展开见 `lark-sheets-write-cells`「数字还是文本」。
84
+ > ⚠️ **要新建子表 / 整表美化 → 别默认「`+csv-put` 写值再事后刷样式」**:`+table-put` / `+workbook-create` 的 `--styles` 能在写数据的**同一步**带全套样式(区域底色 / 边框 / 列宽 / 行高 / 合并),且 `+table-put` 的 payload 里若 sheet 名不在工作簿中会自动新建子表——**纯文本表要新建子表 + 美化时同样走这里**(`--styles` 与列是否 typed 无关),比「`+csv-put` 写值 + 多次 `+cells-batch-set-style` / `+*-resize` 刷样式」少好几次调用(冻结行列等 sheet 级属性仍需 `+dim-freeze` 单独一步)。
62
85
  > ⚠️ **定位 flag**:`+cells-get` / `+cells-set` / `+csv-get` 用 `--range`;`+csv-put` 规范用 `--start-cell`(单个左上角锚点格),也接受 `--range` 别名(区间自动取左上角),二者择一即可。
63
86
  > ⚠️ **读取附加信息**一律走 `+cells-get --include …`,**没有** `--with-styles` 这类 flag;**看合并单元格**用 `+sheet-info` 的 `merged_cells`,不要在 `+cells-get` 里找 merge flag。
64
87
 
88
+ ## 执行要点(读取 / 原生工具 / 陷阱)
89
+
90
+ 准则的实操展开。端到端工作流:了解结构 → 读数据 → 理解语义 → 原生工具优先 → 写入 → 回读验证。
91
+
92
+ ### 读取:按需求选路径(细则见 `lark-sheets-read-data`)
93
+
94
+ | 用户需求 | 读取路径 |
95
+ |---|---|
96
+ | "完善 / 补齐 / 填空 / 修正所有 XX"、分析 / 清洗 / 大数据 | 原生优先(公式 / `+pivot` / `+filter`);表达不了再分批 `+csv-get` 导出 + 脚本处理 + 分批回写(默认覆盖所有对应数据行,不以用户选区为准) |
97
+ | "查一下 / 看看 / 统计 / 汇总"等只读 | `+csv-get` 读到上下文 |
98
+ | 需要公式 / 样式 / 批注 | `+cells-get` |
99
+ | 续写 / 扩展已有内容 | `+csv-get` 看结构 + `+cells-get` 读源区样式 + `+sheet-info --include row_heights,merges`(见准则 5) |
100
+
101
+ > "补齐 / 填空"类用只读路径探 10 行就写会漏写表尾——写入前先按 `lark-sheets-read-data` 确认真实数据末行(准则 3)。
102
+
103
+ ### 计算:原生工具优先,代码兜底(强化准则 7)
104
+
105
+ | 用户需求 | 用原生 | 禁止的替代 |
106
+ |---|---|---|
107
+ | 按 X 统计 Y、分组汇总 | `+pivot-{create\|update\|delete}` | pandas groupby → 写值 |
108
+ | 求和 / 计数 / 平均 / 占比 | 公式 | Python 算 → 写静态值 |
109
+ | 图表 / 可视化 | `+chart-*` | matplotlib |
110
+ | 条件高亮 / 色阶 | `+cond-format-*` | 逐格设样式 |
111
+ | 筛选 | `+filter-*` | pandas filter → 覆盖写入 |
112
+ | 文本提取 / 转换 / 查找 | 公式(REGEXEXTRACT / TEXT / VLOOKUP 等) | Python → 写静态值 |
113
+
114
+ 只有多步清洗、统计建模、公式试错 3 次仍失败时才用代码。
115
+
116
+ ### 用脚本配合 CLI 时
117
+
118
+ - **只读 stdout**:CLI 数据走 stdout、诊断走 stderr;解析 JSON 别 `2>&1`(警告混入会解析失败),用管道或单独重定向 stdout。
119
+ - **喂 CLI 的 CSV / JSON 用 UTF-8 无 BOM**;临时文件放系统临时目录、勿落项目目录。
120
+ - **命令失败先读 stderr 再调整**,别原样重发。
121
+ - **回写纯单元格值**:剥离 `值(V-Align: bottom)` 这类"值(样式)"串与残留引号再写;排序优先 `+range-sort` 原生工具,别"读出本地排完再整列写回"。
122
+
123
+ ### 易漏陷阱
124
+
125
+ - **`+dim-insert` 不继承行高**:只继承值 / 公式 / 边框,新行回落默认高度截断长文本;插行填长文本前读相邻行 `row_height`,用 `+batch-update` 合 `+rows-resize` 补齐。
126
+ - **公式容错**:日期 / 查找 / 数值转换公式用 `IFERROR` 包裹;写完读结果列首末各 5 行查 `#VALUE!` / `#REF!` / `#DIV/0!`,然后继续跑 `+formula-verify` 直到 `status='success'`;同一方案试错上限 3 次。
127
+ - **循环引用**:聚合公式引用范围不能含目标 cell 自身或其传递依赖。
128
+ - **隐藏行列**:`+csv-get` 默认含隐藏行列;设 `--skip-hidden=true` 只看可见,但返回行序号与实际行号不再对应。
129
+ - **跨 sheet 对象**:图表 / 条件格式 / 透视表 / 浮动图片可能分布在多个子表,操作前先 `+workbook-info` 掌握全局。
130
+ - **NLP 任务分批**:语义理解 / 翻译 / 改写 / 分类等用 NLP 处理(代码只做分批 / 行号映射 / 写回);数据量大必须分批(通常 30 行 / 批),每批处理完即时写回,单批生成通常 ≤ 300 行,多批用 `+batch-update`。
131
+
65
132
  ## References
66
133
 
67
- 本 skill 的 reference 分两组:先读**通用方法与规范**(横切所有任务的工作流、铁律、样式、公式规则,不含具体 shortcut),它们规定了"怎么做对";再按操作对象进入**工具参考**查具体 shortcut 与调用细节。编辑类任务务必先过一遍通用方法与规范,其中的铁律对所有工具参考一律生效。
134
+ 本 skill 的 reference 分两组:先读**通用方法与规范**(横切所有任务的样式、公式规则,不含具体 shortcut),它们规定了"怎么做对";再按操作对象进入**工具参考**查具体 shortcut 与调用细节。编辑类任务务必先过一遍通用方法与规范,连同上方「飞书表格编辑准则」对所有工具参考一律生效。
68
135
 
69
136
  ### 通用方法与规范(先读,横切所有任务,不含具体 shortcut)
70
137
 
71
138
  | Reference | 描述 |
72
139
  | --- | --- |
73
- | [飞书表格核心操作:分析、编辑与可视化](references/lark-sheets-core-operations.md) | 飞书表格核心操作工作流。当用户需要对已有的飞书表格进行查看、分析、编辑或可视化时使用。适用场景:数据查询与统计、公式计算、表格美化、创建图表/透视表、筛选排序、批量修改数据、调整表格结构等。即使用户没有明确说"飞书表格",只要操作对象是已有的在线表格,都应触发此工作流。 |
74
- | [飞书表格样式与配色规范](references/lark-sheets-visual-standards.md) | 飞书表格样式与配色规范:表头/数据区/汇总行的颜色、字号、对齐、边框等取值标准,以及新增汇总行、追加行列继承原表风格、已有区域美化等典型场景的决策流程与样式要点。工具调用参数细节请参考对应的 lark-sheets-write-cells / lark-sheets-range-operations / lark-sheets-batch-update。条件格式(高亮、标红、数据条、色阶)请使用 lark-sheets-conditional-format。 |
75
- | [飞书表格公式生成规则](references/lark-sheets-formula-translation.md) | Excel 公式到飞书表格公式的迁移与生成规则。核心目标不是保留 Excel 原语法,而是按飞书表格可执行规则重写公式,并在结果上尽量对齐 Excel。当用户要求把 Excel 公式改写成飞书表格公式,或需要生成飞书公式(尤其涉及 ARRAYFORMULA、原生数组函数、INDEX/OFFSET、MAP/LAMBDA、日期差、多层范围结果与二次展开)时使用。 |
140
+ | [飞书表格样式与配色规范](references/lark-sheets-visual-standards.md) | 飞书表格样式与配色规范:表头/数据区/汇总行的颜色、字号、对齐、边框、数字格式等取值标准,以及从零新建表格的版式美化、新增汇总行、追加行列继承原表风格、已有区域美化等典型场景的决策流程与样式要点。工具调用参数细节请参考对应的 lark-sheets-write-cells / lark-sheets-range-operations / lark-sheets-batch-update。条件格式(高亮、标红、数据条、色阶)请使用 lark-sheets-conditional-format。 |
141
+ | [飞书表格公式生成规则](references/lark-sheets-formula-translation.md) | Excel 公式到飞书表格公式的迁移与生成规则。核心目标不是保留 Excel 原语法,而是按飞书表格可执行规则重写公式,并在结果上尽量对齐 Excel。当用户要求把 Excel 公式改写成飞书表格公式,或需要生成飞书公式(尤其涉及 ARRAYFORMULA、原生数组函数、INDEX/OFFSET、MAP/LAMBDA、日期差、多层范围结果与二次展开)时使用。本文只负责把公式写对,落表后的强制收尾请接 `lark-sheets-formula-verify`。 |
76
142
 
77
143
  ### 按对象的工具参考(含 shortcut)
78
144
 
79
145
  | Reference | 描述 |
80
146
  | --- | --- |
147
+ | [Lark Sheet Formula Verify](references/lark-sheets-formula-verify.md) | 公式写入 / 批量填充 / `--copy-to-range` 扩展 / 导入含公式工作簿后的强制自检入口。对指定子表(或整本工作簿)扫描公式与单元格值,聚合所有 Excel 错误(#REF! / #DIV/0! / #VALUE! / #NAME? / #NULL! / #NUM! / #N/A),同时合并最近一次写入留下的编译失败(formula_errors),输出统一 JSON 让 AI 一次拿到完整健康度报告。只要任务涉及写公式,落表后就应调用 +formula-verify 收敛到 zero-error;`status='errors_found'` 或 `status='partial'` 时禁止把链路标为完成。 |
81
148
  | [Lark Sheet Workbook](references/lark-sheets-workbook.md) | 管理飞书表格的工作簿结构(子表列表及元数据)。当用户提到"看看这个表格有什么"、"表格结构"、"有哪些 sheet"、"新建一个 sheet"、"删除这个工作表"、"重命名"、"复制一份"、"移动到前面"时使用。 |
82
149
  | [Lark Sheet Sheet Structure](references/lark-sheets-sheet-structure.md) | 管理飞书表格的子表结构与布局。适用场景:查看行高、列宽、隐藏行列、合并单元格等布局信息,以及"插入一行"、"删除这列"、"隐藏行"、"冻结表头"、行列分组(大纲折叠/展开)等操作。行列大纲仅在用户明确提到"行分组"、"列分组"、"大纲"、"outline"时才触发,"按XXX分组"等数据分组场景请使用 lark-sheets-pivot-table。如需在表尾追加数据,应先通过此 skill 插入行,再通过 lark-sheets-write-cells 写入。 |
83
150
  | [Lark Sheet Read Data](references/lark-sheets-read-data.md) | 读取飞书表格中的单元格数据。当用户需要"看看数据"、"分析数据"、"统计/汇总"时使用;也适用于需要查看公式、样式、批注等详细信息的场景。 |
84
151
  | [Lark Sheet Search & Replace](references/lark-sheets-search-replace.md) | 在飞书表格中搜索和替换文本,支持限定范围、大小写匹配、精确匹配、正则表达式。当用户需要"查找"、"搜索"、"定位"某个值,或"替换"、"批量修改文本"、"把 A 改成 B"时使用。不要用于理解表格结构(应读取数据)、不要用于数据分析(应读取数据后计算)、不要把用户操作动作中的关键词(如"汇总金额""统计数量")当作搜索词。 |
85
- | [Lark Sheet Write Cells](references/lark-sheets-write-cells.md) | 向飞书表格的指定区域批量写入值、公式、样式、批注或单元格图片。适用场景:填写数据、设置公式、修改格式、添加批注、嵌入单元格图片(如需操作浮动图片,请使用 lark-sheets-float-image);若只需把一块 CSV 批量铺到表格上(值或公式,不带样式/批注),直接使用 `+csv-put` 更短更快。追加数据需先通过 lark-sheets-sheet-structure 插入行列。 |
152
+ | [Lark Sheet Write Cells](references/lark-sheets-write-cells.md) | 向飞书表格的指定区域批量写入值、公式、样式、批注或单元格图片。适用场景:填写数据、设置公式、修改格式、添加批注、嵌入单元格图片(如需操作浮动图片,请使用 lark-sheets-float-image);若只需把一块 CSV 批量铺到表格上(值或公式,不带样式/批注),直接使用 `+csv-put` 更短更快。追加数据需先通过 lark-sheets-sheet-structure 插入行列。只要这次写入真实落了公式,收尾默认继续执行 `lark-sheets-formula-verify`。 |
86
153
  | [Lark Sheet Range Operations](references/lark-sheets-range-operations.md) | 对飞书表格中指定区域执行结构性操作(不涉及写入单元格数据值)。适用场景:清除内容或格式("清空"、"删除内容"、"去掉格式")、合并/取消合并单元格、调整行高列宽("加宽列"、"自适应列宽")、移动/复制/填充/排序数据("移动数据"、"复制到"、"自动填充"、"按某列排序")。写入单元格数据请使用 lark-sheets-write-cells。 |
87
154
  | [Lark Sheet Batch Update](references/lark-sheets-batch-update.md) | 将多个飞书表格写入操作合并为一次批量执行,按顺序依次完成。适合需要连续执行多个写入操作的场景(如先修改结构再写入数据)。 |
88
155
  | [Lark Sheet Chart](references/lark-sheets-chart.md) | 管理飞书表格中的图表(柱形图、折线图、饼图、条形图、面积图、散点图、组合图、雷达图等)。当用户需要创建图表、修改图表样式或数据源、查看已有图表配置、删除图表时使用。也适用于用户提到"数据可视化"、"画个图"、"趋势分析"、"对比图"、"占比分析"、"做个图表"等数据可视化相关场景。 |
@@ -92,6 +159,8 @@ metadata:
92
159
  | [Lark Sheet Filter View](references/lark-sheets-filter-view.md) | 管理飞书表格中的筛选视图(filter view)。当用户需要"建一个 XX 视图"、"保存这个筛选状态"、"切换不同筛选"、维护一个 sheet 上多份独立筛选配置时使用。视图与筛选器(filter)相互独立,可在同一 sheet 共存;视图的隐藏行仅在用户进入该视图时本地生效,不影响其他协作者。 |
93
160
  | [Lark Sheet Sparkline](references/lark-sheets-sparkline.md) | 管理飞书表格中的迷你图(折线迷你图、柱形迷你图、胜负迷你图)。当用户需要在单元格内嵌入小型图表来展示数据趋势时使用。也适用于"趋势线"、"单元格内图表"、"迷你图"等场景。注意:不等同于被禁用的 SPARKLINE() 公式函数。 |
94
161
  | [Lark Sheet Float Image](references/lark-sheets-float-image.md) | 管理飞书表格中的浮动图片。当用户需要在表格中插入浮动图片、调整图片位置和大小、查看已有浮动图片、删除图片时使用。也适用于"插入图片"、"添加 logo"、"放一张图"等场景。注意:如果用户需要将图片嵌入到某个单元格内部(单元格图片),请阅读 lark-sheets-write-cells。 |
162
+ | [Lark Sheet History](references/lark-sheets-history.md) | 查询飞书表格的历史版本并回滚到指定版本。当用户需要查看一张表的编辑历史版本列表、回滚到某个历史版本、或查询回滚的异步状态(进行中/成功/失败)时使用。回滚为异步操作,发起后通过状态查询轮询结果。仅针对飞书表格。 |
163
+ | [Lark Sheet Changeset](references/lark-sheets-changeset.md) | 读取两个版本(CS revision)之间的 changeset(原始变更操作清单),用于复核某次编辑——尤其是 AI 编辑——是否真实满足用户诉求。传入起始版本(编辑前基线),可选结束版本(省略取最新),版本差上限 20;返回里最外层带当前表格最新版本号。当用户需要"看看这次改了什么"、"核对 AI 改动"、"对比两个版本的变更"时使用。 |
95
164
 
96
165
  ## 公共 flag 速查
97
166