@amaster.ai/pi-lark 0.1.2-beta.52 → 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 (39) 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-drive/SKILL.md +7 -5
  10. package/skills/lark-drive/references/lark-drive-copy.md +87 -0
  11. package/skills/lark-drive/references/lark-drive-update-title.md +78 -0
  12. package/skills/lark-im/references/lark-im-message-enrichment.md +1 -1
  13. package/skills/lark-im/references/lark-im-messages-search.md +1 -3
  14. package/skills/lark-sheets/SKILL.md +83 -82
  15. package/skills/lark-sheets/references/lark-sheets-batch-update.md +13 -58
  16. package/skills/lark-sheets/references/lark-sheets-chart.md +2 -1
  17. package/skills/lark-sheets/references/lark-sheets-conditional-format.md +1 -1
  18. package/skills/lark-sheets/references/lark-sheets-range-operations.md +5 -5
  19. package/skills/lark-sheets/references/lark-sheets-read-data.md +80 -6
  20. package/skills/lark-sheets/references/lark-sheets-sheet-structure.md +21 -10
  21. package/skills/lark-sheets/references/lark-sheets-styles-put.md +93 -0
  22. package/skills/lark-sheets/references/lark-sheets-visual-standards.md +2 -2
  23. package/skills/lark-sheets/references/lark-sheets-workbook.md +4 -3
  24. package/skills/lark-sheets/references/lark-sheets-write-cells.md +40 -12
  25. package/skills/lark-sheets/scripts/lark_detect_subtables.py +593 -0
  26. package/skills/lark-sheets/scripts/lark_inspect_workbook.py +188 -0
  27. package/skills/lark-sheets/scripts/lark_profile_table.py +614 -0
  28. package/skills/lark-sheets/scripts/lark_sheet_range.py +176 -0
  29. package/skills/lark-sheets/scripts/lark_sheet_read_cli.py +184 -0
  30. package/skills/lark-sheets/scripts/sheets_df.py +21 -3
  31. package/skills/lark-whiteboard/SKILL.md +15 -8
  32. package/skills/lark-whiteboard/references/lark-whiteboard-export.md +4 -3
  33. package/skills/lark-whiteboard/references/lark-whiteboard-update.md +4 -4
  34. package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +19 -17
  35. package/skills/lark-whiteboard/routes/dsl.md +8 -2
  36. package/skills/lark-whiteboard/routes/mermaid.md +1 -1
  37. package/skills/lark-whiteboard/routes/svg-edit.md +5 -2
  38. package/skills/lark-whiteboard/routes/svg.md +3 -1
  39. package/skills/lark-whiteboard/scenes/mention.md +71 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.2-beta.52",
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.52"
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
 
@@ -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
 
@@ -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) -- 认证和全局参数
@@ -0,0 +1,78 @@
1
+ # drive +update-title
2
+
3
+ > **前置条件:** 先阅读 [`../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
4
+
5
+ 重命名云空间(云盘/云存储)里的文件、文件夹、在线文档或知识库节点。
6
+
7
+ ## 命令
8
+
9
+ ```bash
10
+ # 推荐:传 URL(自动识别类型和 token)
11
+ lark-cli drive +update-title \
12
+ --url 'https://example.larksuite.com/docx/<DOCX_TOKEN>' \
13
+ --title '<NEW_TITLE>'
14
+
15
+ # 裸 token 必须显式传 --type
16
+ lark-cli drive +update-title \
17
+ --token <FILE_TOKEN> \
18
+ --type file \
19
+ --title '<NEW_TITLE>.xlsx'
20
+
21
+ # 知识库节点:传 /wiki/ URL 里的 node_token
22
+ lark-cli drive +update-title \
23
+ --url 'https://example.larksuite.com/wiki/<NODE_TOKEN>' \
24
+ --title '<NEW_TITLE>'
25
+ ```
26
+
27
+ ## 参数
28
+
29
+ | 参数 | 必填 | 说明 |
30
+ |------|------|------|
31
+ | `--url` | 与 `--token` 二选一 | 目标 URL,支持 `/docx/`、`/sheets/`、`/base/`、`/bitable/`、`/slides/`、`/file/`、`/drive/folder/`、`/wiki/` |
32
+ | `--token` | 与 `--url` 二选一 | 目标 token 或 URL;裸 token 必须配合 `--type` |
33
+ | `--type` | 裸 token 时必填 | `docx`、`sheet`、`bitable`(`base` 为兼容别名)、`slides`、`file`、`folder`、`wiki`;传 URL 时可省略,显式传入时必须与 URL 类型一致 |
34
+ | `--title` | 是 | 新标题,别名 `--new-title`;不能为空或纯空白,首尾空格会被去掉 |
35
+ | `--on-extension-mismatch` | 否 | 仅 `--type file`:`keep`(默认,标题缺后缀时自动补上当前后缀,后缀不一致时报错)/ `allow`(跳过校验,原样提交)。传给其他 `--type` 会报错 |
36
+
37
+ ## 行为说明
38
+
39
+ - **空标题会被拒绝**:CLI 拒绝空或纯空白的 `--title`
40
+ - **`file` 类型会校验后缀**:`--type file` 的标题就是完整文件名。CLI 会比对 `--title` 与当前文件名的后缀:没有后缀时默认补上当前后缀(输出里用 `extension_appended` 说明),后缀不一致时拦截(`a.md` → `a.txt`)。要跳过校验加 `--on-extension-mismatch=allow`
41
+ - **wiki 不解包**:`--type wiki` 用 `/wiki/` URL 里的 `wiki_token`,传底层文档 token 会 `981003`
42
+ - **不支持旧版 doc 和思维笔记**:服务端不支持改这两类的标题(`type=doc` / `type=mindnote` 返回 `981002 params error`),CLI 在本地就拒绝,不会白发一次写请求
43
+ - **不支持妙搭 apps**:要改妙搭应用标题,切换到 [`lark-apps`](../../lark-apps/SKILL.md) 业务域处理
44
+
45
+ ## 输出
46
+
47
+ ```json
48
+ {
49
+ "updated": true,
50
+ "file_token": "<file_token>",
51
+ "type": "docx",
52
+ "title": "<new_title>",
53
+ "url": "https://example.feishu.cn/docx/<file_token>"
54
+ }
55
+ ```
56
+
57
+ `--type file` 且未用 `allow` 时,额外返回改名前的文件名,改错了可以据此一条命令改回去;自动补了后缀还会带上 `extension_appended`:
58
+
59
+ ```json
60
+ {
61
+ "updated": true,
62
+ "title": "<new_title>.txt",
63
+ "previous_title": "<old_title>.txt",
64
+ "extension_appended": ".txt"
65
+ }
66
+ ```
67
+
68
+ ## 常见错误
69
+
70
+ | 错误码 | 含义 | 处理 |
71
+ |---|---|---|
72
+ | `99991672` / `99991679` | 缺失 scope | 按错误里的 `missing_scopes`、`hint` 申请/授权所需 scope 后重试 |
73
+ | `99991400` | 命中接口限频 | 等待一段时间后重试;批量改名时保持串行并降低频率 |
74
+
75
+ ## 参考
76
+
77
+ - [lark-drive](../SKILL.md) -- 云空间(云盘/云存储)全部命令
78
+ - [lark-shared](../../lark-shared/SKILL.md) -- 认证和全局参数
@@ -36,7 +36,7 @@ Use `--download-resources` when you want the binaries on disk in one pass; other
36
36
 
37
37
  ## Scope requirement
38
38
 
39
- The default enrichment requires `im:message.reactions:read`, already declared in each shortcut's `UserScopes` / `BotScopes` (or `Scopes` for the user-only search command), so the framework's pre-flight check surfaces a `missing_scope` error before the request is sent. Bots that were registered before this scope was added need an incremental authorization in the Feishu developer console; users can run:
39
+ The default enrichment requires `im:message.reactions:read`, already declared in each shortcut's `UserScopes` / `BotScopes` (or `Scopes` for the search command), so the framework's pre-flight check surfaces a `missing_scope` error before the request is sent. Bots that were registered before this scope was added need an incremental authorization in the Feishu developer console; users can run:
40
40
 
41
41
  ```bash
42
42
  lark-cli auth login --scope "im:message.reactions:read"
@@ -6,8 +6,6 @@ Search Feishu messages across conversations. This shortcut automatically perform
6
6
 
7
7
  By default each result message also carries a `reactions` block (counts + details from `im.reactions.batch_query`) when the server has reactions for it, and `update_time` for messages that were actually edited. With `--page-all`, every page is enriched; pass `--no-reactions` to skip the extra round-trip. See [message enrichment](lark-im-message-enrichment.md) for the full contract.
8
8
 
9
- > **User identity only** (`--as user`). Bot identity is not supported.
10
-
11
9
  This skill maps to the shortcut: `lark-cli im +messages-search` (internally calls `POST /open-apis/im/v1/messages/search` + batched `GET /open-apis/im/v1/messages/mget`, then batch-fetches chat context).
12
10
 
13
11
  ## Commands
@@ -84,7 +82,7 @@ lark-cli im +messages-search --query "test" --dry-run
84
82
  | `--page-all` | No | Automatically paginate through all result pages (up to 40 pages) |
85
83
  | `--page-limit <n>` | No | Max pages to fetch when auto-pagination is enabled (default 20, max 40). Setting it explicitly also enables auto-pagination |
86
84
  | `--format <fmt>` | No | Output format: `json` (default) / `pretty` / `table` / `ndjson` / `csv` |
87
- | `--as <identity>` | No | Identity type (defaults to and only supports `user`) |
85
+ | `--as <identity>` | No | Identity type: `user` or `bot` |
88
86
  | `--dry-run` | No | Print the request only, do not execute it |
89
87
 
90
88
  ## Core Constraints