@amaster.ai/pi-lark 0.1.2-beta.38 → 0.1.2-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/pi-lark",
3
- "version": "0.1.2-beta.38",
3
+ "version": "0.1.2-beta.39",
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",
@@ -56,12 +56,12 @@
56
56
  }
57
57
  },
58
58
  "devDependencies": {
59
- "@earendil-works/pi-coding-agent": "0.74.0",
59
+ "@earendil-works/pi-coding-agent": "0.80.3",
60
60
  "typebox": "*",
61
61
  "vitest": "^4.0.0"
62
62
  },
63
63
  "dependencies": {
64
- "@amaster.ai/pi-shared": "0.1.2-beta.38"
64
+ "@amaster.ai/pi-shared": "0.1.2-beta.39"
65
65
  },
66
66
  "scripts": {
67
67
  "fetch-skills": "node scripts/fetch-skills.mjs",
@@ -45,13 +45,15 @@ lark-cli calendar +agenda --as user
45
45
  | 场景 | 前置要求 |
46
46
  |------|----------|
47
47
  | 预约日程/会议、查会议室 | 先读 [lark-calendar-schedule-meeting.md](references/lark-calendar-schedule-meeting.md) |
48
- | 编辑已有日程 | 先定位目标日程 `event_id`;若是重复性日程,必须定位到具体实例的 `event_id`(禁止使用原重复日程 ID) |
48
+ | 编辑已有日程 | 先定位目标日程 `event_id` |
49
+ | 编辑/删除重复性日程 | 先读 [重复性日程操作规范](references/lark-calendar-recurring.md),按操作范围(仅此次/全部/此次及后续)执行 |
49
50
  | 删除/修改后验证 | 等待 2 秒再查询(API 最终一致性),不要告知用户你等待了 |
50
51
  | 调用任何 Shortcut | 先读其对应 reference 文档 |
51
52
 
52
53
  ## 核心概念
53
54
 
54
- - **日程实例(Instance)**:重复性日程展开后的具体时间实例。操作重复日程的某次实例时,必须先定位该实例的 `event_id`,禁止使用原重复日程的 `event_id`。
55
+ - **日程实例(Instance)**:重复性日程展开后的具体时间实例。「仅此次」操作时使用具体实例的 `event_id`;「全部」或「此次及后续」操作时需对原重复性日程操作(使用原日程 `event_id`),并按需处理例外。
56
+ - **重复性日程例外(Exception)**:对重复性日程某次实例做过「仅此次」编辑后产生的独立日程(拥有独立 `event_id`)。删除/更新「全部」时必须同时处理例外,否则例外会残留。
55
57
  - **全天日程(All-day Event)**:只按日期占用、没有具体起止时刻的日程,结束日期是包含在日程时间内的。
56
58
  - **时间块 vs 时间范围**:时间块是具体确定的连续时间段(如 `14:00~15:00`),时间范围是泛指(如"今天下午")。`+room-find` 必须基于确定时间块,不能基于模糊范围。
57
59
  - **会议室(Room)**:"room"不是"房间",是"会议室"。会议室是日程的一种参与人(resource attendee),不能脱离日程单独预定。
@@ -71,6 +73,7 @@ lark-cli calendar +agenda --as user
71
73
  | 从日程获取关联的视频会议 ID 或用户绑定的会议纪要文档 | 本 skill(`+meeting`) |
72
74
  | 从日程进一步拿 AI 智能纪要 / 逐字稿 / 妙记产物 | 先 `+meeting` 取 `meeting_id`,再 [`vc +detail`](../lark-vc/references/lark-vc-detail.md) → [`note +detail`](../lark-note/references/lark-note-detail.md) / [`minutes +detail`](../lark-minutes/references/lark-minutes-detail.md) |
73
75
  | 预约/改约日程、添加/移除参会人、添加/更换会议室、调整时间 | 先判断新建 vs 编辑,再进入 [schedule-meeting 工作流](references/lark-calendar-schedule-meeting.md) |
76
+ | 编辑/删除重复性日程(「改这个重复日程」「删掉后面的」「全部取消」等) | 先读 [重复性日程操作规范](references/lark-calendar-recurring.md),确认操作范围后执行 |
74
77
 
75
78
  ## 任务类型分流
76
79
 
@@ -47,6 +47,7 @@ lark-cli calendar +create --summary "..." --start "..." --end "..." \
47
47
  > 自动设置 `reminders: [{"minutes": 5}]`,默认日程开始前 5 分钟提醒。
48
48
  > 自动设置 `vchat: {"vc_type": "vc"}`,默认日程包含飞书视频会议。如需其他视频会议类型或不含视频会议,请使用完整 API 命令。
49
49
  > 失败保护:若添加参会人失败(如 open_id 错误),CLI 会自动删除刚创建的空日程(回滚,不通知参会人)。
50
+ > 审批会议室:`+create` 不暴露低频字段 `attendees[].approval_reason`。如果会议室要求审批,请使用用户身份先创建日程,再用完整 API `calendar event.attendees create --as user` 添加会议室并传 `approval_reason`。
50
51
 
51
52
  ## 高级用法(完整 API 命令)
52
53
 
@@ -72,9 +73,16 @@ lark-cli calendar events create \
72
73
  lark-cli schema calendar.event.attendees.create
73
74
  ## 添加参会人
74
75
  lark-cli calendar event.attendees create \
76
+ --as user \
75
77
  --params '{"calendar_id":"<CALENDAR_ID>","event_id":"<EVENT_ID>"}' \
76
78
  --data '{"attendees": [{"type": "user", "user_id": "ou_xxx"}]}'
77
79
 
80
+ ## 添加需要审批的会议室(approval_reason 最大 200 字符)
81
+ lark-cli calendar event.attendees create \
82
+ --as user \
83
+ --params '{"calendar_id":"<CALENDAR_ID>","event_id":"<EVENT_ID>"}' \
84
+ --data '{"attendees": [{"type": "resource", "room_id": "omm_xxx", "approval_reason": "申请原因"}]}'
85
+
78
86
  # 可选第三步(推荐):若第二步失败,回滚删除空日程
79
87
  ## 查看完整参数定义
80
88
  lark-cli schema calendar.events.delete
@@ -0,0 +1,90 @@
1
+ # 重复性日程操作规范
2
+
3
+ 重复性日程的编辑/删除分为三种范围:「仅此次」「全部」「此次及后续」。用户未明确范围时,**必须询问确认**。
4
+
5
+ ## 关键概念
6
+
7
+ - **event_id 结构**:`event_id` 的格式为 `{event_uid}_{originalTime}`。普通日程或重复性日程本体的 `originalTime` 为 `0`;例外的 `originalTime > 0`,代表该例外在原重复性序列中本来的时间位置。因此 `{event_uid}_0` 即为原重复性日程的 `event_id`。
8
+ - **原重复性日程**:携带 `rrule` 的日程本体,`event_id` 形如 `{event_uid}_0`。系列的所有属性(标题、时间、rrule、描述等)都挂在本体上。
9
+ - **例外(Exception)**:对某次实例做过「仅此次」编辑后产生的独立日程,`event_id` 形如 `{event_uid}_{originalTime}`(`originalTime > 0`)。通过 `event_uid` 部分即可关联回原重复性日程。
10
+ - 删除/更新原重复性日程 **不会** 级联处理例外——必须手动逐个处理。
11
+
12
+ ## 前置步骤(所有范围通用)
13
+
14
+ 1. 通过 `+agenda` 或 `+search-event` 定位重复性日程,获取原重复性日程的 `event_id`。
15
+ 2. 通过 `events instance_view` 或 `+agenda` 列出实例,识别哪些是例外(`event_id` 中 `originalTime > 0` 的即为例外)。
16
+ 3. 确认用户的操作范围。
17
+
18
+ ## 编辑全部(更新时间)
19
+
20
+ | 步骤 | 命令 | 说明 |
21
+ |------|------|------|
22
+ | 1 | `lark-cli calendar +update --event-id <原重复日程ID> --start ... --end ...` | 更新原重复性日程的时间 |
23
+ | 2 | `lark-cli calendar events delete --params '{"calendar_id":"<CAL_ID>","event_id":"<例外ID>","need_notification":false}'` (逐个) | 时间变更后例外已无意义,必须删除 |
24
+
25
+ > 理由:更新时间会改变重复起止点,例外日程的原始占位已变,若保留会导致时间冲突或残留。
26
+
27
+ ## 编辑全部(更新非时间字段)
28
+
29
+ | 步骤 | 命令 | 说明 |
30
+ |------|------|------|
31
+ | 1 | `lark-cli calendar +update --event-id <原重复日程ID> --summary ... --description ...` | 更新原重复性日程的标题/描述等 |
32
+ | 2 | `lark-cli calendar +update --event-id <例外ID> --summary ... --description ...` (逐个) | 同步更新例外日程的对应字段 |
33
+
34
+ > 理由:例外已脱离原重复性日程独立存在,不会自动继承原日程的更新。
35
+
36
+ ## 删除全部
37
+
38
+ | 步骤 | 命令 | 说明 |
39
+ |------|------|------|
40
+ | 1 | `lark-cli calendar events delete --params '{"calendar_id":"<CAL_ID>","event_id":"<原重复日程ID>","need_notification":true}'` | 删除重复性日程本体 |
41
+ | 2 | `lark-cli calendar events delete --params '{"calendar_id":"<CAL_ID>","event_id":"<例外ID>","need_notification":false}'` (逐个) | 删除所有例外日程 |
42
+
43
+ > 理由:例外是独立实体,删除原重复性日程不会级联删除例外。
44
+
45
+ ## 编辑此次及后续
46
+
47
+ | 步骤 | 命令 | 说明 |
48
+ |------|------|------|
49
+ | 1 | `lark-cli calendar +update --event-id <原重复日程ID> --rrule "FREQ=...;UNTIL=<截止日期>"` | 截短原重复性日程(UNTIL 设为指定时间前一次实例的日期) |
50
+ | 2 | `lark-cli calendar events delete ...` (逐个) | 删除指定时间之后(含)的例外日程 |
51
+ | 3 | `lark-cli calendar +create --summary ... --start <指定时间> --end ... --rrule "FREQ=..." --attendee-ids ...` | 从指定时间开始创建新的重复性日程(即「后续」部分,携带编辑后的内容) |
52
+
53
+ > UNTIL 计算规则:若用户选择「从第 N 次开始编辑」,UNTIL 应设置为第 N-1 次实例的日期(即保留到指定时间之前的最后一次)。
54
+ > 新日程应继承原日程的参会人、会议室等配置(除非用户明确要修改)。
55
+
56
+ ## 删除此次及后续
57
+
58
+ | 步骤 | 命令 | 说明 |
59
+ |------|------|------|
60
+ | 1 | `lark-cli calendar +update --event-id <原重复日程ID> --rrule "FREQ=...;UNTIL=<截止日期>"` | 截短原重复性日程(UNTIL 设为指定时间前一次实例的日期) |
61
+ | 2 | `lark-cli calendar events delete ...` (逐个) | 删除指定时间之后(含)的例外日程 |
62
+
63
+ > 与「编辑此次及后续」的区别:不需要步骤 3(创建新的重复性日程),因为目标是删除后续而非替换。
64
+
65
+ ## 仅此次
66
+
67
+ - **编辑仅此次**:通过 `+agenda` / `+search-event` 定位到具体实例的 `event_id`,然后正常调用 `+update`。
68
+ - **删除仅此次**:定位到具体实例的 `event_id`,调用 `events delete`。
69
+
70
+ ## 用户意图映射
71
+
72
+ | 用户表达 | 操作范围 |
73
+ |----------|----------|
74
+ | 「改这个重复日程的标题」「全部改」「每次都改」 | 编辑全部 |
75
+ | 「删掉这个重复日程」「取消所有」 | 删除全部 |
76
+ | 「从下周开始改时间」「后面的都改」 | 编辑此次及后续 |
77
+ | 「从下周开始不要了」「后面的都删」 | 删除此次及后续 |
78
+ | 「就改这一次」「只删这一次」 | 仅此次 |
79
+ | 未明确范围 | **必须询问用户** |
80
+
81
+ ## 注意事项
82
+
83
+ - 涉及时间戳计算(如推算 UNTIL 日期)时,必须调用系统命令或脚本,禁止心算。
84
+
85
+ ## 参考
86
+
87
+ - [lark-calendar](../SKILL.md) — 日历全部命令
88
+ - [lark-calendar-update](lark-calendar-update.md) — 更新日程 Shortcut
89
+ - [lark-calendar-create](lark-calendar-create.md) — 创建日程 Shortcut
90
+ - [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数
@@ -43,7 +43,7 @@ lark-cli calendar +update \
43
43
 
44
44
  | 参数 | 必填 | 说明 |
45
45
  |------|------|------|
46
- | `--event-id <id>` | 是 | 要更新的日程 ID。重复性日程要先定位到目标实例的 `event_id`,不要直接使用原重复日程 ID |
46
+ | `--event-id <id>` | 是 | 要更新的日程 ID。重复性日程请根据操作范围选择 ID,详见 [重复性日程操作规范](lark-calendar-recurring.md) |
47
47
  | `--calendar-id <id>` | 否 | 日历 ID(省略则使用 `primary`) |
48
48
  | `--summary <text>` | 否 | 新日程标题。仅在显式传入 `--summary` 时更新;若传空字符串,会把标题清空 |
49
49
  | `--description <text>` | 否 | 新日程描述。目前 API 方式不支持编辑富文本描述;如果日程描述通过客户端编辑为富文本内容,则使用 API 更新描述会导致富文本格式丢失。仅在显式传入 `--description` 时更新;若传空字符串,会把描述清空 |
@@ -65,7 +65,7 @@ lark-cli calendar +update \
65
65
  - 只想修改标题、描述、时间或重复规则时,不需要同时传 `--add-attendee-ids` 或 `--remove-attendee-ids`。
66
66
  - 如需替换某个参与人、群组或会议室,使用 `--remove-attendee-ids <旧ID>` + `--add-attendee-ids <新ID>`。
67
67
  - 会议室是 resource attendee,必须使用 `omm_` ID 添加到参会人列表,不能脱离日程单独预定。
68
- - 更新重复性日程的某一次实例时,必须先通过 `+agenda`、`+search-event` 或实例视图定位该实例的 `event_id`。
68
+ - 更新重复性日程时,必须先确定操作范围(仅此次/全部/此次及后续),然后按 [重复性日程操作规范](lark-calendar-recurring.md) 执行。
69
69
  - 如果需要验证更新结果,等待至少 2 秒后再查询,避免同步延迟导致读到旧数据。
70
70
  - 当同一次命令组合多个动作时,执行顺序为“日程字段 -> 移除参会人 -> 添加参会人”。若中途失败,不会自动回滚已成功步骤;错误信息会说明已完成的步骤。
71
71
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: lark-doc
3
3
  version: 2.0.0
4
- description: "飞书云文档(Docx / Wiki 文档):读取和编辑飞书文档内容。当用户给出文档 URL 或 token,或需要查看、创建、编辑文档、插入或下载文档图片附件时使用。文档中嵌入的电子表格、多维表格、画板,先用本 skill 提取 token 再切到对应 skill。当用户给出 doubao.com 的 /docx/ 或 /wiki/ URL/token 时,也应直接使用本 skill;路由依据是 URL 路径模式和 token,而不是域名。不负责文档评论管理,也不负责表格或 Base 的数据操作。"
4
+ description: "飞书云文档(Docx / Wiki 文档):读取和编辑飞书文档内容。当用户给出文档 URL 或 token,或需要查看、创建、编辑文档、插入或下载文档图片附件时使用。文档中嵌入的电子表格、多维表格、画板,先用本 skill 提取 token 再切到对应 skill。当用户给出 doubao.com 的 /docx/ 或 /wiki/ URL/token 时,也应直接使用本 skill;路由依据是 URL 路径模式和 token,而不是域名。不负责文档评论管理,也不负责表格或 Base 的数据操作。当用户明确要操作飞书思维笔记时,也使用本 skill。"
5
5
  metadata:
6
6
  requires:
7
7
  bins: ["lark-cli"]
8
- cliHelp: "lark-cli docs --help; lark-cli docs +create --help; lark-cli docs +fetch --help; lark-cli docs +update --help; lark-cli docs +resource-download --help; lark-cli docs +resource-update --help; lark-cli docs +resource-delete --help"
8
+ cliHelp: "lark-cli docs --help;lark-cli mindnotes --help"
9
9
  ---
10
10
 
11
11
  # docs
@@ -24,12 +24,12 @@ lark-cli docs +update --doc "文档URL或token" --command append --content '<p>
24
24
  **CRITICAL — 执行对应操作前,MUST 先用 Read 工具读取以下文件,缺一不可:**
25
25
  1. [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md) — 认证、权限处理、全局参数(所有操作通用)
26
26
  2. **读取文档(`docs +fetch`)** → 必读 [`lark-doc-fetch.md`](references/lark-doc-fetch.md)(`--scope` / `--detail` 选择、局部读取策略、`<fragment>` / `<excerpt>` 输出结构)
27
- 3. **创建或编辑文档内容** → 必读 [`lark-doc-xml.md`](references/lark-doc-xml.md)(XML 语法规则,仅当用户明确要求 Markdown 时改读 [`lark-doc-md.md`](references/lark-doc-md.md))和 [`lark-doc-style.md`](references/style/lark-doc-style.md)(元素选择、丰富度规则、颜色语义);从零创建时加读 [`lark-doc-create-workflow.md`](references/style/lark-doc-create-workflow.md);编辑已有文档时加读 [`lark-doc-update.md`](references/lark-doc-update.md) 和 [`lark-doc-update-workflow.md`](references/style/lark-doc-update-workflow.md)
27
+ 3. **创建或编辑文档内容** → 必读 [`lark-doc-xml.md`](references/lark-doc-xml.md)(XML 语法规则,仅当用户明确要求 Markdown 时改读 [`lark-doc-md.md`](references/lark-doc-md.md))和必读 [`lark-doc-style.md`](references/style/lark-doc-style.md)(写作原则:默认段落、按体裁、组件克制);从零创建时加读 [`lark-doc-create-workflow.md`](references/style/lark-doc-create-workflow.md);编辑已有文档时加读 [`lark-doc-update.md`](references/lark-doc-update.md) 和 [`lark-doc-update-workflow.md`](references/style/lark-doc-update-workflow.md)
28
28
 
29
29
  **未读完以上文件就执行相应操作会导致参数选择错误或格式错误。**
30
30
 
31
31
  > **格式选择规则(全局):**
32
- > - **创建 / 导入场景**(`docs +create`,或 `docs +update --command append/overwrite` 的整段写入):XML 和 Markdown 都可以。用户提供 `.md` 本地文件、或明确说"导入 Markdown"时,直接用 Markdown;否则默认 XML(可用 callout、grid、checkbox 等富 block)。
32
+ > - **创建 / 导入场景**(`docs +create`,或 `docs +update --command append/overwrite` 的整段写入):XML 和 Markdown 都可以。用户提供 `.md` 本地文件、或明确说"导入 Markdown"时,直接用 Markdown;否则默认 XML。
33
33
  > - **精准编辑场景**(`docs +update` 的 `str_replace` / `block_insert_after` / `block_replace` / `block_delete` / `block_move_after` 等局部精修指令):优先使用 XML(`--doc-format xml`,即默认值)。XML 能稳定表达 block 结构和样式,局部精修更可控;不要因为 Markdown 更简单就自行切换。
34
34
 
35
35
  ## 快速决策
@@ -39,12 +39,14 @@ lark-cli docs +update --doc "文档URL或token" --command append --content '<p>
39
39
  - 连续执行多个文档写操作时,必须按 [`lark-doc-update.md`](references/lark-doc-update.md) 的「Block ID 生命周期」判断旧 block ID 是否还能复用;`overwrite` / `block_replace` / `block_delete` 后不要复用受影响的旧 ID,插入 / 复制后要重新 fetch 才能拿到新 block ID
40
40
  - 用户需要在文档内**创建、复制或移动**资源块(画板、电子表格、多维表格等)时,必须先读取 [`lark-doc-xml.md`](references/lark-doc-xml.md) 的「三、资源块」章节
41
41
  - 写文档时,由内容和用户意图决定表达形式;流程、架构、路线图、关键指标等信息可以使用画板,但不要默认把重要信息都画板化
42
- - 新增画板必须隔离到 SubAgent:简单图由 SubAgent 直接插入 `<whiteboard type="svg">完整 SVG</whiteboard>`,不读 `lark-whiteboard`;复杂图才由主 Agent 先建 `<whiteboard type="blank"></whiteboard>`,再启动 SubAgent 读取 `lark-whiteboard` 写入
42
+ - 新增或更新画板时,按 [`lark-doc-whiteboard.md`](references/lark-doc-whiteboard.md) 选型;Mermaid 可由主 Agent 直接插入,SVG / 复杂图 / 已有画板更新按其中流程隔离到 SubAgent
43
43
  - 用户说"看一下文档里的图片/附件/素材""预览素材" → 用 `lark-cli docs +media-preview`
44
44
  - 用户明确说"下载素材" → 用 `lark-cli docs +media-download`
45
+ - 用户想把文档回滚到某个 `revision_id` 或某一时刻 → 先读 [`lark-doc-history.md`](references/lark-doc-history.md),按其中流程操作
45
46
  - 用户明确说"下载/更新/删除文档封面图" → 用 `lark-cli docs +resource-download/+resource-update/+resource-delete --type cover`
46
47
  - `resource-*` 目前仅支持 Docx 封面资源;其他图片、附件或素材请走 `+media-*`
47
48
  - 如果目标是画板/whiteboard/画板缩略图 → 只能用 `lark-cli docs +media-download --type whiteboard`(不要用 `+media-preview`)
49
+ - 用户明确要操作思维笔记时;已有**思维笔记**,走 [思维笔记链路](references/lark-doc-mindnote.md);新建**思维笔记**,走 [lark-doc-whiteboard](references/lark-doc-whiteboard.md)
48
50
  - 拿到 spreadsheet URL/token 后 → 切到 `lark-sheets` 做对象内部操作
49
51
  - 用户需要统计文档的**总字数 / 总字符数**(word count / character count)时,先读取 [`lark-doc-word-stat.md`](references/lark-doc-word-stat.md),并按其中流程调用 [`scripts/doc_word_stat.py`](scripts/doc_word_stat.py);统计口径以该脚本为准,不要改用其他方式自行计算。
50
52
  - 用户说"给文档加评论""查看评论""回复评论""给评论加/删除表情 reaction" → 切到 `lark-drive` 处理
@@ -68,6 +70,7 @@ Shortcut 是对常用操作的高级封装(`lark-cli docs +<verb> [flags]`)
68
70
  | [`+create`](references/lark-doc-create.md) | Create a Lark document (XML / Markdown) |
69
71
  | [`+fetch`](references/lark-doc-fetch.md) | Fetch Lark document content (XML / Markdown / im-markdown; `im-markdown` only after fetch for `lark-im`) |
70
72
  | [`+update`](references/lark-doc-update.md) | Update a Lark document (str_replace / block_insert_after / block_replace / ...) |
73
+ | [`+history-list` / `+history-revert` / `+history-revert-status`](references/lark-doc-history.md) | List document history, revert to a `history_version_id`, and query revert task status |
71
74
  | [`+media-insert`](references/lark-doc-media-insert.md) | Insert a local image or file at the end of a Lark document (4-step orchestration + auto-rollback). Prefer `--from-clipboard` when the image is already on the system clipboard (screenshots, copy from Feishu/browser); use `--file` only for on-disk sources. |
72
75
  | [`+media-download`](references/lark-doc-media-download.md) | Download document media or whiteboard thumbnail (auto-detects extension) |
73
76
  | [`+media-preview`](references/lark-doc-media-preview.md) | Preview document media file (auto-detects extension) |
@@ -2,14 +2,14 @@
2
2
 
3
3
  > **前置条件(MUST READ):** 生成文档内容前,必须先用 Read 工具读取以下文件,缺一不可:
4
4
  > 1. [`lark-doc-xml.md`](lark-doc-xml.md) — XML 语法规则(使用 Markdown 格式时改读 [`lark-doc-md.md`](lark-doc-md.md))
5
- > 2. [`lark-doc-style.md`](style/lark-doc-style.md) — 排版指南(元素选择、丰富度规则、颜色语义)
6
- > 3. [`lark-doc-create-workflow.md`](style/lark-doc-create-workflow.md) — 从零创作工作流(Code-Act Loop、并行执行策略)
5
+ > 2. [`lark-doc-style.md`](style/lark-doc-style.md) — 写作原则(默认段落、按体裁、组件克制)
6
+ > 3. [`lark-doc-create-workflow.md`](style/lark-doc-create-workflow.md) — 从零创作工作流(Code-Act Loop、单 Agent 串行撰写)
7
7
  >
8
8
  > **未读完以上文件就生成内容会导致格式错误。**
9
9
 
10
10
  从 XML(默认)或 Markdown 内容创建一个新的飞书云文档。
11
11
 
12
- > **⚠️ 格式选择规则:** 创建 / 导入场景下 XML 和 Markdown 都可以——用户提供 `.md` 本地文件、或明确说"导入 Markdown"时,直接用 Markdown;没有明确指示时默认 XML(表达能力更强,支持 callout、grid、checkbox 等富 block 类型)。不要在用户没要求的情况下主动从 XML 切到 Markdown,也不要在用户已给出 Markdown 时强行改成 XML。
12
+ > **⚠️ 格式选择规则:** 创建 / 导入场景下 XML 和 Markdown 都可以——用户提供 `.md` 本地文件、或明确说"导入 Markdown"时,直接用 Markdown;没有明确指示时默认 XML(表达能力更强,可承载更丰富的结构化内容)。不要在用户没要求的情况下主动从 XML 切到 Markdown,也不要在用户已给出 Markdown 时强行改成 XML。
13
13
 
14
14
  ## 命令
15
15
 
@@ -72,8 +72,8 @@ lark-cli docs +create --doc-format markdown --title "项目计划" --content $'#
72
72
 
73
73
  ## 参考
74
74
 
75
- - [`lark-doc-create-workflow.md`](style/lark-doc-create-workflow.md) — 从零创作工作流(Code-Act Loop、并行执行策略)
76
- - [`lark-doc-style.md`](style/lark-doc-style.md) — 文档样式指南(元素选择 + 丰富度规则 + 颜色语义)
75
+ - [`lark-doc-create-workflow.md`](style/lark-doc-create-workflow.md) — 从零创作工作流(Code-Act Loop、单 Agent 串行撰写)
76
+ - [`lark-doc-style.md`](style/lark-doc-style.md) — 文档写作原则(默认段落、按体裁、组件克制)
77
77
  - [`lark-doc-xml.md`](lark-doc-xml.md) — XML 语法规范
78
78
  - [`lark-doc-fetch.md`](lark-doc-fetch.md) — 获取文档
79
79
  - [`lark-doc-update.md`](lark-doc-update.md) — 更新文档
@@ -0,0 +1,107 @@
1
+ # docs history(历史版本与回滚)
2
+
3
+ 用于查看 Docx 历史版本、按 `history_version_id` 回滚,以及查询回滚任务状态。
4
+
5
+ ## 安全流程
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` 读取文档确认内容。
13
+
14
+ ## 按 revision_id 或时间点回滚
15
+
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>`。
23
+
24
+ 候选确认时使用类似格式:
25
+
26
+ ```text
27
+ 同一个 revision_id 命中多个历史版本,请确认要回滚哪一条:
28
+ - history_version_id=11 revision_id=42 edit_time=2026-06-22T12:24:45Z name=...
29
+ - history_version_id=12 revision_id=42 edit_time=2026-06-22T12:25:14Z name=...
30
+ ```
31
+
32
+ ## 命令
33
+
34
+ ```bash
35
+ # 列出历史版本
36
+ lark-cli docs +history-list --doc "<docx_url_or_token>" --page-size 20
37
+
38
+ # 翻页
39
+ lark-cli docs +history-list --doc "<docx_url_or_token>" --page-size 20 --page-token "<page_token>"
40
+
41
+ # 回滚到指定 history_version_id(默认等待 30000ms)
42
+ lark-cli docs +history-revert --doc "<docx_url_or_token>" --history-version-id 42
43
+
44
+ # 只发起任务,不等待
45
+ lark-cli docs +history-revert --doc "<docx_url_or_token>" --history-version-id 42 --wait-timeout-ms 0
46
+
47
+ # 查询回滚任务状态
48
+ lark-cli docs +history-revert-status --doc "<docx_url_or_token>" --task-id "<task_id>"
49
+ ```
50
+
51
+ ## 参数
52
+
53
+ | 命令 | 参数 | 必填 | 说明 |
54
+ |-|-|-|-|
55
+ | `+history-list` | `--doc` | 是 | Docx URL/token,或可解析为 Docx 的 wiki URL |
56
+ | `+history-list` | `--page-size` | 否 | 返回条数,范围 `1-20`,默认 `20` |
57
+ | `+history-list` | `--page-token` | 否 | 上一页返回的 `page_token` |
58
+ | `+history-revert` | `--doc` | 是 | Docx URL/token,或可解析为 Docx 的 wiki URL |
59
+ | `+history-revert` | `--history-version-id` | 是 | `+history-list` 返回的 `history_version_id`,必须大于 0 |
60
+ | `+history-revert` | `--wait-timeout-ms` | 否 | 等待回滚完成的毫秒数,范围 `0-30000`,默认 `30000` |
61
+ | `+history-revert-status` | `--doc` | 是 | 同一个文档 |
62
+ | `+history-revert-status` | `--task-id` | 是 | `+history-revert` 返回的 `task_id` |
63
+
64
+ ## 返回值要点
65
+
66
+ `+history-list` 返回:
67
+
68
+ ```json
69
+ {
70
+ "entries": [
71
+ {
72
+ "revision_id": 42,
73
+ "history_version_id": "11",
74
+ "edit_time": "1780000000",
75
+ "type": 1,
76
+ "name": "版本名",
77
+ "description": "版本说明",
78
+ "editor_ids": ["ou_xxx"]
79
+ }
80
+ ],
81
+ "has_more": true,
82
+ "page_token": "page_token"
83
+ }
84
+ ```
85
+
86
+ `+history-revert` 返回:
87
+
88
+ ```json
89
+ {
90
+ "task_id": "task_xxx",
91
+ "status": "running",
92
+ "history_version_id": "11",
93
+ "poll_after_ms": 10000
94
+ }
95
+ ```
96
+
97
+ `+history-revert-status` 返回:
98
+
99
+ ```json
100
+ {
101
+ "status": "partial_failed",
102
+ "history_version_id": "11",
103
+ "failed_block_tokens": ["blk_xxx"]
104
+ }
105
+ ```
106
+
107
+ `status` 可能是 `running`、`done`、`partial_failed`、`failed`。当状态是 `partial_failed` 或 `failed` 时,优先检查 `failed_block_tokens`。
@@ -0,0 +1,113 @@
1
+ # 飞书思维笔记(Mindnote)
2
+
3
+ > **前置条件:** 先阅读 [`../SKILL.md`](../SKILL.md) 和 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和路由规则。
4
+
5
+ 当用户要操作思维笔记时,入口属于 `lark-doc`,但实际执行命令使用 `lark-cli mindnotes nodes list/create`,不是 `docs +...`。
6
+
7
+ > [!IMPORTANT]
8
+ > 当前这条链路只支持**读取已有思维笔记**,以及在**已有思维笔记**里读取节点、创建子节点。
9
+ > `mindnotes nodes create` 是新增/更新节点命令,**不是**新建一个新的思维笔记。
10
+ > 如果用户要**新建思维笔记**,不要走本链路,改走 [lark-doc-whiteboard](lark-doc-whiteboard.md)。
11
+
12
+ ## 命令
13
+
14
+ ```bash
15
+ # 先看命令帮助
16
+ lark-cli mindnotes nodes list --help
17
+ lark-cli mindnotes nodes create --help
18
+
19
+ # 读取节点列表
20
+ lark-cli mindnotes nodes list --mindnote-id "<mindnote_token>"
21
+
22
+ # 创建子节点
23
+ lark-cli mindnotes nodes create \
24
+ --mindnote-id "<mindnote_token>" \
25
+ --data '{"client_token":"<client_token>","nodes":[{"parent_id":"node_parent123","texts":[{"element_type":"text","text":{"content":"子节点内容"}}],"highlight":"yellow","finish":false}]}'
26
+
27
+ # 更新已有节点
28
+ lark-cli mindnotes nodes create \
29
+ --mindnote-id "<mindnote_token>" \
30
+ --data '{"client_token":"<client_token>","nodes":[{"node_id":"node_existing123","texts":[{"element_type":"text","text":{"content":"更新后的节点内容"}}],"highlight":"blue","finish":true}]}'
31
+ ```
32
+
33
+ ## 参数
34
+
35
+ ### `mindnotes nodes list`
36
+
37
+ | 参数 | 必填 | 说明 |
38
+ |------|------|------|
39
+ | `--mindnote-id` | 是 | 思维笔记 token / 唯一标识 |
40
+
41
+ 返回重点:`data.nodes` 中常见字段有 `node_id`、`parent_id`、`texts`、`notes`、`images`、`finish`、`highlight`。
42
+
43
+ ### `mindnotes nodes create`
44
+
45
+ 命令参数:
46
+
47
+ | 参数 | 必填 | 说明 |
48
+ |------|------|------|
49
+ | `--mindnote-id` | 是 | 思维笔记 token / 唯一标识 |
50
+ | `--data` | 是 | JSON 请求体 |
51
+
52
+ 请求体字段:
53
+
54
+ | 字段 | 必填 | 说明 |
55
+ |------|------|------|
56
+ | `client_token` | 否 | 幂等 token,建议写操作传入;推荐使用时间戳或 UUID |
57
+ | `nodes` | 是 | 待创建或更新的节点数组 |
58
+ | `nodes[].node_id` | 否 | 节点 ID;传入已有 `node_id` 时表示更新对应节点 |
59
+ | `nodes[].parent_id` | 否 | 父节点 ID;创建子节点时传入 |
60
+ | `nodes[].texts` | 否 | 节点正文富文本数组 |
61
+ | `nodes[].notes` | 否 | 节点备注富文本数组 |
62
+ | `nodes[].images` | 否 | 节点图片列表 |
63
+ | `nodes[].highlight` | 否 | `red` / `yellow` / `pink` / `blue` / `cyan` / `olive` / `grey` |
64
+ | `nodes[].finish` | 否 | 节点完成状态 |
65
+
66
+ 富文本字段 `texts` / `notes` 是元素数组。最常见的是:
67
+
68
+ ```json
69
+ [{"element_type":"text","text":{"content":"节点内容"}}]
70
+ ```
71
+
72
+ ### 节点图片(`nodes[].images`)
73
+
74
+ `nodes[].images` 接收的是**图片 token**,不是本地文件路径,也不是 URL。
75
+
76
+ ```bash
77
+ # 先上传图片,拿到 token
78
+ lark-cli docs +media-upload --file ./image.png --parent-type mindnote_image --parent-node <mindnote_token>
79
+
80
+ # 再把 token 写进节点
81
+ lark-cli mindnotes nodes create \
82
+ --mindnote-id "<mindnote_token>" \
83
+ --data '{"client_token":"<client_token>","nodes":[{"node_id":"node_existing123","images":[{"token":"canonical_token"}]}]}'
84
+ ```
85
+
86
+ 参数说明:
87
+
88
+ | 参数 | 必填 | 说明 |
89
+ |------|------|------|
90
+ | `--file` | 是 | 本地图片路径 |
91
+ | `--parent-type` | 是 | 上传目标类型;图片使用 `mindnote_image` |
92
+ | `--parent-node` | 是 | 传 Mindnote 的 token |
93
+ | `nodes[].images[].token` | 是 | 上传后返回的图片 token |
94
+
95
+ ## 推荐工作流
96
+
97
+ 1. 先判断用户目标是不是“新建一个思维笔记”。
98
+ 2. 如果是新建思维笔记,切到 [lark-doc-whiteboard](lark-doc-whiteboard.md)。
99
+ 3. 如果是操作已有思维笔记,先通过 token 类别判断。
100
+ 4. 确认是 **Mindnote** 后再拿到 `mindnote_id`。
101
+ 5. 先执行 `mindnotes nodes list`,确认目标 `parent_id`。
102
+ 6. 新增子节点时,在 `nodes[]` 里传 `parent_id`;更新已有节点时,在 `nodes[]` 里传已有 `node_id`。
103
+ 7. 再执行 `mindnotes nodes create`。
104
+ 8. 写操作优先带 `client_token`,推荐使用时间戳或 UUID,避免重试时重复创建或重复更新。
105
+
106
+ > [!CAUTION]
107
+ > `mindnotes nodes create` 是写操作。创建时确认插入位置,更新时确认 `node_id` 指向的就是目标节点。
108
+
109
+ ## 参考
110
+
111
+ - [lark-doc-fetch](lark-doc-fetch.md) — 获取文档内容
112
+ - [lark-doc-whiteboard](lark-doc-whiteboard.md) — 新建思维笔记走画板链路
113
+ - [lark-shared](../../lark-shared/SKILL.md) — 认证和全局参数
@@ -3,8 +3,8 @@
3
3
 
4
4
  > **前置条件(MUST READ):** 生成文档内容前,必须先用 Read 工具读取以下文件,缺一不可:
5
5
  > 1. [`lark-doc-xml.md`](lark-doc-xml.md) — XML 语法规则(使用 Markdown 格式时改读 [`lark-doc-md.md`](lark-doc-md.md))
6
- > 2. [`lark-doc-style.md`](style/lark-doc-style.md) — 排版指南(元素选择、丰富度规则、颜色语义)
7
- > 3. [`lark-doc-update-workflow.md`](style/lark-doc-update-workflow.md) — 改写增强工作流(Code-Act Loop、并行执行策略)
6
+ > 2. [`lark-doc-style.md`](style/lark-doc-style.md) — 写作原则(默认段落、按体裁、组件克制)
7
+ > 3. [`lark-doc-update-workflow.md`](style/lark-doc-update-workflow.md) — 改写增强工作流(Code-Act Loop、单 Agent 串行改写)
8
8
  >
9
9
  > **未读完以上文件就生成内容会导致格式错误。**
10
10
 
@@ -232,7 +232,7 @@ lark-cli docs +update --doc "<doc_id>" --command str_replace \
232
232
 
233
233
  > **`docs +update` 不能直接编辑已有画板的内容。** 本命令只能**新增**画板块;要修改已有画板,先用 `docs +fetch` 取到 `<whiteboard token="...">`,再按 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md) 启动 SubAgent 读取 [`lark-whiteboard`](../../lark-whiteboard/SKILL.md) 并写入。
234
234
 
235
- 画板的语法选型与插入示例见 [`lark-doc-style.md`](style/lark-doc-style.md) 的「画板语法与插入」章节。
235
+ 画板的语法选型与插入示例见 [`lark-doc-xml.md`](lark-doc-xml.md) 与 [`lark-doc-whiteboard.md`](lark-doc-whiteboard.md)。
236
236
 
237
237
  ## 最佳实践
238
238
 
@@ -252,8 +252,8 @@ lark-cli docs +update --doc "<doc_id>" --command str_replace \
252
252
 
253
253
  ## 参考
254
254
 
255
- - [`lark-doc-update-workflow.md`](style/lark-doc-update-workflow.md) — 改写增强工作流(Code-Act Loop、并行执行策略)
256
- - [`lark-doc-style.md`](style/lark-doc-style.md) — 文档样式指南(元素选择 + 丰富度规则 + 颜色语义)
255
+ - [`lark-doc-update-workflow.md`](style/lark-doc-update-workflow.md) — 改写增强工作流(Code-Act Loop、单 Agent 串行改写)
256
+ - [`lark-doc-style.md`](style/lark-doc-style.md) — 文档写作原则(默认段落、按体裁、组件克制)
257
257
  - [`lark-doc-xml.md`](lark-doc-xml.md) — XML 语法规范
258
258
  - [`lark-doc-fetch.md`](lark-doc-fetch.md) — 获取文档
259
259
  - [`lark-doc-create.md`](lark-doc-create.md) — 创建文档
@@ -13,6 +13,13 @@ lark-cli docs +fetch --doc "$URL" --doc-format xml --detail full --format json \
13
13
 
14
14
  `$URL` 可以是用户给出的 docx/wiki URL,也可以是可被 `docs +fetch` 解析的 token。
15
15
 
16
+ ## 统计范围
17
+
18
+ 先判断用户要求的是**整篇文档**还是**局部内容**:
19
+
20
+ - 整篇文档的总字数 / 总字符数:按上方「调用方式」抓取 `full` 内容后统计。
21
+ - 本次新增 / 替换 / 改写片段的字数:优先统计拟写内容本身;内容已写入文档时,只 fetch 对应 block / range 后统计。不得用整篇文档字数对比局部目标。
22
+
16
23
  如需在自动化或回归验证中发现未覆盖块类型,追加严格参数:
17
24
 
18
25
  ```bash
@@ -36,6 +43,15 @@ lark-cli docs +fetch --doc "$URL" --doc-format xml --detail full --format json \
36
43
 
37
44
  如果 `unknown_blocks` 或 `unsupported_blocks` 非空,回复用户时要说明“已统计可提取文本,但存在未覆盖块,结果可能偏低”,并列出对应块类型。为空时可直接给出结果。
38
45
 
46
+ ## 字数遵循校验
47
+
48
+ 当用户给了明确字数要求(写 N 字 / x-y 字 / x 字左右 / 上下浮动)时执行;没有明确字数要求则跳过。字数必须按本文流程用脚本统计,不要自己估。
49
+
50
+ 1. 先按「统计范围」确认统计对象,再把要求归一成目标区间:`>x`→`[x+1, +∞)`;`<y`→`(-∞, y-1]`;`x-y`→`[x, y]`;`x 字左右`→`[round(0.9x), round(1.1x)]`
51
+ 2. 按统计对象选择对应输入并调用脚本统计实际字数,读取输出里的 `word_count`
52
+ 3. 对比 `word_count` 与目标区间:区间内即通过;低于下限 → 补充**实质内容**(非注水);高于上限 → 删减冗余内容。改完重新统计
53
+ 4. **最多 2 轮**。2 轮后仍不达标:停止,不得为达标而注水或删关键内容;如实汇报【目标区间 / 当前字数 / 差值与方向 / 已试 2 轮 / 未达原因】,**禁止谎称达标**
54
+
39
55
  ## 输出示例
40
56
 
41
57
  输入正文等价于:`标题` + `一个苹果是 an apple。` 时,输出形态如下:
@@ -7,7 +7,7 @@
7
7
  通过自适应的 **Code-Act Loop** 驱动文档创作,而非固定模板式的工作流。每次任务都循环执行:
8
8
 
9
9
  1. **Plan(规划)** — 根据用户目标和文档当前状态,评估下一步该做什么
10
- 2. **Execute(执行)** — 运行相应的 `lark-cli docs` 命令,或 **spawn** Agent 子任务并行推进
10
+ 2. **Execute(执行)** — 由主 Agent 自己运行 `lark-cli docs` 命令推进正文;仅画板渲染按需隔离到 SubAgent(见步骤三)
11
11
  3. **Observe(观察)** — 检查命令输出,验证正确性,确认内容是否满足用户目标
12
12
  4. **Iterate(迭代)** — 如需调整,回到 Plan 继续循环
13
13
 
@@ -16,44 +16,31 @@
16
16
 
17
17
  ## 典型 Code-Act Loop 流程
18
18
 
19
- ### 步骤一:规划与初始创建(串行)
19
+ ### 步骤一:规划与撰写(单 Agent 串行)
20
+
21
+ 正文由主 Agent 串行维护,**不按章节拆给并行 Agent**,避免上下文割裂、重复矛盾和全文级约束失效。
20
22
 
21
23
  1. 分析用户需求:受众、目的、范围
22
24
  2. 设计大纲:根据任务自然选择结构。可以是短文、纪要、FAQ、方案、报告、清单或其他形式;不要默认套固定章节、固定开头或固定富 block 配比
23
- 3. `docs +create` 创建文档。长文档可**只建骨架**:标题 + 各级标题 + 每节一句占位摘要;短文档可以一次写入完整内容
24
- - ⚠️ 创建较长文档时,**不要**一次性把完整章节内容塞进 `--content`。超长 `--content` 容易触发字符/参数限制。
25
- - 完整内容留到步骤二,由各 Agent 用 `block_insert_after --block-id <章节标题 block_id>` 分段写入。
26
- - ⚠️ **`@file` 路径限制**:`--content @file` 只接受当前工作目录下的相对路径,传绝对路径(如 `@/tmp/xxx.md`)会报 `unsafe file path`。需要落盘时,将文件写在 cwd 下,用完自行清理。
27
-
28
- ### 步骤二:分段撰写(并行 Agent)
29
-
30
- 4. Spawn Agent 并行撰写各章节。每个 Agent 需收到:
31
- - 文档 token、负责的章节范围、用户目标、目标读者和已有风格线索
32
- - `lark-doc-xml.md` 和 `lark-doc-style.md` 的完整路径(Agent 须先读取)
33
- - 使用 `block_insert_after --block-id <章节标题 block_id>` 写入对应章节内容
34
-
35
- ### 步骤三:整合审查与画板识别(串行)
36
-
37
- 5. `docs +fetch --detail with-ids` 获取文档,审查整体效果
38
- 6. 评估内容是否满足用户目标:事实是否完整、结构是否清楚、语气是否匹配、是否保留必要素材
39
- 7. **画板意图识别**:逐章节扫描,按 `lark-doc-style.md`「画板意图识别」表判断是否有段落适合用图表达。重要信息优先画板化,记录需要插图的章节、推荐画板类型、mermaid/SVG 路径和用于画图的源内容
40
-
41
- ### 步骤四:画板处理与润色(并行 Agent)
42
-
43
- 8. **优先处理步骤三识别出的画板需求**:
44
- 参考 [lark-doc-whiteboard.md](../lark-doc-whiteboard.md)中的方式,插入图表画板。
45
- 9. Spawn 内容改写 Agent 定向润色:
46
- - 文字密集且不易读时,优先拆段、改列表、增加小标题或调整顺序;只有确实存在行列数据、并列对比或强提醒信息时,才考虑 `<table>` / `<grid>` / `<callout>`
47
- - 需要明显分隔的主题可补充 `<hr/>`,不强制章节间都使用
48
- - 本地图片使用 `docs +media-insert` 插入
25
+ 3. `docs +create` 创建并撰写:
26
+ - **短文档**:一次写入完整内容
27
+ - **长文档**:先建骨架(标题 + 各级标题),再由主 Agent **顺序逐节**用 `block_insert_after --block-id <章节标题 block_id>` 补全正文;写完一节再写下一节,始终带着已写内容的上下文,保证衔接、不重复
28
+ - ⚠️ 不要一次性把超长完整内容塞进 `--content`,容易触发字符/参数限制;长文按节分次写入
29
+ - ⚠️ 同一节内多次插入时,要锚到**上一个新插入的 block**(按 [`lark-doc-update.md`](../lark-doc-update.md) 的「Block ID 生命周期」),否则反复锚同一个标题会让段落顺序颠倒
30
+ - ⚠️ 若先建骨架写了占位摘要,补正文时**删除占位摘要**,不要留残渣
31
+ - ⚠️ **`@file` 路径限制**:`--content @file` 只接受当前工作目录下的相对路径,传绝对路径(如 `@/tmp/xxx.md`)会报 `unsafe file path`。需要落盘时,将文件写在 cwd 下,用完自行清理
49
32
 
33
+ ### 步骤二:整合审查与画板识别(串行)
50
34
 
51
- ## Agent 子任务要求
35
+ 4. `docs +fetch --api-version v2 --detail with-ids` 获取文档,审查整体效果
36
+ 5. 评估内容是否满足用户目标:事实是否完整、结构是否清楚、语气是否匹配、是否保留必要素材;检查跨节有无重复、矛盾或断流。再按 `lark-doc-style.md` 的「写完自检」快速核对,发现问题就地定向修正
37
+ 6. **画板识别**:逐章节扫描,判断是否有段落用图明显比文字更易懂(流程 / 架构 / 时间线 / 对比 / 占比等,见 `lark-doc-style.md` 的画板原则)。默认用文字,只有确需图示才记录需要插图的章节、推荐画板类型、mermaid/SVG 路径和用于画图的源内容
52
38
 
53
- 内容改写 Agent 必须收到:文档 token、章节范围(标题/block ID)、`lark-doc-xml.md` 和 `lark-doc-style.md` 路径、用户目标/风格要求、具体的 `docs +update` command 和 `--block-id`。
39
+ ### 步骤三:画板处理与润色
54
40
 
55
- Mermaid 图由主 Agent 直接插入 `<whiteboard type="mermaid">...</whiteboard>`,无需 SubAgent。
41
+ 7. **优先处理步骤二识别出的画板需求**:读取并按 [lark-doc-whiteboard.md](../lark-doc-whiteboard.md) 选型和插入;正文本身不交给 SubAgent
42
+ 8. 由**主 Agent 自行润色**(不另起内容子 Agent,正文始终一人维护):文字密集且不易读时,优先拆段、加小标题或调整顺序——叙述内容保持成段,**不要默认改成列表**,只有确属并列要点 / 步骤才用列表(见 `lark-doc-style.md`);只有确实存在行列数据时才用 `<table>`。其余富 block 的取舍一律遵循 `lark-doc-style.md` 的写作原则,不主动堆叠。需要明显分隔的主题可补充 `<hr/>`,不强制章节间都使用。本地图片使用 `docs +media-insert` 插入
56
43
 
57
- SVG SubAgent 必须收到:文档 token、插入位置(标题/block ID)、图表目标、源内容片段、`lark-doc-xml.md` 路径,以及[lark-doc-whiteboard.md](../lark-doc-whiteboard.md) 中的 "SVG 设计 Workflow" 指南。它只负责插入一个 `<whiteboard type="svg">...</whiteboard>`,不改其他正文,也不读取 `lark-whiteboard`。
44
+ ### 步骤四:专项校验(按需执行)
58
45
 
59
- 已有画板更新 SubAgent 必须收到:board_token、图表目标、推荐画板类型、源内容片段、[`../../../lark-whiteboard/SKILL.md`](../../../lark-whiteboard/SKILL.md) 路径。它只负责写入画板,不改文档正文。
46
+ 9. 仅当用户预期需要校验字数时,才读取并执行 [`lark-doc-word-stat.md`](../lark-doc-word-stat.md) 的「字数遵循校验」;否则跳过本项,不读取该 workflow。若执行了专项校验,向用户呈现结果
@@ -1,86 +1,68 @@
1
- # 文档表达组件参考
1
+ # 飞书文档写作原则
2
2
 
3
- 本文件说明飞书文档可用的结构化表达方式,供模型在需要时选择。它不是固定模板,也不是强制排版规范。
3
+ 写飞书文档,像一个该领域资深的人类作者那样写,而不是把内容"装配"成组件。
4
+ 本文只讲"何时用、什么风格";具体标签 / 命令语法见 [`lark-doc-xml.md`](../lark-doc-xml.md)。
4
5
 
5
- 默认原则:优先理解用户目标、受众、素材形态和已有文档风格,由模型自主决定结构、语气和视觉呈现。只有当用户明确要求“美化、重排版、做成报告/方案/看起来更专业”等,或内容本身明显需要结构化承载时,才主动使用下列组件。
6
+ ## 一、用户明确要求优先
6
7
 
7
- ## 一、核心原则
8
+ 用户点名要某种格式——高亮块、分栏、列表、某编号体例、表格、画板、某模板、某已有文档的风格——**一律照用户的来,下面的"默认克制"全部让位**。用户给了样例或已有文档,就沿用它的结构与语气。
8
9
 
9
- 1. **服务内容,而非套模板**:先判断信息最自然的表达方式,再选择段落、列表、表格、分栏、画板等元素
10
- 2. **尊重用户风格**:用户给出样例、语气、结构或已有文档时,优先沿用;没有要求时不强行使用固定开头、固定章节或固定视觉组件
11
- 3. **适度结构化**:结构化 block 用于降低理解成本,不为了“丰富”而堆叠
12
- 4. **保持一致但不过度统一**:同类信息可使用相近表达,但允许因内容差异采用不同形式
13
- 5. **图示服务理解**:流程、架构、对比、风险、路线图、指标趋势等内容在图示明显降低理解成本时,可使用画板表达
10
+ ## 二、默认写连贯段落
14
11
 
15
- ## 二、元素选择指南
12
+ 用户没指定时,**默认是连贯段落**;其余按内容类型分流,别一律"少用结构",也别什么都升标题:
16
13
 
17
- 需要图表时,按类型选择插入方式:思维导图/时序图/类图/饼图/甘特图可用 `<whiteboard type="mermaid">` 直接内嵌;其他新图表可启动 SubAgent 插入 `<whiteboard type="svg">完整 SVG</whiteboard>`;只有编辑**已有**画板时才调用 **lark-whiteboard** skill。
14
+ | 内容 | 用什么 | ❌ 别 |
15
+ |---|---|---|
16
+ | 叙述、论证、分析、说明 | **连贯段落** | 拆成列举 |
17
+ | 真·行列数据(预算、指标、对比、排期、字段说明) | **表格** | 写成段落或把字段堆成一行 |
18
+ | 字段:值(主题、时长、负责人等,少量) | **加粗标签行**或一句话 | 每字段一个标题 |
19
+ | 方法 / 措施 + 每项一段描述 | **加粗引导句段落**(「**全程督导。**…」) | 每项升标题 |
20
+ | 任务清单 / 检查项 / 待办事项 | **`<checkbox>`** | 用普通列表替代可交互待办 |
21
+ | 纯短并列项(无描述,如材料清单) | 列表 | — |
22
+ | 章节(内容成块、需在目录导航) | 标题层级 | — |
18
23
 
19
- | 场景 | 可选表达方式 |
20
- |--------------------------------------------|---------------------------------------|
21
- | 少数需要视觉提醒的短句,如风险、限制、待确认事项或关键提醒 | 需要视觉提醒时可用 `<callout>`;普通结论、摘要或章节导语优先使用段落、列表、小标题或加粗 |
22
- | 方案对比 / 优劣势 / Before vs After | 简短对比可用段落、列表或 `<grid>`;维度较多且需要逐项比较时再考虑 `<table>` 或画板 |
23
- | 简短低风险对比 | `<grid>` 2 列分栏 |
24
- | 需要按行列精确比较或查阅的数据,如指标、清单、字段说明、排期 | 可用 `<table>`;短要点、步骤、摘要或普通说明优先使用段落、列表或小标题 |
25
- | 任务清单 / 检查项 | `<checkbox>` |
26
- | 代码片段 | `<pre lang="x" caption="说明">` |
27
- | 引用 / 公式 | `<blockquote>` / `<latex>` |
28
- | 操作入口 / 跳转链接 | `<button>` / `<a type="url-preview">` |
29
- | 流程图 / 时间线 / 示意图 / 自定义图形 / 架构图 / 数据图 / 思维导图等 | 画板图表 |
24
+ - 判断标准:**去掉结构后能顺成段落,就用段落;成行成列的数据,就用表格。**
25
+ - **红线一:标题层级只给"章节"。** "小标题 + 一两句话"的小项(字段、方法、要点)不该占标题层级——按上表降成标签行 / 加粗引导句段落(否则目录里全是没信息量的条目)。
26
+ - **红线二:列举(「一是 / 二是」「第一 / 第二」「(1)(2)(3)」)只给真正并列的具体项,且别每节都用。**
27
+ - 「一是 / 二是」是党务列举的措辞——只用在列具体的**问题 / 措施**那一处;背景、现状、认识、分析、过渡、总结**一律成段**。
28
+ - **整篇每段 / 每节都"一是 / 二是",和"每段一个 bullet"是同一个骨架化的错——不因为是党务就变对**(纯清单 / 台账类除外)。
30
29
 
30
+ ## 三、按体裁写
31
31
 
32
- ### 画板意图识别
32
+ - **公文 / 法律 / 学术 / 申报 / 项目方案等严肃正式提交物**:靠规范的标题层级、段落与编号体系表达;**默认不用高亮块、分栏**,要强调用加粗或规范小标题。
33
+ - **面向公众号、微信等外部平台粘贴 / 发布的内容**:不用飞书特有富 block(高亮块、分栏等),粘出去会丢样式 / 错乱;改用标准标题、段落、列表、引用。
34
+ - **一般文档**:以可读为先,不堆砌结构。
33
35
 
34
- 撰写或审查每个段落/章节时,**必须判断该内容是否适合用图表达**。满足以下任一特征时,应使用画板而非纯文本;如果该内容承载章节核心结论、关键决策或主要论据,即使结构较简单也优先画板化:
36
+ ## 四、编号与层级
35
37
 
36
- | 内容特征 | 信号词 / 模式 | 推荐画板类型 |
38
+ - **一套编号体例、全篇一致;最忌中文大层级与阿拉伯小数编号混用。**
39
+ - 公文 / 正式材料常用:「一、→(一)→ 1.→(1)」(中文大层级 + 阿拉伯细分层级)。
40
+ - 学术 / 技术 / 商业报告:「1 → 1.1 → 1.1.1」或「一、→(一)→ 1.」,**择一**。
41
+ - ⚠️ **「一、」只能配「(一)」;要用阿拉伯小数就从顶层全用「1 / 1.1」。绝不「一、」配「1.1 / 2.1」**——这是最常见的混用。
42
+ - **不混用**多套(别"第X部分"+"一、"+"1."混着来);**同级不跳号**;**不跳级**。
43
+ - **编号 / 标题层级只给"章节"**,不要为了凑齐体例把每个小项都编上「(一)」、升成标题(小项处理方式见上文「二、默认写连贯段落」)。
44
+ - 简单的 1.2.3 并列项用原生 `<ol><li seq="auto">…</li></ol>` 让飞书自动编号、自动对齐;「一、(一)」原生产不出,才手打成文字——此时用标题级别表达层次,**不靠手动缩进**、各级顶格(全角括号「()」叠手动缩进会视觉错位)。
45
+
46
+ ## 五、飞书特有组件,克制使用
47
+
48
+ - **高亮块 `<callout>`**:很重的强提醒信号,**默认不用**;只给"不提醒就会出错 / 遗漏"的关键项,全文极少(0~1 个),不要每节导语 / 结论都做成高亮块。
49
+ - **分栏 `<grid>`**:仅左右信息量相当、确需并排对照的短内容;否则用段落或表格。
50
+ - **画板**:默认用文字,只在**图示明显比文字更易懂**(流程、架构、时间线、对比、占比等)或用户要求时才用。怎么插、用哪种类型见 [`lark-doc-xml.md`](../lark-doc-xml.md) 与 [`lark-doc-whiteboard.md`](../lark-doc-whiteboard.md)。
51
+ - **颜色**:默认朴素、不上色;需要时保持语义一致,按下表选择对应颜色,不为装饰上色。可用色见 [`lark-doc-xml.md`](../lark-doc-xml.md) 的「美化系统」。
52
+
53
+ | 语义 | 背景色 | 文字色 |
37
54
  |-|-|-|
38
- | 多步骤的操作流程或决策路径 | "先…然后…最后"、"步骤 1/2/3"、"如果…则…否则" | 流程图 / 泳道图 |
39
- | 系统或模块间的依赖与交互 | "调用"、"依赖"、"上游/下游"、"请求→响应" | 架构图 |
40
- | 上下级或从属关系 | "汇报给"、"下属"、"隶属"、"团队结构" | 组织架构图 |
41
- | 时间线或阶段演进 | "Q1/Q2"、"里程碑"、"阶段一→阶段二"、日期序列 | 时间线 / 里程碑 |
42
- | 因果分析或问题归因 | "根因"、"原因"、"导致"、"影响因素" | 鱼骨图 |
43
- | 两个及以上方案/对象的多维度对比 | "vs"、"方案 A/B"、"优劣"、"对比" | 对比图 |
44
- | 层级递进或优先级排序 | "基础→进阶→高级"、"L1/L2/L3"、"核心→外围" | 金字塔图 |
45
- | 数值趋势或周期变化 | 带数字的时间序列、"增长/下降"、百分比变化 | 折线图 / 柱状图 |
46
- | 漏斗或转化率 | "转化率"、"漏斗"、"从…到…留存" | 漏斗图 |
47
- | 发散或归纳的思维结构 | "要点"、"维度"、"分支"、多层嵌套列表 | 思维导图 |
48
- | 循环或飞轮效应 | "正循环"、"飞轮"、"闭环"、"A 驱动 B 驱动 C" | 飞轮图 |
49
- | 占比分布 | "占比"、"份额"、"分布"、百分比加总 ≈100% | 饼图 / 树状图 |
50
-
51
- **判断规则:**
52
- - 重要信息能图示就图示;不要为了省步骤把关键流程、架构、对比、风险链路写成纯文本
53
- - 低重要度、局部辅助信息才用 `<table>` / `<grid>` / `<callout>` 承载
54
- - 确定需要插入哪些图表后,参照 [lark-doc-whiteboard.md](../lark-doc-whiteboard.md) 中的方式,插入图表画板。
55
-
56
- ## 三、颜色语义
57
-
58
- 如果使用颜色,建议保持语义一致;不需要颜色时可以保持朴素文本风格:
59
-
60
- | 语义 | emoji 前缀 | callout 背景色 | 文字色 |
61
- |-|-|-|-|
62
- | 信息、说明 | ℹ️ "说明:" | `light-blue` | `blue` |
63
- | 成功、推荐 | ✅ "推荐:" | `light-green` | `green` |
64
- | 警告 / 错误 / 风险 | ⚠️❌ | `light-red` | `red` |
65
- | 注意、待确认 | ❗"注意:" | `light-yellow` | `yellow` |
66
- | 中性、辅助 | — | `light-gray` | — |
67
-
68
- - 表头可使用 `background-color="light-gray"`,也可以保持默认样式
69
- - 关键指标如使用 `<span text-color="green/red">` 突出,建议同时用 ↑↓ 或 +/- 标注方向(色觉无障碍)
70
-
71
- ## 四、排版规范
72
-
73
- - 标题层级、段落长度、列表嵌套和 Grid 列数应以可读性为准,避免过深层级和过宽分栏
74
- - 文档开头可以是结论、背景、摘要、问题陈述、目录或直接正文,不强制使用 `<callout>`
75
-
76
- ## 五、质量自检
77
-
78
- 生成内容后可以从以下角度自检,但不要把这些项当作硬性比例或固定模板:
79
-
80
- | 指标 | 自检问题 |
81
- |-|-|
82
- | 信息表达 | 当前结构是否符合用户目标,而不是套用固定报告模板? |
83
- | 阅读负担 | 是否有段落过长、层级过深、表格过宽或组件过多的问题? |
84
- | 风格匹配 | 是否延续了用户给定样例或已有文档风格? |
85
- | 组件必要性 | callout、grid、table、whiteboard 等是否真的提升理解? |
86
- | 保真度 | 改写时是否保留了原文事实、引用、图片、附件和资源块? |
55
+ | 信息、说明 | `light-blue` | `blue` |
56
+ | 成功、推荐 | `light-green` | `green` |
57
+ | 警告 / 错误 / 风险 | `light-red` | `red` |
58
+ | 注意、待确认 | `light-yellow` | `yellow` |
59
+ | 中性、辅助 | `light-gray` | — |
60
+
61
+ ## 六、写完自检
62
+
63
+ 交付前快速回看:
64
+ - **叙述是否被列举化**:背景 / 现状 / 认识 / 分析 / 成效 / 过渡 / 总结等应成段;列举只用于同层级、可并列处理的信息,如问题、措施、步骤、任务或材料清单。若正文反复使用连续编号、项目符号或固定并列句式,导致内容缺少叙述,应把背景 / 认识 / 分析 / 过渡改写成有承接关系的段落(纯清单 / 台账类除外)。
65
+ - **数据是否正确呈现**:成行成列的数据应使用表格呈现,不要写成段落,也不要用分隔符把多个字段硬串在一起。
66
+ - **标题是否滥用**:"小标题 + 一句话"的小项不要升成标题;应改成标签行、加粗引导句段落或普通段落。
67
+ - **编号是否统一**:全篇一套、不跳号、不跳级,尤其不要中文 + 阿拉伯混用(如「一、」配「1.1」)。
68
+ - **组件是否克制且保真**:高亮块 / 分栏 / 画板 / 颜色应符合体裁和用户要求;引用 / 图片 / 资源块必须保留。
@@ -5,7 +5,7 @@
5
5
  ## 核心方法论 — Code-Act Loop
6
6
  通过自适应的 **Code-Act Loop** 驱动文档改写,而非固定模板式的工作流。每次任务都循环执行:
7
7
  1. **Plan(规划)** — 根据用户目标和文档当前状态,评估下一步该做什么
8
- 2. **Execute(执行)** — 运行相应的 `lark-cli docs` 命令,或 **spawn** Agent 子任务并行推进
8
+ 2. **Execute(执行)** — 由主 Agent 自己运行 `lark-cli docs` 命令推进改写;仅画板渲染按需隔离到 SubAgent(见步骤二)
9
9
  3. **Observe(观察)** — 检查命令输出,验证正确性,确认内容是否满足用户目标
10
10
  4. **Iterate(迭代)** — 如需调整,回到 Plan 继续循环
11
11
 
@@ -23,33 +23,26 @@
23
23
  - 需要精确跨节区间 → `docs +fetch --scope range --start-block-id xxx --end-block-id yyy`(或 `--end-block-id -1` 读到末尾)
24
24
  - 用户只给了模糊关键词 → `docs +fetch --scope keyword --keyword xxx --context-before 1 --context-after 1 --detail with-ids`
25
25
  - 用户明确要改整篇 → `docs +fetch --detail with-ids`
26
- - 详见 [`lark-doc-fetch.md`](../lark-doc-fetch.md) "意图引导:选择正确的 --scope"
26
+ - 详见 [`lark-doc-fetch.md`](../lark-doc-fetch.md) 中「选 `--scope`(读取范围)」小节
27
27
  2. 系统性评估:用户想改什么、现有文档风格是什么、哪些内容需要保留、哪些问题影响理解
28
- 3. **画板意图识别**:逐章节扫描,按 `lark-doc-style.md`「画板意图识别」表判断哪些段落的信息适合用图表达。重要信息优先画板化,记录需要插图的章节(block ID)、推荐画板类型、mermaid/SVG路径和源内容片段
28
+ 3. **画板识别**:逐章节扫描,判断是否有段落用图明显比文字更易懂(流程 / 架构 / 时间线 / 对比 / 占比等,见 `lark-doc-style.md` 的画板原则)。默认用文字,只有确需图示才记录需要插图的章节(block ID)、推荐画板类型、mermaid/SVG路径和源内容片段
29
29
  4. 向用户简要说明改进计划(包含识别出的画板机会)
30
30
 
31
- ### 步骤二:定向改写(并行 Agent)
31
+ ### 步骤二:定向改写(单 Agent 串行)
32
32
 
33
- 5. **优先处理步骤一识别出的画板候选段落**:
34
- 参考 [lark-doc-whiteboard.md](../lark-doc-whiteboard.md)中的方式,插入图表画板。
35
- 6. Spawn 内容改写 Agent 在不重叠的章节上并行改进,各 Agent 收到文档 token 和特定 block ID:
33
+ 5. **优先处理步骤一识别出的画板候选段落**:读取并按 [lark-doc-whiteboard.md](../lark-doc-whiteboard.md) 选型和插入;正文本身不交给 SubAgent
34
+ 6. 由主 Agent **顺序逐节**改写,**不按章节拆给并行 Agent**,避免上下文割裂、重复矛盾和全文级约束失效:
36
35
  - 沿用或轻微调整已有文档风格,除非用户要求彻底重排版
37
- - 优先通过重写段落、调整标题、拆分列表或补充小标题提升可读性
38
- - 富 block 是可选表达手段,不因固定比例而添加;画板类需求只走第 5 步
36
+ - 优先通过重写段落、调整标题、补充小标题提升可读性;叙述内容保持成段,**不要默认改成列表**,只有确属并列要点 / 步骤才用列表(见 `lark-doc-style.md`)
37
+ - 富 block 是可选表达手段,不因固定比例而添加,取舍遵循 `lark-doc-style.md` 的写作原则;画板类需求只走第 5 步
39
38
 
40
39
  ### 步骤三:验证(串行)
41
40
 
42
41
  7. 获取更新后文档局部内容,检查是否符合用户目标和已有风格
43
- 8. 检查是否满足用户目标并保留原有关键内容;如仍有明显问题则定向修正,向用户呈现结果
42
+ 8. 检查是否满足用户目标并保留原有关键内容。再按 `lark-doc-style.md` 的「写完自检」快速核对,发现问题则定向修正
44
43
 
45
- ## Agent 子任务要求
44
+ ### 步骤四:专项校验(按需执行)
46
45
 
47
- 内容改写 Agent 必须收到:文档 token、章节范围(标题/block ID)、`lark-doc-xml.md` 和 `lark-doc-style.md` 路径、用户目标/风格要求、具体的 `docs +update` command 和 `--block-id`。
46
+ 9. 仅当用户预期需要校验字数时,才读取并执行 [`lark-doc-word-stat.md`](../lark-doc-word-stat.md) 的「字数遵循校验」;否则跳过本项,不读取该 workflow。若执行了专项校验,向用户呈现结果
48
47
 
49
- Mermaid 图由主 Agent 直接插入 `<whiteboard type="mermaid">...</whiteboard>`,无需 SubAgent。
50
-
51
- SVG SubAgent 必须收到:文档 token、插入位置(标题/block ID)、图表目标、源内容片段、`lark-doc-xml.md` 路径,以及[lark-doc-whiteboard.md](../lark-doc-whiteboard.md) 中的 "SVG 设计 Workflow" 指南。它只负责插入一个 `<whiteboard type="svg">...</whiteboard>`,不改其他正文,也不读取 `lark-whiteboard`。
52
-
53
- 已有画板更新 SubAgent 必须收到:board_token、图表目标、推荐画板类型、源内容片段、[`../../../lark-whiteboard/SKILL.md`](../../../lark-whiteboard/SKILL.md) 路径。它只负责写入画板,不改文档正文。
54
-
55
- **上下文节省提示**:Agent 如需在自己负责的章节内重新读取内容,优先用 `docs +fetch --scope section --start-block-id <章节标题id>`(自动覆盖整节),或 `--scope range --start-block-id xxx --end-block-id yyy` 精确区间,只拉自己的章节,不要重复拉全文。
48
+ **上下文节省提示**:主 Agent 改某节时如需重新读取,优先用 `docs +fetch --scope section --start-block-id <章节标题id>`(自动覆盖整节),或 `--scope range --start-block-id xxx --end-block-id yyy` 精确区间,只拉当前章节,不要重复拉全文。
@@ -29,6 +29,7 @@ metadata:
29
29
  - 用户要把本地 `.xlsx` / `.csv` / `.base` 导入成 Base / 多维表格 / bitable,第一步必须使用 `lark-cli drive +import --type bitable`。
30
30
  - 用户要把本地 `.md` / `.docx` / `.doc` / `.txt` / `.html` 导入成在线文档,使用 `lark-cli drive +import --type docx`。
31
31
  - 用户要把本地 `.pptx` 导入成飞书幻灯片,使用 `lark-cli drive +import --type slides`;当前 PPTX 导入上限是 500MB。
32
+ - 批量执行 `drive +import` 且目标是同一个位置(同一 `--folder-token`、默认根目录,或同一 `--target-token`)时,必须串行执行;不要并发导入到同一位置,服务端可能返回并发冲突错误。
32
33
  - 用户要在 Drive 里上传、创建、读取、局部 patch 或覆盖更新**原生 `.md` 文件**(不是导入成 docx),切到 [`lark-markdown`](../lark-markdown/SKILL.md)。
33
34
  - 用户要比较原生 `.md` 文件的**历史版本差异**,或比较远端 Markdown 与本地草稿,切到 [`lark-markdown`](../lark-markdown/SKILL.md) 的 `lark-cli markdown +diff`;需要版本号时先用 `drive +version-history`。
34
35
  - 用户要查看、下载、回滚或删除文件的**历史版本**,使用 `drive +version-history`、`drive +version-get`、`drive +version-revert`、`drive +version-delete`;这组命令同时支持 `--as user` 和 `--as bot`,自动化场景优先 `--as bot`。
@@ -102,6 +103,7 @@ lark-cli drive +inspect --url 'https://xxx.feishu.cn/wiki/wikcnXXX'
102
103
  | `not exist` | 使用了错误的 token | 检查 token 类型,wiki 链接必须先查询获取 `obj_token` |
103
104
  | `permission denied` | 没有相关操作权限 | 引导用户检查当前身份对文档/文件是否有相应操作权限;如果需要,可以授予相应权限 |
104
105
  | `invalid file_type` | file_type 参数错误 | 根据 `obj_type` 传入正确的 file_type(docx/doc/sheet/slides/bitable) |
106
+ | `232140101` / `232140100` / `233523001`(常见于 `drive +import` 的 `job_error_msg`) | 同一位置下存在并发导入 / 创建操作 | 批量导入到同一文件夹、根目录或同一 `--target-token` 时改为串行执行;每个失败项每次重试前等待几秒,总共最多重试 3 次,仍失败就停止并报告冲突 |
105
107
 
106
108
  ### 权限能力入口
107
109
 
@@ -14,6 +14,13 @@
14
14
  > [!IMPORTANT]
15
15
  > 当用户**未传 `--name`** 时,文档标题默认取源文件名(去掉扩展名)。在执行导入前,先友好提示用户:「当前未指定文档标题,默认将使用"xxx"作为标题。如果文件内容中也包含相同标题,导入后可能造成视觉重复。是否需要重命名?」让用户确认后再继续。
16
16
 
17
+ ## 批量导入串行规则
18
+
19
+ > [!IMPORTANT]
20
+ > 批量执行 `drive +import` 且目标是同一个位置时,必须串行执行,不要并发发起导入任务。这里的“相同位置”包括同一个 `--folder-token`、都省略 `--folder-token` 导入到默认根目录,或使用同一个 `--target-token` 导入到已有 bitable。
21
+ >
22
+ > 如果在同一位置下并发导入,服务端可能返回并发冲突错误。看到错误信息或 `job_error_msg` 中包含 `232140101`、`232140100`、`233523001` 任一错误码时,按同位置并发操作处理:停止并发导入,改为串行处理失败项;每个失败项每次重试前等待几秒,总共最多重试 3 次;仍失败就停止并向用户报告冲突。
23
+
17
24
  ## 命令
18
25
 
19
26
  ```bash
@@ -143,6 +150,7 @@ lark-cli drive +import --file ./README.md --type docx --dry-run
143
150
  - “超过 20MB 自动切换分片上传”只表示上传链路会切到 multipart,不代表所有格式都允许导入超过 20MB 的文件。
144
151
 
145
152
  - 若导入任务执行失败,会返回失败时的 `job_status` 及错误信息。
153
+ - 若导入失败信息包含 `232140101`、`232140100`、`233523001`,通常表示同一位置下存在并发导入 / 创建操作;批量场景请改为串行执行,每个失败项每次重试前等待几秒,总共最多重试 3 次,仍失败就停止并报告冲突。
146
154
  - 若内置轮询超时但任务仍在处理中,shortcut 会成功返回,并带上:
147
155
  - `ready=false`
148
156
  - `timed_out=true`
@@ -23,6 +23,8 @@
23
23
  > 错误:`lark-cli drive +search 方案`
24
24
  > `+search` 不接受位置参数;空 `--query` 或省略 `--query` 表示纯靠 filter 浏览(合法)。
25
25
  >
26
+ > **`--query` 最长 30 个字符**:按字符数(Unicode 码点)算,中文每字算 1 个,与 ASCII 同口径;超过 30 会被服务端拒绝(`99992402 field validation failed`,**是报错不是截断**)。长关键词必须先压缩成核心实体 + 主题词(如把整句问题压成「项目名 + 主题」再搜),不要把整句原问塞进 `--query`。
27
+ >
26
28
  > **列表型请求不要硬塞关键词**:如果用户只是要求"我这月创建的所有文档"、"最近半年我编辑过的文档"、"按类型分类统计"这类范围浏览 / 汇总请求,且没有给出标题片段或业务关键词,应使用 `--query ""` 搭配 `--created-by-me`、`--mine`、`--created-*`、`--edited-*`、`--doc-types` 等过滤条件。不要把"查找"、"所有文档"、"最近更新过"、"按类型分类统计"这类动作词或统计意图放进 `--query`,否则会把本来应靠 filter 命中的结果过度收窄。
27
29
 
28
30
  ### 自然语言 → 命令映射速查
@@ -101,7 +103,7 @@ lark-cli drive +search --query 方案 --page-token '<PAGE_TOKEN>'
101
103
 
102
104
  | 参数 | 必填 | 说明 |
103
105
  |---|---|---|
104
- | `--query <text>` | 否 | 搜索关键词;支持服务端高级语法(`intitle:`、`""`、`OR`、`-`)。空字符串或省略表示纯 filter 浏览 |
106
+ | `--query <text>` | 否 | 搜索关键词;支持服务端高级语法(`intitle:`、`""`、`OR`、`-`)。空字符串或省略表示纯 filter 浏览。**长度上限 30 个字符(按 Unicode 码点算,中文每字算 1 个,与 ASCII 同口径);超过 30 服务端直接报 `99992402 field validation failed`,不会截断** |
105
107
  | `--page-size <n>` | 否 | 每页数量,默认 15,最大 20。超过 20 自动 clamp;非正数(≤0)回落 15;**非数字值直接返回 validation 错误** |
106
108
  | `--page-token <token>` | 否 | 上一次响应里的 `page_token`,用于翻页 |
107
109
  | `--format` | 否 | `json`(默认)/ `pretty` |
@@ -81,6 +81,8 @@ lark-cli minutes +speaker-replace \
81
81
 
82
82
  Agent 必须先 `lark-cli api GET .../speakerlist`,再 `+speaker-replace`;`--from-speaker-id` 只接受 `speaker_id`。
83
83
 
84
+ `+speaker-replace` **不会**自己请求 speakerlist:`--from-speaker-id` 的值会原样发给替换接口。整条链路只在 Agent 一开始查一次 speakerlist,务必传入上一步拿到的 `speaker_id`(不要传展示名,否则替换接口会返回 speaker-not-found)。
85
+
84
86
  ### 2. 新说话人必须是 open_id
85
87
 
86
88
  `--to-user-id` 仅支持 `ou_` 开头的 open_id,**不支持直接传姓名**;如果用户只给了姓名,请先用 [lark-contact](../../lark-contact/SKILL.md) 把姓名解析成 `open_id`。