@amaster.ai/pi-lark 0.1.2-beta.42 → 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.
@@ -347,28 +347,30 @@ value 使用预定义关键字机制,第一个元素为字符串常量名称
347
347
  |------|------|------|------|
348
348
  | `format` | string | 是 | 固定为 `"flat"`,表示返回扁平化的对象数组 |
349
349
 
350
- ## API 出参详情
350
+ ## CLI 出参详情
351
+
352
+ CLI 输出标准信封 `{ok, identity, data}`(失败时为 `{ok:false, identity, error}`)。
351
353
 
352
354
  **成功时:**
353
355
 
354
356
  ```json
355
- {"code": 0, "data": {"main_data": [{"dim_city": {"value": "北京"}, "total_amount": {"value": 12345.00}}, ...]}, "msg": ""}
357
+ {"ok": true, "identity": "user", "data": {"main_data": [{"dim_city": {"value": "北京"}, "total_amount": {"value": 12345.00}}, ...]}}
356
358
  ```
357
359
 
358
360
  **失败时:**
359
361
 
360
362
  ```json
361
- {"code": 800004006, "data": {"error": {"code": 800004006, ...}}, "msg": "DSL validation failed"}
363
+ {"ok": false, "identity": "user", "error": {"type": "api", "subtype": "unknown", "code": 800004006, "message": "...does not exist in table schema", "hint": "...", "log_id": "..."}}
362
364
  ```
363
365
 
364
366
  **Response 字段:**
365
367
 
366
368
  | 字段 | 类型 | 说明 |
367
369
  |------|------|------|
368
- | `code` | int | 状态码,0 为成功 |
369
- | `msg` | string | 错误信息 |
370
- | `data.main_data` | []object | 查询结果数组,每个元素为一行数据 |
371
- | `data.error` | object | 失败时的错误详情 |
370
+ | `ok` | bool | 是否成功 |
371
+ | `identity` | string | 执行身份:`user` / `bot` |
372
+ | `data.main_data` | []object | 查询结果数组,每个元素为一行数据(成功时) |
373
+ | `error` | object | 失败时的 typed 错误,含 `type` / `subtype` / `code` / `message` / `hint` / `log_id` |
372
374
 
373
375
  每行数据的字段值封装在 CellValue 中:
374
376
 
@@ -23,12 +23,12 @@ lark-cli base +field-create \
23
23
  lark-cli base +field-create \
24
24
  --base-token <base_token> \
25
25
  --table-id <table_id> \
26
- --json '{"name":"状态","type":"select","multiple":false,"options":[{"name":"Todo","hue":"Blue","lightness":"Lighter"},{"name":"Done","hue":"Green","lightness":"Light"}]}'
26
+ --json '{"name":"状态","type":"select","multiple":false,"default_value":["Todo"],"options":[{"name":"Todo","hue":"Blue","lightness":"Lighter"},{"name":"Done","hue":"Green","lightness":"Light"}]}'
27
27
 
28
28
  lark-cli base +field-create \
29
29
  --base-token <base_token> \
30
30
  --table-id <table_id> \
31
- --json '{"name":"负责人","type":"user","multiple":false,"description":"用于标记记录的直接负责人;协作约定可参考[团队字段约定](https://example.com/field-spec)"}'
31
+ --json '{"name":"负责人","type":"user","multiple":false,"default_value":[{"$slot":"current_user"}],"description":"用于标记记录的直接负责人;协作约定可参考[团队字段约定](https://example.com/field-spec)"}'
32
32
  ```
33
33
 
34
34
  ## 参数
@@ -51,6 +51,7 @@ POST /open-apis/base/v3/bases/:base_token/tables/:table_id/fields
51
51
  - `--json` 必须是 **JSON 对象**,顶层直接传字段定义,不要再套一层。
52
52
  - 顶层最少包含:`name`、`type`。
53
53
  - 所有字段类型都支持可选 `description`;支持纯文本,也支持 Markdown 链接,如 `协作约定可参考[团队字段约定](https://example.com/field-spec)`。
54
+ - 需要字段默认值时传 `default_value`,直接使用字段对应 CellValue;`datetime` / `user` 的动态填充用 `$slot`。完整规则见 [lark-base-field-json.md](lark-base-field-json.md)。
54
55
  - `type` 不同,必填子字段不同:
55
56
  - `select`:`multiple` 控制是否多选,`options` 定义静态选项,`dynamic_options_source` 定义动态选项来源。静态与动态选项配置二选一,不能同时传。
56
57
  - `link`:必须有 `link_table`,可选 `bidirectional`、`bidirectional_link_field_name`。
@@ -64,6 +65,7 @@ POST /open-apis/base/v3/bases/:base_token/tables/:table_id/fields
64
65
  "name": "状态",
65
66
  "type": "select",
66
67
  "multiple": false,
68
+ "default_value": ["Todo"],
67
69
  "options": [
68
70
  { "name": "Todo", "hue": "Blue", "lightness": "Lighter" },
69
71
  { "name": "Done", "hue": "Green", "lightness": "Light" }
@@ -9,6 +9,7 @@
9
9
  - `--json` 必须是 JSON 对象。
10
10
  - 顶层统一使用:`type` + `name` + 类型特有字段。
11
11
  - 所有字段类型都支持可选 `description`;支持纯文本,也支持 Markdown 链接。
12
+ - 字段默认值使用 `default_value`,直接传对应 CellValue;支持范围只有 `text`、`number`、静态 `select`、`datetime`、`user`。清空默认值传 `null`;省略表示创建时不设置、更新时不修改。
12
13
  - 不要使用旧结构:`field_name`、`property`、`ui_type`、数字枚举 `type`。
13
14
  - `+field-update` 使用同样的字段 JSON 结构,但语义是 `PUT`;这是高风险写入操作,建议先 `+field-get` 再按目标状态全量提交,并带 `--yes`。
14
15
  - `type=formula` 或 `type=lookup` 创建/更新前,必须先读对应 guide。
@@ -27,12 +28,12 @@
27
28
 
28
29
  | 类型 | 最小必填字段 | 常见补充字段 |
29
30
  |------|--------------|-------------|
30
- | `text` | `type` `name` | `style.type` |
31
- | `number` | `type` `name` | `style` |
32
- | `select` | `type` `name` | `multiple` + `options`,或 `multiple` + `dynamic_options_source` |
33
- | `datetime` | `type` `name` | `style.format` |
31
+ | `text` | `type` `name` | `style.type` `default_value` |
32
+ | `number` | `type` `name` | `style` `default_value` |
33
+ | `select` | `type` `name` | `multiple` + `options` + 静态 `default_value`,或 `multiple` + `dynamic_options_source` |
34
+ | `datetime` | `type` `name` | `style.format` `default_value` |
34
35
  | `created_at` / `updated_at` | `type` `name` | `style.format` |
35
- | `user` / `group_chat` | `type` `name` | `multiple` |
36
+ | `user` / `group_chat` | `type` `name` | `multiple`;仅 `user` 支持 `default_value` |
36
37
  | `created_by` / `updated_by` | `type` `name` | 无 |
37
38
  | `link` | `type` `name` `link_table` | `bidirectional` `bidirectional_link_field_name` |
38
39
  | `formula` | `type` `name` `expression` | 无 |
@@ -47,31 +48,37 @@
47
48
  ### 3.1 text
48
49
 
49
50
  文本字段;电话、超链接、邮箱、条码也都属于 `text`,通过 `style.type` 区分。
51
+ 支持 `default_value`:静态 Markdown 文本字符串;`phone` style 必须是合法电话号码;`url` style 传一个 Markdown 链接或裸 URL;`email` style 必须是合法邮箱字符串,不要传 Markdown 链接或 `mailto:`。
50
52
 
51
53
  最小写法(默认 `style.type` 为 `plain`):
52
54
 
53
55
  ```json
54
56
  {
55
57
  "type": "text",
56
- "name": "标题"
58
+ "name": "标题",
59
+ "default_value": "默认标题"
57
60
  }
58
61
  ```
59
62
 
60
63
  常用写法:
61
64
 
65
+ 默认值可以是 Markdown 文本
62
66
  ```json
63
67
  {
64
68
  "type": "text",
65
69
  "name": "标题",
66
- "description": "主标题字段"
70
+ "description": "主标题字段",
71
+ "default_value": "未命名"
67
72
  }
68
73
  ```
69
74
 
75
+ `style.type=phone` 时默认值是合法电话号码字符串。
70
76
  ```json
71
77
  {
72
78
  "type": "text",
73
79
  "name": "联系电话",
74
- "style": { "type": "phone" }
80
+ "style": { "type": "phone" },
81
+ "default_value": "+8613800000000"
75
82
  }
76
83
  ```
77
84
 
@@ -79,7 +86,17 @@
79
86
  {
80
87
  "type": "text",
81
88
  "name": "官网",
82
- "style": { "type": "url" }
89
+ "style": { "type": "url" },
90
+ "default_value": "[官网](https://example.com)"
91
+ }
92
+ ```
93
+
94
+ ```json
95
+ {
96
+ "type": "text",
97
+ "name": "邮箱",
98
+ "style": { "type": "email" },
99
+ "default_value": "owner@example.com"
83
100
  }
84
101
  ```
85
102
 
@@ -88,13 +105,15 @@
88
105
  ### 3.2 number
89
106
 
90
107
  数字字段;货币、进度、评分都属于 `number`,通过 `style.type` 区分。
108
+ 支持 `default_value`:静态 JSON number;所有 number style 都按这个规则写。
91
109
 
92
110
  最小写法(默认 `style.type` 为 `plain`):
93
111
 
94
112
  ```json
95
113
  {
96
114
  "type": "number",
97
- "name": "工时"
115
+ "name": "工时",
116
+ "default_value": 8
98
117
  }
99
118
  ```
100
119
 
@@ -118,7 +137,8 @@
118
137
  "precision": 2,
119
138
  "percentage": false,
120
139
  "thousands_separator": true
121
- }
140
+ },
141
+ "default_value": 8
122
142
  }
123
143
  ```
124
144
 
@@ -151,7 +171,8 @@
151
171
  {
152
172
  "type": "number",
153
173
  "name": "完成度",
154
- "style": { "type": "progress", "percentage": true, "color": "Blue" }
174
+ "style": { "type": "progress", "percentage": true, "color": "Blue" },
175
+ "default_value": 0.65
155
176
  }
156
177
  ```
157
178
 
@@ -180,6 +201,7 @@
180
201
  #### 静态选项
181
202
 
182
203
  支持字段:`multiple`、`options`
204
+ 支持 `default_value`:静态选项名数组;即使 `multiple=false` 也写数组,如 `["Todo"]`。
183
205
 
184
206
  默认值 / 约束:
185
207
  - `multiple` 默认 `false`
@@ -189,12 +211,14 @@
189
211
  - `options[].hue` 可用:`Red`、`Orange`、`Yellow`、`Lime`、`Green`、`Turquoise`、`Wathet`、`Blue`、`Carmine`、`Purple`、`Gray` 缺省值为 `Blue`
190
212
  - `options[].lightness` 可用:`Lighter`、`Light`、`Standard`、`Dark`、`Darker` 缺省值为 `Lighter`
191
213
  - 选项里没有 `id`,只有 `name`。
214
+ - 支持 `default_value` 配置:填选项名数组。
192
215
 
193
216
  ```json
194
217
  {
195
218
  "type": "select",
196
219
  "name": "状态",
197
220
  "multiple": false,
221
+ "default_value": ["Todo"],
198
222
  "options": [
199
223
  { "name": "Todo", "hue": "Blue", "lightness": "Lighter" },
200
224
  { "name": "Done", "hue": "Green", "lightness": "Light" }
@@ -205,6 +229,7 @@
205
229
  #### 动态选项
206
230
 
207
231
  支持字段:`multiple`、`dynamic_options_source`
232
+ 动态选项不支持 `default_value`。
208
233
 
209
234
  默认值 / 约束:
210
235
  - `multiple` 默认 `false`
@@ -213,6 +238,7 @@
213
238
  - `dynamic_options_source.field_id` 填来源字段 id 或字段名
214
239
  - `dynamic_options_source` 仅创建支持;更新已有字段时不要传
215
240
  - 引用选项条件 / 级联筛选条件:这个功能在 Base 前端支持,属于 UI-only 属性,OpenAPI 里不支持,CLI 不能读取、创建或更新;不要根据接口返回缺失判断未配置
241
+ - 动态选项不支持配置 `default_value`。
216
242
 
217
243
  ```json
218
244
  {
@@ -229,13 +255,15 @@
229
255
  ### 3.4 datetime
230
256
 
231
257
  手动填写的日期/时间字段。系统时间用 `created_at` / `updated_at`。
258
+ 支持 `default_value`:静态时间字符串,或 `{ "$slot": "record_created_time" }`。`datetime + record_created_time` 是自动填充可编辑单元格;`created_at` 是只读创建时间元信息。
232
259
 
233
260
  最小写法:
234
261
 
235
262
  ```json
236
263
  {
237
264
  "type": "datetime",
238
- "name": "截止时间"
265
+ "name": "截止时间",
266
+ "default_value": "2026-03-24 10:00:00"
239
267
  }
240
268
  ```
241
269
 
@@ -251,7 +279,8 @@
251
279
  {
252
280
  "type": "datetime",
253
281
  "name": "截止时间",
254
- "style": { "format": "yyyy-MM-dd HH:mm" }
282
+ "style": { "format": "yyyy-MM-dd HH:mm" },
283
+ "default_value": { "$slot": "record_created_time" }
255
284
  }
256
285
  ```
257
286
 
@@ -276,12 +305,19 @@
276
305
  ### 3.6 user / group_chat
277
306
 
278
307
  人员字段和群字段都支持 `multiple`。
308
+ `user` 支持 `default_value`:人员 CellValue 数组,元素可用 `{ "id": "ou_xxx" }` 或 `{ "$slot": "current_user" }`;不要猜用户 ID。`group_chat` 不支持默认值。
279
309
 
280
310
  默认值 / 约束:
281
311
  - `multiple` 默认 `true`
312
+ - `user` 字段支持 `default_value` 配置,`group_chat` 字段不支持 `default_value` 配置。
282
313
 
283
314
  ```json
284
- { "type": "user", "name": "负责人", "multiple": true }
315
+ {
316
+ "type": "user",
317
+ "name": "负责人",
318
+ "multiple": true,
319
+ "default_value": [{ "$slot": "current_user" }, { "id": "ou_xxx" }]
320
+ }
285
321
  ```
286
322
 
287
323
  ```json
@@ -488,3 +524,4 @@ Object(对象字段)、Button(按钮字段)、Stage(流程字段)暂
488
524
  - `number` 的精度、货币、进度、评分配置都放在 `style` 下,不要写顶层 `precision`。
489
525
  - `datetime` 是手动日期字段;系统时间请改用 `created_at` / `updated_at`。
490
526
  - `formula` / `lookup` 没读 guide 前不要直接写。
527
+ - 只有 `text`、`number`、静态 `select`、`datetime`、`user` 支持 `default_value`;清空统一传 `"default_value": null`。其他字段类型不要配置默认值。
@@ -11,14 +11,14 @@ lark-cli base +field-update \
11
11
  --base-token <base_token> \
12
12
  --table-id <table_id> \
13
13
  --field-id <field_id> \
14
- --json '{"name":"状态","type":"select","multiple":false,"options":[{"name":"Todo","hue":"Blue","lightness":"Lighter"},{"name":"Doing","hue":"Orange","lightness":"Light"},{"name":"Done","hue":"Green","lightness":"Light"}]}' \
14
+ --json '{"name":"状态","type":"select","multiple":false,"default_value":["Doing"],"options":[{"name":"Todo","hue":"Blue","lightness":"Lighter"},{"name":"Doing","hue":"Orange","lightness":"Light"},{"name":"Done","hue":"Green","lightness":"Light"}]}' \
15
15
  --yes
16
16
 
17
17
  lark-cli base +field-update \
18
18
  --base-token <base_token> \
19
19
  --table-id <table_id> \
20
20
  --field-id <field_id> \
21
- --json '{"name":"负责人","type":"user","multiple":false,"description":"用于标记记录的直接负责人"}' \
21
+ --json '{"name":"负责人","type":"user","multiple":false,"default_value":null,"description":"用于标记记录的直接负责人"}' \
22
22
  --yes
23
23
  ```
24
24
 
@@ -47,6 +47,7 @@ PUT /open-apis/base/v3/bases/:base_token/tables/:table_id/fields/:field_id
47
47
  - `--json` 必须是 **JSON 对象**,顶层直接传字段定义。
48
48
  - 更新语义是 `PUT`(全量字段配置更新),不要只传零散片段;至少显式包含 `name`、`type`,并补齐该类型所需关键配置。
49
49
  - 所有字段类型都支持可选 `description`;支持纯文本,也支持 Markdown 链接。
50
+ - 需要字段默认值时传 `default_value`,直接使用字段对应 CellValue;传 `null` 清空,省略表示不修改现有默认值。完整规则见 [lark-base-field-json.md](lark-base-field-json.md)。
50
51
  - `select` 更新时:`options` 仍按对象数组传,避免混入无效字段。
51
52
  - `link` 更新限制:
52
53
  - 不能把非 `link` 字段改成 `link`,也不能把 `link` 改成非 `link`。
@@ -59,6 +60,7 @@ PUT /open-apis/base/v3/bases/:base_token/tables/:table_id/fields/:field_id
59
60
  "name": "状态",
60
61
  "type": "select",
61
62
  "multiple": false,
63
+ "default_value": ["Doing"],
62
64
  "options": [
63
65
  { "name": "Todo", "hue": "Blue", "lightness": "Lighter" },
64
66
  { "name": "Doing", "hue": "Orange", "lightness": "Light" },
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lark-drive
3
3
  version: 1.0.0
4
- description: "飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、评论/权限/订阅、标题、版本和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。"
4
+ description: "飞书云空间(云盘/云存储):管理 Drive 文件和文件夹,包含上传/下载、创建文件夹、复制/移动/删除、查看元数据、评论/权限/订阅、标题、版本、飞书文档密级标签(secure labels)和本地文件导入。用户需要整理云盘目录、处理云空间资源 URL/token、判断链接类型/真实 token/标题,或导入 Word/Markdown/Excel/CSV/PPTX/.base 为 docx/sheet/bitable/slides 时使用;doubao.com 云空间 URL/token 也按资源路径和 token 路由,不回退 WebFetch。不负责:文档内容编辑(走 lark-doc)、表格/Base 表内数据操作(走 lark-sheets/lark-base)、知识空间节点/成员管理(走 lark-wiki)、原生 Markdown 文件读写/patch/diff(走 lark-markdown)。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
@@ -20,10 +20,12 @@ metadata:
20
20
 
21
21
  ## 快速决策
22
22
 
23
+ - 用户要把**已有 Wiki 节点移出知识库,放到 Drive 文件夹或“我的空间”根目录**:切到 `lark-wiki`,使用 `lark-cli wiki +move-to-drive`;不要把 Wiki token 直接交给 `drive +move`。这是会改变文档归属和权限继承的写操作,执行前确认源节点与目标位置。
23
24
  - 用户要**复制文档 / 创建副本 / 另存为副本**时,使用 `lark-cli drive files copy`。先用 `lark-cli schema drive.files.copy --format json` 确认参数;如果来源是 wiki URL/token,先用 `lark-cli drive +inspect` 获取底层 `token` 和 `type`,不要把 wiki token 直接当 `file_token`。`params.file_token` 传源文档 token,`data.folder_token` 传目标文件夹 token,`data.name` 传副本名称,`data.type` 传源文件类型(如 `docx` / `sheet` / `bitable` / `slides`)。示例:`lark-cli drive files copy --params '{"file_token":"<DOC_TOKEN>"}' --data '{"folder_token":"<FOLDER_TOKEN>","name":"<COPY_NAME>","type":"docx"}'`。如返回 `confirmation_required`,按 `lark-shared` 高风险审批协议向用户确认后,在原命令末尾追加 `--yes` 重试。
24
25
  - 用户要**识别飞书 / doubao 云空间 URL 的类型和 token**时,可以先按 URL 路径形态做轻量判断;当路径已明确指向 docx / sheet / bitable / slides / file / folder 等资源时,可直接提取对应 token/type。传入 wiki URL、需要识别标题或 canonical URL、URL/token 有歧义,或后续操作依赖底层真实资源时,再使用 `lark-cli drive +inspect --url '<url>'` 进行识别;具体用法、失败处理和边界见 [`references/lark-drive-inspect.md`](references/lark-drive-inspect.md)。
25
26
  - 高风险写操作(删除、公开权限修改、owner 转移、版本删除/回滚、批量移动/覆盖/同步)必须同时满足三个条件才执行:目标已解析为该操作可直接使用的执行对象,执行细节已明确到可直接调用命令(例如删除的 file-token/type、公开权限修改的共享范围、owner 转移的目标 owner、版本删除/回滚的 version id、移动/覆盖/同步的目标位置和冲突策略),且用户在本轮明确确认执行这些具体目标和执行细节。用户只说“删除没用的文件”“开放/共享给大家”“改成开放”“覆盖/移动这些”只表示目标状态;先只读发现并列出候选、权限档位或执行方案,停止等待用户确认。
26
- - 用户要**检查 / 治理文档权限、公开范围、链接分享、外部访问、复制下载权限、密级标签、owner 转移**,或要“权限风险报告、收紧权限、申请查看 / 编辑权限、转移 / 批量转移 owner”,必须先阅读 [`references/lark-drive-workflow.md`](references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`permission_governance`](references/lark-drive-workflow-permission-governance.md) workflow。
27
+ - 用户要**检查 / 治理文档权限、公开范围、链接分享、外部访问、复制下载权限、密级标签、owner 转移**,或要”权限风险报告、收紧权限、申请查看 / 编辑权限、转移 / 批量转移 owner”,必须先阅读 [`references/lark-drive-workflow.md`](references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`permission_governance`](references/lark-drive-workflow-permission-governance.md) workflow。
28
+ - 用户要为指定飞书文档**设置 / 修改密级标签(secure label)**,或查询当前用户可用的密级标签,直接读取 [`references/lark-drive-secure-label.md`](references/lark-drive-secure-label.md);这是 Drive 文件治理能力。
27
29
  - 用户要**整理云盘 / 文件夹 / 文档库 / 知识库 / 个人文档库**,或要“盘点目录结构、找出未归档/临时/重复/空目录、生成整理方案”,必须先阅读 [`references/lark-drive-workflow.md`](references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`knowledge_organize`](references/lark-drive-workflow-knowledge-organize.md) workflow。默认只生成方案;创建目录、移动资源、申请权限都必须单独确认。
28
30
  - 用户要**搜文档 / Wiki / 电子表格 / 多维表格 / 云空间(云盘/云存储)对象**,优先使用 `lark-cli drive +search`。自然语言里"最近我编辑过的"、"我创建的"(→ `--created-by-me`,原始创建者语义)、"我负责/owner 的"(→ `--mine`,owner 语义)、"最近一周我打开过的 xxx"、"某人 owner 的 docx" 等直接映射到扁平 flag,避免手写嵌套 JSON。
29
31
  - 用户要**获取文档评论列表**时,优先使用 `lark-cli drive +list-comments --url '<url>'`,不要优先手写 `drive file.comments list`;支持妙搭 apps 的 `/page/<token>` URL;具体使用方式先阅读 [`references/lark-drive-list-comments.md`](references/lark-drive-list-comments.md)。
@@ -20,16 +20,20 @@
20
20
 
21
21
  若缺少任一条件,使用 `drive +search`、`drive +inspect` 或只读 API 收集候选并回复待确认清单;启发式规则(打开时间、标题模式、owner、文件类型等)只能作为候选筛选依据,不能升级为删除确认。执行 `drive +delete` 时必须使用解析后的 `--file-token` 和 `--type`。
22
22
 
23
+ ## 批量删除建议
24
+
25
+ 批量删除文件或文件夹时,建议逐个串行处理,不要并发执行删除命令,并发删除可能触发服务端加锁或冲突,导致部分删除失败;这类失败通常需要等待后对单个失败项重试。
26
+
23
27
  ## 命令
24
28
 
25
29
  ```bash
26
- # 删除普通文件
30
+ # 删除普通文件(异步操作,会自动有限轮询任务状态)
27
31
  lark-cli drive +delete \
28
32
  --file-token <FILE_TOKEN> \
29
33
  --type file \
30
34
  --yes
31
35
 
32
- # 删除在线文档
36
+ # 删除在线文档(异步操作,会自动有限轮询任务状态)
33
37
  lark-cli drive +delete \
34
38
  --file-token <DOCX_TOKEN> \
35
39
  --type docx \
@@ -52,22 +56,30 @@ lark-cli drive +delete \
52
56
 
53
57
  ## 行为说明
54
58
 
55
- - **普通文件删除**:同步操作,成功时直接返回 `deleted=true`
56
- - **文件夹删除**:异步操作,接口返回 `task_id`,shortcut 会先做有限轮询;如果在轮询窗口内完成,则直接返回成功结果
57
- - **轮询超时不是失败**:文件夹删除内置最多轮询 30 次、每次间隔 2 秒;如果轮询结束任务仍未完成,会返回 `task_id`、`status`、`ready=false`、`timed_out=true` 和 `next_command`
58
- - **继续查询**:当看到 `next_command` 时,改用 `lark-cli drive +task_result --scenario task_check --task-id <TASK_ID>` 继续查询
59
- - **状态值**:`task_check` 的服务端状态通常是 `success`、`fail`、`process`
59
+ - **删除可能需要等待**:删除操作在服务端可能异步处理,shortcut 会在本次命令内自动做有限次数的结果轮询
60
+ - **已完成则停止**:如果返回 `deleted=true`,且没有返回 `next_command`,说明删除已经完成,不需要再调用 `drive +task_result`
61
+ - **未完成再续查**:如果超过内置轮询次数仍未完成,会返回 `ready=false`、`timed_out=true`、`task_id` 和 `next_command`;此时按 `next_command` 继续查询删除结果
62
+ - **task_id 不是成功条件**:`task_id` 只是续查凭据。没有 `task_id` 但返回 `deleted=true` 时,也表示删除已完成
63
+ - **失败处理**:如果返回 `failed=true` 或 `status=fail`,按错误信息和 `task_id` 报告删除失败;不要重复删除同一资源
64
+
65
+ ## 常见错误处理
66
+
67
+ | 错误码 | 含义 | 建议处理 |
68
+ |--------|------|----------|
69
+ | `1061007` | 文件已删除 | 视为目标已不可用,无需重试删除 |
70
+ | `99991400` | 命中接口限频 | 等待一段时间后重试;批量删除时保持串行并降低频率 |
71
+ | `99991679` | 缺失 scope | 按错误里的 `missing_scopes`、`hint` 申请/授权所需 scope 后重试 |
60
72
 
61
73
  ## 推荐续跑方式
62
74
 
63
75
  ```bash
64
- # 第一步:先直接删除文件夹
76
+ # 第一步:先直接删除资源
65
77
  lark-cli drive +delete \
66
- --file-token <FOLDER_TOKEN> \
67
- --type folder \
78
+ --file-token <FILE_OR_FOLDER_TOKEN> \
79
+ --type <TYPE> \
68
80
  --yes
69
81
 
70
- # 如果返回 ready=false / timed_out=true,再继续查
82
+ # 只有返回 ready=false / timed_out=true 或 next_command 时,才需要继续查
71
83
  lark-cli drive +task_result \
72
84
  --scenario task_check \
73
85
  --task-id <TASK_ID>
@@ -5,15 +5,16 @@
5
5
 
6
6
  将文件或文件夹移动到用户云空间(云盘/云存储)的其他位置。
7
7
 
8
- ## 与 `wiki +move` 的区别
8
+ ## 与 Wiki 移动 shortcut 的区别
9
9
 
10
10
  - `drive +move` 只处理 **Drive 文件夹树内部** 的位置调整,目标位置用 `--folder-token` 表示
11
11
  - `wiki +move` 处理的是 **Wiki 知识空间 / 页面层级**:要么移动已有 Wiki 节点,要么把 Drive 文档迁入 Wiki
12
- - 如果用户说“移动到某个文件夹”“移动到我的空间根目录”,应使用 `drive +move`
12
+ - `wiki +move-to-drive` 把 **已有 Wiki 节点移出知识库**,放到 Drive 文件夹或“我的空间”根目录
13
+ - 如果用户说“移动到某个文件夹”“移动到我的空间根目录”,还要判断源对象:源对象已在 Drive 时使用 `drive +move`;源对象是 Wiki 节点时使用 `wiki +move-to-drive`
13
14
  - 如果用户说“移动到某个知识库 / 页面下”“迁入 Wiki / 知识空间”,应使用 `wiki +move`
14
15
  - 如果用户说“移动到我的文档库 / 我的知识库 / 个人知识库 / my_library”,不要使用 `drive +move`;先按 Wiki 目标处理
15
16
  - `我的文档库` 不是 Drive root folder,也不是 `--folder-token` 省略后的默认目的地
16
- - `drive +move` 不支持 wiki 文档;如果目标是 Wiki,不要尝试用 `drive +move` 代替
17
+ - `drive +move` 不支持 Wiki 文档;Wiki 节点到 Drive 应使用 `wiki +move-to-drive`,目标是 Wiki 时使用 `wiki +move`
17
18
 
18
19
  ## 不要误用到 `我的文档库`
19
20
 
@@ -117,4 +118,5 @@ lark-cli drive +task_result \
117
118
  ## 参考
118
119
 
119
120
  - [lark-drive](../SKILL.md) -- 云空间(云盘/云存储)全部命令
121
+ - [wiki +move-to-drive](../../lark-wiki/references/lark-wiki-move-to-drive.md) -- 将 Wiki 节点移出知识库并放入 Drive
120
122
  - [lark-shared](../../lark-shared/SKILL.md) -- 认证和全局参数
@@ -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) -- 认证和全局参数
@@ -1464,6 +1464,7 @@
1464
1464
  <xs:annotation>
1465
1465
  <xs:documentation>
1466
1466
  表格元素, 用于展示结构化数据
1467
+ 宽高分配规则参考 HTML table 的整体值 / 子项值处理逻辑, 但在 SXSD 中做确定化约束, 以保证跨端实现一致。
1467
1468
  边框规则:
1468
1469
  - 后设置优先:相邻单元格线条只有一个颜色, 如果均设置, 则右下单元格的设置覆盖左上单元格
1469
1470
  - 不设置边框属性时使用默认样式
@@ -1476,6 +1477,8 @@
1476
1477
  - id: 表格唯一标识符(可选)
1477
1478
  - topLeftX/topLeftY: 左上角坐标
1478
1479
  - flipX/flipY: 水平/垂直翻转
1480
+ - width: 表格目标总宽度(可选)。若设置, 优先用于为未填写列宽的列分配剩余宽度; 当所有列宽均为空时, 所有列均分该值; 当所有列均已填写且该值大于已填写列宽总和时, 多出空间继续分配给现有列, 默认按各列当前宽度作为权重分配; 当已填写列宽之和超过或无法容纳该值时, 保留已填写列宽, 并以最终列宽总和回写 table.width
1481
+ - height: 表格目标总高度(可选)。若设置, 优先用于为未填写行高的行分配剩余高度; 当所有行高均为空时, 所有行均分该值; 当所有行均已填写且该值大于已填写行高总和时, 多出空间继续分配给现有行, 默认按各行当前高度作为权重分配; 当已填写行高之和超过或无法容纳该值时, 保留已填写行高, 并以最终行高总和回写 table.height
1479
1482
  table 子元素:
1480
1483
  - colgroup: 列组元素, 用于定义列的宽度
1481
1484
  - tr: 行元素, 包含多个单元格
@@ -1484,10 +1487,10 @@
1484
1487
  - col: 列元素
1485
1488
  col 属性:
1486
1489
  - span: 列跨数, 默认为1, 可选
1487
- - width: 列宽度, 默认值为110, 可选
1490
+ - width: 列宽度输入值, 默认值为110, 可选。无 table.width 时, 已填写列保持原值, 空列使用默认值; 有 table.width 时, 已填写列保持原值, 空列优先均分剩余宽度; 若不存在空列且 table.width 大于已填写列宽总和, 则多出空间按各列当前宽度作为权重分配到所有列; 若剩余宽度不足则空列回退为默认值, 并以最终列宽总和作为 table.width
1488
1491
 
1489
1492
  tr 属性:
1490
- - height: 行高, 默认为单元格高度
1493
+ - height: 行高输入值, 默认值为37, 可选。无 table.height 时, 已填写行保持原值, 空行使用默认值; 有 table.height 时, 已填写行保持原值, 空行优先均分剩余高度; 若不存在空行且 table.height 大于已填写行高总和, 则多出空间按各行当前高度作为权重分配到所有行; 若剩余高度不足则空行回退为默认值, 并以最终行高总和作为 table.height。若行高低于内容高度, 需要手动修改行高
1491
1494
  tr 子元素:
1492
1495
  - td: 单元格元素, 用于显示数据
1493
1496
 
@@ -1543,6 +1546,8 @@
1543
1546
  <xs:attribute name="topLeftY" type="sml:YType" use="required"/>
1544
1547
  <xs:attribute name="flipX" type="xs:boolean" use="optional" default="false"/>
1545
1548
  <xs:attribute name="flipY" type="xs:boolean" use="optional" default="false"/>
1549
+ <xs:attribute name="width" type="sml:PositiveSize" use="optional"/>
1550
+ <xs:attribute name="height" type="sml:PositiveSize" use="optional"/>
1546
1551
  </xs:complexType>
1547
1552
  </xs:element>
1548
1553
 
@@ -248,6 +248,26 @@
248
248
  - `<tr>` 内为 `<td>`
249
249
  - `<td>` 内可放 `<content>`
250
250
 
251
+ `<table>` 可选设置 `width` 和 `height`,分别表示表格的目标总宽度和总高度:
252
+
253
+ ```xml
254
+ <table topLeftX="80" topLeftY="120" width="800" height="300">
255
+ <colgroup>
256
+ <col width="240"/>
257
+ <col/>
258
+ </colgroup>
259
+ <tr height="80">
260
+ <td><content textType="body"><p>表头 1</p></content></td>
261
+ <td><content textType="body"><p>表头 2</p></content></td>
262
+ </tr>
263
+ </table>
264
+ ```
265
+
266
+ - 已设置的列宽和行高优先保留;未设置的列宽、行高优先使用目标总宽度或总高度分配剩余空间。
267
+ - 如果所有列宽或行高都未设置,则目标总宽度或总高度会在各列或各行之间分配。
268
+ - 如果目标尺寸不足以容纳已设置的尺寸,则保留已设置值,并以最终列宽或行高总和为准。
269
+ - 行高低于单元格内容高度时,需要手动增大行高。
270
+
251
271
  ### `<chart>`
252
272
 
253
273
  图表元素必须至少包含: