@amaster.ai/pi-lark 0.1.8 → 0.1.9

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 (116) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +2 -0
  3. package/skills/lark-apps/references/lark-apps-db.md +130 -2
  4. package/skills/lark-apps/references/lark-apps-user-id-convert.md +63 -0
  5. package/skills/lark-base/SKILL.md +155 -167
  6. package/skills/lark-base/references/{lark-base-role-guide.md → lark-base-advanced-permission-and-role.md} +5 -5
  7. package/skills/lark-base/references/lark-base-app-block-data-config.md +122 -0
  8. package/skills/lark-base/references/lark-base-app.md +225 -0
  9. package/skills/lark-base/references/lark-base-cell-value.md +26 -19
  10. package/skills/lark-base/references/{dashboard-block-data-config.md → lark-base-dashboard-block-config.md} +37 -5
  11. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +1 -1
  12. package/skills/lark-base/references/lark-base-dashboard.md +9 -9
  13. package/skills/lark-base/references/lark-base-data-analysis-pandas.md +93 -0
  14. package/skills/lark-base/references/lark-base-data-analysis-python-stdlib.md +120 -0
  15. package/skills/lark-base/references/lark-base-data-query.md +8 -11
  16. package/skills/lark-base/references/lark-base-field-create.md +7 -50
  17. package/skills/lark-base/references/{formula-field-guide.md → lark-base-field-formula.md} +1 -1
  18. package/skills/lark-base/references/{lookup-field-guide.md → lark-base-field-lookup.md} +1 -1
  19. package/skills/lark-base/references/{lark-base-field-json.md → lark-base-field-schema.md} +15 -100
  20. package/skills/lark-base/references/lark-base-field-update.md +13 -51
  21. package/skills/lark-base/references/lark-base-filter-condition.md +19 -31
  22. package/skills/lark-base/references/lark-base-record-batch-create.md +5 -1
  23. package/skills/lark-base/references/lark-base-record-batch-update.md +5 -2
  24. package/skills/lark-base/references/lark-base-record-query-and-analysis-cloud-sop.md +145 -0
  25. package/skills/lark-base/references/lark-base-record-query-and-analysis-sop.md +233 -0
  26. package/skills/lark-base/references/{role-config.md → lark-base-role-config.md} +2 -2
  27. package/skills/lark-base/references/lark-base-view-set-filter.md +1 -1
  28. package/skills/lark-base/references/lark-base-workflow-schema.md +2 -2
  29. package/skills/lark-base/references/{lark-base-workflow-guide.md → lark-base-workflow.md} +1 -1
  30. package/skills/lark-calendar/SKILL.md +2 -0
  31. package/skills/lark-calendar/references/lark-calendar-create.md +4 -3
  32. package/skills/lark-doc/SKILL.md +3 -3
  33. package/skills/lark-doc/references/lark-doc-fetch.md +8 -3
  34. package/skills/lark-doc/references/lark-doc-update.md +12 -8
  35. package/skills/lark-drive/SKILL.md +5 -3
  36. package/skills/lark-drive/references/lark-drive-download.md +27 -1
  37. package/skills/lark-drive/references/lark-drive-export.md +1 -0
  38. package/skills/lark-drive/references/lark-drive-member-remove.md +59 -0
  39. package/skills/lark-drive/references/lark-drive-preview.md +21 -2
  40. package/skills/lark-drive/references/lark-drive-push.md +5 -1
  41. package/skills/lark-drive/references/lark-drive-search.md +2 -0
  42. package/skills/lark-im/SKILL.md +6 -1
  43. package/skills/lark-minutes/SKILL.md +11 -5
  44. package/skills/lark-minutes/references/lark-minutes-apply-permission.md +95 -0
  45. package/skills/lark-minutes/references/lark-minutes-detail.md +7 -6
  46. package/skills/lark-minutes/references/lark-minutes-download.md +4 -2
  47. package/skills/lark-note/SKILL.md +13 -9
  48. package/skills/lark-note/references/lark-note-detail.md +5 -2
  49. package/skills/lark-note/references/lark-note-transcript.md +2 -0
  50. package/skills/lark-shared/SKILL.md +36 -0
  51. package/skills/lark-slides/SKILL.md +54 -54
  52. package/skills/lark-slides/references/cli/lark-slides-add-slide.md +92 -0
  53. package/skills/lark-slides/references/cli/lark-slides-create.md +176 -0
  54. package/skills/lark-slides/references/cli/lark-slides-delete-slide.md +65 -0
  55. package/skills/lark-slides/references/cli/lark-slides-history.md +132 -0
  56. package/skills/lark-slides/references/cli/lark-slides-media-upload.md +103 -0
  57. package/skills/lark-slides/references/cli/lark-slides-replace-slide.md +259 -0
  58. package/skills/lark-slides/references/cli/lark-slides-screenshot.md +115 -0
  59. package/skills/lark-slides/references/{lark-slides-update-slide.md → cli/lark-slides-update-slide.md} +21 -4
  60. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-get.md +110 -0
  61. package/skills/lark-slides/references/cli/lark-slides-xml-presentation-slide-replace.md +188 -0
  62. package/skills/lark-slides/references/cli/lark-slides-xml-presentations-get.md +157 -0
  63. package/skills/lark-slides/references/iconpark-index.json +5 -41901
  64. package/skills/lark-slides/references/iconpark.md +3 -44
  65. package/skills/lark-slides/references/lark-slides-add-slide.md +3 -90
  66. package/skills/lark-slides/references/lark-slides-create.md +3 -174
  67. package/skills/lark-slides/references/lark-slides-delete-slide.md +3 -63
  68. package/skills/lark-slides/references/lark-slides-edit-workflows.md +3 -141
  69. package/skills/lark-slides/references/lark-slides-history.md +3 -130
  70. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -102
  71. package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +3 -83
  72. package/skills/lark-slides/references/lark-slides-replace-slide.md +3 -256
  73. package/skills/lark-slides/references/lark-slides-screenshot.md +3 -113
  74. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +3 -108
  75. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +3 -186
  76. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +3 -155
  77. package/skills/lark-slides/references/planning-layer.md +1 -1
  78. package/skills/lark-slides/references/slides_chart_demo.xml +5 -1415
  79. package/skills/lark-slides/references/slides_xml_schema_definition.xml +3 -3512
  80. package/skills/lark-slides/references/troubleshooting.md +3 -60
  81. package/skills/lark-slides/references/validation-checklist.md +3 -154
  82. package/skills/lark-slides/references/workflow/error-handling.md +62 -0
  83. package/skills/lark-slides/references/workflow/slides-editing.md +143 -0
  84. package/skills/lark-slides/references/workflow/template-editing.md +85 -0
  85. package/skills/lark-slides/references/workflow/validation-xml.md +156 -0
  86. package/skills/lark-slides/references/xml/iconpark-index.json +37458 -0
  87. package/skills/lark-slides/references/xml/iconpark.md +46 -0
  88. package/skills/lark-slides/references/xml/slides_chart_demo.xml +1415 -0
  89. package/skills/lark-slides/references/xml/slides_xml_schema_definition.xml +3514 -0
  90. package/skills/lark-slides/references/xml/xml-schema-quick-ref.md +497 -0
  91. package/skills/lark-slides/references/xml-schema-quick-ref.md +3 -495
  92. package/skills/lark-slides/scripts/iconpark_tool.py +1 -1
  93. package/skills/lark-slides/scripts/xml_lint.py +2989 -0
  94. package/skills/lark-slides/scripts/xml_lint_test.py +4720 -0
  95. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +3 -2975
  96. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +5 -4712
  97. package/skills/lark-task/SKILL.md +12 -0
  98. package/skills/lark-task/references/lark-task-create.md +3 -1
  99. package/skills/lark-vc/SKILL.md +15 -5
  100. package/skills/lark-vc/references/lark-vc-detail.md +11 -6
  101. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-events.md → lark-vc/references/lark-vc-meeting-events.md} +121 -20
  102. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-list-active.md → lark-vc/references/lark-vc-meeting-list-active.md} +2 -2
  103. package/skills/{lark-vc-agent/references/lark-vc-agent-meeting-message-send.md → lark-vc/references/lark-vc-meeting-message-send.md} +3 -3
  104. package/skills/lark-vc/references/lark-vc-recording.md +8 -6
  105. package/skills/lark-vc/references/vc-domain-boundaries.md +8 -1
  106. package/skills/lark-vc-agent/SKILL.md +24 -9
  107. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-join.md +2 -2
  108. package/skills/lark-vc-agent/references/lark-vc-agent-meeting-leave.md +2 -2
  109. package/skills/lark-wiki/SKILL.md +3 -1
  110. package/skills/lark-wiki/references/lark-wiki-node-copy.md +5 -19
  111. package/skills/lark-wiki/references/lark-wiki-node-create.md +19 -2
  112. package/skills/lark-wiki/references/lark-wiki-node-get.md +15 -0
  113. package/skills/lark-wiki/references/lark-wiki-node-list.md +1 -1
  114. package/skills/lark-base/references/lark-base-data-analysis-sop.md +0 -210
  115. package/skills/lark-base/references/lark-base-data-query-guide.md +0 -69
  116. package/skills/lark-base/references/lark-base-record-upsert.md +0 -63
@@ -78,7 +78,7 @@ lark-cli wiki +node-create \
78
78
  | `--parent-node-token` | 否 | 父知识库节点 token;传入后会在该节点下创建新节点 |
79
79
  | `--title` | 否 | 节点标题 |
80
80
  | `--node-type` | 否 | 节点类型,默认 `origin`;可选值:`origin`、`shortcut` |
81
- | `--obj-type` | 否 | 节点对应对象类型,默认 `docx`;可选值:`sheet`、`mindnote`、`bitable`、`docx`、`slides` |
81
+ | `--obj-type` | 否 | 节点对应对象类型,默认 `docx`;可选值:`sheet`、`mindnote`、`bitable`、`file`、`docx`、`slides`。`file` 仅支持 `shortcut` 节点 |
82
82
  | `--origin-node-token` | 否 | 当 `--node-type=shortcut` 时必填,表示快捷方式指向的源节点 token |
83
83
 
84
84
  ## 空间解析规则
@@ -89,11 +89,27 @@ lark-cli wiki +node-create \
89
89
  - **个人知识库回退**:`user` 身份下,如果 `--space-id` 和 `--parent-node-token` 都没传,会自动解析 `my_library`
90
90
  - **bot 身份限制**:`bot` 身份既没有“个人知识库”回退语义,也不支持显式传 `--space-id my_library`;请改用真实 `space_id` 或 `--parent-node-token`
91
91
 
92
- ## shortcut 节点规则
92
+ ## 节点类型与对象类型
93
+
94
+ | `node_type` | 支持的 `obj_type` |
95
+ |-------------|-------------------|
96
+ | `origin` | `sheet`、`mindnote`、`bitable`、`docx`、`slides` |
97
+ | `shortcut` | `sheet`、`mindnote`、`bitable`、`file`、`docx`、`slides` |
93
98
 
94
99
  - `--node-type=shortcut` 时,必须同时提供 `--origin-node-token`
95
100
  - `--node-type=origin` 时,不能传 `--origin-node-token`
101
+ - `--obj-type=file` 仅支持 `--node-type=shortcut`;实体节点不支持创建 `file` 类型
96
102
  - `shortcut` 节点只是知识库中的快捷方式入口;真正被引用的节点由 `--origin-node-token` 指定
103
+ - 如果 `+node-create` 因上述组合返回参数校验错误,禁止改用 raw `wiki nodes create` 或直接调用 OpenAPI 绕过校验;应修正 `node_type`、`obj_type` 或 `origin_node_token`
104
+
105
+ ```bash
106
+ # 创建一个指向文件的快捷方式节点
107
+ lark-cli wiki +node-create \
108
+ --space-id <SPACE_ID> \
109
+ --node-type shortcut \
110
+ --obj-type file \
111
+ --origin-node-token <ORIGIN_NODE_TOKEN>
112
+ ```
97
113
 
98
114
  ## 一致性校验
99
115
 
@@ -111,6 +127,7 @@ lark-cli wiki +node-create \
111
127
  - 同时需要 `my_library` 和父节点时:会展示三步调用链
112
128
  - **bot 自动授权**:若使用 `--as bot`,结果还会额外带上 `permission_grant`,用于说明是否已自动为当前 CLI 用户授予新建节点的可管理权限
113
129
  - **输出结果**:成功后会返回 `resolved_space_id`、`resolved_by`、`node_token`、`obj_token`、`obj_type`、`node_type`、`title` 等字段,便于后续继续操作
130
+ - **结构限制**:返回 `131003` 表示触发了知识空间总节点数、目录深度或单个父节点直属子节点数等结构限制。这不是瞬时错误,禁止使用相同参数重试。根据上游错误信息选择更浅或其他父节点、重新组织现有节点,或清理/改用其他知识空间;不要在无法确认具体限制时盲目增加中间层级。
114
131
 
115
132
  ## 推荐场景
116
133
 
@@ -52,6 +52,21 @@ lark-cli wiki +node-get \
52
52
  - `creator` falls back to `creator` when `node_creator` is absent. `updated_at` is `obj_edit_time` formatted as RFC3339.
53
53
  - No `url` is returned: `get_node` does not provide one and a synthesized `www.feishu.cn/wiki/<node_token>` link is non-canonical/misleading for a read command. Use `node_token` / `obj_token` as the identifiers.
54
54
 
55
+ ## Terminal business errors
56
+
57
+ These HTTP 200 responses carry a non-zero business code and are not retryable with the same input:
58
+
59
+ | Code | Meaning | Required action |
60
+ |------|---------|-----------------|
61
+ | `131006` | The current user or app/bot identity lacks access to the Wiki node or space | This is resource access, not app scope authorization. Do not retry the same request, reauthorize, or switch identity as trial and error; ask the node owner or wiki administrator to grant read access, or use an accessible resource |
62
+ | `131012` | The Wiki node has been deleted | Do not retry the same node token; rediscover the node or ask for a current Wiki link |
63
+ | `131013` | The resource token is invalid | Do not switch identity or reauthorize; correct the URL/token |
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
+
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
+
55
70
  ## Required Scope
56
71
 
57
72
  `wiki:node:retrieve`
@@ -87,7 +87,7 @@ lark-cli wiki +node-list --space-id 6946843325487912356 --parent-node-token wikc
87
87
  - `--space-id my_library` is a per-user alias and only valid with `--as user`. The shortcut will refuse `--as bot` with `my_library` upfront.
88
88
  - `--space-id` is a numeric wiki `space_id`. Do not pass a wiki URL, wiki node token, document token, or title. Use `lark-cli wiki +space-list --as user` to discover it.
89
89
  - `--parent-node-token` must resolve to a wiki node token. If you have a docx/sheet/base/file URL, first run `lark-cli wiki +node-get --node-token <url>` and use the returned `node_token`.
90
- - Treat `invalid_parameters` (`space_id is not int`, `invalid page_token`), `not_found` (`node not found by parent node token`), and `permission_denied` as terminal for the current arguments. Fix the argument or permission before retrying.
90
+ - Treat `invalid_parameters` (`space_id is not int`, `invalid page_token`), `not_found` (`node not found by parent node token`), and `permission_denied` as terminal for the current arguments. For `131006 permission_denied`, the user or app/bot identity lacks access to the target space or parent node; this is resource access, not app scope authorization. Do not retry the same request, reauthorize, or switch identity as trial and error. Ask the resource owner or wiki administrator to grant read access, or use an accessible resource.
91
91
  - For `rate_limit`, stop immediate retries and retry later with exponential backoff or a smaller `--page-limit`.
92
92
 
93
93
  ## Required Scope
@@ -1,210 +0,0 @@
1
- # Base data analysis SOP
2
-
3
- Base 数据查询与分析任务的执行契约。覆盖记录读取、筛选、排序、Top/Bottom N、聚合统计、分组聚合、多表关联、临时分析和查询后写入前的目标定位。
4
-
5
- 本文只管查询选路和正确性边界;具体操作前先读真实结构和现状,复杂 JSON 再跳到 reference:
6
-
7
- - `+data-query`: entry guide [lark-base-data-query-guide.md](lark-base-data-query-guide.md), full DSL SSOT [lark-base-data-query.md](lark-base-data-query.md)
8
- - 视图筛选: [lark-base-view-set-filter.md](lark-base-view-set-filter.md)
9
- - 记录读取: `+record-list` / `+record-search` / `+record-get`,先确认字段 ID、字段名、分页和投影范围
10
-
11
- ## 0. Hard Rules
12
-
13
- - 全局问题不能用默认 `+record-list --limit N` 片面地回答。
14
- - `jq` / shell / 本地代码是在个人电脑或当前运行环境中处理已返回数据,只适合小范围结果;超过 200 行默认不推荐本地统计、排序或求极值,应改用 Base 云端查询服务的 filter/sort/aggregate。
15
- - “最高、最低、最新、最早、Top、Bottom、总数、全部、异常、最大、最小、最多、最少、优先级最高”等全局语义,必须在 Base 云端查询服务中完成筛选、排序或聚合。
16
- - 一次性原始记录查询优先用 `+record-list` / `+record-search` 的 filter/sort;聚合分析优先用 `+data-query`。
17
- - `+record-search` 用于关键词检索字段的展示文本;金额、状态、日期、空值、关联等结构化条件继续用 `--filter-json` 表达。
18
- - 不要依赖已有视图,除非用户明确指定该视图,或你已读取并验证其 filter/sort/projection 符合当前问题。
19
- - 交付输出必须使用用户可读的真实字段值;内部 ID、`record_id`、关联记录 ID、open_id、编码字段只可作为连接键或定位键,不能替代最终输出,除非用户明确要求输出这些键值。
20
- - 每次读取必须做最小投影,并包含后续解释、回查或写入需要的业务 key。
21
-
22
- ## 1. Intent -> Tool Path
23
-
24
- | 用户意图 | 首选路径 | 关键规则 |
25
- | --- | --- | --- |
26
- | 看几条、预览、示例 | `+record-list --limit N --field-id ...` | 保持局部语义;不要推广为全局结论 |
27
- | 已知 `record_id` | `+record-get` | 直接读取;不要 search/list 反查 |
28
- | 明确关键词 | `+record-search --keyword ... --search-field ... --field-id ...` | 必须显式指定 `--search-field`;可叠加 `--filter-json` |
29
- | 按条件找原始记录 | `+record-list --filter-json ...` | `filter-json` 与视图筛选结构一致,支持文本、数字、日期、选项、人员、群组、关联等值 |
30
- | 排序 / TopN 原始记录 | `+record-list --filter-json ... --sort-json ... --limit N` | 最高/最新用 `desc:true`,最低/最早用 `desc:false`;数组顺序表达优先级;最多 10 个排序条件 |
31
- | 聚合 / 分组 / 分组排序 | `+data-query` | 使用 filters/dimensions/measures/sort/limit |
32
- | 聚合后输出逐条记录 | `+data-query` 得到业务 key 或候选字段组合 -> `+record-list --filter-json` / `+record-get` 回查 | `+data-query` 维度行按字段组合去重且不返回 `record_id` |
33
- | 多表 / 多跳关联 | 以候选数最小的事实表为驱动表,沿业务 key 或 link `record_id` 逐跳回查 | 读出 link 单元格里的关联 `record_id` 后,到被关联表批量 `+record-get` 展示字段 |
34
- | 查询后写入 / 视图化 | 先用本 SOP 得到可复核的目标记录 id 集合 | 再进入记录写入或视图配置;高价值可复用查询可沉淀为持久视图 |
35
-
36
- ## 2. Execution Patterns
37
-
38
- ### 2.1 结构化原始记录与 TopN
39
-
40
- 使用 `+record-list` 的 filter/sort 路径:
41
-
42
- 1. `+field-list` 确认筛选字段、排序字段、展示字段、业务 key。
43
- 2. 筛选只用 `--filter-json` 或 `--filter-json @file`。
44
- 3. 排序用 `--sort-json`。
45
- 4. `--field-id` 做最小投影,`--limit` 控制返回数量。
46
-
47
- Example: string/number 条件 + TopN:
48
-
49
- ```bash
50
- lark-cli base +record-list \
51
- --base-token <base_token> \
52
- --table-id <table_id> \
53
- --filter-json '{"logic":"and","conditions":[["Title","==","Launch plan"],["Score",">=",80]]}' \
54
- --sort-json '[{"field":"Updated","desc":true}]' \
55
- --field-id Name \
56
- --field-id Title \
57
- --field-id Score \
58
- --limit 20
59
- ```
60
-
61
- Example: 复杂筛选从文件读取:
62
-
63
- ```bash
64
- lark-cli base +record-list \
65
- --base-token <base_token> \
66
- --table-id <table_id> \
67
- --filter-json @filter.json \
68
- --sort-json '[{"field":"Priority","desc":true}]' \
69
- --field-id Name \
70
- --field-id Tags \
71
- --limit 50
72
- ```
73
-
74
- `filter-json` 与视图筛选结构一致。下面只列常用 fewshot;字段类型、operator、value 形状拿不准,或需要人员、群组、关联、空值、地理位置、formula / lookup 等完整筛选时,先读 [lark-base-view-set-filter.md](lark-base-view-set-filter.md),再把同样的 filter JSON 传给 `--filter-json`。
75
-
76
- 文本 `==`:字段值等于目标文本。
77
- ```json
78
- {"logic":"and","conditions":[["Title","==","Launch plan"]]}
79
- ```
80
-
81
- 文本包含 / like:文本字段包含目标片段;operator 写 `intersects`。
82
- ```json
83
- {"logic":"and","conditions":[["Title","intersects","urgent"]]}
84
- ```
85
-
86
- 数字 `==`:字段值等于目标数字。
87
- ```json
88
- {"logic":"and","conditions":[["Score","==",95]]}
89
- ```
90
-
91
- 日期 `==`:字段值等于目标日期;datetime / created_at / updated_at 用 `ExactDate(...)`。
92
- ```json
93
- {"logic":"and","conditions":[["Due Date","==","ExactDate(2026-06-02)"]]}
94
- ```
95
-
96
- 选项 `==`:字段值匹配单个选项;选项值使用选项名数组,单个选项也写数组。
97
- ```json
98
- {"logic":"and","conditions":[["Priority","==",["P0"]]]}
99
- ```
100
-
101
- 选项 `intersects`:字段值与给定选项集合有交集,常用于多选或“命中任一选项”。
102
- ```json
103
- {"logic":"and","conditions":[["Tags","intersects",["P0","Blocked"]]]}
104
- ```
105
-
106
- `--sort-json` 传排序数组,数组顺序就是优先级,`desc:true` 为降序,`desc:false` 为升序,最多 10 个排序条件。
107
-
108
- ### 2.2 关键词检索后叠加结构化条件
109
-
110
- 使用 `+record-search` 做关键词命中,结构化条件仍用 `--filter-json` 下推:
111
-
112
- ```bash
113
- lark-cli base +record-search \
114
- --base-token <base_token> \
115
- --table-id <table_id> \
116
- --keyword Alice \
117
- --search-field Name \
118
- --filter-json '{"logic":"and","conditions":[["Status","!=","Done"]]}' \
119
- --sort-json '[{"field":"Updated","desc":true}]' \
120
- --field-id Name \
121
- --field-id Status \
122
- --limit 20
123
- ```
124
-
125
- 不要把 `+record-search` 当成金额、状态、日期、空值、关联字段的结构化筛选入口;这些条件继续写成 `--filter-json`。
126
-
127
- ### 2.3 聚合分析与 TopN
128
-
129
- 使用 `+data-query`:
130
-
131
- - 让 Base 云端查询服务完成 filters、dimensions、measures、sort、pagination.limit。
132
- - `pagination.limit` 是 Base 云端查询服务中的结果限制,不是本地分页扫描。
133
- - 常用聚合 fewshot 先读 [lark-base-data-query-guide.md](lark-base-data-query-guide.md);字段类型、日期 value、DSL shape 以 [lark-base-data-query.md](lark-base-data-query.md) 为准。
134
- - `+data-query` 可返回聚合结果或维度字段行;维度字段行按字段组合去重且不返回 `record_id`,不能当逐条原始记录结果使用。
135
- - 需要输出逐条记录、记录定位或完整行级字段时,先用 `+data-query` 得到业务 key、分组值或候选字段组合,再用 `+record-list --filter-json` / `+record-get` 回查。
136
-
137
- Example: 分组计数:
138
-
139
- ```bash
140
- lark-cli base +data-query \
141
- --base-token <base_token> \
142
- --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"}}'
143
- ```
144
-
145
- Example: 过滤后汇总并取 TopN:
146
-
147
- ```bash
148
- lark-cli base +data-query \
149
- --base-token <base_token> \
150
- --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"]}]},"sort":[{"field_name":"total_amount","order":"desc"}],"pagination":{"limit":10},"shaper":{"format":"flat"}}'
151
- ```
152
-
153
- ### 2.4 视图化与复用
154
-
155
- 一次性查询先用 `+record-list` / `+record-search` 的 filter/sort 验证。需要用户长期打开、共享或复用时,再把同一套 filter/sort 沉淀为视图。
156
-
157
- Example: 将已验证的筛选排序写入视图:
158
-
159
- ```bash
160
- lark-cli base +view-set-filter \
161
- --base-token <base_token> \
162
- --table-id <table_id> \
163
- --view-id <view_id> \
164
- --json @filter.json
165
-
166
- lark-cli base +view-set-sort \
167
- --base-token <base_token> \
168
- --table-id <table_id> \
169
- --view-id <view_id> \
170
- --json '{"sort_config":[{"field":"Priority","desc":true}]}'
171
- ```
172
-
173
- 手动配置和视图配置的优先级:
174
-
175
- 1. `--filter-json` 覆盖 `--view-id` 保存的 view filter JSON。
176
- 2. `--sort-json` 覆盖 `--view-id` 保存的 view sort config。
177
- 3. 没有手动 filter/sort 时,`--view-id` 使用视图自身保存的 filter/sort。
178
-
179
- ### 2.5 关系查询与回查
180
-
181
- - link 单元格通常是关联表 `record_id` 数组,不是用户可读内容,只是连接键。
182
- - 先用 `+field-list` 确认 link 字段的 `link_table`、业务唯一键和展示字段。
183
- - 从驱动表拿到候选记录后,用关联 `record_id` 到关联表 `+record-get` 批量读取记录内容。
184
- - 多跳关系逐跳建立 `record_id/key -> 用户可读字段` 映射;最终用户可读的信息。
185
-
186
- 禁止:
187
-
188
- - 把 link `record_id` 当最终输出。
189
- - 用 `+record-search` 搜 link `record_id`。
190
- - 基于 ID、自增编号、link 值做语义猜测;禁止依赖字段先验、样本记忆补全交付输出。
191
-
192
- ## 3. Range & Pagination Contract
193
-
194
- - `+record-list` 默认页、固定 `--limit`、本地 `jq`、shell 管道、手工浏览输出,都只覆盖已读取范围;超过 200 行不要把本地处理当作推荐路径。
195
- - `has_more=true`、存在下一页 offset/page token、或返回行数等于 page size,都表示可能还有未读取数据。
196
- - 对全局问题,只有 Base 云端查询服务已经通过 filter/sort/aggregate 收敛目标范围,或 `+data-query` 已在云端完成聚合、排序和限制时,才可以用有限返回形成结论。
197
- - 必须全量导出时,按 `+record-list` 分页语义串行翻页;不要并发调用 `+record-list`。
198
-
199
- ## 4. Final Answer Check
200
-
201
- 形成交付输出前必须能确认:
202
-
203
- - 问题范围是局部样例、单点定位、全局原始记录、聚合分析、多表关联,还是查询后写入。
204
- - 筛选、排序、聚合是否发生在 Base 云端查询服务中,而不是本地 `jq` / shell 中。
205
- - 如果使用 `jq` / shell,本地输入是否是 200 行以内的小范围结果;超过 200 行是否已改用 Base 云端查询服务查询。
206
- - 如果使用 `+record-list` / `+record-search`,是否处理了 `has_more`,且投影包含业务 key 和解释字段。
207
- - 如果涉及关系查询,是否按 `record_id` 或业务 key 精确回查,交付输出是否来自关联表真实字段。
208
- - 交付输出能追溯到表、字段、筛选条件、排序/聚合条件和连接键。
209
-
210
- 任一项无法确认时,继续查询或明确说明只能得到局部结论。
@@ -1,69 +0,0 @@
1
- # Base data-query guide
2
-
3
- This guide is the entry point for `+data-query`. Use it for common aggregation fewshots and command selection. For the complete DSL fields, operators, limits, and response details, use [lark-base-data-query.md](lark-base-data-query.md) as the DSL SSOT.
4
-
5
- Before using `+data-query`, also follow [lark-base-data-analysis-sop.md](lark-base-data-analysis-sop.md) to confirm that the task really needs aggregation instead of record listing or a temporary view.
6
-
7
- ## When to use
8
-
9
- Use `+data-query` when the user asks for server-side:
10
-
11
- - group by / aggregation
12
- - sum, average, min, max, count, distinct count
13
- - filtered aggregation
14
- - sorted Top N or Bottom N
15
- - global statistical conclusions
16
-
17
- `+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.
18
-
19
- ## Common Fewshots
20
-
21
- Count records by a category field:
22
-
23
- ```bash
24
- lark-cli base +data-query \
25
- --base-token <base_token> \
26
- --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"}}'
27
- ```
28
-
29
- Sum a number field by category and return Top 10:
30
-
31
- ```bash
32
- lark-cli base +data-query \
33
- --base-token <base_token> \
34
- --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"}}'
35
- ```
36
-
37
- Aggregate only records matching a filter:
38
-
39
- ```bash
40
- lark-cli base +data-query \
41
- --base-token <base_token> \
42
- --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"}}'
43
- ```
44
-
45
- ## Common filter values
46
-
47
- Common `Condition.value` shapes: select `is` / `isNot` uses exactly one option
48
- name; datetime `is` / `isGreater` / `isLess` uses `["Today"]` or
49
- `["ExactDate","<epoch_ms>"]`; `isEmpty` / `isNotEmpty` uses `[]`.
50
- Use relative date keywords only for relative requests; see
51
- [lark-base-data-query.md](lark-base-data-query.md) for other field types and operators.
52
-
53
- Use `tableName` when the table ID is unavailable but the table name is known:
54
-
55
- ```bash
56
- lark-cli base +data-query \
57
- --base-token <base_token> \
58
- --dsl '{"datasource":{"type":"table","table":{"tableName":"Orders"}},"measures":[{"field_name":"Amount","aggregation":"sum","alias":"total_amount"}],"shaper":{"format":"flat"}}'
59
- ```
60
-
61
- ## Routing to the DSL SSOT
62
-
63
- Read [lark-base-data-query.md](lark-base-data-query.md) when you need:
64
-
65
- - the full DSL field reference
66
- - supported aggregations and field types
67
- - filter operator details
68
- - pagination and result limits
69
- - 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: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: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 格式规范