@amaster.ai/pi-lark 0.1.2-beta.58 → 0.1.2-beta.60

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 (40) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-base/SKILL.md +143 -166
  3. package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
  4. package/skills/lark-base/references/lark-base-app-block-data-config.md +2 -2
  5. package/skills/lark-base/references/lark-base-cell-value.md +9 -14
  6. package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +1 -1
  7. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +1 -1
  8. package/skills/lark-base/references/lark-base-dashboard.md +9 -9
  9. package/skills/lark-base/references/lark-base-data-query.md +5 -5
  10. package/skills/lark-base/references/lark-base-field-create.md +7 -50
  11. package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
  12. package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
  13. package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +13 -98
  14. package/skills/lark-base/references/lark-base-field-update.md +13 -51
  15. package/skills/lark-base/references/lark-base-filter-condition.md +7 -35
  16. package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
  17. package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
  18. package/skills/lark-base/references/lark-base-record-history-list.md +19 -2
  19. package/skills/lark-base/references/{lark-base-data-analysis-cloud.md → lark-base-record-query-and-analysis-cloud-sop.md} +4 -4
  20. package/skills/lark-base/references/{lark-base-data-analysis-sop.md → lark-base-record-query-and-analysis-sop.md} +27 -18
  21. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  22. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  23. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  24. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  25. package/skills/lark-doc/SKILL.md +3 -3
  26. package/skills/lark-doc/references/lark-doc-fetch.md +8 -3
  27. package/skills/lark-doc/references/lark-doc-update.md +12 -8
  28. package/skills/lark-minutes/references/lark-minutes-apply-permission.md +1 -1
  29. package/skills/lark-minutes/references/lark-minutes-download.md +1 -1
  30. package/skills/lark-shared/SKILL.md +25 -224
  31. package/skills/lark-shared/references/lark-shared-config-init.md +12 -0
  32. package/skills/lark-shared/references/lark-shared-high-risk-approval.md +38 -0
  33. package/skills/lark-shared/references/lark-shared-identity-and-permissions.md +105 -0
  34. package/skills/lark-shared/references/lark-shared-output-contract.md +17 -0
  35. package/skills/lark-shared/references/lark-shared-update-notice.md +23 -0
  36. package/skills/lark-slides/references/cli/lark-slides-update-slide.md +18 -1
  37. package/skills/lark-vc/references/lark-vc-recording.md +1 -1
  38. package/skills/lark-workflow-meeting-summary/SKILL.md +12 -1
  39. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -67
  40. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
@@ -0,0 +1,105 @@
1
+ # 身份与权限
2
+
3
+ ## 认证任务速查
4
+
5
+ | 用户意图 | 首选命令 / 回答 |
6
+ |---|---|
7
+ | 获取全部权限 | `lark-cli auth login --domain all --no-wait --json` |
8
+ | 按业务域授权 | `lark-cli auth login --domain docs --domain drive --no-wait --json`;`--domain` 可重复,也可用逗号分隔 |
9
+ | 指定单个 scope 授权 | `lark-cli auth login --scope "<scope>" --no-wait --json` |
10
+ | 检查当前登录态、是谁登录、token 是否有效 | `lark-cli auth status --json --verify`;回答时引用 `identity`、`verified`、`identities.user.status`、`identities.user.userName`、`identities.user.openId`(用户 open id)、`identities.user.tokenStatus`、`identities.user.scope` |
11
+ | 快速查看当前身份状态 | `lark-cli whoami`;实际生效的那一个身份 |
12
+ | 退出当前机器的用户登录态 | `lark-cli auth logout --json`;`loggedOut:true` 表示注销成功 |
13
+ | bot 缺少权限 | 不要执行 `auth login`;引导用户在开发者后台开通 bot scope,优先复用错误里的 `console_url` |
14
+ | 取消用户对应用的全部服务端授权 | `auth logout` 只清本机登录态;服务端授权需用户在飞书授权管理页取消 |
15
+ | 只取消一个 scope | CLI 不支持单独撤销一个已授予 scope;可重新走最小 scope 授权,或让用户在授权管理页处理 |
16
+
17
+ 机器读取 JSON 时,为减少 `_notice` 干扰,可在命令前加:
18
+
19
+ ```bash
20
+ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 lark-cli auth status --json --verify
21
+ ```
22
+
23
+ ## 身份类型
24
+
25
+ 两种身份类型,通过 `--as` 切换:
26
+
27
+ | 身份 | 标识 | 获取方式 | 适用场景 |
28
+ |------|------|---------|---------|
29
+ | user 用户身份 | `--as user` | `lark-cli auth login` 等 | 访问用户自己的资源(日历、云空间/云盘/云存储等) |
30
+ | bot 应用身份 | `--as bot` | 自动,只需 appId + appSecret | 应用级操作,访问bot自己的资源 |
31
+
32
+ ## 身份选择原则
33
+
34
+ 输出的 `[identity: bot/user]` 代表当前身份。bot 与 user 表现差异很大,需确认身份符合目标需求:
35
+
36
+ - **Bot 看不到用户资源**:无法访问用户的日历、云空间(云盘/云存储)文档、邮箱等个人资源。例如 `--as bot` 查日程返回 bot 自己的(空)日历
37
+ - **Bot 无法代表用户操作**:发消息以应用名义发送,创建文档归属 bot
38
+ - **Bot 权限**:只需在飞书开发者后台开通 scope,无需 `auth login`
39
+ - **User 权限**:后台开通 scope + 用户通过 `auth login` 授权,两层都要满足
40
+
41
+ ## 身份延续
42
+ - CLI命令执行时,身份选择优先级为:显式 `--as` 优先;省略时由 CLI 根据当前配置和可用凭证自动选择(可通过 `lark-cli whoami` 查看 `identity` 和选择逻辑)。
43
+ - 因此,盲目省略 `--as` 是不可控的,在明确需要保持某一身份时,建议全程显式选择。
44
+
45
+ ## 权限不足处理
46
+
47
+ 遇到权限相关错误时,**根据当前身份类型采取不同解决方案**。
48
+
49
+ 错误响应中包含关键信息:
50
+ - `missing_scopes`:列出缺失的 scope (N选1)
51
+ - `console_url`:飞书开发者后台的权限配置链接
52
+ - `hint`:建议的修复命令
53
+
54
+ ### Bot 身份(`--as bot`)
55
+
56
+ 将错误中的 `console_url` 原样提供给用户,引导去后台开通 scope。**禁止**对 bot 执行 `auth login`。
57
+
58
+ ### User 身份(`--as user`)
59
+
60
+ ```bash
61
+ lark-cli auth login --domain <domain> --no-wait --json # 按业务域发起授权
62
+ lark-cli auth login --scope "<missing_scope>" --no-wait --json # 按具体 scope 发起授权(推荐,符合最小权限原则)
63
+ ```
64
+
65
+ **规则**:auth login 必须指定范围(`--scope`、`--domain` 或 `--recommend`)。多次 login 的 scope 会累积(增量授权)。
66
+
67
+ ### Agent 代理发起认证(推荐)
68
+
69
+ 当你作为 AI agent 需要帮用户完成认证时,优先使用 split-flow,避免在同一轮对话中阻塞等待用户授权:
70
+
71
+ ```bash
72
+ # 发起授权(立即返回 device_code 和 verification_url)
73
+ lark-cli auth login --scope "calendar:calendar:readonly" --no-wait --json
74
+ ```
75
+
76
+ 拿到 `verification_url` 后,将它原样作为本轮最终消息发给用户,并结束本轮/交还控制权。不要在同一轮中展示 URL 后立刻执行 `--device-code` 阻塞轮询;在不透传中间输出的 agent harness 里,这会导致用户永远看不到 URL。
77
+
78
+ 用户回复已完成授权后,再在后续步骤执行:
79
+
80
+ ```bash
81
+ lark-cli auth login --device-code <device_code>
82
+ ```
83
+
84
+ **Split-Flow 完整步骤**:
85
+
86
+ **第一步:发起授权(当前轮)**
87
+
88
+ 1. 执行 `lark-cli auth login --scope "xxx" --no-wait --json`(必须加 `--no-wait --json`)
89
+ 2. 从 JSON 输出中提取 `verification_url` 和 `device_code`
90
+ 3. 生成二维码:`lark-cli auth qrcode <verification_url> --output "xxx"`
91
+ 4. 将 URL 和二维码展示给用户(先 URL,后二维码)
92
+ 5. **结束本轮对话前,必须明确告知用户**:"请完成授权后,回来告诉我已授权完成,我会帮你完成后续步骤"
93
+
94
+ **第二步:完成授权(后续轮)**
95
+
96
+ 1. 等待用户回复"已完成授权"
97
+ 2. **由你(AI agent)亲自执行**:`lark-cli auth login --device-code <device_code>`
98
+ 3. 此命令会轮询授权状态并完成登录
99
+ 4. 如果返回授权成功,流程结束
100
+
101
+ **关键规则**:
102
+
103
+ - **你必须亲自执行 `--device-code` 命令**,不要指示用户自行执行
104
+ - **不要在同一轮中展示 URL 后立刻执行 `--device-code`**,这会导致用户看不到 URL
105
+ - **禁止跨流程缓存 `verification_url` 或 `device_code`**:每次需要重新发起授权时,必须沿用所需的 `--scope`、`--domain` 或 `--recommend` 选择以及任何 `--exclude` 值,并附加 `--no-wait --json` 生成新的链接。不要复用已过期的授权链接或 device code
@@ -0,0 +1,17 @@
1
+ # JSON 输出契约
2
+
3
+ `--format json`(默认)下,成功与错误的信封结构不同:
4
+
5
+ 成功信封写入 **stdout**(退出码 0):
6
+
7
+ ```json
8
+ { "ok": true, "identity": "user", "data": { "guid": "..." }, "meta": { "count": 1 } }
9
+ ```
10
+
11
+ 错误信封写入 **stderr**(退出码非 0):
12
+
13
+ ```json
14
+ { "ok": false, "identity": "user", "error": { "type": "authorization", "subtype": "missing_scope", "code": 99991679, "message": "...", "hint": "...", "missing_scopes": ["..."] } }
15
+ ```
16
+
17
+ **判断成功必须用 `ok == true`(或进程退出码 0),不要用 `code == 0`**:成功信封没有顶层 `code` / `msg` 字段,`code` 只出现在错误信封的 `error` 内,含义是上游 OpenAPI 的 numeric code。按 OpenAPI 老格式 `{"code": 0, "msg": "ok"}` 判断会把所有成功调用误判为失败;封装写入类命令(如 `task +create`)时尤其危险,误判会绕过幂等逻辑导致重复创建。
@@ -0,0 +1,23 @@
1
+ # 更新与 `_notice`
2
+
3
+ lark-cli 命令执行后,如果检测到新版本,JSON 输出中会包含 `_notice.update` 字段(含 `message`、`command` 等)。
4
+
5
+ 除非用户正在询问更新、版本或 notice,否则不要把 `_notice` 原样复制为当前任务的主要答案,也不要为了 notice 中断当前任务去反复查 help。
6
+
7
+ 需要稳定 JSON 给脚本或机器读取时,可以在命令前设置:
8
+
9
+ ```bash
10
+ LARKSUITE_CLI_NO_UPDATE_NOTIFIER=1 LARKSUITE_CLI_NO_SKILLS_NOTIFIER=1 <lark-cli command>
11
+ ```
12
+
13
+ 当你在输出中看到 `_notice.update` 时,先完成用户当前请求;如仍相关,再简短告知可运行:
14
+
15
+ ```bash
16
+ lark-cli update
17
+ ```
18
+
19
+ **重要**:始终使用 `lark-cli update` 更新,它会同时更新 CLI 和 AI Skills。
20
+
21
+ 另外两类 notice:
22
+ - `_notice.skills`:本地 Skills 与当前 CLI 不同步。
23
+ - `_notice.deprecated_command`:本次使用了兼容保留的旧命令;后续调用改用 `replacement`。如果同时提供 `action: "lark-cli update"`,同样建议升级。
@@ -54,6 +54,22 @@ lark-cli slides +update-slide --as user \
54
54
 
55
55
  一次请求就能同时做完改样式、插入、删除、换备注、换背景——这是 `+replace-slide` 逐元素 part 做不到的(它没法寻址背景,也没有 move 操作)。
56
56
 
57
+ ## 本地图片:`@路径` 占位符
58
+
59
+ `--content` 的 XML 里写 `<img src="@./chart.png" .../>`,CLI 会:先把每个不重复的本地文件上传到这份演示文稿(`parent_type=slide_file`),再把 `src` 替换成返回的 `file_token`,最后才整页写回。
60
+
61
+ 占位符路径按**执行命令时的 CWD** 解析,跟 `--content @file` 所在目录无关;`@./assets/x.png` 找的是 `$PWD/assets/x.png`。
62
+
63
+ ```bash
64
+ lark-cli slides +update-slide --as user \
65
+ --presentation "$PRES" --slide-id "$SLIDE" \
66
+ --content '<slide xmlns="https://www.larkoffice.com/sml/2.0"><data><img src="@./chart.png" topLeftX="100" topLeftY="100" width="320" height="180"/></data></slide>'
67
+ ```
68
+
69
+ - 文件不存在、不是普通文件、超过 20 MB,都在**调用任何接口之前**报错,不会留下半成品。
70
+ - 去重只在**单次调用内**生效:多页共用同一张图时,逐页更新会把它每页重传一次。这种图先用 [`+media-upload`](lark-slides-media-upload.md) 传一次,把 `file_token` 写进各页的 `src`。
71
+ - 整页只发一个 part,所以上传是这条命令里**唯一不可逆的一半**:图先落进演示文稿的 media store,若随后 replace 失败,报错 hint 会告诉你已经传了几张,直接重试会再传一份。先 `--dry-run` 可提前看到 `images_to_upload` 和上传步骤。
72
+
57
73
  ## 标准读-改-写流程
58
74
 
59
75
  ```bash
@@ -130,6 +146,7 @@ lark-cli slides +xml-get --as user \
130
146
  | `xml_presentation_id` | 实际写入的演示文稿 ID |
131
147
  | `slide_id` | 与传入相同——整页覆盖不换页 id |
132
148
  | `revision_id` | 写入后的新版本号 |
149
+ | `images_uploaded` | 仅当 `--content` 带 `@` 占位符时出现:本次去重后实际上传的图片张数 |
133
150
 
134
151
  服务端拒绝这次写入时(`failed_reason` 非空)**不会**返回成功输出,而是报错并带上原因——单个 part 承载整页,任何失败都意味着页面没被写入。
135
152
 
@@ -143,4 +160,4 @@ lark-cli slides +xml-get --as user \
143
160
  | 3350001,原因包含 `not found` | `--presentation` 不匹配,或 `--slide-id` 对应的页面已被删除 | 检查 `--presentation` 和 `--slide-id`,再用 `slides +xml-get` 回读当前页面 ID |
144
161
  | 3350001,其他 invalid param | `--content` 的 XML 结构有问题(如 `<shape>` 缺 `<content/>`、包含服务端不支持的元素) | 按 [error-handling.md](../workflow/error-handling.md) 检查 `--content` 的 XML 结构 |
145
162
  | 3350002 not found | `--revision-id` 传了不存在的版本号 | 用 `-1` 或真实存在的 `revision_id` |
146
- | 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
163
+ | 1061004 / 403 | 当前身份对这份 PPT 没有编辑权限 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope;wiki 链接另需 `wiki:node:read`,`@` 占位符另需 `docs:document.media:upload`;`--as bot` 还要求该 bot 对目标 PPT 有编辑权限 |
@@ -138,7 +138,7 @@ lark-cli minutes +download --minute-tokens <minute_token>
138
138
  | `no recording available` | 该会议无录制或录制未完成 | 确认会议已结束且开启了录制 |
139
139
  | `121005 no permission` | 无权查看该会议录制 | 确认是会议参与者或有录制权限 |
140
140
  | `124002 recording generating` | 录制文件仍在生成中 | 等待录制完成后重试 |
141
- | `missing required scope(s)` | 权限不足 | `--as user`:按提示运行 `auth login --scope`;`--as bot`:使用错误中的 `console_url` 去开发者后台开通,**禁止**对 bot 执行 `auth login`(见 [lark-shared](../../lark-shared/SKILL.md) 的权限恢复表) |
141
+ | `missing required scope(s)` | 权限不足 | `--as user`:按提示运行 `auth login --scope`;`--as bot`:使用错误中的 `console_url` 去开发者后台开通,**禁止**对 bot 执行 `auth login`(见 [lark-shared](../../lark-shared/SKILL.md) 的权限管理) |
142
142
 
143
143
  ## 提示
144
144
 
@@ -29,6 +29,7 @@ metadata:
29
29
  ```bash
30
30
  lark-cli auth login --domain vc # 基础(查询+纪要)
31
31
  lark-cli auth login --domain vc,drive # 含读取纪要文档正文、生成文档
32
+ lark-cli auth login --domain vc,drive,minutes # 含无 note_id 时的妙记备选路径
32
33
  ```
33
34
 
34
35
  ## 工作流
@@ -80,9 +81,18 @@ lark-cli note +detail --note-id "note_id"
80
81
  ```
81
82
  - 根据上一步搜集到的 `meeting-id` 查询。
82
83
  - 单次最多查询 50 个,超过 50 个需分批调用。
83
- - 部分会议没有 `note_id` 或报错 `no notes available`,在最终输出中标注"无纪要"。
84
+ - 部分会议没有 `note_id` 或报错 `no notes available`,**不要直接标注"无纪要"**:先看 `vc +detail` 是否返回了 `minute_token`,有则走下面的妙记备选路径;`note_id` 和 `minute_token` 都没有时才标注"无纪要"。
84
85
  - 记录每个纪要的 `note_id`(纪要 ID)、`note_display_type`(展示类型:`unknown` / `normal` / `unified`)、`note_doc_token`(纪要文档 Token)和 `verbatim_doc_token`(逐字稿文档 Token)。
85
86
 
87
+ > **妙记备选路径(无 `note_id`、有 `minute_token` 时)**:智能纪要与妙记是两条独立产物链路,缺少智能纪要不代表这场会没有内容。
88
+ >
89
+ > ```bash
90
+ > # --minute-tokens 是复数形式(+download 同);--output-dir 只接受相对路径
91
+ > lark-cli minutes +detail --minute-tokens "<minute_token>" --transcript --output-dir ./transcripts --as user
92
+ > ```
93
+ >
94
+ > 逐字稿会落盘,供 Step 4 基于原始发言独立提炼(不要照搬 AI 总结)。若返回 `No read permission`(`2091005`),先把无权限事实告知用户,用户明确同意后再用单数 flag 申请:`lark-cli minutes +apply-permission --minute-token "<minute_token>" --perm view --as user`;申请需 owner 在客户端批准后才可重试。详见 [lark-minutes](../lark-minutes/SKILL.md)。
95
+
86
96
  > **逐字稿路由按 `note_display_type` 决定**(详见 [vc-domain-boundaries.md](../lark-vc/references/vc-domain-boundaries.md) 的 Note 域):
87
97
  > - `normal`:逐字稿是独立文档,链接/正文走 `verbatim_doc_token`。
88
98
  > - `unified`:逐字稿**不是独立文档**,没有可分享的逐字稿文档链接;需要逐字稿内容时用 `note +transcript --note-id <note_id>`([lark-note](../lark-note/SKILL.md))拉取到本地,报告中标注"unified 纪要"即可。
@@ -119,4 +129,5 @@ lark-cli docs +update --doc "<url_or_token>" --command append --doc-format markd
119
129
  - [lark-shared](../lark-shared/SKILL.md) — 认证、权限(必读)
120
130
  - [lark-vc](../lark-vc/SKILL.md) — `+search`、`+detail` 详细用法
121
131
  - [lark-note](../lark-note/SKILL.md) — `note +detail`、`note +transcript`(unified 纪要逐字稿)
132
+ - [lark-minutes](../lark-minutes/SKILL.md) — `minutes +detail`、`+apply-permission`(无 `note_id` 时的妙记备选路径)
122
133
  - [lark-doc](../lark-doc/SKILL.md) — `+fetch`、`+create`、`+update` 详细用法
@@ -1,67 +0,0 @@
1
- # Base data-query guide
2
-
3
- Read this guide after the [data analysis SOP](lark-base-data-analysis-sop.md) enters the Cloud path and selects `+data-query`, or directly when the user explicitly asks about the `+data-query` command or DSL. It provides common aggregation fewshots; use [lark-base-data-query.md](lark-base-data-query.md) only for complete DSL fields, operators, limits, response details, or error recovery.
4
-
5
- ## When to use
6
-
7
- Use `+data-query` when the user asks for server-side:
8
-
9
- - group by / aggregation
10
- - sum, average, min, max, count, distinct count
11
- - filtered aggregation
12
- - sorted Top N or Bottom N
13
- - global statistical conclusions
14
-
15
- `+data-query` can return dimension field rows, but those rows are grouped by dimension values and do not include `record_id`. Use `+record-list`, `+record-search`, or `+record-get` for row-level output, record identity, or full raw record details.
16
-
17
- ## Common Fewshots
18
-
19
- Count records by a category field:
20
-
21
- ```bash
22
- lark-cli base +data-query \
23
- --base-token <base_token> \
24
- --dsl '{"datasource":{"type":"table","table":{"tableId":"<table_id>"}},"dimensions":[{"field_name":"Status","alias":"status"}],"measures":[{"field_name":"Status","aggregation":"count","alias":"count"}],"shaper":{"format":"flat"}}'
25
- ```
26
-
27
- Sum a number field by category and return Top 10:
28
-
29
- ```bash
30
- lark-cli base +data-query \
31
- --base-token <base_token> \
32
- --dsl '{"datasource":{"type":"table","table":{"tableId":"<table_id>"}},"dimensions":[{"field_name":"Region","alias":"region"}],"measures":[{"field_name":"Amount","aggregation":"sum","alias":"total_amount"}],"sort":[{"field_name":"total_amount","order":"desc"}],"pagination":{"limit":10},"shaper":{"format":"flat"}}'
33
- ```
34
-
35
- Aggregate only records matching a filter:
36
-
37
- ```bash
38
- lark-cli base +data-query \
39
- --base-token <base_token> \
40
- --dsl '{"datasource":{"type":"table","table":{"tableId":"<table_id>"}},"dimensions":[{"field_name":"Owner","alias":"owner"}],"measures":[{"field_name":"Amount","aggregation":"sum","alias":"total_amount"}],"filters":{"type":1,"conjunction":"and","conditions":[{"field_name":"Status","operator":"is","value":["Done"]}]},"shaper":{"format":"flat"}}'
41
- ```
42
-
43
- ## Common filter values
44
-
45
- Common `Condition.value` shapes: select `is` / `isNot` uses exactly one option
46
- name; datetime `is` / `isGreater` / `isLess` uses `["Today"]` or
47
- `["ExactDate","<epoch_ms>"]`; `isEmpty` / `isNotEmpty` uses `[]`.
48
- Use relative date keywords only for relative requests; see
49
- [lark-base-data-query.md](lark-base-data-query.md) for other field types and operators.
50
-
51
- Use `tableName` when the table ID is unavailable but the table name is known:
52
-
53
- ```bash
54
- lark-cli base +data-query \
55
- --base-token <base_token> \
56
- --dsl '{"datasource":{"type":"table","table":{"tableName":"Orders"}},"measures":[{"field_name":"Amount","aggregation":"sum","alias":"total_amount"}],"shaper":{"format":"flat"}}'
57
- ```
58
-
59
- ## Routing to the DSL SSOT
60
-
61
- Read [lark-base-data-query.md](lark-base-data-query.md) when you need:
62
-
63
- - the full DSL field reference
64
- - supported aggregations and field types
65
- - filter operator details
66
- - pagination and result limits
67
- - response shape and error recovery
@@ -1,63 +0,0 @@
1
- # base +record-upsert
2
-
3
- > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
-
5
- 创建记录,或在带 `--record-id` 时更新记录。
6
-
7
- ## 推荐命令
8
-
9
- ```bash
10
- # 创建记录
11
- lark-cli base +record-upsert --base-token <base_token> --table-id <table_id> \
12
- --json '{"项目名称":"Apollo","状态":"进行中"}'
13
-
14
- # 更新记录
15
- lark-cli base +record-upsert --base-token <base_token> --table-id <table_id> --record-id <record_id> \
16
- --json '{"项目名称":"Apollo","状态":"完成","完成时间":"2026-03-24 10:00"}'
17
- ```
18
-
19
- ## 参数
20
-
21
- | 参数 | 必填 | 说明 |
22
- |------|------|------|
23
- | `--base-token <token>` | 是 | Base Token |
24
- | `--table-id <id_or_name>` | 是 | 表 ID 或表名 |
25
- | `--record-id <id>` | 否 | 传入时走更新,不传时走创建 |
26
- | `--json <body>` | 是 | 字段写入对象,类型 `Map<FieldNameOrID, CellValue>` |
27
-
28
- ## API
29
-
30
- - 创建:`POST /open-apis/base/v3/bases/:base_token/tables/:table_id/records`
31
- - 更新:带 `--record-id` 时改走 `PATCH /records/:record_id`
32
-
33
- ## `--json` 结构
34
-
35
- - `--json` 必须是 **JSON object map**,形状是 `Map<FieldNameOrID, CellValue>`。
36
- - key 是字段名或字段 ID;value 是该字段的 `CellValue`。
37
- - 一次请求里同一字段只用一种标识,避免重复写入冲突。
38
- - 写入前先 `+field-list` 确认字段类型和字段名/ID。
39
- - CellValue 统一看 [lark-base-cell-value.md](lark-base-cell-value.md)。
40
-
41
- ```json
42
- {
43
- "项目名称": "Apollo",
44
- "状态": "进行中",
45
- "完成时间": "2026-03-24 10:00"
46
- }
47
- ```
48
-
49
- ## 返回重点
50
-
51
- - 创建时返回 `record` 和 `created: true`。
52
- - 更新时返回 `record` 和 `updated: true`。
53
- - 如果写入了 `formula / lookup / created_at / updated_at / created_by / updated_by` 等只读字段,返回里可能出现 `ignored_fields`,这些字段不会被更新。
54
-
55
- ## 坑点
56
-
57
- - 有 `--record-id` 就一定更新;不传就一定创建,不会自动查重或按业务键 upsert。
58
- - `select` 字段只支持写入字段中已有的选项;构造 CellValue 前先用 `+field-list` 或 `+field-search-options` 确认目标选项存在。
59
- - 这是写入操作,执行前必须确认目标表和字段。
60
-
61
- ## 参考
62
-
63
- - [lark-base-cell-value.md](lark-base-cell-value.md) — CellValue 格式规范