@amaster.ai/pi-lark 0.1.2-beta.51 → 0.1.2-beta.53

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 (87) hide show
  1. package/package.json +2 -2
  2. package/skills/lark-apps/SKILL.md +10 -4
  3. package/skills/lark-apps/references/lark-apps-cloud-dev.md +5 -4
  4. package/skills/lark-apps/references/lark-apps-create.md +6 -3
  5. package/skills/lark-apps/references/lark-apps-get.md +1 -1
  6. package/skills/lark-apps/references/lark-apps-list.md +1 -1
  7. package/skills/lark-apps/references/lark-apps-local-dev.md +27 -1
  8. package/skills/lark-apps/references/lark-apps-release-create.md +1 -1
  9. package/skills/lark-base/SKILL.md +11 -4
  10. package/skills/lark-base/references/lark-base-dashboard-block-get-data.md +17 -1
  11. package/skills/lark-base/references/lark-base-dashboard.md +17 -4
  12. package/skills/lark-base/references/lark-base-field-json.md +2 -0
  13. package/skills/lark-calendar/SKILL.md +1 -1
  14. package/skills/lark-doc/SKILL.md +1 -0
  15. package/skills/lark-doc/references/lark-doc-history.md +13 -14
  16. package/skills/lark-drive/SKILL.md +7 -5
  17. package/skills/lark-drive/references/lark-drive-apply-permission.md +1 -1
  18. package/skills/lark-drive/references/lark-drive-copy.md +87 -0
  19. package/skills/lark-drive/references/lark-drive-export.md +3 -0
  20. package/skills/lark-drive/references/lark-drive-task-result.md +3 -0
  21. package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
  22. package/skills/lark-event/SKILL.md +7 -4
  23. package/skills/lark-event/references/lark-event-vc.md +8 -2
  24. package/skills/lark-im/SKILL.md +5 -5
  25. package/skills/lark-im/references/lark-im-chat-list.md +9 -2
  26. package/skills/lark-im/references/lark-im-chat-members-list.md +7 -4
  27. package/skills/lark-im/references/lark-im-chat-messages-list.md +10 -3
  28. package/skills/lark-im/references/lark-im-chat-search.md +9 -2
  29. package/skills/lark-im/references/lark-im-feed-group-list-item.md +2 -2
  30. package/skills/lark-im/references/lark-im-feed-group-list.md +2 -2
  31. package/skills/lark-im/references/lark-im-feed-shortcut-list.md +1 -1
  32. package/skills/lark-im/references/lark-im-flag-list.md +2 -2
  33. package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
  34. package/skills/lark-im/references/lark-im-messages-search.md +4 -5
  35. package/skills/lark-im/references/lark-im-threads-messages-list.md +8 -4
  36. package/skills/lark-mail/references/lark-mail-triage.md +19 -4
  37. package/skills/lark-minutes/SKILL.md +1 -1
  38. package/skills/lark-minutes/references/lark-minutes-search.md +6 -7
  39. package/skills/lark-shared/SKILL.md +3 -3
  40. package/skills/lark-sheets/SKILL.md +83 -82
  41. package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
  42. package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
  43. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
  44. package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
  45. package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
  46. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
  47. package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
  48. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
  49. package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
  50. package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
  51. package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
  52. package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
  53. package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
  54. package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
  55. package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
  56. package/skills/lark-sheets/scripts/sheets_df.py +21 -3
  57. package/skills/lark-slides/SKILL.md +25 -40
  58. package/skills/lark-slides/references/lark-slides-add-slide.md +92 -0
  59. package/skills/lark-slides/references/lark-slides-create.md +16 -35
  60. package/skills/lark-slides/references/lark-slides-delete-slide.md +65 -0
  61. package/skills/lark-slides/references/lark-slides-edit-workflows.md +5 -3
  62. package/skills/lark-slides/references/lark-slides-media-upload.md +3 -25
  63. package/skills/lark-slides/references/lark-slides-replace-pages.md +6 -4
  64. package/skills/lark-slides/references/lark-slides-replace-slide.md +22 -1
  65. package/skills/lark-slides/references/lark-slides-screenshot.md +31 -13
  66. package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +5 -5
  67. package/skills/lark-slides/references/slides_chart_demo.xml +1 -1
  68. package/skills/lark-slides/references/slides_xml_schema_definition.xml +48 -4
  69. package/skills/lark-slides/references/troubleshooting.md +1 -2
  70. package/skills/lark-slides/references/validation-checklist.md +3 -3
  71. package/skills/lark-slides/references/xml-schema-quick-ref.md +23 -9
  72. package/skills/lark-slides/scripts/sxsd_validator.py +154 -10
  73. package/skills/lark-slides/scripts/xml_text_overlap_lint.py +360 -76
  74. package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +1138 -214
  75. package/skills/lark-whiteboard/SKILL.md +15 -8
  76. package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
  77. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
  78. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
  79. package/skills/lark-whiteboard/routes/dsl.md +8 -2
  80. package/skills/lark-whiteboard/routes/mermaid.md +1 -1
  81. package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
  82. package/skills/lark-whiteboard/routes/svg.md +3 -1
  83. package/skills/lark-whiteboard/scenes/mention.md +71 -0
  84. package/skills/lark-wiki/SKILL.md +5 -3
  85. package/skills/lark-wiki/references/lark-wiki-delete-space.md +6 -3
  86. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +0 -219
  87. package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +0 -126
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.2-beta.51",
3
+ "version": "0.1.2-beta.53",
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.51"
64
+ "@amaster.ai/pi-shared": "0.1.2-beta.53"
65
65
  },
66
66
  "scripts": {
67
67
  "fetch-skills": "node scripts/fetch-skills.mjs",
@@ -64,22 +64,28 @@ lark-cli auth login --domain apps
64
64
 
65
65
  新建必先定 **app_type** 和**开发方式**两件正交的事;修改已有先按「app_id 获取」指认到 app,指认不到就问用户,不擅自 `+create`。开发方式(本地 vs 云端)只看用户对"谁来写代码"的偏好,与应用复杂度、要不要数据库无关。
66
66
 
67
+ **app_type 三类边界**(先判"要不要把数据存到服务端",再判"纯展示还是有交互"):
68
+
67
69
  | 信号 | 判定 |
68
70
  |---|---|
69
- | 静态展示 / 单页 / PPT/deck / demo / 落地页 / 仪表盘 / UI mockup / 可交互原型 / 线框图 / 视觉探索 / 无后端状态 | `app_type=html`,加载 [`creative-design/creative-design.md`](creative-design/creative-design.md)(含完整开发与发布流程) |
70
- | 登录 / 数据库 / 持久化 / 多人协作 / 增删改查 / 报名 / 投票 / 站会 / OKR / 泛称"系统·工具" | `app_type=full_stack` |
71
+ | 含数据库 / 后端持久化:登录 / 增删改查 / 报名·投票·站会存记录 / 多人协作 / 泛称"系统·工具"且明确要存数据 | `app_type=full_stack` |
72
+ | 纯静态展示(给人"看"的物料,无 JS 交互):PPT/deck / demo / 落地页 / 海报 / UI mockup / 线框图 / 静态仪表盘 / 视觉探索 | `app_type=html`,加载 [`creative-design/creative-design.md`](creative-design/creative-design.md)(含完整开发与发布流程) |
73
+ | 有 JS 交互但无数据库(给人"用"的前端应用):可交互原型 / SPA / 表单校验 / 动态计算 / 调用外部 API / 泛称"工具·系统"但未明确要存数据 | `app_type=frontend`(**默认倾向**:用户未明确提出数据库需求时默认引导 frontend,不默认 full_stack) |
74
+ | 类型模糊(尤其"要不要存数据"不清) | **追问**,话术偏向 frontend,例:"看起来是个前端应用,需要保存数据吗?";确认要存数据再转 full_stack,确认纯展示再转 html |
71
75
  | 用户要自己写 / 本地 IDE·code agent / 拉源码到本地 / 交研发 | 本地开发,读 [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md) |
72
76
  | 让妙搭 AI 云端生成 / 对话式 / 自己不碰代码 | 云端会话,读 [`lark-apps-cloud-dev.md`](references/lark-apps-cloud-dev.md) |
73
77
  | 未表达"谁来写"偏好 | **必须先问**(本地代码开发 vs 云端 AI 生成);选定前不擅自选边、不暗示默认,不得以"需求不模糊"为由跳过提问直接 `+init` / `git clone` / `+session-create` / 首轮 `+chat` |
74
78
  | 修改已有 + 当前目录是 `.spark/meta.json` 项目 | 直接继续本地按意图路由,不必问也不必判云端 |
75
79
  | 修改已有 + 有云端偏好 | 云端会话;未表达偏好且非本地项目 → 默认本地;判不准先问 |
76
80
 
81
+ **类型升级**:`frontend` 应用后续需要数据库/后端能力时,本地 CLI 不提供类型升级;引导用户到云端会话(打开 `https://miaoda.feishu.cn/app/{app_id}`),用自然语言描述后端需求(如"给这个应用加登录和数据存储")即可触发升级,无需特殊指令。
82
+
77
83
  ## 发布态护栏
78
84
 
79
85
  - **发布意图判定**:用户要"可访问 / 线上 / 分享 / 新链接 / 上线" = 发布意图,先走发布链路、确认完成再给链接。
80
86
  - 完成 ≠ 发布:云端会话完成 / `+list is_published=true` 都不代表最新内容已部署。
81
- - 开发态链接 `https://miaoda.feishu.cn/app/{app_id}`(仅 full_stack 应用):进应用编辑/开发态、管理与继续开发应用的入口。创意模式(html)应用开发态和发布态是同一个链接,无需额外提供开发态链接。
82
- - 发布态链接来源:`+release-get` 轮询 `finished` 给 `online_url` / `failed` 给 `error_logs`(html 和 full_stack 统一走 `+release-get`)。
87
+ - 开发态链接 `https://miaoda.feishu.cn/app/{app_id}`(full_stack / frontend 应用):进应用编辑/开发态、管理与继续开发应用的入口,也是 frontend 升级为 full_stack 的入口(云端会话)。创意模式(html)应用开发态和发布态是同一个链接,无需额外提供开发态链接。
88
+ - 发布态链接来源:`+release-get` 轮询 `finished` 给 `online_url` / `failed` 给 `error_logs`(html / frontend / full_stack 统一走 `+release-get`)。
83
89
  - html 应用的主链路是创意模式开发方式:按 [`lark-apps-local-dev.md`](references/lark-apps-local-dev.md) 初始化仓库、在仓库内产出 HTML 及关联文件,并通过 git commit / git push / `+release-create` / `+release-get` 发布部署。任何 git 操作(clone / pull / push)报错时,先执行 `lark-cli apps +git-credential-init --app-id <app_id> --as user` 刷新本地 Git 凭证,再重试原 git 命令。如果刷新凭证也失败,**停止并向用户报告**:原始 git 错误、凭证刷新失败原因,以及是否可能是当前环境(操作系统、沙箱)限制导致(如 macOS Keychain 在沙箱中不可用、Linux 加密文件目录不可写等)。不要改走 `+html-publish`,也不要把 `+html-publish` 当作本地开发链路的 fallback。
84
90
  - 创意模式(html)应用的链接格式为 `https://{租户域名}/page/{meta_token}`,**开发态和发布态是同一个链接**(区别于 full_stack 应用两者分开)。此链接形似飞书文档链接。`+get --app-id <meta_token>` 可获取应用信息(含 `app_id`),`+get --app-id <app_id>` 可获取 `meta_token`。看到 `/page/xxx` 链接时,它是妙搭创意模式应用,不要当成飞书文档跳过。
85
91
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  三层父子关系,下层都挂在上层之下:
12
12
 
13
- - **app(应用资产)**:一个妙搭应用,由 `+create` 创建并拿到 `app_id`。云端生成应用类型用 `full_stack`。
13
+ - **app(应用资产)**:一个妙搭应用,由 `+create` 创建并拿到 `app_id`。`--app-type` 沿用 SKILL.md「选择开发路径」判定的类型(有数据库需求→`full_stack`;纯前端交互、未提数据库→默认 `frontend`),云端生成不写死 `full_stack`。
14
14
  - **session(会话)**:一个 app 下的一段独立对话上下文,由 `+session-create` 创建并拿到 `session_id`。一个 app 可有多个 session;`is_active` 表示该 session 当前是否可写(可发起对话)。
15
15
  - **turn(轮)**:一个 session 里的一轮交互 = 一条用户消息 + 妙搭 Agent 针对它的生成/迭代。`+chat` 发一条消息就发起一轮;轮的句柄是 `turn_id`,状态看 `latest_turn.status`。
16
16
 
@@ -41,7 +41,8 @@
41
41
  ### 典型链路
42
42
 
43
43
  ```bash
44
- # 1) 建 app,拿 app_id(云端生成走 full_stack)
44
+ # 1) 建 app,拿 app_id(--app-type 用主路由判定的类型;此例"待办应用"要存待办→full_stack,
45
+ # 若是纯前端交互工具且未提数据库则用 frontend)
45
46
  lark-cli apps +create --name "待办应用" --app-type full_stack \
46
47
  --description "支持新增、完成、筛选待办"
47
48
 
@@ -68,14 +69,14 @@ lark-cli apps +session-list --app-id app_xxx
68
69
  ## 需求发送
69
70
 
70
71
  - 只有用户明确选择云端路径,或明确说“让妙搭 Agent / 云端 AI 生成/迭代”时,才进入本 reference;不要因为用户只说“做个 X”或“给我链接”就默认云端。
71
- - 进入云端路径后,极简需求也可直接发起生成,例如“做个投票工具”“做个站会小应用”。先建 `full_stack` app,再用 `+chat --message "<用户原话>"` 透传需求,不编造实体、字段或业务细节。
72
+ - 进入云端路径后,极简需求也可直接发起生成,例如“做个投票工具”“做个站会小应用”。先按主路由判定的 `--app-type` 建 app(有数据库需求→`full_stack`,纯前端交互未提数据库→默认 `frontend`),再用 `+chat --message "<用户原话>"` 透传需求,不编造实体、字段或业务细节。
72
73
  - 如果需求过泛,可在 `+chat --message` 中保留原话,并只补一句“请先生成通用版本,后续可继续迭代”,不要用多轮追问阻塞生成。
73
74
 
74
75
  ## 会话落点
75
76
 
76
77
  | 情形 | 动作 |
77
78
  |---|---|
78
- | 全新应用 + 云端生成 | 先 `+create --app-type full_stack` 拿 `app_id`,再 `+session-create` -> `+chat` |
79
+ | 全新应用 + 云端生成 | 先按主路由判定的类型 `+create --app-type <frontend\|full_stack>`(未提数据库默认 frontend)拿 `app_id`,再 `+session-create` -> `+chat` |
79
80
  | 已知 app_id,用户没指定会话 | 先 `+session-list`;有活跃会话时问用户继续现有还是新开 |
80
81
  | 用户说“新开一段/换个话题” | `+session-create` 后再 `+chat` |
81
82
  | 用户说“接着刚才” | 复用上下文 session_id;拿不到就 `+session-list` 让用户选 |
@@ -4,12 +4,12 @@
4
4
 
5
5
  ## 何时用
6
6
 
7
- 用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent:用户要“帮我生成/迭代应用”时,先创建 `full_stack` app,再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。
7
+ 用来创建应用资产并拿到 `app_id`。它不负责把自然语言需求交给云端 Agent:用户要“帮我生成/迭代应用”时,先按 SKILL.md「选择开发路径」判定的 `--app-type`(有数据库需求→`full_stack`,纯前端交互未提数据库→默认 `frontend`)创建 app,再进入 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md) 用 `+session-create` / `+chat` 提交需求。
8
8
 
9
9
  ## 命令骨架
10
10
 
11
11
  - 必填:`--name`、`--app-type`。
12
- - app type 语义取值为 `html` / `full_stack`;CLI 会把输入归一成小写后校验。
12
+ - app type 取值为小写 `html` / `frontend` / `full_stack`;框架按枚举精确校验(不做大小写归一),非法值直接报错。
13
13
  - 可选:`--description`、`--icon-url`。
14
14
 
15
15
  ## 示例
@@ -17,6 +17,9 @@
17
17
  ```bash
18
18
  lark-cli apps +create --name "客户调研问卷" --app-type html
19
19
 
20
+ lark-cli apps +create --name "JSON 格式化工具" --app-type frontend \
21
+ --description "纯前端交互工具,无需数据库"
22
+
20
23
  lark-cli apps +create --name "审批系统" --app-type full_stack \
21
24
  --description "部门审批系统,支持登录、提交申请、多级审批"
22
25
 
@@ -35,5 +38,5 @@ lark-cli apps +create --name "Demo" --app-type html --dry-run
35
38
 
36
39
  创建后按用户路径继续:
37
40
 
38
- - 本地应用开发(含 html 和 full_stack):读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。
41
+ - 本地应用开发(含 html / frontend / full_stack):读 [`lark-apps-local-dev.md`](lark-apps-local-dev.md)。
39
42
  - 云端 Agent 生成/迭代:读 [`lark-apps-cloud-dev.md`](lark-apps-cloud-dev.md)。
@@ -26,7 +26,7 @@ lark-cli apps +get --app-id app_xxx -q '.data.app.app_type'
26
26
  | 字段 | 类型 | 说明 |
27
27
  |------|------|------|
28
28
  | `app_id` | string | 应用唯一标识 |
29
- | `app_type` | string | 应用类型(如 HTML、FULL_STACK、MODERN_HTML) |
29
+ | `app_type` | string | 应用类型(如 HTML、FRONTEND、FULL_STACK、MODERN_HTML) |
30
30
  | `name` | string | 应用显示名称 |
31
31
  | `description` | string | 应用功能说明 |
32
32
  | `icon_url` | string | 应用图标 URL |
@@ -10,7 +10,7 @@
10
10
 
11
11
  - 支持 `--keyword` 按应用名模糊搜索。
12
12
  - `--ownership` 枚举:`all` / `mine` / `shared`(默认 `all` = 我创建的 + 共享给我的;`mine` = 仅我创建;`shared` = 仅共享给我)。
13
- - `--app-type` 枚举:`html` / `full_stack`。
13
+ - `--app-type` 枚举:`html` / `frontend` / `full_stack`。
14
14
  - 分页:`--page-size` 默认 20,`--page-token` 传上一页 cursor。
15
15
 
16
16
  ## 示例
@@ -1,6 +1,6 @@
1
1
  # lark-apps 本地开发
2
2
 
3
- 适用:用户要把妙搭应用(full_stack 或 html)源码拉到本地,用本地 code agent/IDE 开发、调试数据库,再发布。
3
+ 适用:用户要把妙搭应用(full_stack、frontend 或 html)源码拉到本地,用本地 code agent/IDE 开发、再发布。其中调试数据库仅 full_stack 适用(frontend / html 无数据库)。
4
4
 
5
5
  ## 新建 vs 已有应用
6
6
 
@@ -36,6 +36,32 @@ git push origin sprint/default
36
36
  lark-cli apps +release-create --as user --app-id app_xxx --branch sprint/default
37
37
  ```
38
38
 
39
+ ### frontend
40
+
41
+ 纯前端应用(vite-react,无数据库)。流程与 full_stack 基本一致——`+init` 装依赖、`npm run dev`、commit/push/release——差别是无 `+db-*` 调库步骤。后续需要数据库/后端能力时不在本地升级,按 SKILL.md「类型升级」引导到云端会话。
42
+
43
+ ```bash
44
+ # 新建 frontend 应用
45
+ lark-cli apps +create --as user --name "JSON 格式化工具" --app-type frontend \
46
+ --description "纯前端交互工具,无需数据库"
47
+
48
+ # 初始化本地仓库(--dir 取值见下方「领域规则」,勿照抄此处示例值)
49
+ lark-cli apps +init --as user --app-id app_xxx --dir ./json-tool
50
+
51
+ # 进入仓库后按项目脚手架启动(vite-react)
52
+ cd ./json-tool
53
+ npm install
54
+ npm run dev
55
+
56
+ # 开发完成后:提交本次改动 -> git push origin sprint/default -> +release-create
57
+ git add <本次开发的文件>
58
+ git commit -m "feat: ..."
59
+ git push origin sprint/default
60
+ lark-cli apps +release-create --as user --app-id app_xxx --branch sprint/default
61
+ # 发布是异步的:用 +release-get 轮询到 status=finished 才算部署完成、拿到 online_url
62
+ lark-cli apps +release-get --as user --app-id app_xxx --release-id <上一步返回的 release_id>
63
+ ```
64
+
39
65
  ### html
40
66
 
41
67
  #### 首次开发(无 app,无代码)
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 何时用
6
6
 
7
- 用于把应用的代码分支推进到发布流程(html 和 full_stack 统一走此入口)。
7
+ 用于把应用的代码分支推进到发布流程(html / frontend / full_stack 统一走此入口)。
8
8
 
9
9
  ## 命令骨架
10
10
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: lark-base
3
- version: 1.2.3
3
+ version: 1.2.4
4
4
  description: "飞书多维表格(Base)操作:建表、字段、记录、视图、统计、公式/lookup、表单、仪表盘、workflow、角色权限;遇到 Base/多维表格/bitable 或 /base/ 链接时使用。文件导入/导出转 lark-drive,认证/授权转 lark-shared。"
5
5
  metadata:
6
6
  requires:
@@ -30,6 +30,7 @@ metadata:
30
30
 
31
31
  - Base 业务操作只使用 `lark-cli base +...` shortcut,不使用旧聚合式 `+table / +field / +record / +view / +history / +workspace`。
32
32
  - 执行 update 前必须先查当前 shortcut 的 `--help` 或对应 reference。若命令要求完整配置,首次请求必须基于可信的当前配置执行 read-modify-write:只修改用户明确指定的内容,保留其他仍适用的可写配置,并按命令要求的结构提交。若命令支持局部/delta update,按其契约提交最小合法 payload;不得以不完整请求试错补参。
33
+ - Base CLI/OpenAPI 当前不支持视图行高、冻结列、列宽等 UI-only 外观设置。遇到这类需求,说明能力边界并停止,不要猜测未文档化参数或改走 raw API。
33
34
  - 本地文件与 Base 之间的导入/导出转 `lark-drive`,具体格式、参数、路径限制和仅结构导出规则由 `lark-drive` 负责;导入完成后再回到 Base 命令。
34
35
  - 在线复制 Base 使用 `+base-copy`,不要绕行导出/导入。
35
36
  - 认证、初始化、scope、身份切换、权限不足恢复属于 `lark-shared`;Base 文档只保留会影响 Base 路径选择的权限规则。
@@ -54,6 +55,7 @@ metadata:
54
55
  | 查看 Base 内资源目录 | `+base-block-list` | 想先了解一个 Base 里有哪些 table/docx/dashboard/workflow/folder 时优先用它;返回 ID 关系和 fewshot 看 `--help` |
55
56
  | 管理 Base 内资源目录 | `+base-block-create/move/rename/delete` | 创建或整理 Base 直接管理的 folder/table/docx/dashboard/workflow;资源内容继续用对应命令 |
56
57
  | 管理数据表 | `+table-list/get/create/update/delete` | 处理 table 的列出、详情、创建、重命名和删除 |
58
+ | 复制 Base 内单张数据表 | `+table-copy` / `+table-copy-status` | 默认只复制结构;只有用户明确要求复制全表、数据、行或记录时才传 `--range all`;异步任务按返回的 `task_id` 查询或续等 |
57
59
  | 列/查/删字段 | `+field-list/get/delete/search-options` | 写入前用 list/get 确认字段类型、选项、ID;删除前确认目标字段 |
58
60
  | 创建/更新字段 | `+field-create` / `+field-update` | 必读 [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) |
59
61
  | 读记录明细 | `+record-get` / `+record-list` / `+record-search` | 涉及筛选、排序、Top/Bottom N、聚合、多表关联、全局结论时读 [lark-base-data-analysis-sop.md](references/lark-base-data-analysis-sop.md) |
@@ -68,7 +70,7 @@ metadata:
68
70
  | 表单题目创建/更新 | `+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) |
69
71
  | Base 内表单管理 | `+form-list/get/create/update/delete` / `+form-questions-list/delete` | 缺少或不确定归属时,先用 `+table-list` 或 `+base-block-list` 取得真实 `table_id`;这些命令使用 `--base-token + --table-id` 并在整个工作流中复用同一 `table_id`,删除前确认目标表单 |
70
72
  | 分享表单详情 | `+form-detail --share-token <share_token>` | 只接受表单分享链接里的 `share_token`,不要传 `--base-token` / `--form-id`;提交前读 [lark-base-form-detail.md](references/lark-base-form-detail.md) |
71
- | 仪表盘与组件 | `+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` |
73
+ | 仪表盘与组件 | `+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 恢复 |
72
74
  | 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 与启停状态 |
73
75
  | 高级权限与角色 | `+advperm-*` / `+role-*` | 角色操作先读入口 [lark-base-role-guide.md](references/lark-base-role-guide.md);角色 create/update 或解读完整配置再读权限 JSON SSOT [role-config.md](references/role-config.md);系统角色不可删除;关闭高级权限会影响自定义角色 |
74
76
 
@@ -79,6 +81,7 @@ metadata:
79
81
  - `base-block` 只负责资源目录管理,包括创建资源、移动到 folder、重命名和删除;具体资源内容仍走 table/dashboard/workflow 命令。
80
82
  - 新建 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 形状,不要猜字段属性。
81
83
  - `+base-create` 不传 `--table-name` 和 `--fields` 时,会创建一个默认 schema 的初始数据表。
84
+ - `+table-copy` 的安全默认值是只复制表结构;用户没有明确要求记录时省略 `--range`,明确要求包含记录时才传 `--range all`。`--table-id` 可直接使用当前 Base 中的表 ID 或表名。
82
85
  - 表、字段、视图、workflow、dashboard block 的名称和 ID 必须来自真实返回,不要凭用户口述猜。
83
86
  - 存储字段可写;系统字段、`formula`、`lookup` 只读;附件字段走专用 attachment 命令。
84
87
  - 一次性原始记录查询优先用 `+record-list` / `+record-search` 的 filter/sort;聚合分析优先用 `+data-query`;需要长期显示在表中时,才新增 `formula` / `lookup` 字段。
@@ -89,6 +92,7 @@ metadata:
89
92
  ## 身份与权限降级
90
93
 
91
94
  - 默认显式使用 `--as user` 操作用户资源;只有用户明确要求应用身份时,才直接用 `--as bot`。
95
+ - `+table-copy --wait` 提交成功后会在 stderr 打印完整 `task_id`;若进程被 Ctrl-C 终止,可用该 ID 和原身份执行 `+table-copy-status` 续查,不要重新提交复制。
92
96
  - user 身份报 scope/授权不足,或错误中包含 `missing_scopes` / `hint`,先转 `lark-shared` 做用户授权恢复,不要直接降级 bot。
93
97
  - user 身份报资源级无访问且无授权恢复提示时,才可用 `--as bot` 重试一次;bot 仍失败就停止重试并按权限错误处理。
94
98
  - `91403` 或明确不可访问错误不要循环换身份重试。
@@ -111,7 +115,7 @@ metadata:
111
115
  - 优先用写入返回确认结果;返回信息不足或任务明确要求核验时,再读回。
112
116
  - 写记录前先读字段结构;只写存储字段。系统字段、附件字段、`formula`、`lookup` 不作为普通记录写入目标。
113
117
  - 附件上传、下载、删除走专用 `+record-*-attachment` 命令。
114
- - 写字段前先读 [lark-base-field-json.md](references/lark-base-field-json.md);涉及 `formula` / `lookup` 时必须读 [formula-field-guide.md](references/formula-field-guide.md) / [lookup-field-guide.md](references/lookup-field-guide.md)。
118
+ - 写字段前先读 [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)。
115
119
  - 表名、字段名、视图名、workflow 配置中的名称必须来自真实返回;跨表场景还要读取目标表结构。
116
120
  - 删除、角色更新、字段更新、表单提交(`+form-submit`)等高风险操作遵循 CLI 的 confirmation gate,必须带 `--yes`;目标不明确时先用 get/list 消歧。
117
121
  - 批量写入单批最多 200 条;连续写同一表时串行执行,遇到 `1254291` 按短暂等待后重试处理。
@@ -130,7 +134,10 @@ metadata:
130
134
 
131
135
  ## Dashboard / Workflow / Role
132
136
 
133
- - 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`。
137
+ - 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) 的完整读取分支恢复。
138
+ - Dashboard shortcut 不支持指定组件的 `x/y/w/h`、精确位置或尺寸,不能把 `+dashboard-arrange` 静默当作等价实现。用户只要求一般性重排/美化时可执行一次智能重排;用户要求精确结果时先说明限制并询问是否接受自适应布局,接受后才执行。不要探测 raw `lark-cli api`、源码或未公开布局参数。
139
+ - 创建接口成功返回即表示写入成功;只有结果不确定时才额外执行一次 `+dashboard-get` 或 `+dashboard-block-list`。不要仅为确认创建而逐组件调用 `+dashboard-block-get-data`。
140
+ - 用户要读取多个组件的计算结果时,先完整列出组件(`+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 拆成独立模型轮次。
134
141
  - 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、当前启停状态和用户意图。
135
142
  - 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` 只适用于自定义角色,系统角色不可删除;删除角色和关闭高级权限前必须确认目标和影响。
136
143
 
@@ -63,7 +63,8 @@ lark-cli base +dashboard-block-get-data \
63
63
  # 先看仪表盘里有哪些组件
64
64
  lark-cli base +dashboard-block-list \
65
65
  --base-token bascn***************CtadY \
66
- --dashboard-id blkxxxxxxxx
66
+ --dashboard-id blkxxxxxxxx \
67
+ --page-size 100
67
68
 
68
69
  # 再读取某个组件的最终计算结果
69
70
  lark-cli base +dashboard-block-get-data \
@@ -71,6 +72,21 @@ lark-cli base +dashboard-block-get-data \
71
72
  --block-id chtxxxxxxxx
72
73
  ```
73
74
 
75
+ 如果用户要读取多个组件,先通过 `+dashboard-block-list --page-size 100` 取得真实 ID;若返回 `has_more=true`,继续把本页返回的 `page_token` 传给 `--page-token`,直到 `has_more=false`。收齐目标组件并跳过没有计算结果的文本组件后,再在**一个 shell 工具调用**内串行执行。每条命令会依次输出一个完整 JSON envelope;不要把每个 block 拆成独立模型轮次。
76
+
77
+ ```bash
78
+ set -euo pipefail
79
+
80
+ block_ids=(cht_block_1 cht_block_2)
81
+ for block_id in "${block_ids[@]}"; do
82
+ lark-cli base +dashboard-block-get-data \
83
+ --base-token bascn***************CtadY \
84
+ --block-id "$block_id"
85
+ done
86
+ ```
87
+
88
+ 数组中的 ID 必须逐字来自 `+dashboard-block-list` 返回,不要把名称或未经验证的用户文本作为 shell 代码执行。循环仍然是串行 API 调用,只减少模型往返,不裁剪任何组件结果。
89
+
74
90
  如果你需要先确认组件类型、名称或 `data_config`,请先执行:
75
91
 
76
92
  ```bash
@@ -19,7 +19,7 @@ Dashboard 是 Base 中的数据可视化看板,可以把表格数据变成**
19
19
  | 修改组件 | `+dashboard-block-update` | 先读 block 现状,再读 [dashboard-block-data-config.md](dashboard-block-data-config.md) 决定替换哪些顶层 key |
20
20
  | 查看仪表盘有哪些组件 | `+dashboard-get` 或 `+dashboard-block-list` | 本页下方「查看仪表盘」 |
21
21
  | 读取图表计算结果 | `+dashboard-block-get-data` | 返回图表最终数据协议;需要 block 元数据先用 `+dashboard-block-get` |
22
- | 智能重排组件布局 | `+dashboard-arrange` | 用户明确要求重排,或本次会话新建仪表盘的收尾整理;无法指定精确位置 |
22
+ | 智能重排组件布局 | `+dashboard-arrange` | 用户明确要求重排,或本次会话新建仪表盘的收尾整理;无法指定 `x/y/w/h`、精确位置或尺寸 |
23
23
 
24
24
  ## 典型场景工作流
25
25
 
@@ -29,7 +29,7 @@ Dashboard 是 Base 中的数据可视化看板,可以把表格数据变成**
29
29
 
30
30
  - 聚合方式:创建指标卡或分布图时优先把聚合写进 `data_config`,只有 Top N、字段取值探索、复杂筛选校验或 helper 汇总表场景才先用 `+data-query`。
31
31
  - Dry-run 边界:已按模板构造的简单指标卡、分布图、趋势图不需要逐个 `--dry-run` 后再真实创建;只有在调试 JSON、检查请求体、复杂自造 `data_config` 或处理 API validation 错误时才 dry-run。
32
- - 验证方式:通过创建接口返回值确认创建成功与否,只在结果不确定时用 `+dashboard-get` 或 `+dashboard-block-list` 确认仪表盘和组件存在,或调用 `+dashboard-block-get-data`读取计算结果验证。
32
+ - 验证方式:创建接口成功返回即表示写入成功。只有结果不确定时才用一次 `+dashboard-get` 或 `+dashboard-block-list` 确认仪表盘和组件存在;不要仅为确认创建而逐组件调用 `+dashboard-block-get-data`。
33
33
  - 布局方式:`+dashboard-arrange` 仅两种情况使用:① 用户明确要求美化/重排;② 本次会话中从零新建的仪表盘,建完组件后做一次性布局整理。不是创建成功的必要步骤。
34
34
 
35
35
  示例:搭建一个销售数据分析仪表盘
@@ -142,8 +142,10 @@ lark-cli base +dashboard-block-update \
142
142
 
143
143
  > [!CAUTION]
144
144
  > - 排列结果是**服务端智能推荐**,不一定完全符合用户预期
145
- > - 无法指定具体位置(如"第一排放 A,第二排放 B"),排列逻辑是**自适应**的
145
+ > - Dashboard shortcut 无法指定 `x/y/w/h`、精确位置或尺寸(如"第一排放 A""图表撑满整行"),排列逻辑是**自适应**的
146
146
  > - **不建议**在已有仪表盘上自动调用,除非用户明确要求
147
+ > - 用户只要求一般性重排/美化时,可执行一次 `+dashboard-arrange`;用户要求精确结果时,先说明限制并询问是否接受自适应布局,接受后才执行,不能静默替代或声称精确满足
148
+ > - 执行一次 `+dashboard-arrange` 后即停止;不要继续探测 raw `lark-cli api`、源码或未公开布局参数
147
149
 
148
150
  ```bash
149
151
  # 第 1 步:列出仪表盘,定位到目标仪表盘
@@ -163,6 +165,12 @@ lark-cli base +dashboard-arrange \
163
165
  - 想看某个组件的详细 data_config 配置 → 用 **方式 C**
164
166
  - 想看某个图表/指标卡实际算出来的数据 → 用 **方式 D**
165
167
 
168
+ 用户要求读取“全部图表”或“完整仪表盘”时,先用方式 B 分页枚举所有 block:使用 `--page-size 100`;若返回 `has_more=true`,继续把本页返回的 `page_token` 传给 `--page-token`,直到 `has_more=false`。收齐后再对每个 block 收口,不能只返回 get-data 成功的子集:
169
+
170
+ 1. 图表或指标卡:使用方式 D 读取计算结果。
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。
173
+
166
174
  ```bash
167
175
  # 第 1 步:列出仪表盘,定位到当前仪表盘
168
176
  lark-cli base +dashboard-list --base-token xxx
@@ -173,7 +181,10 @@ lark-cli base +dashboard-list --base-token xxx
173
181
  lark-cli base +dashboard-get --base-token xxx --dashboard-id blk_xxx
174
182
 
175
183
  # 方式 B:列出所有组件
176
- lark-cli base +dashboard-block-list --base-token xxx --dashboard-id blk_xxx
184
+ lark-cli base +dashboard-block-list \
185
+ --base-token xxx \
186
+ --dashboard-id blk_xxx \
187
+ --page-size 100
177
188
 
178
189
  # 方式 C:查看某个组件的详细配置
179
190
  lark-cli base +dashboard-block-get --base-token xxx --dashboard-id blk_xxx --block-id chtxxxxxxxx
@@ -184,6 +195,8 @@ lark-cli base +dashboard-block-get-data --base-token xxx --block-id chtxxxxxxxx
184
195
  # 最后:把获取到的现状信息整理好告诉用户
185
196
  ```
186
197
 
198
+ 需要读取多个组件的计算结果时,先用方式 B 获取真实 `block_id`(使用 `--page-size 100`;若 `has_more=true`,继续把返回的 `page_token` 传给 `--page-token`,直到 `has_more=false`),再按 [lark-base-dashboard-block-get-data.md](lark-base-dashboard-block-get-data.md) 的多组件范式,在一个 shell 工具调用内串行读取;不要把每个 block 拆成独立模型轮次。文本组件没有计算结果,应跳过。
199
+
187
200
  ## 组件类型选择
188
201
 
189
202
  组件 `type` 决定展示形式:
@@ -518,6 +518,8 @@
518
518
 
519
519
  Object(对象字段)、Button(按钮字段)、Stage(流程字段)暂时都没有被 CLI 支持。这些字段会展示为 `not_support` 字段并被保护:不允许修改,不允许读取内容。
520
520
 
521
+ 遇到暂不支持的字段类型时,直接说明 Base CLI 当前不支持并停止;不要猜测未注册的字段 JSON、service 或 schema,也不要用其他字段类型冒充目标能力。
522
+
521
523
  ## 6. 易错点
522
524
 
523
525
  - `select` 只有一个类型;不要写 `single_select` / `multi_select`,用 `multiple` 控制是否多选。
@@ -190,7 +190,7 @@ lark-cli contact +search-user --query <query> --as user
190
190
  lark-cli im +chat-search --query <query> --as user
191
191
  ```
192
192
 
193
- > 搜索用户接口不支持 bot 身份,必须用 `--as user`;搜到的 `ou_` open_id 用于日程参与人操作(如添加日程参与人)。
193
+ > 搜索用户/群不支持 bot 身份,必须用 `--as user`。**解析不到或类型不明确时,向用户澄清该参会人类型,不要靠名字形态硬猜类型。**
194
194
 
195
195
  ## 不在本 skill 范围
196
196
 
@@ -5,6 +5,7 @@ description: "飞书云文档(Docx / Wiki 文档):读取和编辑飞书文
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
8
+ skills: ["lark-shared"]
8
9
  cliHelp: "lark-cli docs --help;lark-cli mindnotes --help"
9
10
  ---
10
11
 
@@ -2,24 +2,23 @@
2
2
 
3
3
  用于查看 Docx 历史版本、按 `history_version_id` 回滚,以及查询回滚任务状态。
4
4
 
5
- ## 安全流程
5
+ ## 安全约束
6
6
 
7
- 1. 先用分页接口 `+history-list` 找到目标版本的 `history_version_id`。
8
- 2. 如果用户指定的是 `revision_id`,不要假设它唯一,也不要把 `revision_id` 直接传给 `+history-revert`。先拉一页并在 `entries[]` 中筛选 `revision_id` 相同的候选;如果未匹配到且 `has_more=true`,继续用 `page_token` 翻页;如果已匹配到候选,最多额外再拉一页补齐可能跨页的相邻候选。最终优先根据用户目标时间与 `edit_time` 的接近程度选择最合适的一条,取同一条的 `history_version_id`;如果没有目标时间,或多个候选无法可靠区分,再向用户展示候选版本(`history_version_id`、`revision_id`、`edit_time`、`name/description`)并确认后回滚。
9
- 3. 如果用户指定的是某一时刻但没有指定 `revision_id`,按 `entries[].edit_time` 匹配;优先选择不晚于目标时刻的最近一条历史记录,无法明确匹配时先向用户确认候选版本。
10
- 4. 再用 `+history-revert --history-version-id <history_version_id>` 发起回滚。默认最多等待 30 秒;如果返回 `status: running`,记录 `task_id`。
11
- 5. 用 `+history-revert-status` 轮询 `task_id`,直到状态不再是 `running`。
12
- 6. 回滚完成后,用 `docs +fetch` 读取文档确认内容。
7
+ - `overwrite` 会重建正文和 block ID,且无法保证保留评论等非正文对象。用户要求保留这些对象时,应先说明限制并确认。
8
+ - `overwrite` 返回 warning 或 `partial_success` 时,先核验最新内容。核验失败或发生 revision conflict 时停止,不要再次覆盖。
9
+ - 权限、网络或临时系统错误应保留原错误分类,不得解释为目标版本不存在。
13
10
 
14
11
  ## 按 revision_id 或时间点回滚
15
12
 
16
- 当用户说“回滚到 revision_id=42”“恢复到昨天下午 3 点的版本”这类需求时,流程是:
17
-
18
- 1. 执行 `docs +history-list --doc <doc>` 获取第一页历史记录;`+history-list` 是分页接口,只有 `has_more=true` 且还需要更多候选时才继续传 `--page-token` 翻页。
19
- 2. 如果用户给出 `revision_id`:先筛选当前页中 `entries[].revision_id == 用户给出的 revision_id`。如果未命中且 `has_more=true`,继续拉下一页;如果已经命中候选,最多额外再拉一页,补齐同一个 `revision_id` 可能跨页出现的相邻 `history_version_id`。若用户同时给出目标时间,在候选里选择 `edit_time` 与目标时间最接近的一条;若未给目标时间但候选只有一条,可直接使用;若多个候选无法可靠区分,不要自行取第一条,向用户展示候选并确认。
20
- 3. 如果用户只给出时间:用 `entries[].edit_time` 匹配,选择目标时刻之前最近的一条;如果用户表达的是“最接近某时刻”,则选择绝对时间差最小的一条。
21
- 4. 从最终匹配条目读取 `history_version_id`。`history_version_id` 对应服务端 `minor_history.version`,这是回滚接口需要的 ID。
22
- 5. 执行 `docs +history-revert --doc <doc> --history-version-id <history_version_id>`。
13
+ 1. 使用 `+history-list` 定位目标记录。需要更多候选时,根据 `has_more` 和 `page_token` 翻页。
14
+ - 用户指定 `revision_id`:逐页筛选相同 `revision_id` 的记录。未命中时必须继续翻页至 `has_more=false` 才可进入 fallback;命中位于页尾时,继续读取下一页以收集相邻的同 `revision_id` 候选。多条记录时结合 `edit_time` 选择;无法区分时请用户确认。
15
+ - 用户指定时间:选择不晚于目标时间的最近一条记录;用户明确要求“最接近”时,选择时间差最小的记录。
16
+ 2. 找到目标记录后,使用该记录的 `history_version_id` 调用 `+history-revert`。不要将 `revision_id` 传给回滚接口。返回 `running` 时使用 `+history-revert-status` 查询;只有 `done` 表示成功,其他终态均停止并报告。
17
+ 3. 没有目标记录但用户指定了 `revision_id` 时,可读取目标版本并恢复正文:
18
+ - 使用 `docs +fetch --doc "<doc>" --revision-id <revision_id> --scope full --detail full --format json` 读取目标版本。确认文档一致、返回的 `revision_id` 与目标一致,且 `content` 不是 `<fragment>`。
19
+ - 使用 `docs +fetch --doc "<doc>" --scope full --detail full --format json` 读取当前完整文档,其 `content` 同样不得是 `<fragment>`。目标与当前响应的 `revision_id` 相同时直接结束,不执行 `overwrite`。否则移除目标 `content` 中旧的 block ID,将正文写入任务目录下的相对路径,然后仅执行一次 `docs +update --doc "<doc>" --command overwrite --revision-id <current_revision_id> --content @target.xml`,其中 `current_revision_id` 来自当前文档响应。目标响应包含非空 JSON object 形式的 `reference_map` 时,将其写入相对路径并追加 `--reference-map @target-reference-map.json`;否则省略该参数。`+update` 不支持 `--yes`。
20
+ - 使用 `docs +fetch --doc "<doc>" --scope full --detail full --format json` 读取最新完整文档并核验。忽略重新生成的 block ID,正文结构、文本、链接和引用资源应与目标版本一致。
21
+ 4. 目标版本明确不可读时停止并报告。
23
22
 
24
23
  候选确认时使用类似格式:
25
24
 
@@ -16,12 +16,12 @@ metadata:
16
16
 
17
17
  > **导入分流规则:** 如果用户要把本地 Excel / CSV / `.base` 快照导入成 Base / 多维表格 / bitable,必须优先使用 `lark-cli drive +import --type bitable`。不要先切到 `lark-base`;`lark-base` 只负责导入完成后的表内操作。
18
18
 
19
- > **副本分流规则:** 如果用户要复制在线文档、创建文档副本、把文档复制到另一个文件夹,必须使用 `lark-cli drive files copy`。不要用 `drive +export` 下载后再 `drive +import` 上传,也不要用 `docs +fetch` + `docs +create` 重建正文;导出/导入只用于本地文件转换或离线产物。
19
+ > **副本分流规则:** 如果用户要复制在线文档、创建文档副本、把文档复制到另一个文件夹,必须使用 `lark-cli drive +copy`。不要用 `drive +export` 下载后再 `drive +import` 上传,也不要用 `docs +fetch` + `docs +create` 重建正文;导出/导入只用于本地文件转换或离线产物。
20
20
 
21
21
  ## 快速决策
22
22
 
23
23
  - 用户要把**已有 Wiki 节点移出知识库,放到 Drive 文件夹或“我的空间”根目录**:切到 `lark-wiki`,使用 `lark-cli wiki +move-to-drive`;不要把 Wiki token 直接交给 `drive +move`。这是会改变文档归属和权限继承的写操作,执行前确认源节点与目标位置。
24
- - 用户要**复制文档 / 创建副本 / 另存为副本**时,使用 `lark-cli drive files copy`。先用 `lark-cli schema drive.files.copy --format json` 确认参数;如果来源是 wiki URL/token,先用 `lark-cli drive +inspect` 获取底层 `token` 和 `type`,不要把 wiki token 直接当 `file_token`。`params.file_token` 传源文档 token,`data.folder_token` 传目标文件夹 token,`data.name` 传副本名称,`data.type` 传源文件类型(如 `docx` / `sheet` / `bitable` / `slides`)。示例:`lark-cli drive files copy --params '{"file_token":"<DOC_TOKEN>"}' --data '{"folder_token":"<FOLDER_TOKEN>","name":"<COPY_NAME>","type":"docx"}'`。如返回 `confirmation_required`,按 `lark-shared` 高风险审批协议向用户确认后,在原命令末尾追加 `--yes` 重试。
24
+ - 用户要**复制文档 / 创建副本 到云盘或者文件夹**时,使用 `lark-cli drive +copy`,用法见 [`references/lark-drive-copy.md`](references/lark-drive-copy.md)。如果是要复制文档 / 创建副本到知识库,使用 `wiki +node-copy`(见 [`lark-wiki-node-copy.md`](../lark-wiki/references/lark-wiki-node-copy.md))。
25
25
  - 用户要**识别飞书 / doubao 云空间 URL 的类型和 token**时,可以先按 URL 路径形态做轻量判断;当路径已明确指向 docx / sheet / bitable / slides / file / folder 等资源时,可直接提取对应 token/type。传入 wiki URL、需要识别标题或 canonical URL、URL/token 有歧义,或后续操作依赖底层真实资源时,再使用 `lark-cli drive +inspect --url '<url>'` 进行识别;具体用法、失败处理和边界见 [`references/lark-drive-inspect.md`](references/lark-drive-inspect.md)。
26
26
  - 高风险写操作(删除、公开权限修改、owner 转移、版本删除/回滚、批量移动/覆盖/同步)必须同时满足三个条件才执行:目标已解析为该操作可直接使用的执行对象,执行细节已明确到可直接调用命令(例如删除的 file-token/type、公开权限修改的共享范围、owner 转移的目标 owner、版本删除/回滚的 version id、移动/覆盖/同步的目标位置和冲突策略),且用户在本轮明确确认执行这些具体目标和执行细节。用户只说“删除没用的文件”“开放/共享给大家”“改成开放”“覆盖/移动这些”只表示目标状态;先只读发现并列出候选、权限档位或执行方案,停止等待用户确认。
27
27
  - 用户要**检查 / 治理文档权限、公开范围、链接分享、外部访问、复制下载权限、密级标签、owner 转移**,或要”权限风险报告、收紧权限、申请查看 / 编辑权限、转移 / 批量转移 owner”,必须先阅读 [`references/lark-drive-workflow.md`](references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`permission_governance`](references/lark-drive-workflow-permission-governance.md) workflow。
@@ -52,7 +52,7 @@ metadata:
52
52
  - `drive +inspect` / `drive +upload` 遇到 `not found`、`permission denied`、`missing scope` 时,默认停止重试;只有 `rate limit` 或临时网络错误才适合有限重试。
53
53
 
54
54
  ## 修改标题
55
- - 使用 `drive files patch` 命令,通过new_title字段可以修改标题,支持 docx、sheet、bitable、file、wiki、folder 类型
55
+ - 用户要**重命名 / 改标题 / 改文件名**,使用 `lark-cli drive +update-title`,用法见 [`references/lark-drive-update-title.md`](references/lark-drive-update-title.md)。
56
56
 
57
57
  ## 核心概念
58
58
 
@@ -128,6 +128,7 @@ Shortcut 是对常用操作的高级封装(`lark-cli drive +<verb> [flags]`)
128
128
  | `+sync` | 双向同步本地目录与 Drive 文件夹:拉取 `new_remote`、推送 `new_local`,`modified` 按 `--on-conflict=remote-wins\|local-wins\|keep-both\|ask` 处理;`--quick` 用修改时间近似比较;`--on-duplicate-remote` 支持 `fail` / `newest` / `oldest`;只同步 `type=file`,跳过在线文档和 shortcut,且不会删除两端多余文件。 |
129
129
  | [`+push`](references/lark-drive-push.md) | 将本地目录推送到 Drive 文件夹,支持 skip / smart / overwrite 与确认后删除远端。 |
130
130
  | [`+create-shortcut`](references/lark-drive-create-shortcut.md) | 在另一个文件夹里创建现有 Drive 文件的快捷方式。 |
131
+ | [`+copy`](references/lark-drive-copy.md) | 复制资源到目标文件夹;如果要复制到知识库,使用 `wiki +node-copy`; |
131
132
  | [`+add-comment`](references/lark-drive-add-comment.md) | 给 doc/docx/file/sheet/slides/base(bitable) 添加全文/局部评论;不支持妙搭 apps。 |
132
133
  | [`+list-comments`](references/lark-drive-list-comments.md) | 分页获取评论列表。 |
133
134
  | [`+batch-query-comments`](references/lark-drive-batch-query-comments.md) | 按评论 ID 批量获取评论。 |
@@ -146,6 +147,7 @@ Shortcut 是对常用操作的高级封装(`lark-cli drive +<verb> [flags]`)
146
147
  | [`+version-revert`](references/lark-drive-version-revert.md) | 回滚到指定历史版本。 |
147
148
  | [`+version-delete`](references/lark-drive-version-delete.md) | 删除指定历史版本。 |
148
149
  | [`+move`](references/lark-drive-move.md) | 移动 Drive 文件或文件夹;Wiki 层级移动走 `lark-wiki`。 |
150
+ | [`+update-title`](references/lark-drive-update-title.md) | 重命名文件、文件夹、在线文档或知识库。 |
149
151
  | [`+delete`](references/lark-drive-delete.md) | 删除 Drive 文件或文件夹,文件夹删除会轮询异步任务。 |
150
152
  | [`+task_result`](references/lark-drive-task-result.md) | 查询 import/export/move/delete 等异步任务结果。 |
151
153
  | [`+inspect`](references/lark-drive-inspect.md) | 检视 URL 的类型、标题和 canonical token;wiki URL 会自动解包到底层文档。 |
@@ -170,10 +172,10 @@ lark-cli drive <resource> <method> [flags] # 调用 API
170
172
 
171
173
  ### files
172
174
 
173
- - `copy` — 复制文件;在线文档创建副本的首选能力,完整参数见上方“快速决策”,不要用 `drive +export` / `drive +import` 绕行复制
175
+ - `copy` — 复制文件;优先使用 [`drive +copy`](references/lark-drive-copy.md)
174
176
  - `create_folder` — 新建文件夹
175
177
  - `list` — 获取文件夹下的清单;使用前阅读 [`references/lark-drive-files-list.md`](references/lark-drive-files-list.md)
176
- - `patch` — 修改文件标题
178
+ - `patch` — 修改文件标题;优先使用 [`drive +update-title`](references/lark-drive-update-title.md) shortcut
177
179
 
178
180
  ### permission.members
179
181
 
@@ -70,7 +70,7 @@ API 成功时返回空 `data`(仅 `code: 0, msg: "success"`),对应 CLI
70
70
 
71
71
  ## 与 wiki URL 的关系
72
72
 
73
- 传入 `/wiki/<node_token>` 时,shortcut 会直接用 `node_token` 作为路径参数并以 `type=wiki` 调用接口。如果需要先把 wiki 节点解析成 `obj_token`(例如想显式对底层 docx 申请),自行先调 `wiki spaces get_node` 拿 `obj_token + obj_type`,再用 bare token + `--type docx` 调本命令。
73
+ 传入 `/wiki/<node_token>` 时,shortcut 会直接用 `node_token` 作为路径参数并以 `type=wiki` 调用接口。如果需要先把 wiki 节点解析成 `obj_token`,自行先调用 [`wiki +node-get` shortcut](../../lark-wiki/references/lark-wiki-node-get.md) 拿 `obj_token + obj_type`,再用 bare `obj_token` + `--type <obj_type>` 调本命令。
74
74
 
75
75
  ## 参考
76
76
 
@@ -0,0 +1,87 @@
1
+
2
+ # drive +copy
3
+
4
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
5
+
6
+ 复制一个 Drive 文件(在线文档、表格、多维表格、幻灯片、思维笔记或普通文件)到目标文件夹,生成一个内容相同的新副本。
7
+
8
+ ## 命令
9
+
10
+ ```bash
11
+ # 源文档传 URL(自动识别类型和 token)
12
+ lark-cli drive +copy --url "https://example.larksuite.com/docx/<DOCX_TOKEN>" --name '副本名称' --folder-token <TARGET_FOLDER_TOKEN>
13
+
14
+ # Wiki URL(自动解包底层资源后复制到 Drive)
15
+ lark-cli drive +copy --url "https://example.larksuite.com/wiki/<WIKI_TOKEN>" --name '副本名称' --folder-token <TARGET_FOLDER_TOKEN>
16
+
17
+ # Wiki token
18
+ lark-cli drive +copy --token <WIKI_TOKEN> --type wiki --name '副本名称' --folder-token my_space
19
+ ```
20
+
21
+ ## 参数
22
+
23
+ | 参数 | 必填 | 说明 |
24
+ |------|------|------|
25
+ | `--url` | 与 `--token` 二选一 | 源文档 URL,支持 `doc` / `docx` / `sheet` / `file` / `mindnote` / `slides` / `base` / `bitable` / `wiki` 路径;wiki 会自动解包底层资源 |
26
+ | `--token` | 与 `--url` 二选一 | 源文档 token 或 URL;裸 token 必须配合 `--type` |
27
+ | `--type` | 裸 token 时必填 | 源文件类型:`doc`、`docx`、`sheet`、`file`、`mindnote`、`slides`、`bitable`(`base` 为兼容别名)或 `wiki`;传 URL 时可省略,显式传入时必须与 URL 类型一致 |
28
+ | `--name` | 是 | 副本名称,最长 256 字节 |
29
+ | `--folder-token` | 是 | 目标文件夹 token、文件夹 URL,或常量 `my_space`(复制到当前身份"我的空间"根目录,内部自动解析根 token) |
30
+ | `--extra` | 否 | 可重复的 `key=value` 对,原样透传给 API 的 `extra` 自定义复制参数;典型用法 `--extra target_type=docx`(复制旧版 doc 时转换为 docx 副本) |
31
+
32
+ ## 输入规则
33
+
34
+ - `--url` 与 `--token` 互斥,只传一个
35
+ - `--type` 必须与源文件真实类型一致,类型不匹配时服务端会返回失败
36
+ - `base` 与 `bitable` 是同一概念,CLI 会把 `base` 归一化为 `bitable` 后发给服务端
37
+ - 目标文件夹必须是云空间(云盘/云存储)文件夹 token,不能传 wiki 节点 token
38
+
39
+ ## Wiki 场景
40
+
41
+ `drive +copy` 接受 wiki URL,也接受 `--token <WIKI_TOKEN> --type wiki`。目标仅支持云盘(Drive)文件夹或 `my_space` 根目录;要把副本留在知识库中,使用 `wiki +node-copy`。
42
+
43
+ ## 行为说明
44
+
45
+ - bot 身份复制成功后,CLI 会自动尝试给当前 CLI 用户授予新副本的 `full_access`,结果在输出的 `data.permission_grant` 字段中;授权失败不影响复制本身的成功状态
46
+
47
+ ## 输出
48
+
49
+ ```json
50
+ {
51
+ "ok": true,
52
+ "identity": "bot",
53
+ "data": {
54
+ "copied": true,
55
+ "file_token": "<new_file_token>",
56
+ "file_type": "docx",
57
+ "name": "副本名称",
58
+ "url": "https://example.larksuite.com/docx/<new_file_token>",
59
+ "source_file_token": "<source_file_token>",
60
+ "source_type": "docx",
61
+ "source_wiki_token": "<source_wiki_token, only for wiki input>",
62
+ "folder_token": "<target_folder_token>",
63
+ "permission_grant": {
64
+ "status": "granted",
65
+ "perm": "full_access",
66
+ "member_type": "openid",
67
+ "user_open_id": "<current_user_open_id>",
68
+ "message": "Granted the current CLI user full_access on the new document."
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ `source_wiki_token` 仅 wiki 输入出现;`permission_grant` 仅 bot 身份出现,user 身份复制时 `data` 下没有该字段。
75
+
76
+ ## 常见错误
77
+
78
+ | 错误码 | 含义 | 处理 |
79
+ |---|---|---|
80
+ | `99991672` / `99991679` | 缺失 scope | 按错误里的 `missing_scopes`、`hint` 申请/授权所需 scope 后重试 |
81
+ | `99991400` | 命中接口限频 | 等待一段时间后重试;批量复制时保持串行并降低频率 |
82
+
83
+ ## 参考
84
+
85
+ - [lark-drive](../SKILL.md) -- 云空间(云盘/云存储)全部命令
86
+ - [lark-wiki](../../lark-wiki/SKILL.md) -- 知识库节点复制(`wiki +node-copy`)
87
+ - [lark-shared](../../lark-shared/SKILL.md) -- 认证和全局参数