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

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.2-beta.56",
3
+ "version": "0.1.2-beta.58",
4
4
  "description": "Pi extension for Lark/Feishu workspace — calendar, docs, drive, sheets, tasks, mail and more via lark-cli.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -61,7 +61,7 @@
61
61
  "vitest": "^4.0.0"
62
62
  },
63
63
  "dependencies": {
64
- "@amaster.ai/pi-shared": "0.1.2-beta.56"
64
+ "@amaster.ai/pi-shared": "0.1.2-beta.58"
65
65
  },
66
66
  "scripts": {
67
67
  "fetch-skills": "node scripts/fetch-skills.mjs",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lark-base
3
- version: 1.2.5
4
- description: "飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、workflow、角色权限;遇到 Base/多维表格/bitable 或 /base/ 链接时使用。文件导入/导出转 lark-drive,认证/授权转 lark-shared。"
3
+ version: 1.2.6
4
+ description: "飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限;遇到 Base/多维表格/bitable、BaseApp/AppMode,或应用模式的 /app/ 链接(可能同时包含 /base/workspace/<workspace_token>)时使用。BaseApp 不走 lark-apps;文件导入/导出转 lark-drive,认证/授权转 lark-shared。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
@@ -18,6 +18,8 @@ metadata:
18
18
  - 用户要在 Base 内建表、改表、管理字段、写记录、查记录、配视图。
19
19
  - 用户要在 Base 内做公式字段、lookup 字段、跨表计算、派生指标、筛选聚合、TopN、统计分析。
20
20
  - 用户要管理 Base 表单、仪表盘、workflow、高级权限或角色。
21
+ - 用户要用应用模式(BaseApp):新建应用、管理应用页面、在页面上加图表/列表/富文本组件,或整理 Workspace 目录。
22
+ - 用户明确提到 BaseApp / AppMode / 应用模式 / Workspace 内应用,或给出应用模式的 `/app/` 链接(链接可能同时携带 `/base/workspace/<workspace_token>` 路径信息),并要查询页面或组件;这类应用属于 Base,不走 `lark-apps`。
21
23
  - 用户要把旧 Base 聚合式命令或旧写法迁移到当前 `lark-cli base +...` shortcut。
22
24
 
23
25
  不要使用本 skill:
@@ -28,6 +30,7 @@ metadata:
28
30
 
29
31
  ## 使用边界
30
32
 
33
+ - BaseApp 复制是明确的停止边界:本期没有 BaseApp 复制命令。识别到复制 / 克隆应用模式的诉求后,直接说明当前 CLI 无法完成并停止,不要调用 `+base-copy`(包括 `--help` / `--dry-run`)、`+app-create`、Drive copy 或任何写命令试探、拼装替代方案。
31
34
  - Base 业务操作只使用 `lark-cli base +...` shortcut,不使用旧聚合式 `+table / +field / +record / +view / +history / +workspace`。
32
35
  - 执行 update 前必须先查当前 shortcut 的 `--help` 或对应 reference。若命令要求完整配置,首次请求必须基于可信的当前配置执行 read-modify-write:只修改用户明确指定的内容,保留其他仍适用的可写配置,并按命令要求的结构提交。若命令支持局部/delta update,按其契约提交最小合法 payload;不得以不完整请求试错补参。
33
36
  - Base CLI/OpenAPI 当前不支持视图行高、冻结列、列宽等 UI-only 外观设置。遇到这类需求,说明能力边界并停止,不要猜测未文档化参数或改走 raw API。
@@ -36,11 +39,20 @@ metadata:
36
39
  - **更低频:文件导入/导出。** 本地文件与 Base 之间的导入/导出转 `lark-drive`;具体格式、参数、路径限制和仅结构导出规则由 `lark-drive` 负责,导入完成后再回到 Base 命令。
37
40
  - 认证、初始化、scope、身份切换、权限不足恢复属于 `lark-shared`;Base 文档只保留会影响 Base 路径选择的权限规则。
38
41
 
42
+ ## 应用模式与 Workspace 心智模型
43
+
44
+ - Workspace 是组织 Base 和 BaseApp 的空间容器;BaseApp 创建时必须归属一个 Workspace,`workspace_token` 标识这个容器。
45
+ - BaseApp(应用模式)不是 Base 的别名。它用 Page 组织界面,每个 Page 再包含图表、列表或富文本 Block;`app_token`、`page_id`、`block_id` 分别标识这三层对象。
46
+ - Base 保存表、字段和记录等数据。BaseApp 的组件通过 `data_config` 引用 Base 中的数据,但引用关系不会把 Base 变成 App 的子对象。
47
+ - App 的列表组件最多引用一个 Base,而且该 Base 必须与 App 位于同一 Workspace;App 图表的多个数据源也共用一个 `base_token`。
48
+ - Workspace 负责资源归属,App 负责页面和组件,Base 负责数据。按操作对象选择 `+workspace-*`、`+app-*` 或 Base 数据命令,不要混用 token。
49
+
39
50
  ## 先获取 Base Token 和所需 ID
40
51
 
41
52
  进入任何需要目标 Base 的 shortcut 前,必须先拿到可用的 `base_token`,以及当前任务需要的 `table_id` / `view_id` / `record_id` / `form_id` / `dashboard_id` / `workflow_id` 等真实 ID;不要把完整 URL、wiki token、workspace token 或孤立 raw token 直接当作 `--base-token`。
42
53
 
43
- - 用户输入 URL 或分享链接:先运行 `lark-cli base +url-resolve --url "<url>" --as user`,用返回的 `base_token` 和相关 ID 继续后续命令。
54
+ - 用户输入 URL 或分享链接:先运行 `lark-cli base +url-resolve --url "<url>" --as user`。Base URL 返回 `base_token` 和相关 ID;BaseApp `/app/` URL 返回 `app_token`,并在原链接携带时返回 `workspace_token` 和 `page_id`。
55
+ - 用户要查询既有 BaseApp,但当前输入和当前会话可信命令返回中都没有真实 `/app/` 链接或 `app_token`,也没有可供 `+workspace-entity-list --type baseapp` 定位的 `workspace_token`,且用户未明确要求读取含这些标识的当前文件:无需调用任何工具;先明确说明当前任务没有提供应用链接或 Workspace 信息、无法可靠定位目标 BaseApp,再请用户补充并停止。不要在此前后调用 `lark-apps`、`+title-resolve`、Drive 搜索、浏览器或其他全局名称发现,不要默认选择同名候选,也不要把 `base_token` 当作 `app_token`。
44
56
  - Base/Wiki URL 的 `table=` query 参数实际表示当前选中的顶层 block,可能是数据表、仪表盘或 workflow;不要按参数名自行当成 `table_id`。以 `+url-resolve` 返回的 `block_type` 以及 `table_id` / `dashboard_id` / `workflow_id` 为准;`selection_source=url_query` 只说明 URL 当前选中了该 block,不代表它覆盖用户明确点名的目标。若用户点名的 dashboard 与 `block_name` 不一致,先用 `+dashboard-list` 按名称匹配;若只返回中性 `block_id`,按 hint 用 `+base-block-list` 确认类型。
45
57
  - 用户输入 Base 标题、关键词或不确定名称:先运行 `lark-cli base +title-resolve --title "<keyword>" --as user`;`--title` 传入标题中的短关键词,不超过 30 个字符;过长标题先取最有区分度的短关键词;多候选时先让用户消歧,不要猜。
46
58
  - 文档嵌入 Base 标签:直接读取 `<bitable>` / `<base_refer>` 的 `token` 作为 `--base-token`,`table-id` 作为 `--table-id`,`view-id` 作为 `--view-id`;孤立 raw token 不走 `+url-resolve`。
@@ -73,6 +85,10 @@ metadata:
73
85
  | Base 内表单管理 | `+form-list/get/create/update/delete` / `+form-questions-list/delete` | 缺少或不确定归属时,先用 `+table-list` 或 `+base-block-list` 取得真实 `table_id`;这些命令使用 `--base-token + --table-id` 并在整个工作流中复用同一 `table_id`,删除前确认目标表单 |
74
86
  | 分享表单详情 | `+form-detail --share-token <share_token>` | 使用表单分享链接里的 `share_token`;提交前读 [lark-base-form-detail.md](references/lark-base-form-detail.md) |
75
87
  | 仪表盘与组件 | `+dashboard-*` / `+dashboard-block-*` | 提到图表/看板/block 时先读 [lark-base-dashboard.md](references/lark-base-dashboard.md);组件 `data_config` 读 [dashboard-block-data-config.md](references/dashboard-block-data-config.md);读取一个或多个图表计算结果用 `+dashboard-block-get-data`;读取完整仪表盘时按 block 类型分流,文本和不支持直接取数的图表按 reference 恢复 |
88
+ | 查询 BaseApp 与关联 Base | `+url-resolve` → `+app-get` → `+base-get` | 只把 `/app/` URL 传给 `+url-resolve`,不要把 `/base/workspace/` URL 传给它;用 `+app-get ref` 的 key 作为 `base_token` 再调用 `+base-get`。最终答复忠实保留应用 `name` / `app_token`,以及每个关联 Base 的 `name` / `base_token` |
89
+ | 管理应用模式(BaseApp/AppMode)页面与组件 | `+app-page-*` / `+app-block-*` | BaseApp/AppMode、Workspace 内应用或带 base/workspace 上下文的 `/app/` 链接直接走本路由,不走 `lark-apps`;没有 `+app-list`,列 Workspace 内应用必须用 `+workspace-entity-list --workspace-token <token> --type baseapp`;先读 [lark-base-app.md](references/lark-base-app.md)。组件 `data_config` 读 [lark-base-app-block-data-config.md](references/lark-base-app-block-data-config.md);`+app-block-get-data` 除 `app_token` 外还需要图表数据源的 `base_token` |
90
+ | 复制 Page / 设置页面图标 | 当前不支持 | 不产生任何写入,不得用 `+app-page-create` 冒充完整复制;单独说明“可新建空 Page”仅是替代能力,须等用户明确要求后再执行 |
91
+ | Workspace 目录 | `+workspace-create` / `+workspace-entity-list` / `+workspace-move-in` | 新建 Workspace、列出或移入其中的 Base/应用;移出或移除请求必须先用 `+workspace-entity-list` 只读定位并忠实报告实际名称,再按 [lark-base-app.md](references/lark-base-app.md) 说明不支持并停止;`drive +move` 不改变 Workspace 归属 |
76
92
  | Workflow | `+workflow-*` | 创建/更新或理解 steps 时读入口 [lark-base-workflow-guide.md](references/lark-base-workflow-guide.md) 和 steps JSON SSOT [lark-base-workflow-schema.md](references/lark-base-workflow-schema.md);list/get/enable/disable 只处理 workflow ID 与启停状态 |
77
93
  | 高级权限与角色 | `+advperm-*` / `+role-*` | 角色操作先读入口 [lark-base-role-guide.md](references/lark-base-role-guide.md);角色 create/update 或解读完整配置再读权限 JSON SSOT [role-config.md](references/role-config.md);关闭高级权限会影响自定义角色 |
78
94
 
@@ -126,6 +142,12 @@ metadata:
126
142
  - Dashboard shortcut 不支持指定组件的 `x/y/w/h`、精确位置或尺寸,不能把 `+dashboard-arrange` 静默当作等价实现。用户只要求一般性重排/美化时可执行一次智能重排;用户要求精确结果时先说明限制并询问是否接受自适应布局,接受后才执行。不要探测 raw `lark-cli api`、源码或未公开布局参数。
127
143
  - 创建接口成功返回即表示写入成功;只有结果不确定时才额外执行一次 `+dashboard-get` 或 `+dashboard-block-list`。不要仅为确认创建而逐组件调用 `+dashboard-block-get-data`。
128
144
  - 用户要读取多个组件的计算结果时,先完整列出组件(`+dashboard-block-list --page-size 100`;若 `has_more=true`,继续把返回的 `page_token` 传给 `--page-token`,直到 `has_more=false`),再按 [lark-base-dashboard-block-get-data.md](references/lark-base-dashboard-block-get-data.md) 在一个 shell 工具调用内串行读取;不要把每个 block 拆成独立模型轮次。
145
+ - BaseApp(应用模式)把 Base 数据组织成页面和组件。`+app-create` 是只创建 App 的原子命令,必须传目标 `workspace_token`;Workspace 选择以及是否创建备用 Base 由 [lark-base-app.md](references/lark-base-app.md) 的自然语言流程编排。应用查询使用 `+app-get`,页面使用 `+app-page-*`。页面命令使用 `app_token`,组件命令使用 `app_token + page_id`;表、字段和记录命令使用 `base_token`。`+app-block-get-data` 是组件命令中的例外:使用 `app_token + base_token + chart_token`,其中 `base_token` 来自该图表的 `data_config.base_token`,`chart_token` 通过 `--block-id` 传入。不要把组件的普通 `block_id` 传给该命令。同一 Page 内组件名称必须唯一;列表使用 `type=list + sub_type`,每个列表至多一个同 Workspace Base。组件配置详见 [lark-base-app-block-data-config.md](references/lark-base-app-block-data-config.md)。
146
+ - `+app-block-list` 返回 `type=unsupported` 时,只能报告该组件存在且当前 CLI 不支持读取或修改;不得继续调用 `+app-block-get`、`+app-block-get-data` 或 `+app-block-update`,这些请求会报错。
147
+ - `+app-page-list` 返回的 Page 若 `name=""`,表示当前用户对该 Page 无权限,不是无标题页面;报告该权限状态,不要将其作为后续页面或组件操作的目标。
148
+ - 复用现有 BaseApp block 的 `data_config` 只能作为结构模板,首次 Create/Update 前仍要逐项对齐用户显式要求;用户要求排序时必须显式写 `group_by[].sort.order` 或顶层 `sort.order`,不能用旧配置省略的方向或当前 `get-data` 结果顺序代替。
149
+ - 本期不支持 Page 复制和页面图标。识别到任一需求后不得产生写入,也不得调用 `+app-page-create` 冒充完整复制。最终答复先明确“不支持且未执行写入”,再单独总结替代能力:“当前 CLI 可以新建空 Page,但不会复制原 Page 的内容、组件或图标;如需新建,请另行明确要求。”在用户后续明确要求前,不得执行该替代方案。
150
+ - 应用页面的 block 与仪表盘的 block 是同一套底层实体,但 ID 体系不通用:`+app-block-*` 的 `block_id` 不要拿去打 `+dashboard-block-*`,反之亦然。图表类 `data_config` 两边同构,列表类和富文本是应用模式独有。
129
151
  - Workflow 的复杂点是 `steps` 结构。创建、更新或解释完整 workflow 时读入口 [lark-base-workflow-guide.md](references/lark-base-workflow-guide.md) 和 steps JSON SSOT [lark-base-workflow-schema.md](references/lark-base-workflow-schema.md);enable/disable/list 只需确认 workflow ID、当前启停状态和用户意图。
130
152
  - Role 的复杂点是权限 JSON。角色操作先读入口 [lark-base-role-guide.md](references/lark-base-role-guide.md);`+role-create` 只支持自定义角色;`+role-update` 是 delta merge;角色 create/update 或解读完整配置时读权限 JSON SSOT [role-config.md](references/role-config.md)。`+role-delete` 只适用于自定义角色,系统角色不可删除;删除角色和关闭高级权限前必须确认目标和影响。
131
153
 
@@ -160,5 +182,6 @@ metadata:
160
182
  - [lark-base-filter-condition.md](references/lark-base-filter-condition.md):视图 filter、记录 `--filter-json`、表单 `visible_rule` 的 tuple 条件结构公共协议 SSOT
161
183
  - [lark-base-form-detail.md](references/lark-base-form-detail.md) / [lark-base-form-submit.md](references/lark-base-form-submit.md) / [lark-base-form-questions-create.md](references/lark-base-form-questions-create.md) / [lark-base-form-questions-update.md](references/lark-base-form-questions-update.md):表单详情、提交和复杂 JSON
162
184
  - [lark-base-dashboard.md](references/lark-base-dashboard.md) / [dashboard-block-data-config.md](references/dashboard-block-data-config.md) / [lark-base-dashboard-block-get-data.md](references/lark-base-dashboard-block-get-data.md):仪表盘、组件配置与图表结果协议
185
+ - [lark-base-app.md](references/lark-base-app.md) / [lark-base-app-block-data-config.md](references/lark-base-app-block-data-config.md):应用模式(Workspace / 应用 / 页面 / 组件)入口与组件配置 SSOT
163
186
  - [lark-base-workflow-guide.md](references/lark-base-workflow-guide.md) / [lark-base-workflow-schema.md](references/lark-base-workflow-schema.md):workflow 入口与 steps JSON SSOT
164
187
  - [lark-base-role-guide.md](references/lark-base-role-guide.md) / [role-config.md](references/role-config.md):角色入口与权限 JSON SSOT
@@ -1,6 +1,6 @@
1
1
  # dashboard block data_config SSOT
2
2
 
3
- Block 的 `data_config` 字段因 `type` 不同而变化。本文档是 dashboard block `data_config` 的单一事实来源(SSOT),包含组件类型、字段结构、筛选格式、约束和可复制模板。
3
+ Block 的 `data_config` 字段因 `type` 不同而变化。本文档是 Dashboard block 扁平单数据源 `data_config` 的单一事实来源(SSOT),包含组件类型、字段结构、筛选格式、约束和可复制模板。BaseApp 图表的外层结构不同,但每个 `data_sources[]` 元素复用本文的字段取值、筛选、分组、排序及规范化规则;创建或更新 App 组件时,还必须读取 [BaseApp Block data_config](lark-base-app-block-data-config.md) 了解共享 `base_token`、多数据源封装,以及 App 独有的列表组件协议。
4
4
 
5
5
  ## 支持的组件类型(`type` 枚举)
6
6
 
@@ -29,11 +29,13 @@ text: is, isNot, contains, doesNotContain, isEmpty, isNotEmpty
29
29
  number: is, isNot, isGreater, isGreaterEqual, isLess, isLessEqual, isEmpty, isNotEmpty
30
30
  select(multiple=false): is, isNot, isEmpty, isNotEmpty
31
31
  select(multiple=true): is, isNot, contains, doesNotContain, isEmpty, isNotEmpty
32
- datetime: is, isGreater, isGreaterEqual, isLess, isLessEqual, isEmpty, isNotEmpty
32
+ datetime: is, isGreater, isLess, isEmpty, isNotEmpty
33
33
  checkbox: is (value: true/false)
34
34
  user / created_by / updated_by: is, isNot, isEmpty, isNotEmpty
35
35
  ```
36
36
 
37
+ `isGreaterEqual` / `isLessEqual` 不是全局不支持:它们可用于 `number`,但不能用于 `datetime` / `created_at` / `updated_at`。日期范围必须用 `isGreater` / `isLess` 配合 `ExactDate`;不要把数字字段的操作符集合套到日期字段上。
38
+
37
39
  ## data_config 通用结构
38
40
 
39
41
  | 字段 | 类型 | 说明 |
@@ -156,12 +158,42 @@ user / created_by / updated_by: is, isNot, isEmpty, isNotEmpty
156
158
  | `number` | number | is, isNot, isGreater, isGreaterEqual, isLess, isLessEqual, isEmpty, isNotEmpty | `{"field_name":"金额","operator":"isGreater","value":0}` |
157
159
  | `select` (`multiple=false`) | string(选项名) | is, isNot, isEmpty, isNotEmpty | `{"field_name":"状态","operator":"is","value":"已完成"}` |
158
160
  | `select` (`multiple=true`) | string[](选多个)/ string(选单个) | is, isNot, contains, doesNotContain, isEmpty, isNotEmpty | 多选传数组如 `["标签1","标签2"]`;单选传单个字符串 |
159
- | `datetime` / `created_at` / `updated_at` | number(Unix 毫秒时间戳,13位) | is, isGreater, isGreaterEqual, isLess, isLessEqual, isEmpty, isNotEmpty | `{"field_name":"创建日期","operator":"isGreater","value":1704038400000}` |
161
+ | `datetime` / `created_at` / `updated_at` | `["ExactDate", Unix 毫秒时间戳]` | is, isGreater, isLess, isEmpty, isNotEmpty | `{"field_name":"创建日期","operator":"isGreater","value":["ExactDate",1704038400000]}` |
160
162
  | `checkbox` | boolean | is | `{"field_name":"已审核","operator":"is","value":true}` |
161
163
  | `user` / `created_by` / `updated_by` | string 或 string[](用户 ID,格式 `ou_xxx`)。不知道 `open_id` 时先用 `lark-cli contact +search-user --query "<姓名/邮箱/手机号>" --as user` 查 id。 | is, isNot, isEmpty, isNotEmpty | `{"field_name":"负责人","operator":"is","value":"ou_xxxxxxxxxxxxxxxx"}` |
162
164
  | 所有类型(为空/不为空) | 不需要 value | isEmpty, isNotEmpty | `{"field_name":"备注","operator":"isEmpty"}` |
163
165
 
164
- > `value` 类型为 `string | number | boolean | string[]`,需根据字段类型匹配正确格式
166
+ > `value` 类型因字段而异,可为 `string | number | boolean | string[] | ["ExactDate", number]`,需按上表构造。
167
+
168
+ ### 日期筛选
169
+
170
+ 图表 `data_config.filter` 筛选 `datetime` / `created_at` / `updated_at` 字段时:
171
+
172
+ - 有值条件只能使用 `is`、`isGreater` 或 `isLess`,不得使用 `isGreaterEqual` 或 `isLessEqual`。
173
+ - `value` 必须写成 `["ExactDate", <Unix 毫秒时间戳>]`,不得直接传裸时间戳。
174
+ - `isEmpty` / `isNotEmpty` 不传 `value`。
175
+
176
+ 日期区间示例:
177
+
178
+ ```json
179
+ {
180
+ "filter": {
181
+ "conjunction": "and",
182
+ "conditions": [
183
+ {
184
+ "field_name": "派单日期",
185
+ "operator": "isGreater",
186
+ "value": ["ExactDate", 1785686400000]
187
+ },
188
+ {
189
+ "field_name": "派单日期",
190
+ "operator": "isLess",
191
+ "value": ["ExactDate", 1786032000000]
192
+ }
193
+ ]
194
+ }
195
+ }
196
+ ```
165
197
 
166
198
  ## 约束与本地校验
167
199
 
@@ -0,0 +1,122 @@
1
+ # BaseApp Block `data_config`
2
+
3
+ 本文件说明 BaseApp 组件 `data_config` 的 CLI 映射与操作约束,不复制完整字段 Schema。App 图表的每个 `data_sources[]` 元素复用 [Dashboard block data_config](dashboard-block-data-config.md) 的字段取值、筛选、分组、排序及规范化规则;区别是 Dashboard 使用扁平单数据源结构,而 App 图表在顶层使用共享的 `base_token` 和多数据源 `data_sources[]`。列表组件是 App 独有协议,不复用 Dashboard 图表结构。本文所称“组件协议”是指 CLI 随版本发布的 API 元数据、本文明确列出的约束及实际服务端校验结果。
4
+
5
+ ## 类型映射
6
+
7
+ - 图表:`--type column|bar|line|pie|ring|area|combo|scatter|funnel|wordCloud|radar|statistics`
8
+ - 富文本:`--type text`(与 Dashboard 文本组件同名同义)
9
+ - 列表:`--type list --sub-type standard|grouped|collapsible|card|detail`
10
+ - 列表省略 `--sub-type` 时默认 `standard`
11
+ - `type/sub_type` 创建后不可修改
12
+
13
+ ## 外层请求字段
14
+
15
+ - Create 只发送 `name`、`type`、按需发送的 `sub_type` 和 `data_config`。`name`、`type` 必填;图表和列表的 `data_config` 必填,富文本可省略。
16
+ - 标准列表未显式指定 `--sub-type` 时,不发送 `sub_type`,由服务端使用 `standard` 默认值;其他列表类型必须发送对应 `sub_type`。
17
+ - 图表和富文本不得发送 `sub_type`。
18
+ - Update 只发送 `name`、`data_config`,且至少提供一个;未传字段保持不变,不允许修改 `type`、`sub_type`。
19
+ - 布局、位置、尺寸、`show_title` 等展示配置不属于本期公开 Create/Update 请求字段,CLI 不提供或提升这些字段。
20
+
21
+ ## 列表配置
22
+
23
+ 列表公共数据源字段为单值 `base_token` 和 `table_name`。每个列表最多关联一个 Base,且该 Base 必须位于 App 所在的同一 Workspace。
24
+
25
+ 按组件协议,各 subtype 使用以下字段组:
26
+
27
+ - 公共:`base_token`、`table_name`、`filter`、`sort_by`
28
+ - `standard/grouped/collapsible`:`columns`、`group_by`
29
+ - `card`:`fields`、`card_config`
30
+ - `detail`:`fields`、`detail_config`
31
+ - `columns` 和 `fields` 都是可选字段。未指定时 CLI 不发送,由服务端使用产品默认字段。
32
+ - 只有用户显式指定 `columns` / `fields` 时才发送;显式传 `[]` 表示明确发送空数组,不能作为默认值自动补入。
33
+ - `filter`、`sort_by`、`group_by`、`card_config`、`detail_config` 也都是可选字段;未指定时不发送。
34
+ - 列表 Create 的 `data_config` 必填,其中只有 `base_token` 和 `table_name` 是顶层必填字段。
35
+ - 可选对象一旦传入,其内部必填项仍须满足协议,例如 `filter` 必须包含 `conjunction` 和 1~50 项 `conditions`。
36
+
37
+ 不要添加协议未定义的语义校验,尤其不要假设:
38
+
39
+ - detail/card 必须有 title;
40
+ - grouped/collapsible 必须或只能有一个 group_by;
41
+ - fields 存在 role 或 visible 属性。
42
+
43
+ 未知顶层字段会被本地校验拒绝;只有确认 CLI 校验与最新协议不一致时才使用 `--no-validate`。
44
+
45
+ ## 创建示例
46
+
47
+ ```bash
48
+ lark-cli base +app-block-create \
49
+ --app-token <app_token> --page-id <page_id> \
50
+ --name "订单列表" \
51
+ --type list --sub-type standard \
52
+ --data-config '{"base_token":"<base_token>","table_name":"订单"}'
53
+ ```
54
+
55
+ 字段的具体对象结构与必填性以 CLI 当前版本的 API 元数据和服务端校验结果为准,不在这里猜测未公开属性。
56
+
57
+ ## 更新语义
58
+
59
+ 下面是只更新顶层 `filter` 的示例,适用于协议将 `filter` 定义在 `data_config` 顶层的组件(所有列表 subtype 均可使用)。组件类型在创建后不可修改,所以 update 命令不再传 `--type`。App 图表的 `filter` 定义在对应的 `data_sources[]` 元素中;更新图表筛选时必须按图表结构传入完整 `data_sources`,不能把 `filter` 提到顶层。
60
+
61
+ ```bash
62
+ lark-cli base +app-block-update \
63
+ --app-token <app_token> --page-id <page_id> --block-id <block_id> \
64
+ --data-config '{"filter":{"conjunction":"and","conditions":[{"field_name":"状态","operator":"is","value":"已完成"}]}}'
65
+ ```
66
+
67
+ - CLI 只发送用户显式传入的字段。
68
+ - 未传字段由服务端保持不变。
69
+ - 不为 update 注入 create 默认值,不先读取后拼成全量配置。
70
+ - 数组/对象字段的替换粒度以组件协议和服务端校验结果为准。
71
+
72
+ ## 图表与富文本
73
+
74
+ **App 图表是多数据源结构(`ChartDataConfig`),与 Dashboard 的扁平单源结构不同。** 顶层用一个 `base_token`(所有数据源共用),`table_name` / `series` / `count_all` / `group_by` / `filter` 下沉到每个 `data_sources[]` 元素里;顶层另有可选的 `data_source_mode` 和 `sort`。每个数据源内部各字段的取值逻辑与 [dashboard-block-data-config.md](dashboard-block-data-config.md) 完全一致(`series[].rollup` 大写、`group_by[].sort` 小写等),CLI 对每个 `data_sources[]` 元素复用同一套规范化与校验。富文本使用 `--type text`,配置为 `{"text":"..."}`,无数据源;Create 时可省略 `data_config`,等价于空文本。
75
+
76
+ > **text 内容怎么取**:text 组件没有 `/data` 接口,走 `+app-block-get-data` 会被服务端兜底成通用 500。改用 `+app-block-get --block-id <widget_id>` 直接读 `data_config.text`(Markdown 原文)。图表仍走 `+app-block-get-data --block-id <chart_token>`。
77
+
78
+ 顶层参数:
79
+
80
+ | 参数 | 必填 | 取值 | 说明 |
81
+ |-|-|-|-|
82
+ | `base_token` | 是 | `string` | 数据所在 Base 的 token;所有数据源共用同一个值。App 命令不带 `--base-token`,只能写在 data_config 内 |
83
+ | `data_sources` | 是 | `ChartDataSourceConfig[]` | 有序数组,至少一项 |
84
+ | `data_source_mode` | 否 | `aggregate` / `compare` | `aggregate`(默认)在横轴聚合数据源;`compare` 按数据源拆分系列 |
85
+ | `sort` | 否 | `{type: group\|value\|record, order?: asc\|desc}` | 顶层排序;`statistics` 不允许 |
86
+
87
+ 每个 `data_sources[]` 元素:`table_name`(必填)、`series` 与 `count_all=true` 二选一、`group_by`(最多 2 项,`statistics` 不允许)、`filter`。
88
+
89
+ ```json
90
+ {
91
+ "base_token": "A2f5boKjfazMzesI9zKbmugTc4T",
92
+ "data_sources": [
93
+ {
94
+ "table_name": "数据表",
95
+ "count_all": true,
96
+ "group_by": [
97
+ { "field_name": "文本", "mode": "integrated", "sort": { "type": "value", "order": "desc" } }
98
+ ]
99
+ }
100
+ ]
101
+ }
102
+ ```
103
+
104
+ 对应命令(单数据源计数柱状图):
105
+
106
+ ```bash
107
+ lark-cli base +app-block-create \
108
+ --app-token <app_token> --page-id <page_id> \
109
+ --name "文本分布" --type column \
110
+ --data-config '{"base_token":"A2f5boKjfazMzesI9zKbmugTc4T","data_sources":[{"table_name":"数据表","count_all":true,"group_by":[{"field_name":"文本","mode":"integrated","sort":{"type":"value","order":"desc"}}]}]}'
111
+ ```
112
+
113
+ 多数据源示例(两张表各出一条系列,按数据源拆分):
114
+
115
+ ```bash
116
+ lark-cli base +app-block-create \
117
+ --app-token <app_token> --page-id <page_id> \
118
+ --name "销售与成本" --type combo \
119
+ --data-config '{"base_token":"bas_xxx","data_source_mode":"compare","data_sources":[{"table_name":"销售表","group_by":[{"field_name":"月份","sort":{"type":"group","order":"asc"}}],"series":[{"field_name":"销售额","rollup":"SUM"}]},{"table_name":"成本表","group_by":[{"field_name":"月份","sort":{"type":"group","order":"asc"}}],"series":[{"field_name":"成本","rollup":"SUM"}]}],"sort":{"type":"group","order":"asc"}}'
120
+ ```
121
+
122
+ Update 语义:传入 `data_sources` 即全量替换整个有序数组;修改 `base_token` 时必须同时传入完整 `data_sources`。请求不得包含 `sub_type`(平滑/堆积/百分比等展示变体走产品默认值)。布局、位置、尺寸和展示配置不属于本期公开 Create/Update 协议。其他请求字段以 CLI 当前版本的 API 元数据和服务端校验结果为准。
@@ -0,0 +1,225 @@
1
+ # BaseApp(应用模式)操作指引
2
+
3
+ > 先读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md)。接口和组件字段以 CLI 当前版本的 API 元数据、[组件配置 reference](lark-base-app-block-data-config.md) 和服务端校验结果为准;不要从组件名称推断额外约束。
4
+
5
+ ## 不支持能力:先判断并停止
6
+
7
+ ### 复制 BaseApp
8
+
9
+ 本期没有 BaseApp 复制命令。用户要复制或克隆既有 BaseApp 时,直接说明当前 CLI 无法完成并停止;不要继续探索浏览器、OpenAPI 或创建类命令等替代通道,也不要发起任何写请求。
10
+
11
+ - `+base-copy` 只支持 Base,不支持 BaseApp;不得向它传入 `app_token`,也不得把复制出的 Base 描述为应用副本。
12
+ - `+app-create` 只创建全新空 BaseApp,不复制既有页面和组件。
13
+ - 不要使用 Drive copy 或其他 Base shortcut 拼装、模拟或冒充 BaseApp 复制。
14
+
15
+ ### 创建或归属 PageGroup
16
+
17
+ 当前第一阶段的页面层级能力只支持顶级 Page 节点。PageGroup 的创建、归属设置,以及把现有 Page 移入页面组均不支持。
18
+
19
+ 最终答复必须同时说明上述正向支持范围和负向限制,不能只说 PageGroup 不支持。用户命中这些诉求时,直接说明当前 CLI 无法完成并停止;不要继续探索浏览器、OpenAPI 或普通 Page 命令等替代通道,也不要读取页面后声称能完成分组或发起任何写请求。
20
+
21
+ ### 从 Workspace 移出或移除资源
22
+
23
+ 当前 CLI 只支持用 `+workspace-move-in` 把 Base 或 BaseApp 移入 Workspace,不支持从 Workspace 移出或移除资源,也没有 `workspace move-out` / `workspace remove` 命令。这类请求必须先完成只读定位,再说明限制并停止,顺序不可调换:
24
+
25
+ 1. Workspace URL 含 `/base/workspace/<workspace_token>` 时,提取其中的真实 `workspace_token`,不要把完整 URL 当作命令参数。
26
+ 2. 在同一轮立即执行 `lark-cli base +workspace-entity-list --workspace-token <workspace_token> --page-size 100 --as user`;若 `has_more=true`,继续分页直到完整。该查询是必要的只读定位步骤,不要把它留成等待用户再次选择的可选项,也不要用 `--help` 代替真实查询。
27
+ 3. 用服务端返回的 `entities[].name`、`entity_type`、`token` 和 `url` 忠实判断目标。名称完全匹配时报告真实对象;没有完全匹配时明确说明不存在精确同名实体,并原样列出可能相关的候选。不得自动去掉或补齐前后缀,也不得仅凭名称相似就声称已经定位目标。用户直接给出 token 时仍要忠实报告该 token 对应的实际名称。
28
+ 4. 定位结果报告完后,明确说明当前 CLI 无法执行 Workspace 移出/移除,并停止,不要发起任何写请求。用户在任一步骤中取消时立即停止,取消后不再调用工具。
29
+
30
+ `lark-cli drive +move` 只改变 Base 或 BaseApp 在云盘中的目录位置,不改变其 Workspace 归属,不能作为移出 Workspace 的替代方案。不要继续探索 Drive move/delete、另一个 Workspace 的 `+workspace-move-in`、浏览器、OpenAPI 或源码来拼装或冒充该操作;只有用户后续明确提出另一项受支持的操作时,才执行新的写入。
31
+
32
+ ## Token 与命令
33
+
34
+ | 对象 | 标识 | 命令 |
35
+ |---|---|---|
36
+ | Workspace | `workspace_token` | `+workspace-create` / `+workspace-entity-list` / `+workspace-move-in` |
37
+ | BaseApp | `app_token` | `+app-create/get`;重命名和删除见下方 |
38
+ | Base | `base_token` | `+base-create` 返回;表、字段、记录命令使用它 |
39
+ | Page | `page_id` | `+app-page-list/get/create/update/delete` |
40
+ | Block | `block_id` | `+app-block-list/get/create/update` |
41
+
42
+ 页面和组件命令使用 `app_token`;Base 数据命令使用 `base_token`。`+app-block-get-data` 使用 `app_token + base_token + chart_token`:CLI 参数名仍为 `--block-id`,但必须传组件返回的 `chart_token`,不能传普通 `block_id`。请求路径与仪表盘图表数据接口相同。
43
+
44
+ BaseApp / AppMode 是 Base 域能力。用户提供 `/app/` 链接时,先用 `+url-resolve`;它会返回 `app_token`,并忠实提取链接实际携带的 `workspace_token` 与 `page_id`。直接使用本指引和 `lark-cli base +...`,不要先尝试 `lark-cli apps`。
45
+
46
+ ## 查询应用
47
+
48
+ ```bash
49
+ lark-cli base +app-get --app-token <app_token>
50
+ ```
51
+
52
+ - 没有 `lark-cli base +app-list`。需要列出某个 Workspace 内的 BaseApp 时,唯一列表入口是:
53
+
54
+ ```bash
55
+ lark-cli base +workspace-entity-list \
56
+ --workspace-token <workspace_token> \
57
+ --type baseapp \
58
+ --page-size 100
59
+ ```
60
+
61
+ - 响应中的 `pages` 是页面摘要。
62
+ - `ref` 的结构是 `Base token -> 当前组件引用的 Table 名称数组`。需要操作被引用 Base 时,使用 `ref` 的 key 作为 `base_token`。
63
+ - `ref` 只描述当前组件已经引用的数据源;没有被组件引用的 Base 不会出现在其中。
64
+
65
+ ## 查询页面与组件
66
+
67
+ ```bash
68
+ lark-cli base +app-page-list --app-token <app_token> --page-size 100
69
+ lark-cli base +app-block-list \
70
+ --app-token <app_token> \
71
+ --page-id <page_id> \
72
+ --page-size 100
73
+ ```
74
+
75
+ - `+app-get` 已返回足够的页面摘要时,可直接取得目标 `page_id`;需要完整页面目录或分页确认时再用 `+app-page-list`。
76
+ - `+app-page-list` 返回的某个 Page 若 `name` 为空字符串,表示当前用户对该 Page 无权限,不表示 Page 没有标题。报告该权限状态,不要将其 `page_id` 用于后续页面或组件读写。
77
+ - 只需列表摘要时不要逐个调用 `+app-block-get` 复核;仅在用户需要单个组件详情时使用 get。
78
+ - `+app-block-list` 返回 `type=unsupported` 的组件时,只能通过列表摘要识别它的存在。当前 CLI 不支持读取详情、读取计算数据或修改此类组件;不要调用 `+app-block-get`、`+app-block-get-data` 或 `+app-block-update`,这些请求会报错。
79
+
80
+ ## 创建 Workspace
81
+
82
+ ```bash
83
+ lark-cli base +workspace-create \
84
+ --name "AppMode-空白评测空间" \
85
+ --as user
86
+ ```
87
+
88
+ ## 创建应用
89
+
90
+ ```bash
91
+ lark-cli base +app-create \
92
+ --name "销售应用" \
93
+ --workspace-token <workspace_token> \
94
+ --as user
95
+ ```
96
+
97
+ - `+app-create` 没有 `--base-token`。
98
+ - `--workspace-token` 必填;`+app-create` 只调用 App 创建接口,不创建 Workspace、Base,也不移动资源。
99
+ - `--theme-style` 可选,支持 `default|cloudBlue|fresh|softLight|future|technology`。
100
+ - 记录输出中的 `app_token` 和 `workspace_token`。
101
+
102
+ ### 创建应用的自然语言编排
103
+
104
+ 先根据用户是否指定 Workspace 和现有 Base 选择流程,再调用原子 shortcut:
105
+
106
+ | 用户提供的信息 | 执行流程 |
107
+ |---|---|
108
+ | Workspace + 现有 Base | 确认 Base 位于该 Workspace → `+app-create`;不创建备用 Base |
109
+ | Workspace,未指定 Base | `+app-create` → `+base-create` 创建空 Base → `+workspace-move-in` |
110
+ | 未指定 Workspace,指定现有 Base | 先确认该 Base 所属 Workspace;能确定时在该 Workspace 执行 `+app-create`,不能确定时请用户提供 Workspace;不创建备用 Base |
111
+ | Workspace 和 Base 都未指定 | `+workspace-create` → `+app-create` → `+base-create` 创建空 Base → `+workspace-move-in` |
112
+
113
+ 应用模式的列表组件只能引用同一 Workspace 内的一个 Base。用户指定现有 Base 时,不要因为 `+app-create` 没有接收 `base_token` 就额外创建 Base;后续在组件 `data_config.base_token` 中引用该 Base。
114
+
115
+ 多步编排中,每个成功的 shortcut 都会立即产生资源且不自动回滚。后续步骤失败时,明确报告已经成功创建的 Workspace、App 或 Base 及其 token;用户要求继续时,只重试失败步骤,不要重复创建已经成功的资源。
116
+
117
+ ## 读取图表计算结果
118
+
119
+ ```bash
120
+ lark-cli base +app-block-get-data \
121
+ --app-token <app_token> \
122
+ --base-token <base_token> \
123
+ --block-id <chart_token>
124
+ ```
125
+
126
+ - `--block-id` 的值必须取图表组件摘要中的 `chart_token`,不能使用组件的普通 `block_id`。
127
+ - `base_token` 使用当前图表组件 `data_config.base_token`;一个 App 引用多个 Base 时,不要从 `+app-get ref` 中任意选择一个 key。
128
+ - `page_id` 不参与请求。
129
+ - 返回协议与 `+dashboard-block-get-data` 完全一致。
130
+
131
+ ## 重命名应用
132
+
133
+ ```bash
134
+ lark-cli drive files patch \
135
+ --file-token <app_token> \
136
+ --type bitable \
137
+ --data '{"new_title":"新名称"}'
138
+ ```
139
+
140
+ BaseApp 与 Base 在 Drive 文件接口中都使用 `type=bitable`。`new_title` 只更新应用标题,不会重命名它引用的 Base,也不会修改 Page 或 Block。
141
+
142
+ ## 删除应用
143
+
144
+ ```bash
145
+ lark-cli drive +delete --file-token <app_token> --type bitable --yes
146
+ ```
147
+
148
+ - 删除 BaseApp 应用本体需要切到 `lark-drive`。
149
+ - BaseApp 与 Base 在 Drive 删除接口中都使用 `--type bitable`;删除 BaseApp 时 `--file-token` 传 `app_token`。
150
+ - 这是高风险写操作;执行前先确认 `app_token` 来自 `+app-get` 或 `+workspace-entity-list`。
151
+
152
+ ## Page
153
+
154
+ ### 本期不支持的 Page 能力
155
+
156
+ Page 复制和页面图标均不在本期范围。用户提出复制 Page、复制页面、克隆页面、沿用页面图标、设置或修改页面图标等需求时:
157
+
158
+ 1. 明确说明当前 CLI 不支持该能力,并确认本次没有执行任何写入。
159
+ 2. 不得调用 `+app-page-create` 冒充完整复制;空 Page 不包含原 Page 的内容、组件或图标。
160
+ 3. 不得尝试使用其他 shortcut 拼装、模拟或声称完成 Page 复制或图标设置。
161
+ 4. 在最终答复中将以下替代能力单独成段说明,但不要自动执行:
162
+
163
+ > 可用替代能力(本次未执行):当前 CLI 可以新建一个空 Page,但不会复制原 Page 的内容、组件或图标。如需新建空 Page,请明确告诉我。
164
+
165
+ 只有用户后续明确要求新建空 Page,才可以调用 `+app-page-create`。
166
+
167
+ ```bash
168
+ lark-cli base +app-page-list --app-token <app_token>
169
+ lark-cli base +app-page-create --app-token <app_token> --name "总览"
170
+ lark-cli base +app-page-update --app-token <app_token> --page-id <page_id> --name "经营总览"
171
+ lark-cli base +app-page-delete --app-token <app_token> --page-id <page_id> --yes
172
+ ```
173
+
174
+ - 同一 App 内 Page 名称必须唯一。创建或更新名称前,CLI 会读取页面列表;更新时排除当前 Page。
175
+ - 同一 Page 内组件名称必须唯一。`+app-block-create` 会分页读取该 Page 的全部组件并在创建前检查重名。
176
+ - 本期没有 Page arrange,也没有 Block delete;Block 的 `type/sub_type` 创建后不可修改。详见[本期不支持的能力](#本期不支持的能力)。
177
+
178
+ ## 本期不支持的能力
179
+
180
+ 下列能力本期不存在。用户提出时,直接说明不支持并给出可选的替代方向,不要用 Dashboard 或其他域的同名能力顶替。
181
+
182
+ | 用户诉求 | 本期状态 | 正确动作 |
183
+ |---|---|---|
184
+ | 自动排版 / 重新布局 / 美化页面组件 | 没有 App page arrange | 直接告知不支持;不要调用 `+dashboard-arrange` |
185
+ | 删除页面组件 | 没有 App block delete | 直接告知不支持,只能在 UI 处理;不要调用 `+dashboard-block-delete` |
186
+ | 修改组件位置 / 大小 / 置顶 | 布局、位置、尺寸不属于公开 Create/Update 协议 | 直接告知不支持;不要用 `+app-block-update` 做空更新伪装成移动 |
187
+ | 修改已有组件的 `type/sub_type` | `type/sub_type` 创建后不可修改 | 先读取当前 Block;无论是否已为目标类型,最终答复都要说明此约束。已匹配时说明无需写入;不匹配时说明只能在 UI 处理;不得调用或承诺用 `+app-block-update` 修改类型 |
188
+ | 修改已存在 App 的主题 | `--theme-style` 只在 `+app-create` 时生效 | 直接告知不支持;如确有必要,说明只能新建 App 时指定主题 |
189
+ | 读取或修改 `type=unsupported` 的组件 | 列表仅用于识别该组件存在,详情读取、计算数据读取和修改均不支持 | 直接告知不支持;不要调用 `+app-block-get`、`+app-block-get-data` 或 `+app-block-update`,这些请求会报错 |
190
+
191
+ `+dashboard-*` 命令只作用于 Base 内的仪表盘,`dashboard_id` 是 `blk` 开头、组件 ID 是 `cht` 开头;AppMode 的 `pge` 页面和 `wgt` 组件不属于它们的作用域。缺少能力时不要用这些命令试探,包括 `--help` 和 `--dry-run`:一次调用就是一次错误的能力归属判断。
192
+
193
+ ## 列表组件
194
+
195
+ 创建列表时使用 `--type list` 与 `--sub-type standard|grouped|collapsible|card|detail`。省略 `--sub-type` 时默认 `standard`。
196
+
197
+ ```bash
198
+ lark-cli base +app-block-create \
199
+ --app-token <app_token> \
200
+ --page-id <page_id> \
201
+ --name "待处理订单" \
202
+ --type list \
203
+ --sub-type standard \
204
+ --data-config '{"base_token":"<base_token>","table_name":"订单"}'
205
+ ```
206
+
207
+ - `data_config.base_token` 是单值:每个列表最多选择一个 Base。
208
+ - Base 必须在当前 App 的同一个 Workspace;CLI 写入前校验。
209
+ - 完整字段协议读 [lark-base-app-block-data-config.md](lark-base-app-block-data-config.md)。
210
+
211
+ ## 更新组件
212
+
213
+ `+app-block-update` 只发送显式传入的 `data_config` 字段。未传字段保持不变;数组或对象字段是否整体替换,以[组件配置 reference](lark-base-app-block-data-config.md)和服务端校验结果为准。不要为了“补全”先读取并提交全量配置。
214
+
215
+ ## 常见恢复
216
+
217
+ | 现象 | 动作 |
218
+ |---|---|
219
+ | `status=partial` | 告知已完成/失败步骤;用户要求继续时执行 `retry.command` |
220
+ | Page 重名 | 先 `+app-page-list`,选择唯一名称后重试 |
221
+ | 组件重名 | 先 `+app-block-list`,为该 Page 内的新组件选择唯一名称后重试 |
222
+ | 列表 Base 不在同一 Workspace | 用 `+workspace-entity-list` 核对;选择同 Workspace Base |
223
+ | 列表协议校验失败 | 读取组件协议文档;不要推断 title、group_by 数量或 field role |
224
+ | Block 类型选错 | 本期无法删除且类型不可改,只能在 UI 处理后重新创建 |
225
+ | 用户要 arrange / 删组件 / 调位置 / 改主题 | 按[本期不支持的能力](#本期不支持的能力)直接告知不支持;不要改用 `+dashboard-*` 命令 |
@@ -27,14 +27,17 @@
27
27
  "logic": "and", // 所有 conditions 同时成立;任意一个成立时使用 "or"
28
28
  "conditions": [
29
29
  ["标题", "==", "Launch plan"], // 文本全等
30
+ ["标题", "!=", "Archived plan"], // 文本不全等
30
31
  ["标题", "intersects", "urgent"], // 文本包含目标片段
32
+ ["标题", "disjoint", "internal"], // 文本不包含目标片段
31
33
  ["金额", ">=", 100], // 数字比较;支持 ==、!=、>、>=、<、<=
32
34
  ["状态", "intersects", ["进行中", "暂停"]], // Select 集合相交:包含“进行中”或“暂停”任意一个选项
33
35
  ["状态", "disjoint", ["已终止"]], // Select 集合无交集
34
36
  ["已完成", "==", true], // Checkbox
35
37
  ["负责人", "intersects", [{"id": "ou_xxx"}]], // 负责人包含某个人;intersects 表示包含数组中任意一个人员
38
+ ["负责人", "disjoint", [{"id": "ou_yyy"}]], // 负责人不包含指定人员中的任何一个
36
39
  ["关联项目", "intersects", [{"id": "rec_xxx"}]], // 关联项目包含某个 record_id;intersects 表示包含数组中任意一条关联
37
- ["备注", "non_empty"], // 非空判断;标量 null 和多值空数组都是空
40
+ ["备注", "non_empty"], // 格子非空;判断格子为空改用 ["备注", "empty"]
38
41
  ["业务日期", "==", "ExactDate(2026-08-07)"], // 具体一天:按 Base 时区匹配 2026-08-07 当天
39
42
  ["发生时间", ">", "ExactDate(2024-01-31 23:59:59.999)"], // 日期不支持 >=;用 > 前一天最后一毫秒表达含当天的下界
40
43
  ["发生时间", "<", "ExactDate(2024-03-01 00:00:00)"] // 2024 年 2 月范围上界:小于 3 月 1 日零点
@@ -60,12 +60,20 @@ value 类型取决于条件引用对象(字段 / 题目)的类型。
60
60
 
61
61
  ### `text`
62
62
 
63
- 用字符串:
63
+ 用字符串;`==` / `!=` 比较完整文本,`intersects` / `disjoint` 判断是否包含目标片段:
64
+
65
+ ```json
66
+ ["标题", "!=", "已归档"]
67
+ ```
64
68
 
65
69
  ```json
66
70
  ["标题", "intersects", "发布"]
67
71
  ```
68
72
 
73
+ ```json
74
+ ["标题", "disjoint", "内部"]
75
+ ```
76
+
69
77
  ### `location`
70
78
 
71
79
  location 筛选只按 `full_address` 字符串匹配,不能直接按经纬度筛选;优先使用 `intersects` 做包含匹配,例如查深圳:
@@ -86,12 +94,16 @@ location 筛选只按 `full_address` 字符串匹配,不能直接按经纬度
86
94
 
87
95
  ### `select`
88
96
 
89
- 用选项名数组:
97
+ 用选项名数组;`intersects` 表示命中任意选项,`disjoint` 表示不包含其中任何选项:
90
98
 
91
99
  ```json
92
100
  ["状态", "intersects", ["Doing", "Blocked"]]
93
101
  ```
94
102
 
103
+ ```json
104
+ ["状态", "disjoint", ["Archived"]]
105
+ ```
106
+
95
107
  ### `user` / `created_by` / `updated_by`
96
108
 
97
109
  用对象数组:
@@ -102,6 +114,10 @@ location 筛选只按 `full_address` 字符串匹配,不能直接按经纬度
102
114
  ["负责人", "intersects", [{ "id": "ou_xxx" }]]
103
115
  ```
104
116
 
117
+ ```json
118
+ ["负责人", "disjoint", [{ "id": "ou_xxx" }]]
119
+ ```
120
+
105
121
  ### `group_chat`
106
122
 
107
123
  用对象数组:
@@ -171,7 +187,7 @@ location 筛选只按 `full_address` 字符串匹配,不能直接按经纬度
171
187
 
172
188
  - 不要再写旧对象风格:`{"field_name":...,"operator":...}`。
173
189
  - `user` / `group_chat` / `link` 不要写成单个标量。
174
- - `empty` / `non_empty` 不要硬塞无意义的 value。
190
+ - `empty` / `non_empty` 统一表示格子为空 / 非空,不要传 value;标量空格子和多值字段没有任何元素都属于空。
175
191
  - 日期条件稳定写法用 `ExactDate(...)` 或 `Today` / `Yesterday` / `Tomorrow`。
176
192
  - `formula` / `lookup` 的 value 形状不固定;拿不准时先读当前配置或字段定义,或根据错误提示修正类型。
177
193
 
@@ -36,6 +36,7 @@ lark-cli calendar +create --summary "..." --start "..." --end "..." \
36
36
  | `--attendee-ids <id_list>` | 否 | 参与人 ID 列表(逗号分隔)。支持用户(`ou_`)、群组(`oc_`)和会议室(`omm_`)。AI 提取时请务必保留对应前缀。bot 可作为合法参会人,无需剔除 |
37
37
  | `--calendar-id <id>` | 否 | 日历 ID(省略则使用主日历) |
38
38
  | `--rrule <rrule>` | 否 | 重复日程的重复性规则,规则设置方式参考rfc5545。示例值:"FREQ=DAILY;INTERVAL=1;UNTIL=<具体日期>" |
39
+ | `--meeting-owner-id <ou_>` | 否 | 设置 VC 会议 owner。仅以应用(bot)身份在应用日历上操作时生效(需 `--as bot`);owner 必须为本租户用户身份的 open_id(`ou_`) |
39
40
  | `--dry-run` | 否 | 预览 API 调用,不执行 |
40
41
 
41
42
  > 当用户表达'每周 X'、'每周重复'、'连续 N 周'时,必须使用 rrule 创建重复性日程,而非创建多个独立日程
@@ -49,7 +50,8 @@ lark-cli calendar +create --summary "..." --start "..." --end "..." \
49
50
 
50
51
  ## 高级用法(完整 API 命令)
51
52
 
52
- 如需配置 `location`(地理位置,不含会议室位置)、`visibility`(日程公开范围)、自定义 `reminders`(提醒设置)、自定义 `attendee_ability`(参与人权限)、自定义 `free_busy_status`(日程忙闲状态)、参与人可选参加状态或全天日程等高级参数,请使用完整的 API 命令:
53
+ > 优先策略:创建日程优先走 `+create`。遇到 `+create` 不支持的高级参数(如 `location`(地理位置,不含会议室位置)、`visibility`(日程公开范围)、自定义 `reminders`(提醒设置)、自定义 `attendee_ability`(参与人权限)、自定义 `free_busy_status`(日程忙闲状态)、参与人可选参加状态或全天日程等),**优先先用 `+create` 创建成功,再用完整 API update 对这些字段做编辑补齐**,而非整体改用完整 API 从零创建。
54
+
53
55
  **注意**:
54
56
  - 全天日程的开始日期和结束日期必须分别是日程开始的第一天和结束的最后一天。如果只有一天的话,开始日期和结束日期是相同。
55
57
 
@@ -60,12 +62,10 @@ lark-cli calendar event.attendees create \
60
62
  --params '{"calendar_id":"<CALENDAR_ID>","event_id":"<EVENT_ID>"}' \
61
63
  --data '{"attendees": [{"type": "resource", "room_id": "omm_xxx", "approval_reason": "申请原因"}]}'
62
64
 
63
- 完整 API 命令的关键差异:
64
- - `+create` 在传入 `--attendee-ids`(即需要邀请其他参会人)时,会自动把当前身份一并加进参会人,但 `calendar events create` / `calendar event.attendees create` 等完整 API **不会**自动加。需自行把调用身份的 open_id 以 `type:user` 写入 attendees,与邀请的其他参会人合并去重后添加。open_id 用 `lark-cli auth status --json --verify` 获取:bot 取 `identities.bot.openId`(`--verify` 才会填充),user 取 `identities.user.openId`。
65
+ 完整 API 命令的关键差异和处理策略:
65
66
  - 时间参数是 **Unix 秒字符串**(非 ISO 8601)。换算时**禁止依赖容器默认时区**(常为 UTC,会导致 8 小时偏移),必须显式指定目标时区。
66
67
  - 全天日程的开始日期和结束日期必须分别是日程开始的第一天和结束的最后一天;单日全天日程两者相同。
67
68
  - 手动拆成“创建日程 + 添加参会人”两步时,若第二步失败,建议删除刚创建的空日程,避免遗留无参会人的日程。
68
- - 设置会议 owner:`+create` 不支持,需用完整 API 命令在 `vchat.meeting_settings.owner_id` 中设置,且必须同时设置 `vchat.vc_type` 为 `vc`(代表该日程为 VC 视频会议)。仅当以应用(bot)身份在应用日历上操作时生效;owner 必须为用户身份(`ou_` open_id),不能为非用户或外部租户用户。
69
69
 
70
70
  ## 参会人类型
71
71
 
@@ -14,7 +14,7 @@ metadata:
14
14
 
15
15
  **CRITICAL:先判断场景,再读取该场景的参考文件;不要在任务开始时一次性读取全部参考文件。每个文件只在首次进入对应阶段时读取一次。**
16
16
 
17
- **身份:文档操作推荐显式指定 `--as user`。例外:如果 `doc_token` / `note_doc_token` 等是从 bot 链路(如 `vc +detail --as bot` → `note +detail --as bot`)取得的,应继续显式使用 `--as bot`,不要无条件切回 user——身份延续规则见 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md)。**
17
+ **身份:文档操作推荐显式指定 `--as user`。**
18
18
 
19
19
  **所有表示本地文件的 `@path` 均使用 `@./xxx` 形式的相对路径,并以运行 `lark-cli` 时的当前工作目录(CWD)为基准。**
20
20
 
@@ -190,7 +190,11 @@ lark-cli im <resource> <method> [flags] # 调用 API
190
190
 
191
191
  ### images
192
192
 
193
- - `create` — 上传图片。Identity: `bot` only (`tenant_access_token`).
193
+ - `create` — 上传图片。Identity: supports `user` and `bot`; user identity requires `im:resource` scope on the UAT.
194
+
195
+ ### files
196
+
197
+ - `create` — 上传文件。Identity: supports `user` and `bot`; user identity requires `im:resource` scope on the UAT.
194
198
 
195
199
  ### pins
196
200
 
@@ -238,6 +242,7 @@ lark-cli im <resource> <method> [flags] # 调用 API
238
242
  | `reactions.list` | `im:message.reactions:read` |
239
243
  | `threads.forward` | `im:message` |
240
244
  | `images.create` | `im:resource` |
245
+ | `files.create` | `im:resource` |
241
246
  | `pins.create` | `im:message.pins:write_only` |
242
247
  | `pins.delete` | `im:message.pins:write_only` |
243
248
  | `pins.list` | `im:message.pins:read` |
@@ -12,6 +12,8 @@ metadata:
12
12
 
13
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
14
 
15
+ `+detail` 返回的 `note_doc_token` / `verbatim_doc_token` / `shared_doc_tokens` 交给 [lark-doc](../lark-doc/SKILL.md) 读正文时,仍要显式带上同一个 `--as`。lark-doc 对普通文档推荐 `--as user`,**不覆盖这些纪要文档 token 的来源身份**。
16
+
15
17
  **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-vc/references/vc-domain-boundaries.md`](../lark-vc/references/vc-domain-boundaries.md)**,不读将导致命令使用、会议产物决策、领域边界职责判断错误:
16
18
  > 1. 了解日历 & VC、会议产物 & 文档的关联关系和职责划分
17
19
  > 2. 了解会议产物(妙记和纪要)之间的关联关系,例如:**妙记和纪要产生条件相互独立**
@@ -22,6 +22,8 @@ metadata:
22
22
 
23
23
  身份是跨命令工作流的状态,不是单条命令的局部参数:一旦某个 ID(如 `note_id`、`minute_token`)由某个身份取得,后续消费它的命令(包括跨到 lark-minutes / lark-note / lark-doc)必须显式沿用相同 `--as`;不要依赖 profile 默认身份,也不要为绕过权限错误切换身份。完整规则见 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md) 的「身份延续」。
24
24
 
25
+ **本链路的身份策略覆盖到最后一跳读正文**:`vc +detail` → `note +detail` → `docs +fetch --doc <note_doc_token> / <verbatim_doc_token>` 全程用同一个 `--as`。[lark-doc](../lark-doc/SKILL.md) 对普通文档推荐 `--as user`,**不覆盖本链路取得的纪要文档 token**;读正文时不要因此切回 user。
26
+
25
27
  本 skill 默认使用 `--as user`。`+detail`、`+recording`、`meeting get`、`+meeting-list-active`、`+meeting-events` 和 `+meeting-message-send` 也支持 `--as bot`;`+meeting-events` 和 `+meeting-message-send` 必须沿用 `meeting_id` 的来源身份。`+search` 仅支持 `--as user`。
26
28
 
27
29
  ```bash
@@ -143,6 +143,8 @@ lark-cli minutes +detail --minute-tokens '<minute_token1>,<minute_token2>' \
143
143
 
144
144
  智能纪要(`note_doc_token`)是飞书文档,使用 `docs +fetch` 读取正文内容;**逐字稿的读取方式由 `note_display_type` 决定**:
145
145
 
146
+ 读正文是本链路的最后一跳,身份仍由本链路决定:`--as <user|bot>` 一律填 Step 2 取得 token 时用的那个身份。[lark-doc](../../lark-doc/SKILL.md) 对普通文档推荐 `--as user`,那是用户自有文档的默认建议,**不适用于这里的纪要文档 token**,不要因此切回 user。
147
+
146
148
  ```bash
147
149
  # 纪要正文(两种展示类型都适用)
148
150
  lark-cli docs +fetch --doc <note_doc_token> --doc-format markdown
@@ -50,6 +50,7 @@ lark-cli wiki +node-copy \
50
50
 
51
51
  - Copying is non-recursive: only the requested node and its content are copied.
52
52
  - Descendant nodes must be copied separately.
53
+ - When the Wiki service returns `131009` lock contention, the CLI retries twice with bounded exponential backoff. If contention remains, wait before retrying again and avoid concurrent writes under the same target parent.
53
54
  - To move an existing Wiki node without keeping the source, use [`wiki +move`](lark-wiki-move.md) instead of copy-then-delete.
54
55
 
55
56
  ## Required Scope
@@ -127,6 +127,7 @@ lark-cli wiki +node-create \
127
127
  - 同时需要 `my_library` 和父节点时:会展示三步调用链
128
128
  - **bot 自动授权**:若使用 `--as bot`,结果还会额外带上 `permission_grant`,用于说明是否已自动为当前 CLI 用户授予新建节点的可管理权限
129
129
  - **输出结果**:成功后会返回 `resolved_space_id`、`resolved_by`、`node_token`、`obj_token`、`obj_type`、`node_type`、`title` 等字段,便于后续继续操作
130
+ - **结构限制**:返回 `131003` 表示触发了知识空间总节点数、目录深度或单个父节点直属子节点数等结构限制。这不是瞬时错误,禁止使用相同参数重试。根据上游错误信息选择更浅或其他父节点、重新组织现有节点,或清理/改用其他知识空间;不要在无法确认具体限制时盲目增加中间层级。
130
131
 
131
132
  ## 推荐场景
132
133
 
@@ -63,6 +63,10 @@ These HTTP 200 responses carry a non-zero business code and are not retryable wi
63
63
  | `131013` | The resource token is invalid | Do not switch identity or reauthorize; correct the URL/token |
64
64
  | `131014` | The document is not mounted in Wiki | Stop Wiki resolution; use the corresponding docs/sheets/base/drive command, or provide a Wiki URL/node_token |
65
65
 
66
+ ## Rate limiting
67
+
68
+ For `99991400` / `rate_limit`: Do not retry immediately. Wait `retry_after_seconds`, or use exponential backoff with jitter. Stop after 3 total attempts (1 initial + 2 retries).
69
+
66
70
  ## Required Scope
67
71
 
68
72
  `wiki:node:retrieve`