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

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 (29) 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-data-analysis-cloud.md → lark-base-record-query-and-analysis-cloud-sop.md} +4 -4
  19. package/skills/lark-base/references/{lark-base-data-analysis-sop.md → lark-base-record-query-and-analysis-sop.md} +27 -18
  20. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  21. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  22. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  23. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  24. package/skills/lark-doc/SKILL.md +3 -3
  25. package/skills/lark-doc/references/lark-doc-fetch.md +8 -3
  26. package/skills/lark-doc/references/lark-doc-update.md +12 -8
  27. package/skills/lark-slides/references/cli/lark-slides-update-slide.md +18 -1
  28. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -67
  29. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.2-beta.58",
3
+ "version": "0.1.2-beta.59",
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.58"
64
+ "@amaster.ai/pi-shared": "0.1.2-beta.59"
65
65
  },
66
66
  "scripts": {
67
67
  "fetch-skills": "node scripts/fetch-skills.mjs",
@@ -1,187 +1,164 @@
1
1
  ---
2
2
  name: lark-base
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。"
3
+ version: 1.2.19
4
+ description: "飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、应用模式(BaseApp/AppMode 页面与组件)、Workspace 目录、workflow、角色权限;遇到 Base/多维表格/bitable、BaseApp/AppMode、/base/ 或 /app/ 链接时使用。BaseApp 不走 lark-apps;文件导入/导出转 lark-drive,认证/授权转 lark-shared。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
8
8
  cliHelp: "lark-cli base --help"
9
9
  ---
10
10
 
11
- # base
11
+ # Base
12
12
 
13
- ## 何时使用
13
+ 普通 Base 是数据容器,由一棵 Base Block 资源树和 Base 级配置组成。`folder`、`table`、`docx`、`dashboard`、`workflow` 都是 Block 类型;Advanced Permission / Role 是 Base 级配置,不属于 Block。Table 是其中承载业务数据的核心 Block。Workspace 是组织 Base 与 BaseApp 的外层容器;BaseApp(AppMode)通过 Page 和组件组织 Base 数据,不是 Base 的别名。
14
14
 
15
- 使用本 skill:
15
+ ## 身份选择(优先)
16
16
 
17
- - 用户明确提到 Base / 多维表格 / bitable,或给出 `/base/` 链接。
18
- - 用户要在 Base 内建表、改表、管理字段、写记录、查记录、配视图。
19
- - 用户要在 Base 内做公式字段、lookup 字段、跨表计算、派生指标、筛选聚合、TopN、统计分析。
20
- - 用户要管理 Base 表单、仪表盘、workflow、高级权限或角色。
21
- - 用户要用应用模式(BaseApp):新建应用、管理应用页面、在页面上加图表/列表/富文本组件,或整理 Workspace 目录。
22
- - 用户明确提到 BaseApp / AppMode / 应用模式 / Workspace 内应用,或给出应用模式的 `/app/` 链接(链接可能同时携带 `/base/workspace/<workspace_token>` 路径信息),并要查询页面或组件;这类应用属于 Base,不走 `lark-apps`。
23
- - 用户要把旧 Base 聚合式命令或旧写法迁移到当前 `lark-cli base +...` shortcut。
17
+ 操作 Base 优先使用 `--as user`;用户明确要求应用身份时使用 `--as bot`。权限失败按 `lark-shared` 以原身份修复 scope 或资源 ACL;只有用户明确同意更换操作者时才切换身份。
24
18
 
25
- 不要使用本 skill:
19
+ ## 进入前必做:解析目标实体
26
20
 
27
- - 只是认证、初始化配置、切换身份、处理 scope 或权限授权恢复,转 `lark-shared`。
28
- - 把本地文件导入成 Base,或将 Base 导出为本地文件,转 `lark-drive`。
29
- - 泛化数据分析、字段设计、公式讨论,但没有 Base/多维表格上下文。
21
+ 开始操作前先确定 `base_token` 和目标实体类型;上下文已提供 `<bitable>` / `<base_refer>` 标签及资源 ID 时直接使用。其余情况从两个入口解析:
30
22
 
31
- ## 使用边界
23
+ 1. **URL 或分享链接:** `lark-cli base +url-resolve --url '<url>' --as user`。Base URL 根据返回的 `resource_type` / `block_type` 及 `table_id`、`view_id`、`record_id`、`dashboard_id`、`workflow_id`、`docx_token`、`share_token` 等坐标进入对应模块;BaseApp `/app/` URL 返回 `app_token`,并在链接携带时返回 `workspace_token` 和 `page_id`。实体类型以解析结果为准。
24
+ 2. **Base 标题或关键词:** `lark-cli base +title-resolve --title '<keyword>' --as user`。单一结果直接取得 `base_token`;多个候选结合标题、所有者和更新时间消歧,仍无法唯一确定时请用户选择。随后按下方 Base Block 资源模型定位目标实体。
25
+ 3. **BaseApp:** 优先使用真实 `/app/` URL;已有 `workspace_token` 时可用 `+workspace-entity-list --type baseapp` 定位。两者都没有时请用户补充应用链接或 Workspace,不按名称全局猜测 `app_token`。
32
26
 
33
- - BaseApp 复制是明确的停止边界:本期没有 BaseApp 复制命令。识别到复制 / 克隆应用模式的诉求后,直接说明当前 CLI 无法完成并停止,不要调用 `+base-copy`(包括 `--help` / `--dry-run`)、`+app-create`、Drive copy 或任何写命令试探、拼装替代方案。
34
- - Base 业务操作只使用 `lark-cli base +...` shortcut,不使用旧聚合式 `+table / +field / +record / +view / +history / +workspace`。
35
- - 执行 update 前必须先查当前 shortcut 的 `--help` 或对应 reference。若命令要求完整配置,首次请求必须基于可信的当前配置执行 read-modify-write:只修改用户明确指定的内容,保留其他仍适用的可写配置,并按命令要求的结构提交。若命令支持局部/delta update,按其契约提交最小合法 payload;不得以不完整请求试错补参。
36
- - Base CLI/OpenAPI 当前不支持视图行高、冻结列、列宽等 UI-only 外观设置。遇到这类需求,说明能力边界并停止,不要猜测未文档化参数或改走 raw API。
37
- - **高频:数据分析。** 数据表记录用于查询、分析、解析或比较时,先读取 [Base 数据表查询与分析 SOP](references/lark-base-data-analysis-sop.md);进入本地分析路径后,使用 `+record-list --format ndjson` 获取分析数据。
38
- - **低频:在线复制。** 复制整个 Base 使用 `+base-copy`,复制 Base 内单张数据表使用 `+table-copy`。
39
- - **更低频:文件导入/导出。** 本地文件与 Base 之间的导入/导出转 `lark-drive`;具体格式、参数、路径限制和仅结构导出规则由 `lark-drive` 负责,导入完成后再回到 Base 命令。
40
- - 认证、初始化、scope、身份切换、权限不足恢复属于 `lark-shared`;Base 文档只保留会影响 Base 路径选择的权限规则。
27
+ **读取 Base:** Base 信息用 `+base-get`,资源目录按下方 Base Block 资源模型读取。
28
+
29
+ **写入 Base:** 创建新 Base 使用一次 `+base-create --name <base-name> --table-name <table-name> --fields '<field-array>'` 同时创建 Base、首表和 fields;`+base-copy` 复制整个 Base;Base 内资源统一按下方 Block 生命周期管理。
30
+
31
+ ## Base Block 资源模型
32
+
33
+ ```text
34
+ Base
35
+ ├── Base Block 资源树
36
+ │ ├── Table Block
37
+ │ │ ├── Field schema
38
+ │ │ ├── Records / CellValue
39
+ │ │ ├── Views
40
+ │ │ └── Forms / Questions
41
+ │ ├── Dashboard Block(布局容器)
42
+ │ │ └── Dashboard 内部 Blocks(图表、指标卡、文本)
43
+ │ ├── Workflow Block
44
+ │ │ └── Workflow definition(title、status、steps 执行图)
45
+ │ ├── Docx Block → docx_token / lark-doc
46
+ │ └── Folder Block → 子 Block
47
+ └── Base 级配置
48
+ └── Advanced Permission / Roles
49
+ ```
50
+
51
+ 每个 Base Block 都有 `id`、`type`、可修改的 `name`、所在 Folder 的 `parent_id`,并在同级目录中具有顺序。`+base-block-list` 是统一发现入口;`+base-block-create` 创建 Block,`+base-block-rename` 修改名称,`+base-block-move` 通过 `--parent-id` 调整目录并通过 `--before-id` / `--after-id` 调整顺序,`+base-block-delete` 删除 Block。类型专属内容再由对应模块命令处理。
52
+
53
+ 创建时已经明确类型专属初始内容,可直接使用对应构造命令一次完成:Table 用 `+table-create --fields`,Dashboard 用 `+dashboard-create` 设置主题,Workflow 用 `+workflow-create --json` 提交完整定义;Folder 和 Docx 使用 `+base-block-create`。
54
+
55
+ Block 的 `id` 按类型直接作为对应模块坐标:
56
+
57
+ | Block type | 模块坐标与内部内容 |
58
+ |---|---|
59
+ | `table` | `id` 即 `table_id`;内部包含 Field、Record、View 和 Form |
60
+ | `dashboard` | `id` 即 `dashboard_id`;内部包含图表、指标卡和文本等 Dashboard 组件 |
61
+ | `workflow` | `id` 即 `workflow_id`;内部包含 title、status 和 steps 执行图 |
62
+ | `docx` | Block 另带 `docx_token`;正文由 `lark-doc` 处理 |
63
+ | `folder` | `id` 是目录 Block ID,也可作为 `--parent-id`;只组织子 Block |
64
+
65
+ ## Table Block(The Core)
66
+
67
+ Table 本身是 Base Block,也是 Base 的核心数据存储层;Field、Record、View 和 Form 是 Table 内部对象,不是 Base Block。业务数据查询、写入、关联、统计和分析都从 Table 开始;标准资源读取链路是 `+table-list → +field-list → +record-list` / `+record-search`,多表的 `+field-list` 可以并发执行;记录相关任务读取 [Record 查询与分析 SOP](references/lark-base-record-query-and-analysis-sop.md)。
68
+
69
+ **读取 Table:** `+table-list` 定位表,`+table-get` 读取详情。Table 专属复制使用 `+table-copy`,异步状态用 `+table-copy-status`;schema 和 records 由下方内部对象操作。
70
+
71
+ Table 下的大多数更新通过异步链路生效,接口成功返回后立即读取可能暂时看不到最新状态。优先以写入成功响应作为操作结果;任务必须确认最终状态时,先完成本轮相关变更,再统一读取验收,避免逐项写后立即读回。
72
+
73
+ ### Field
74
+
75
+ Field 定义列 schema。`field_id` 是稳定列标识,`name` 是可修改的展示名称;Formula、Lookup、Link、Select 等属于 Field 类型或能力。
76
+
77
+ **读取 Field:** `+field-list` / `+field-get` / `+field-search-options`。**写入 Field:** 已有 Table 中创建多个字段时,优先向一次 `+field-create --json` 传字段对象数组;单字段更新和删除用 `+field-update` / `+field-delete`。创建和更新分别读取 [field-create](references/lark-base-field-create.md) / [field-update](references/lark-base-field-update.md),由命令文档继续路由 Field JSON、Formula 和 Lookup 协议。
78
+
79
+ ### Record
80
+
81
+ Record 是 Table 中的一行数据,包含该记录在各个 Field 下的 CellValue。系统 `record_id` 是表内稳定、非空且唯一的主键,Table 的主字段只是展示字段。
82
+
83
+ **读取 Record:** 记录预览、筛选、匹配、统计、聚合、TopN、多表或语义分析,以及写前定位记录和写后验收,都必须先完整读取 [Record 查询与分析 SOP](references/lark-base-record-query-and-analysis-sop.md),并由该 SOP 选择具体命令。**写入 Record:** 优先使用 [batch create](references/lark-base-record-batch-create.md) / [batch update](references/lark-base-record-batch-update.md) 创建或更新一条或多条记录,按其文档中的 CellValue 协议提交字段值。
84
+
85
+ **Record 生命周期:** `+record-delete` 删除记录;`+record-share-link-create` 创建记录分享链接;`+record-history-list` 查询单条记录的变更事件,读取 [历史记录协议](references/lark-base-record-history-list.md)。附件使用 `+record-upload-attachment` / `+record-download-attachment` / `+record-remove-attachment` 操作。
86
+
87
+ Record 中的 Select、人员、群组、Link、附件的 CellValue 通常是多值;Link 的目标 `table_id` 来自 Field schema,CellValue 中的 `id` 对应目标表 `record_id`。
88
+
89
+ ### View
90
+
91
+ View 是同一 Table records 上的持久化筛选、排序、分组和展示配置,共享底层 records,不产生数据副本。一次性查询直接使用 Record 读取;需要在 Base UI 中长期保存、共享或复用访问方式时使用 View。
92
+
93
+ **读取 View:** 使用 `+view-list` / `+view-get`,并通过 `+view-get-filter` / `+view-get-sort` / `+view-get-group` / `+view-get-visible-fields` / `+view-get-timebar` / `+view-get-card` 读取持久化配置。**写入 View:** 使用 `+view-create` / `+view-rename` / `+view-delete` 管理 View,并通过对应的 `+view-set-*` 更新筛选、排序、分组、可见字段、时间轴和卡片配置;筛选结构读 [View filter](references/lark-base-view-set-filter.md),由该文档继续路由公共 condition 协议。
94
+
95
+ ### Form
96
+
97
+ Form 依附于 Table,以 Field 作为题目,每次有效提交会创建一条 Record,适合信息收集、外部填写、条件题目和附件提交。
98
+
99
+ 1. **读取 Table 中的表单配置:** 使用 `+form-list` / `+form-get` 读取表单,使用 `+form-questions-list` 读取题目配置;这些命令使用表单所属的 `base_token + table_id`。
100
+ 2. **创建或修改 Table 中的表单配置:** 使用 `+form-create` / `+form-update` / `+form-delete` 管理表单;题目由 Table Field 承载,question ID 对应 `field_id`,创建和更新分别读取 [questions create](references/lark-base-form-questions-create.md) / [questions update](references/lark-base-form-questions-update.md),删除使用 `+form-questions-delete`。
101
+ 3. **填写分享表单并提交:** 对表单分享链接使用 `+url-resolve` 取得 `share_token`,按 [Form detail](references/lark-base-form-detail.md) 执行 `+form-detail` 读取真实题目、必填项和显示条件,再按 [Form submit](references/lark-base-form-submit.md) 构造字段与附件并执行 `+form-submit`。
102
+
103
+ ## Dashboard Block
104
+
105
+ Dashboard Block 是 Base Block 树中的仪表盘容器,负责承载页面主题、布局和内部组件集合,本身不表示某一项图表数据。使用 `+dashboard-list` 定位容器,`+dashboard-get` 读取容器信息,`+dashboard-update` 修改主题,`+dashboard-arrange` 统一编排内部组件布局。
106
+
107
+ 容器内部的图表、指标卡和文本等组件在 Dashboard API 中也称为 Block,但不属于 Base Block 树。内部 Block 分为三条操作路径:
108
+
109
+ 1. **读取配置:** `+dashboard-block-list` / `+dashboard-block-get` 读取组件类型、布局和 `data_config`;文本组件的正文也属于配置。
110
+ 2. **写入配置:** `+dashboard-block-create` / `+dashboard-block-update` / `+dashboard-block-delete` 管理组件,`data_config` 定义数据源、维度、指标、聚合或文本内容。
111
+ 3. **读取内容:** `+dashboard-block-get-data` 读取图表、指标卡等数据组件的计算结果。
112
+
113
+ 操作内部 Block 前先读 [Dashboard](references/lark-base-dashboard.md),由该入口继续路由组件配置和结果协议。
41
114
 
42
115
  ## 应用模式与 Workspace 心智模型
43
116
 
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
-
50
- ## 先获取 Base Token 和所需 ID
51
-
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`。
53
-
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`。
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` 确认类型。
57
- - 用户输入 Base 标题、关键词或不确定名称:先运行 `lark-cli base +title-resolve --title "<keyword>" --as user`;`--title` 传入标题中的短关键词,不超过 30 个字符;过长标题先取最有区分度的短关键词;多候选时先让用户消歧,不要猜。
58
- - 文档嵌入 Base 标签:直接读取 `<bitable>` / `<base_refer>` 的 `token` 作为 `--base-token`,`table-id` 作为 `--table-id`,`view-id` 作为 `--view-id`;孤立 raw token 不走 `+url-resolve`。
59
- - 仍无法定位且用户不是要新建 Base 时,先反问用户要操作哪一个 Base;用户要新建时才用 `+base-create`。
60
-
61
- ## 快速路由
62
-
63
- | 用户目标 | 优先命令 | 何时读 reference |
64
- |---|---|---|
65
- | 查 Base 本体 | `+base-get` | 用返回确认 Base 名称、owner、权限和可继续操作的 token |
66
- | 创建/复制 Base | `+base-create` / `+base-copy` | 新建时强烈推荐用 `--table-name` + `--fields` 同时配置新 Base 里唯一一个初始数据表的 name 和 schema;写入后报告新 Base 标识和 `permission_grant` |
67
- | Base 文件导入/导出 | 转 `lark-drive` | 文件格式、参数、路径限制和仅结构导出规则由 `lark-drive` 负责;在线复制走 `+base-copy` |
68
- | 查看 Base 内资源目录 | `+base-block-list` | 想先了解一个 Base 里有哪些 table/docx/dashboard/workflow/folder 时优先用它;返回 ID 关系和 fewshot 看 `--help` |
69
- | 管理 Base 内资源目录 | `+base-block-create/move/rename/delete` | 创建或整理 Base 直接管理的 folder/table/docx/dashboard/workflow;资源内容继续用对应命令 |
70
- | 管理数据表 | `+table-list/get/create/update/delete` | 处理 table 的列出、详情、创建、重命名和删除;`+table-create` 必须传 `--fields` 一次性定义表结构,字段 JSON 读 [lark-base-field-json.md](references/lark-base-field-json.md) |
71
- | 复制 Base 内单张数据表 | `+table-copy` / `+table-copy-status` | 在线复制单张数据表;复制范围和异步任务参数查看 `--help` |
72
- | 列/查/删字段 | `+field-list/get/delete/search-options` | 写入前用 list/get 确认字段类型、选项、ID;删除前确认目标字段 |
73
- | 创建/更新字段 | `+field-create` / `+field-update` | 同一表创建多个字段时,默认一次向 `+field-create --json` 传字段对象数组;预计串行运行时间超过 caller/tool timeout 时按时间预算拆分,不按固定条数切块;仅创建一个或多个只含 `name` + `type:text` 的简单字段时按 `+field-create --help` 即可,其他类型或属性必读 [lark-base-field-json.md](references/lark-base-field-json.md);公式读 [formula-field-guide.md](references/formula-field-guide.md),lookup 读 [lookup-field-guide.md](references/lookup-field-guide.md);仍需逐项恢复或命令细节时读 [lark-base-field-create.md](references/lark-base-field-create.md),更新细节读 [lark-base-field-update.md](references/lark-base-field-update.md) |
74
- | 读取已知记录 | `+record-get` | 已知具体 `record_id` 时可以直接读取记录 |
75
- | 查询或分析数据表记录 | 由 [Base 数据表查询与分析 SOP](references/lark-base-data-analysis-sop.md) 选择 | 数据表记录查询和分析任务先读 SOP |
76
- | 解释、编写或排错 `+data-query` DSL | [data-query guide](references/lark-base-data-query-guide.md) | 用户明确询问 `+data-query` 命令或 DSL 时直接读取;需要完整字段、操作符、限制或响应协议时再读 [DSL SSOT](references/lark-base-data-query.md) |
77
- | 写记录 | `+record-upsert` / `+record-batch-create` / `+record-batch-update` | 必读 [lark-base-record-upsert.md](references/lark-base-record-upsert.md) / [lark-base-record-batch-create.md](references/lark-base-record-batch-create.md) / [lark-base-record-batch-update.md](references/lark-base-record-batch-update.md) 和 [lark-base-cell-value.md](references/lark-base-cell-value.md) |
78
- | 附件字段 | `+record-upload-attachment` / `+record-download-attachment` / `+record-remove-attachment` | 使用附件操作命令上传本地文件系统中的文件,下载/删除按 file token 或字段定位 |
79
- | 删除记录 / 分享记录链接 / 历史 | `+record-delete` / `+record-share-link-create` / `+record-history-list` | 删除前确认 record;分享链接最多 100 条;历史读 [lark-base-record-history-list.md](references/lark-base-record-history-list.md),只查单条记录,不做整表审计 |
80
- | 管理视图 | `+view-*` | `+view-set-filter` 读 [lark-base-view-set-filter.md](references/lark-base-view-set-filter.md)(filter 条件结构见公共协议 [lark-base-filter-condition.md](references/lark-base-filter-condition.md));其余配置先 get 现状,再按返回结构更新 |
81
- | 公式字段 | `+field-create/update --json '{"type":"formula",...}'` | 必读 [formula-field-guide.md](references/formula-field-guide.md),读后再加隐藏确认 flag `--i-have-read-guide` |
82
- | Lookup 字段 | `+field-create/update --json '{"type":"lookup",...}'` | 必读 [lookup-field-guide.md](references/lookup-field-guide.md),读后再加隐藏确认 flag `--i-have-read-guide` |
83
- | 表单提交 | `+form-submit` | 先读 [lark-base-form-detail.md](references/lark-base-form-detail.md) 获取题目、filter 和附件所需 `base_token`;提交 JSON 读 [lark-base-form-submit.md](references/lark-base-form-submit.md) |
84
- | 表单题目创建/更新 | `+form-questions-create` / `+form-questions-update` | Base 内表单按 table 管理;先确定并复用真实 `table_id`。读 [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);题目显隐条件 `visible_rule` 结构见公共协议 [lark-base-filter-condition.md](references/lark-base-filter-condition.md) |
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`,删除前确认目标表单 |
86
- | 分享表单详情 | `+form-detail --share-token <share_token>` | 使用表单分享链接里的 `share_token`;提交前读 [lark-base-form-detail.md](references/lark-base-form-detail.md) |
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 归属 |
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 与启停状态 |
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);关闭高级权限会影响自定义角色 |
94
-
95
- ## Base 心智模型
96
-
97
- - Base 曾用名 Bitable;返回字段、错误或旧文档里的 `bitable` 多为历史兼容,不代表应改走裸 API 或另一套命令。
98
- - `+base-block-list` 是查看一个 Base 内资源目录的新入口:它列出这个 Base 直接管理的 `folder/table/docx/dashboard/workflow`,适合先判断 Base 里有什么,再决定走 table、dashboard、workflow 或 docx 命令。
99
- - `base-block` 只负责资源目录管理,包括创建资源、移动到 folder、重命名和删除;具体资源内容仍走 table/dashboard/workflow 命令。
100
- - 新建 Base 时,强烈推荐一次性执行 `lark-cli base +base-create --name "<base>" --table-name "<table>" --fields '<field-json-array>'`,同时配置新 Base 里唯一一个初始数据表的 name 和 schema;使用 `--fields` 前先读 [lark-base-field-json.md](references/lark-base-field-json.md) 或复用 `+field-create` 的字段 JSON 形状,不要猜字段属性。
101
- - `+base-create` 不传 `--table-name` 和 `--fields` 时,会创建一个默认 schema 的初始数据表。
102
- - `+table-copy` 用于在线复制 Base 内的数据表,`--table-id` 可使用当前 Base 中的表 ID 或表名;复制范围等参数查看 `--help`。
103
- - 表、字段、视图、workflow、dashboard block 的名称和 ID 必须来自真实返回,不要凭用户口述猜。
104
- - `formula` 适合常规计算、条件判断、文本/日期处理和长期派生指标;`lookup` 适合明确的跨表查找、筛选后取值或聚合引用。
105
- - 写入、公式、lookup、workflow、dashboard 前,先读取真实结构:表、字段、视图、关联表和 dashboard block 名称都以命令返回为准。
106
-
107
- ## 身份与权限降级
108
-
109
- - 默认显式使用 `--as user` 操作用户资源;只有用户明确要求应用身份时,才直接用 `--as bot`。
110
- - `+table-copy --wait` 提交成功后会在 stderr 打印完整 `task_id`;若进程被 Ctrl-C 终止,可用该 ID 和原身份执行 `+table-copy-status` 续查,不要重新提交复制。
111
- - user 身份报 scope/授权不足,或错误中包含 `missing_scopes` / `hint`,先转 `lark-shared` 做用户授权恢复,不要直接降级 bot。
112
- - user 身份报资源级无访问且无授权恢复提示时,才可用 `--as bot` 重试一次;bot 仍失败就停止重试并按权限错误处理。
113
- - `91403` 或明确不可访问错误不要循环换身份重试。
114
- - `+base-create` / `+base-copy` 若用 bot 身份执行,关注返回中的 `permission_grant`,并把用户是否可打开新 Base 告知用户。
115
-
116
- ## 写入前置规则
117
-
118
- - 优先用写入返回确认结果;返回信息不足或任务明确要求核验时,再读回。
119
- - 严格区分动作语义:用户要求“新增/创建”时,必须用本轮 create 返回的对象、ID 或数量确认完成,不能把已有资源算作本轮新增;目标已存在时按具体命令或 guide 的同名契约处理,不得自行改写用户语义。复合创建任务对每类资源只做一次必要盘点;只有命令明确返回逐项结果时才优先使用批量创建,并继续配置本轮返回的 ID。
120
- - 写记录前先读字段结构;只写存储字段。系统字段、附件字段、`formula`、`lookup` 不作为普通记录写入目标。
121
- - 附件上传、下载、删除走专用 `+record-*-attachment` 命令。
122
- - 除上述简单 text fast path 外,写字段前先读 [lark-base-field-json.md](references/lark-base-field-json.md);请求字段类型不在 reference 已支持类型目录中时,说明当前 CLI 不支持并停止,不要猜测未注册的字段 JSON、service 或 schema,也不要用其他字段类型冒充;涉及 `formula` / `lookup` 时必须读 [formula-field-guide.md](references/formula-field-guide.md) / [lookup-field-guide.md](references/lookup-field-guide.md)。
123
- - 表名、字段名、视图名、workflow 配置中的名称必须来自真实返回;跨表场景还要读取目标表结构。
124
- - 删除、角色更新、字段更新、表单提交(`+form-submit`)等高风险操作遵循 CLI 的 confirmation gate,必须带 `--yes`;目标不明确时先用 get/list 消歧。
125
- - 真正的 batch 写命令遵守各自文档的单批上限;`+field-create` 数组是顺序单项请求,按 caller timeout 而非固定条数拆分;连续写同一表时串行执行,遇到 `1254291` 按短暂等待后重试处理。
126
- - `select` 字段只支持写入字段中已有的选项;构造 CellValue 前先用 `+field-list` 或 `+field-search-options` 确认目标选项存在。
127
-
128
- ## 表单与视图细节
129
-
130
- - Base 内表单 list/get/create/update/delete 和题目管理都属于具体数据表:第一个管理命令前必须已有归属明确的真实 `table_id`;缺失或归属不明确时才用 `+table-list` 或 `+base-block-list` 定位,已有真实 ID 时直接复用。后续管理命令始终传同一 `base_token + table_id`。
131
- - 表单问题由数据表字段承载,question `id` 就是 `field_id`。创建问题前先 `+form-questions-list`;除非用户明确要求同名的独立问题,否则标题已存在时优先用 `+form-questions-update` 修改必填状态、标题或描述,不要先创建同名问题再删除旧问题。
132
- - `+form-questions-delete` 用于删除非主字段问题;主字段问题使用 `+form-questions-update` 修改。
133
- - `+form-submit` 是高风险写操作,必须带 `--yes` 确认;调用前必须先跑 `+form-detail`,读取 `questions[].type`、`required`、`filter` 和附件场景需要的 `base_token`;不要填写被 filter 隐藏的问题。
134
- - `+form-questions-update` 是题目配置全量覆盖,不是 patch;未传字段会回落默认值,传空字符串 / `null` / 空数组会直接写入空或清空。更新前先 `+form-questions-list` 读取当前题目,把要保留的 `title` / `description` / `required` / `option_display_mode` / `visible_rule` 等字段带回请求。
135
- - 表单附件不要写进 `fields`,放在 `--json.attachments`;提交附件时必须同时传表单所属 Base 的 `--base-token`。
136
- - `+view-set-filter` 是唯一保留的 view reference;sort/group/card/timebar/visible-fields 这类配置先用对应 get 命令读现状,保留未修改字段,只替换用户要求变更的配置。
137
- - 视图适合持久化、共享和 UI 复用;一次性筛选/排序可先用 `+record-list` / `+record-search` 的 filter/sort 验证结果,再按需要沉淀为持久视图。
138
-
139
- ## Dashboard / Workflow / Role
140
-
141
- - Dashboard 的复杂点是 block 的 `data_config`,不是 list/get/create/delete 命令参数。创建或更新 block 前先读 [dashboard-block-data-config.md](references/dashboard-block-data-config.md),组件必须串行创建;`+dashboard-arrange` 是服务端智能布局,仅在用户明确要求重排/美化、或对本次会话从零新建的仪表盘做收尾整理时执行。`+dashboard-block-get-data` 读取图表最终计算结果,不返回 block 名称、类型、布局或 `data_config`;需要元数据先用 `+dashboard-block-get`。用户要求“全部/完整”仪表盘内容时不得跳过 text 或不支持直接取数的 block,按 [lark-base-dashboard.md](references/lark-base-dashboard.md) 的完整读取分支恢复。
142
- - Dashboard shortcut 不支持指定组件的 `x/y/w/h`、精确位置或尺寸,不能把 `+dashboard-arrange` 静默当作等价实现。用户只要求一般性重排/美化时可执行一次智能重排;用户要求精确结果时先说明限制并询问是否接受自适应布局,接受后才执行。不要探测 raw `lark-cli api`、源码或未公开布局参数。
143
- - 创建接口成功返回即表示写入成功;只有结果不确定时才额外执行一次 `+dashboard-get` 或 `+dashboard-block-list`。不要仅为确认创建而逐组件调用 `+dashboard-block-get-data`。
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 无权限,不是无标题页面;报告该权限状态,不要将其作为后续页面或组件操作的目标。
117
+ Workspace 是组织 Base 和 BaseApp 的空间容器;BaseApp 创建时必须归属一个 Workspace。BaseApp 用 Page 组织界面,每个 Page 包含图表、列表或富文本组件;组件通过 `data_config` 引用 Base 数据,但不会改变 Base、Table、Field 和 Record 的归属关系。Workspace 负责资源归属,App 负责页面和组件,Base 负责数据。
118
+
119
+ 1. **Workspace:** 使用 `+workspace-create`、`+workspace-entity-list` 和 `+workspace-move-in` 创建目录、列出其中的 Base/BaseApp 或移入资源。
120
+ 2. **应用:** 使用 `+app-create` / `+app-get`;应用查询和创建依赖真实 `app_token` / `workspace_token`。
121
+ 3. **页面:** 使用 `+app-page-list/get/create/rename/delete` 管理 Page。
122
+ 4. **组件:** 使用 `+app-block-list/get/create/update` 读写组件配置,使用 `+app-block-get-data` 读取组件计算结果。
123
+
124
+ BaseApp、Workspace、Page 或组件任务开始前完整读取 [应用模式与 Workspace](references/lark-base-app.md);构造组件 `data_config` 时继续读取 [应用组件配置](references/lark-base-app-block-data-config.md)。BaseApp 不走 `lark-apps`。当前不支持 BaseApp 复制、Page 完整复制、页面图标以及从 Workspace 移出资源;遇到这些目标按 reference 的能力边界处理,不以新建空对象或 Drive 移动冒充。
125
+
126
+ - BaseApp(应用模式)中的 Page 和组件使用 `app_token` / `page_id` / `block_id`,表、字段和记录仍使用组件所引用 Base 的 `base_token`;不要混用 token 或把 BaseApp 当作 Base 的别名。
148
127
  - 复用现有 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` 两边同构,列表类和富文本是应用模式独有。
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、当前启停状态和用户意图。
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` 只适用于自定义角色,系统角色不可删除;删除角色和关闭高级权限前必须确认目标和影响。
128
+ - 应用页面的 block 与仪表盘 block 是同一套底层实体,但 ID 体系不通用;按当前模块 reference 选择命令和配置协议。
153
129
 
154
- ## 常见恢复
130
+ ## Workflow Block
155
131
 
156
- | 错误 / 现象 | 恢复动作 |
157
- |---|---|
158
- | `param baseToken is invalid` / `base_token invalid` | 检查是否把 wiki token、workspace token 或完整 URL 当成了 `--base-token`;按入口规则重新获取真实 `base_token` |
159
- | `not found` 且输入来自 Wiki 链接 | 优先检查是否把 wiki token 当成 base token,不要立刻改走裸 API |
160
- | `1254045` 字段名不存在 | 重新 `+field-list`,使用真实字段名或字段 ID;注意空格、大小写和跨表字段 |
161
- | `1254015` 字段值类型不匹配 | 先 `+field-list`,再按 [lark-base-cell-value.md](references/lark-base-cell-value.md) 构造 CellValue |
162
- | `Invalid discriminator value`(字段写入缺 `type`) | 按完整提交规则读取当前字段,只改目标内容后提交;不要只补 `type` 重试 |
163
- | filter 报 `value of type array` / `Only string values` | 用 record/view 的 tuple `--filter-json`(非 `+data-query` 对象型),value 按字段 type 选标量或数组;见 [lark-base-view-set-filter.md](references/lark-base-view-set-filter.md) |
164
- | 日期 / 人员 / 超链接字段报格式错误 | 日期用 `YYYY-MM-DD HH:mm`;人员用 `[{ "id": "ou_xxx" }]`;超链接用 URL 或 markdown link 字符串 |
165
- | formula / lookup 创建失败 | 先读 [formula-field-guide.md](references/formula-field-guide.md) / [lookup-field-guide.md](references/lookup-field-guide.md),再按 guide 重建请求 |
166
- | `ignored_fields` / `READONLY` | 移除只读字段,只写存储字段 |
167
- | `1254104` | 批量超过 200,分批调用 |
168
- | `1254291` | 并发写冲突,串行写入并在批次间短暂等待 |
169
-
170
- ## 保留 Reference
171
-
172
- - [lark-base-data-analysis-sop.md](references/lark-base-data-analysis-sop.md):所有数据表记录查询和分析的统一入口;依次选择 jq、Python 或 Cloud
173
- - [Python 标准库](references/lark-base-data-analysis-python-stdlib.md) / [pandas](references/lark-base-data-analysis-pandas.md):统一数据分析 SOP 选定 Python 实现后按需读取的同场景示例
174
- - [lark-base-data-analysis-cloud.md](references/lark-base-data-analysis-cloud.md):统一 SOP 判定 jq 与 Python 路径均不适用时的云端查询 SOP
175
- - [lark-base-data-query-guide.md](references/lark-base-data-query-guide.md) / [lark-base-data-query.md](references/lark-base-data-query.md):Cloud SOP 选定 `+data-query` 后或用户直接询问该命令/DSL 时读取 fewshot,完整 DSL 细节再读 SSOT;其 `filters` 使用独立对象 DSL
176
- - [lark-base-cell-value.md](references/lark-base-cell-value.md):记录 CellValue 构造
177
- - [lark-base-field-json.md](references/lark-base-field-json.md):字段 JSON 构造
178
- - [formula-field-guide.md](references/formula-field-guide.md) / [lookup-field-guide.md](references/lookup-field-guide.md):公式与 lookup 字段
179
- - [lark-base-field-create.md](references/lark-base-field-create.md) / [lark-base-field-update.md](references/lark-base-field-update.md):字段创建/更新命令级补充
180
- - [lark-base-record-upsert.md](references/lark-base-record-upsert.md) / [lark-base-record-batch-create.md](references/lark-base-record-batch-create.md) / [lark-base-record-batch-update.md](references/lark-base-record-batch-update.md) / [lark-base-record-history-list.md](references/lark-base-record-history-list.md):记录写入 JSON 与历史返回解释
181
- - [lark-base-view-set-filter.md](references/lark-base-view-set-filter.md):视图筛选 JSON
182
- - [lark-base-filter-condition.md](references/lark-base-filter-condition.md):视图 filter、记录 `--filter-json`、表单 `visible_rule` 的 tuple 条件结构公共协议 SSOT
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
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
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
187
- - [lark-base-role-guide.md](references/lark-base-role-guide.md) / [role-config.md](references/role-config.md):角色入口与权限 JSON SSOT
132
+ Workflow 本身是 Base Block,其内部是一张由 `next` / `children` 连接的 steps 执行图;触发器、动作、条件分支和循环都是 step 类型。它适合定时执行、Record 新增或变更联动、消息通知、记录读写和跨系统调用。Workflow 分为三条操作路径:
133
+
134
+ 1. **读取配置:** `+workflow-list` 定位流程,`+workflow-get` 读取 `title`、`status` 和完整 `steps` 执行图。
135
+ 2. **写入配置:** `+workflow-create` 创建完整定义,`+workflow-update` 更新完整定义;构造或修改配置前读取 [Workflow](references/lark-base-workflow.md),由该入口继续路由 step 类型和 schema。
136
+ 3. **运行状态控制:** `+workflow-enable` / `+workflow-disable` 启用或停用已有 Workflow,不修改 steps 执行图。
137
+
138
+ ## Advanced Permission(AdvPerm)
139
+
140
+ AdvPerm 为 Base 开启细粒度权限模式;Role 在此基础上配置 Base、Table、View、Field、Record、Dashboard 和 Docx 等资源的访问能力,适合按团队或职责限制可见范围、编辑能力、复制下载和数据访问规则。
141
+
142
+ **读取 AdvPerm:** `+base-get` 查看 `is_advanced`,`+role-list` / `+role-get` 查看角色。**写入 AdvPerm:** `+advperm-enable` / `+advperm-disable` 启停高级权限,`+role-create` / `+role-update` / `+role-delete` 管理角色。先读 [权限与角色](references/lark-base-advanced-permission-and-role.md),由该入口继续路由权限 JSON 协议。
143
+
144
+ ## Docx Block
145
+
146
+ Docx Block 是组织在 Base 目录中的飞书文档资源,适合把说明、方案和报告与数据表、仪表盘及流程放在同一 Base 中;正文仍使用标准 Docx 数据模型。
147
+
148
+ 从 Base Block 资源目录按 `--type docx` 定位文档并取得 `docx_token`;正文读取、创建与编辑使用 `lark-doc`。
149
+
150
+ ## Folder Block
151
+
152
+ Folder Block 只承担 Base 目录分组和层级组织。用 `+base-block-list --parent-id <folder_block_id>` 读取直接子项。
153
+
154
+ ## 通用执行契约
155
+
156
+ - Update 先确认命令是完整替换还是 delta:完整替换使用可信当前配置做 read-modify-write,delta 只提交目标变更。
157
+ - 优先用写入返回确认结果;返回不足以确认或任务明确要求核验时再读回目标。
158
+ - 命令具有 confirmation gate 时,确认目标和影响后使用 `--yes`。
159
+
160
+ ## 不在本 Skill 范围
161
+
162
+ - 认证、初始化、scope、身份切换和授权恢复 → `lark-shared`
163
+ - Excel、CSV、`.base` 等本地文件与 Base 之间的导入/导出 → `lark-drive`
164
+ - Base 内嵌 Docx 的正文编辑 → `lark-doc`;电子表格内容操作 → `lark-sheets`
@@ -1,6 +1,6 @@
1
- # Base advanced permission and role guide
1
+ # Base Advanced Permission 与 Role
2
2
 
3
- This guide is the entry point for Base advanced permissions and roles. Use it to choose commands and understand safety boundaries. For the permission JSON itself, use [role-config.md](role-config.md) as the SSOT.
3
+ This is the module entry point for Base advanced permissions and roles. Use it to choose commands and understand safety boundaries. For the permission JSON itself, use [Role Permission Schema](lark-base-role-config.md).
4
4
 
5
5
  ## Command selection
6
6
 
@@ -11,7 +11,7 @@ This guide is the entry point for Base advanced permissions and roles. Use it to
11
11
  | Disable advanced permissions | `+advperm-disable` | High-risk write. Disabling invalidates existing custom roles. |
12
12
  | Locate roles | `+role-list` | Returns role summaries. Use `+role-get` for full config. |
13
13
  | Inspect one role | `+role-get` | Use before updating a role or deciding whether a role can be deleted. |
14
- | Create a custom role | `+role-create` | Supports `custom_role` only. Read [role-config.md](role-config.md) before constructing `--json`. |
14
+ | Create a custom role | `+role-create` | Supports `custom_role` only. Read [Role Permission Schema](lark-base-role-config.md) before constructing `--json`. |
15
15
  | Update a role | `+role-update` | Delta merge. Read current config first, then send only intended changes. |
16
16
  | Delete a role | `+role-delete` | Custom roles only. System roles cannot be deleted. |
17
17
 
@@ -35,7 +35,7 @@ Do not probe with `+advperm-get`: that command is not supported. Do not use an e
35
35
 
36
36
  ## Common Fewshots
37
37
 
38
- Use these fewshots for simple role changes. For table, field, record, dashboard, docx, or filter permission details, switch to [role-config.md](role-config.md).
38
+ Use these fewshots for simple role changes. For table, field, record, dashboard, docx, or filter permission details, switch to [Role Permission Schema](lark-base-role-config.md).
39
39
 
40
40
  Create a custom role that keeps copy/download disabled:
41
41
 
@@ -67,7 +67,7 @@ lark-cli base +role-update \
67
67
 
68
68
  ## JSON SSOT
69
69
 
70
- Use [role-config.md](role-config.md) for:
70
+ Use [Role Permission Schema](lark-base-role-config.md) for:
71
71
 
72
72
  - `AdvPermBaseRoleConfig` top-level structure.
73
73
  - `base_rule_map`, `table_rule_map`, `dashboard_rule_map`, and `docx_rule_map`.
@@ -1,6 +1,6 @@
1
1
  # BaseApp Block `data_config`
2
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 元数据、本文明确列出的约束及实际服务端校验结果。
3
+ 本文件说明 BaseApp 组件 `data_config` 的 CLI 映射与操作约束,不复制完整字段 Schema。App 图表的每个 `data_sources[]` 元素复用 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 的字段取值、筛选、分组、排序及规范化规则;区别是 Dashboard 使用扁平单数据源结构,而 App 图表在顶层使用共享的 `base_token` 和多数据源 `data_sources[]`。列表组件是 App 独有协议,不复用 Dashboard 图表结构。本文所称“组件协议”是指 CLI 随版本发布的 API 元数据、本文明确列出的约束及实际服务端校验结果。
4
4
 
5
5
  ## 类型映射
6
6
 
@@ -71,7 +71,7 @@ lark-cli base +app-block-update \
71
71
 
72
72
  ## 图表与富文本
73
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`,等价于空文本。
74
+ **App 图表是多数据源结构(`ChartDataConfig`),与 Dashboard 的扁平单源结构不同。** 顶层用一个 `base_token`(所有数据源共用),`table_name` / `series` / `count_all` / `group_by` / `filter` 下沉到每个 `data_sources[]` 元素里;顶层另有可选的 `data_source_mode` 和 `sort`。每个数据源内部各字段的取值逻辑与 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 完全一致(`series[].rollup` 大写、`group_by[].sort` 小写等),CLI 对每个 `data_sources[]` 元素复用同一套规范化与校验。富文本使用 `--type text`,配置为 `{"text":"..."}`,无数据源;Create 时可省略 `data_config`,等价于空文本。
75
75
 
76
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
77
 
@@ -1,15 +1,14 @@
1
1
  # base CellValue 规范(lark-base-cell-value)
2
2
 
3
- > 适用命令:`lark-cli base +record-upsert`、`lark-cli base +record-batch-create`、`lark-cli base +record-batch-update`
3
+ > 适用命令:`lark-cli base +record-batch-create`、`lark-cli base +record-batch-update`
4
4
 
5
5
  本文件定义 **shortcut 写记录** 时 `CellValue` 的推荐格式,目标是让 AI 一次写对。不同命令的外层 JSON 形状不同,但每个 cell 都以本文为 source of truth。
6
6
 
7
7
  ## 1. 顶层规则(必须遵守)
8
8
 
9
9
  - `--json` 必须是 JSON 对象。
10
- - `+record-upsert`:顶层直接传字段映射:`{"字段名或字段ID": CellValue}`。
11
- - `+record-batch-create`:使用 `create_records`,其每个元素都是 `Map<FieldNameOrID, CellValue>`。
12
- - `+record-batch-update`:使用 `update_records`,其每个 value 都是 `Map<FieldNameOrID, CellValue>`。
10
+ - `+record-batch-create --json` 使用 `{"create_records":[{"字段名或字段ID": CellValue}, ...]}`,数组中的每个对象代表一条新 Record。
11
+ - `+record-batch-update --json` 使用 `{"update_records":{"rec_xxx":{"字段名或字段ID": CellValue}, ...}}`,以 `record_id` 定位每条待更新 Record。
13
12
  - 一次 payload 里同一字段只用一种 key(字段名或字段 ID),不要重复。
14
13
  - 写入前先 `+field-list` 获取字段 `type/style/multiple`,再构造值。
15
14
  - 需要清空字段时优先传 `null`(字段允许清空时)。
@@ -119,7 +118,9 @@ text 字段的 `style.type` 影响单元格检查逻辑:
119
118
 
120
119
  ### 2.8 location
121
120
 
122
- 写入对象必须使用 `{lng, lat}`,两者都是数字;`lng` 是经度,`lat` 是纬度。不需要手动传 `full_address`,平台会根据坐标解析地址。
121
+ - 读取:`{lng, lat, full_address}`,三个成员均非空。
122
+ - 写入:`{lng, lat}`,经纬度均为数字;`full_address` 由平台根据坐标解析,不允许手动指定。
123
+ - 筛选行为:按照 `full_address` 做字符串筛选,将 Location 当作文本列使用文本 operator。
123
124
 
124
125
  ```json
125
126
  {
@@ -130,7 +131,6 @@ text 字段的 `style.type` 影响单元格检查逻辑:
130
131
  }
131
132
  ```
132
133
 
133
- 读取单元格时,非空 location 为 `{lng, lat, full_address}`,三个成员均非空,`full_address` 是字符串;筛选、转文本等场景使用 `full_address`,只有公式能访问坐标。如果用户只给地址文本,先获取或确认坐标后再写入;不要把仅有地址文本直接当作 location CellValue。
134
134
 
135
135
  ### 2.9 attachment(不作为普通 CellValue 写入)
136
136
 
@@ -142,23 +142,18 @@ text 字段的 `style.type` 影响单元格检查逻辑:
142
142
 
143
143
  ## 3. 只读字段(不要写)
144
144
 
145
- 以下字段在写记录时应视为只读:
146
- - `auto_number`
147
- - `lookup`
148
- - `formula`
149
- - `created_at` / `updated_at`
150
- - `created_by` / `updated_by`
145
+ 写记录时,`auto_number`、`lookup`、`formula`、`created_at/updated_at`、`created_by/updated_by` 均为只读字段。
151
146
 
152
147
  写入只读字段通常不会更新数据;返回里可能出现 `ignored_fields`,reason 会说明 `READONLY`。看到这种返回时,不要重试同一 payload,应移除只读字段,只写存储字段。
153
148
 
154
- 读取单元格时,`auto_number`、`formula`、`lookup` 为 `string|null`;`created_at`、`updated_at` 为标准 RFC3339 字符串或 `null`;`created_by`、`updated_by` 为 `array<{id, name}>`。
149
+ 读取单元格时,`auto_number`、`formula`、`lookup` 为 `string | null`;`created_at`、`updated_at` 为 RFC3339 字符串或 `null`;`created_by`、`updated_by` 为 `array<{id, name}>`。
155
150
 
156
151
  ## 4. 完整示例
157
152
 
158
153
  ```json
159
154
  {
160
155
  "标题": "Created from shortcut",
161
- "状态": "Todo",
156
+ "状态": ["Todo"],
162
157
  "标签": ["高优", "外部依赖"],
163
158
  "工时": 8,
164
159
  "截止时间": "2026-03-24 10:00",
@@ -1,4 +1,4 @@
1
- # dashboard block data_config SSOT
1
+ # Base Dashboard Block 配置
2
2
 
3
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
 
@@ -730,4 +730,4 @@ GET /open-apis/base/v3/bases/bascn_example_token/dashboards/blocks/chtxxxxxxxx/d
730
730
 
731
731
  - [lark-base-dashboard.md](lark-base-dashboard.md) — dashboard 模块总指引
732
732
  - `+dashboard-block-get` — 获取 block 元数据
733
- - [dashboard-block-data-config.md](dashboard-block-data-config.md) — data_config 结构和组件类型说明
733
+ - [Dashboard Block 配置](lark-base-dashboard-block-config.md) — data_config 结构和组件类型说明
@@ -15,8 +15,8 @@ Dashboard 是 Base 中的数据可视化看板,可以把表格数据变成**
15
15
  | 你想做什么 | 用这些命令 | 关键文档 |
16
16
  |------|-----------|---------|
17
17
  | 创建/删除/改名称 | `+dashboard-create/delete/update` | 本页下方「仪表盘管理」 |
18
- | 在仪表盘里添加组件 | `+dashboard-block-create` | 先定位 dashboard、表和字段,再读 [dashboard-block-data-config.md](dashboard-block-data-config.md) 构造 `data_config` |
19
- | 修改组件 | `+dashboard-block-update` | 先读 block 现状,再读 [dashboard-block-data-config.md](dashboard-block-data-config.md) 决定替换哪些顶层 key |
18
+ | 在仪表盘里添加组件 | `+dashboard-block-create` | 先定位 dashboard、表和字段,再读 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 构造 `data_config` |
19
+ | 修改组件 | `+dashboard-block-update` | 先读 block 现状,再读 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 决定替换哪些顶层 key |
20
20
  | 查看仪表盘有哪些组件 | `+dashboard-get` 或 `+dashboard-block-list` | 本页下方「查看仪表盘」 |
21
21
  | 读取图表计算结果 | `+dashboard-block-get-data` | 返回图表最终数据协议;需要 block 元数据先用 `+dashboard-block-get` |
22
22
  | 智能重排组件布局 | `+dashboard-arrange` | 用户明确要求重排,或本次会话新建仪表盘的收尾整理;无法指定 `x/y/w/h`、精确位置或尺寸 |
@@ -48,7 +48,7 @@ lark-cli base +field-list --base-token xxx --table-id <table_id>
48
48
 
49
49
  # 第 4 步:顺序创建每个组件(必须串行执行,不能并发)
50
50
  # 重要:创建组件前,先确定 dashboard_id、组件 name/type 和真实表字段
51
- # 再阅读 dashboard-block-data-config.md 了解 data_config 结构、组件类型和 filter 规则
51
+ # 再阅读 lark-base-dashboard-block-config.md 了解 data_config 结构、组件类型和 filter 规则
52
52
 
53
53
  # 第 1 个组件
54
54
  lark-cli base +dashboard-block-create \
@@ -93,7 +93,7 @@ lark-cli base +field-list --base-token xxx --table-id <table_id>
93
93
 
94
94
  # 第 4 步:顺序创建每个新组件(必须串行执行,不能并发)
95
95
  # 重要:先确定 dashboard_id、组件 name/type 和真实表字段
96
- # 再阅读 dashboard-block-data-config.md 了解 data_config 结构
96
+ # 再阅读 lark-base-dashboard-block-config.md 了解 data_config 结构
97
97
  lark-cli base +dashboard-block-create \
98
98
  --base-token xxx \
99
99
  --dashboard-id blk_xxx \
@@ -127,7 +127,7 @@ lark-cli base +field-list --base-token xxx --table-id <table_id>
127
127
 
128
128
  # 第 5 步:执行更新
129
129
  # 重要:先读取当前 block 的 name/type/data_config
130
- # 再阅读 dashboard-block-data-config.md 了解 data_config 更新规则
130
+ # 再阅读 lark-base-dashboard-block-config.md 了解 data_config 更新规则
131
131
  lark-cli base +dashboard-block-update \
132
132
  --base-token xxx \
133
133
  --dashboard-id blk_xxx \
@@ -169,7 +169,7 @@ lark-cli base +dashboard-arrange \
169
169
 
170
170
  1. 图表或指标卡:使用方式 D 读取计算结果。
171
171
  2. `text`:使用方式 C,正文位于 `data_config.text`;text 没有计算结果,但属于完整仪表盘内容。
172
- 3. get-data 返回不支持的图表类型:先用方式 C 读取真实 `data_config`,确认 `table_name`、维度、指标、聚合与筛选,再按 [数据分析 SOP](lark-base-data-analysis-sop.md) 使用 `+data-query` 重建同口径结果。字段必须来自真实配置和表结构,不得猜测;无法等价重建时明确报告限制,不能静默省略该 block。
172
+ 3. get-data 返回不支持的图表类型:先用方式 C 读取真实 `data_config`,确认 `table_name`、维度、指标、聚合与筛选,再按 [Record 查询与分析 SOP](lark-base-record-query-and-analysis-sop.md) 使用 `+data-query` 重建同口径结果。字段必须来自真实配置和表结构,不得猜测;无法等价重建时明确报告限制,不能静默省略该 block。
173
173
 
174
174
  ```bash
175
175
  # 第 1 步:列出仪表盘,定位到当前仪表盘
@@ -209,14 +209,14 @@ lark-cli base +dashboard-block-get-data --base-token xxx --block-id chtxxxxxxxx
209
209
  | 单个关键指标 | statistics | 指标卡组件 |
210
210
  | 富文本说明/标题/注释 | text | 文本组件(支持 Markdown) |
211
211
 
212
- 详细组件类型和 data_config 完整规则:[dashboard-block-data-config.md](dashboard-block-data-config.md)
212
+ 详细组件类型和 data_config 完整规则:[Dashboard Block 配置](lark-base-dashboard-block-config.md)
213
213
 
214
214
  ## 常见问题
215
215
 
216
216
  **Q: 创建组件的命令和 data_config 怎么写?**
217
217
  A:
218
218
  1. 先确定 `dashboard_id`、组件 `name`、组件 `type` 和真实表字段
219
- 2. 再读 [dashboard-block-data-config.md](dashboard-block-data-config.md) 了解:
219
+ 2. 再读 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 了解:
220
220
  - 全部组件类型的可复制模板
221
221
  - filter 筛选条件格式
222
222
  - 字段类型与操作符对应表
@@ -237,7 +237,7 @@ A: 不能。`+dashboard-block-update` 只能修改 `name` 和 `data_config`,
237
237
  **Q: 更新组件的命令和 data_config 怎么写?**
238
238
  A:
239
239
  1. 先读取当前 block,确认 `block_id`、当前 `type` 和已有 `data_config`
240
- 2. 再读 [dashboard-block-data-config.md](dashboard-block-data-config.md) 了解 data_config 结构
240
+ 2. 再读 [Dashboard Block 配置](lark-base-dashboard-block-config.md) 了解 data_config 结构
241
241
 
242
242
  **data_config 更新策略(顶层 key merge)**:
243
243
  - 只传入需要修改的顶层字段(如 `series`、`filter`)