@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
@@ -22,16 +22,23 @@ metadata:
22
22
 
23
23
  **身份**:画板操作默认使用 `--as user`。仅当需要以应用身份上传时使用 `--as bot`。
24
24
 
25
- | 用户需求 | 行动 |
26
- |-----------------------------------------|---------------------------------------------------------------------------------------------------|
25
+ > 先判断「只读还是写入」,再在对应表内按上到下匹配,**命中即停**。
26
+
27
+ ### A. 只读 · 查看 / 导出(不改画板)
28
+
29
+ | 用户需求 | 行动 |
30
+ |---|---|
27
31
  | 查看画板内容 / 导出图片 | [`+export --output-type preview`](references/lark-whiteboard-export.md) |
28
32
  | 导出 SVG 矢量图 | [`+export --output-type svg`](references/lark-whiteboard-export.md) |
29
- | 获取画板的 Mermaid/PlantUML 代码 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
30
- | 检查画板是否由代码绘制 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
31
- | 仅微调节点文字/颜色 | `+export --output-type raw` → 手动改 JSON → `+update --input_format raw` |
32
- | 用户**已提供** Mermaid/PlantUML/SVG 代码,或明确指定用该格式 | 自己生成/使用代码 → [`+update --input_format mermaid/plantuml/svg`](references/lark-whiteboard-update.md) |
33
- | 新建/创作复杂图表(架构/流程/组织等) | → **[§ 创作 Workflow](references/lark-whiteboard-workflow.md#创作-workflow)** |
34
- | 修改/重绘已有画板 | → **[§ 修改 Workflow](references/lark-whiteboard-workflow.md#修改-workflow)** |
33
+ | 提取画板的 Mermaid/PlantUML 源码 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
34
+
35
+ ### B. 写入 · 创作 / 编辑(会改画板,命中即停)
36
+
37
+ | 场景 | 行动 | 写入方式 | 对原内容 |
38
+ |---|---|---|---|
39
+ | 用户**已提供** Mermaid/PlantUML/SVG 代码,或明确指定用该格式 | 使用该代码 → [`+update`](references/lark-whiteboard-update.md),`--input_format` 取单值 `mermaid` / `plantuml` / `svg`;写入非空已有画板并需要 overwrite 时,先确认会整板重建;若 SVG 用于修改已有画板,先走 [`routes/svg-edit.md`](routes/svg-edit.md) 有损确认 | overwrite / append | 按用户要求 |
40
+ | 从零新建复杂图表(架构/流程/组织等) | → **[§ 创作 Workflow](references/lark-whiteboard-workflow.md#创作-workflow)** | 首次写入 | — |
41
+ | 修改 / 增补已有画板 | → **[§ 编辑 Workflow](references/lark-whiteboard-workflow.md#编辑-workflow)** | 见该表 | 见该表 |
35
42
 
36
43
  ## Shortcuts
37
44
 
@@ -10,15 +10,16 @@
10
10
  |----------------------|----|------------------------------------------------------------------------|
11
11
  | `--whiteboard-token` | 是 | 画板 token,需要拥有画板的读权限 |
12
12
  | `--output-type` | 是 | 输出格式:`preview`(预览图片)、`svg`(SVG 矢量图)、`source`(PlantUML/Mermaid 代码)、`raw`(OpenAPI 原生画板节点格式) |
13
- | `--output` | 否 | 输出路径。当 `--output-type preview` 时必填,推荐传入无后缀文件路径(如 `./preview`);当 `--output-type svg/source/raw` 时可选,不填则直接输出到终端 |
13
+ | `--output` | 否 | 输出路径。当 `--output-type preview` 时必填;当 `--output-type svg/source/raw` 时可选,不填则直接输出到终端 |
14
14
  | `--overwrite` | 否 | 覆盖已存在的文件,默认为 false |
15
15
 
16
16
  ## 输出格式
17
17
 
18
- - `preview`:预览图片。推荐 `--output ./preview` 这类无后缀文件路径,CLI 会按实际图片类型保存为 `./preview.png` 或 `./preview.jpg`。如果 `--output` 是目录,会保存为该目录下的 `whiteboard_<whiteboard-token>.png/.jpg`;如果显式写了后缀,需要和实际图片类型匹配。`--overwrite` 检查的是补齐后缀后的最终路径,例如返回 PNG 时 `--output ./preview` 对应覆盖 `./preview.png`。
18
+ - `preview`:预览图片。保存时会根据接口实际返回的 `Content-Type` 决定扩展名,例如 `image/jpeg` 会保存为 `.jpg`。
19
19
  - `svg`:导出画板为标准 SVG 矢量图。可用于 SVG 编辑后回写画板(见 [`routes/svg-edit.md`](../routes/svg-edit.md))。注意:导出为纯视觉快照,思维导图层级、表格结构、连接器绑定等语义信息会丢失。
20
20
  - `source`:PlantUML/Mermaid 代码。仅限画板内有且仅有一个 PlantUML/Mermaid 图时,才可导出代码,否则会在返回值中告知不存在/有多个节点。
21
- - `raw`:飞书 OpenAPI 原生画板节点格式。这一 json 格式不适合直接编辑复杂布局或内容,建议仅限于需要修改简单的文本内容/颜色等细节时使用。需要进行更复杂的设计/修改时,建议参考 [§ 渲染 & 写入画板](../SKILL.md#渲染--写入画板)。
21
+ - `raw`:飞书 OpenAPI 原生画板节点格式。这一 json 格式不适合直接编辑复杂布局或内容,建议仅限于需要修改简单的文本内容/颜色等细节时使用。需要进行更复杂的设计/修改时,建议参考 [§ 编辑 Workflow](lark-whiteboard-workflow.md#编辑-workflow)。
22
+ - **需编辑后回写时,导出务必加 `--output <file>` 写入文件**:文件内容可直接作为 `+update` 的输入;直接输出到终端的结果会多一层 `{ ok, identity, data }` 包装,`+update` 无法解析。
22
23
 
23
24
  ## 示例
24
25
 
@@ -17,7 +17,7 @@
17
17
  |----------------------|----|--------------------------------------------|
18
18
  | `--whiteboard-token` | 是 | 画板 token,需要拥有画板的编辑权限 |
19
19
  | `--idempotent-token` | 否 | 幂等 token,确保更新操作幂等;最少 10 个字符,建议使用时间戳 + 场景标识拼接(如 `1744800000-board-1`)。同一次逻辑更新只生成一次该 token,重试时须原样复用;切勿在每次重试时重新生成时间戳或幂等 key,否则会重复写入 |
20
- | `--overwrite` | 否 | 覆盖更新,在更新前删除所有现有内容,默认为 false |
20
+ | `--overwrite` | 否 | 写入模式:带上则覆盖更新(写入前删除画板所有现有内容再写入);省略则为增量追加(保留原有内容,新内容叠加写入)。默认 false(增量追加)|
21
21
  | `--source` | 是 | 输入画板内容,支持使用 `@path` 从文件读取,或 `-` 从 stdin 读取 |
22
22
  | `--input_format` | 否 | 输入格式:`raw`、`plantuml`、`mermaid`、`svg`,默认为 `raw` |
23
23
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  思维导图,时序图,类图,饼图,流程图等图表推荐使用 Mermaid/PlantUML 语法绘制。
29
29
 
30
- 而当需要绘制架构图,组织架构图,泳道图,对比图,鱼骨图,柱状图,折线图,树状图,漏斗图,金字塔图,循环/飞轮图,里程碑或其他较为复杂的图表时,推荐参考 [§ 渲染 & 写入画板](../SKILL.md#渲染--写入画板) 使用 whiteboard-cli 工具创作。
30
+ 而当需要绘制架构图,组织架构图,泳道图,对比图,鱼骨图,柱状图,折线图,树状图,漏斗图,金字塔图,循环/飞轮图,里程碑或其他较为复杂的图表时,推荐参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板) 使用 whiteboard-cli 工具创作。
31
31
 
32
32
  ## 示例
33
33
 
@@ -71,7 +71,7 @@ lark-cli whiteboard +update \
71
71
 
72
72
  ### 示例 3:使用 whiteboard-cli 生成 OpenAPI 格式并写入画板
73
73
 
74
- whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](../SKILL.md#渲染--写入画板)
74
+ whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板)
75
75
 
76
76
  ```bash
77
77
  # 使用 whiteboard-cli 生成 OpenAPI 格式并通过管道传递
@@ -85,7 +85,7 @@ npx -y @larksuite/whiteboard-cli@^0.2.13 -i <产物文件> --to openapi --format
85
85
 
86
86
  ### 示例 4:先生成产物文件,再从文件读取更新
87
87
 
88
- whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](../SKILL.md#渲染--写入画板)
88
+ whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](lark-whiteboard-workflow.md#渲染--写入画板)
89
89
 
90
90
  ```bash
91
91
  # 生成 OpenAPI 格式到文件
@@ -1,4 +1,4 @@
1
- # 画板创作/修改工作流
1
+ # 画板创作/编辑工作流
2
2
 
3
3
  ## 创作 Workflow
4
4
 
@@ -19,23 +19,24 @@
19
19
 
20
20
  ---
21
21
 
22
- ## 修改 Workflow
22
+ ## 编辑 Workflow
23
23
 
24
24
  **Step 1:获取 board_token**(同创作 Workflow Step 1)
25
25
 
26
- **Step 2:判断修改策略**
26
+ **Step 2:探测可编辑性 / 是否由代码绘制**
27
27
 
28
- ```
29
- +export --output-type source
30
- ├─ 返回 Mermaid/PlantUML 代码
31
- │ → 在原代码上修改 → +update --input_format mermaid/plantuml
32
- ├─ 无代码(SVG/DSL 或其他方式绘制的画板)
33
- │ ├─ 需纯新增(思维导图、流程图、时序图、类图、饼图、甘特图)图表节点
34
- │ │ → +export --output-type preview → 看图 → +export --output-type raw → 确定新节点坐标和层级 → [§ 渲染 & 写入画板]
35
- │ └─ 其他改动(几何变动/增删元素/结构调整/混合编辑等)
36
- │ → [`../routes/svg-edit.md`](../routes/svg-edit.md)(视觉高保真还原,大部分场景适用)
37
- └─ 用户有明确要求 → 以用户要求优先
38
- ```
28
+ - `+export --output-type source` — 能返回单一 Mermaid/PlantUML 源码,说明画板由代码绘制、可走路径①;返回无代码/多图则走路径②③④
29
+
30
+ **Step 3:选编辑路径**(按上到下匹配,命中即停;用户有明确指定则以用户为准)
31
+
32
+ | 路径 | 命中条件 | 怎么改 | 写入方式 | 是否有损 |
33
+ |---|---|---|---|---|
34
+ | ①源码重构 | `+export source` 返回单一 Mermaid/PlantUML(即画板由代码绘制) | 在源码上改 → 按源码类型用 `+update --input_format mermaid` 或 `+update --input_format plantuml` | overwrite(整板重建) | ⚠️ **非严格无损,执行前确认** |
35
+ | ②属性微调 | 只改已有节点的文字/颜色 | `+export --output-type raw --output <file>`(**必须写入文件**)→ 编辑文件中目标节点字段;如只能用 `+update --input_format raw --source @<file> --overwrite` 写回,先说明会整板重建并等待用户确认 | overwrite(整板重建) | ⚠️ **有损风险,未确认不得执行** |
36
+ | ③增量追加 | 在原图基础上新增图/元素,保留原内容 | `+export --output-type preview` → 理解原图 → `+export --output-type raw` → 确定新节点坐标 → [§ 渲染 & 写入画板](#渲染--写入画板) 创作&写入 | append(**不加 `--overwrite`**) | 无损(原节点不动) |
37
+ | ④结构重绘 | 需几何变动/增删元素/结构调整/混合编辑 | [`../routes/svg-edit.md`](../routes/svg-edit.md) | overwrite(清空重来) | ⚠️ **有损,必须先经用户确认** |
38
+
39
+ **⚠️ 止损**:一条路径最多试 2 轮,不行就换条路径尝试一次;仍不行就停下,如实告诉用户卡点,不要在各路径间反复横跳。
39
40
 
40
41
  ---
41
42
 
@@ -45,12 +46,13 @@
45
46
 
46
47
  **先自报身份**:按训练来源,你属于哪一家?`Claude` / `Gemini` / `GPT` / `GLM` / `Doubao 或 Seed` / `Other`。身份决定 SVG / DSL 分流(不同家族对这两种表达语言的能力不均衡),不要跳过这一步。
47
48
 
48
- **然后按图表类型 × 身份选路径**,读对应文件按其完整 workflow 执行(含读 scene 指南、生成内容、渲染审查、交付):
49
+ **然后按当前产物类型 / 图表类型 × 身份选路径**,读对应文件按其完整 workflow 执行(含读 scene 指南、生成内容、渲染审查、交付):
49
50
 
50
- 按上到下匹配, 命中即停:
51
+ 当前产物路由按上到下匹配, 命中即停:
51
52
 
52
53
  | 图表类型 | 身份 | 路径 |
53
54
  |--------------------|-------------------------------------|------------------------------------------------|
55
+ | 当前要生成/追加的内容包含 @用户提及或图片/配图 | 任何身份 | [`../routes/dsl.md`](../routes/dsl.md) |
54
56
  | 思维导图、时序图、类图、饼图、甘特图 | 任何身份 | [`../routes/mermaid.md`](../routes/mermaid.md) |
55
57
  | 鱼骨图、金字塔图、流程图 | `Doubao` / `Seed` | [`../routes/dsl.md`](../routes/dsl.md) |
56
58
  | 其他图表 | `Claude` / `Gemini` / `GPT` / `GLM` / `Doubao` / `Seed` | [`../routes/svg.md`](../routes/svg.md) |
@@ -81,7 +83,7 @@ diagram.png ← 渲染结果
81
83
 
82
84
  写入画板时按最终产物类型选择 `+update --input_format`:
83
85
 
84
- - Mermaid / PlantUML / SVG 产物直接用对应的 `mermaid` / `plantuml` / `svg` 写入。
86
+ - Mermaid / PlantUML / SVG 产物直接写入时,`--input_format` 取单值 `mermaid` / `plantuml` / `svg`;写入非空已有画板并需要 overwrite 时,先确认会整板重建;SVG 修改已有画板时先走 [`../routes/svg-edit.md`](../routes/svg-edit.md) 的确认 workflow。
85
87
  - 只有 DSL 产物或已明确需要 OpenAPI 原生节点格式时,才先用 `npx -y @larksuite/whiteboard-cli@^0.2.13 --to openapi --format json` 转换,再用 `raw` 写入。
86
88
 
87
89
  具体命令示例、`--overwrite`、`--idempotent-token` 和 `--as user/bot` 的使用方式,统一参考 [`whiteboard +update`](./lark-whiteboard-update.md)。
@@ -33,7 +33,7 @@ Step 3: 渲染 & 审查 → 交付
33
33
  npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json --to openapi --format json \
34
34
  | lark-cli whiteboard +update --whiteboard-token <board_token> \
35
35
  --source - --input_format raw --idempotent-token <时间戳+标识> --as user
36
- → 完整 dry-run / 确认流程见 SKILL.md [§ 写入画板](../SKILL.md#写入画板)
36
+ → 完整 dry-run / 确认流程见 [§ 写入画板](../references/lark-whiteboard-workflow.md#写入画板)
37
37
  - 交付:向用户报告 board_token 写入成功
38
38
  ```
39
39
 
@@ -73,7 +73,13 @@ Step 3: 渲染 & 审查 → 交付
73
73
  | 循环/飞轮图 | `scenes/flywheel.md` | 增长飞轮、闭环链路 |
74
74
  | 里程碑 | `scenes/milestone.md` | 时间线、版本演进 |
75
75
  | 流程图 | `scenes/flowchart.md` | 业务流、状态机、带条件判断的链路 |
76
- | 图片展示 | `scenes/photo-showcase.md` | 用户显式要求图片/配图/插图时(需先完成 `elements/image.md` 的图片准备) |
76
+
77
+ ### 插入 @用户提及 / 图片
78
+
79
+ | 当前内容包含 | 必读指南 |
80
+ |---|---|
81
+ | @用户提及 | [`../scenes/mention.md`](../scenes/mention.md) |
82
+ | 图片 / 配图 | [`../scenes/photo-showcase.md`](../scenes/photo-showcase.md) |
77
83
 
78
84
  ## 渲染前自查
79
85
 
@@ -22,6 +22,6 @@ Step 3: 渲染验证 & 写入画板 & 交付
22
22
  npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.mmd --to openapi --format json \
23
23
  | lark-cli whiteboard +update --whiteboard-token <board_token> \
24
24
  --source - --input_format raw --idempotent-token <时间戳+标识> --as user
25
- → 完整 dry-run / 确认流程见 SKILL.md [§ 写入画板](../SKILL.md#写入画板)
25
+ → 完整 dry-run / 确认流程见 [§ 写入画板](../references/lark-whiteboard-workflow.md#写入画板)
26
26
  6. 交付:向用户报告 board_token 写入成功
27
27
  ```
@@ -16,11 +16,14 @@ SVG 导出是**纯视觉快照**,再次导入后画板语义(思维导图层
16
16
 
17
17
  ### 0. 用户确认(强制)
18
18
 
19
- 在执行任何编辑前,**必须**向用户说明:
19
+ 执行任何编辑前,先判断**紧邻的上一条用户消息**是否已明确确认有损编辑:
20
+
21
+ - **已确认**(含用户主动预授权,如"我知道有损,直接改")→ 直接进入 Step 1,不再重复警告。
22
+ - **未确认或回复含糊** → 原样向用户发出下面这句话,**然后立即结束本回合等待回复** —— 同一条消息内不得附带任何导出/编辑/写回命令或工具调用:
20
23
 
21
24
  > SVG 编辑只保证视觉层面对齐,画板语义(层级/节点类型/思维导图结构/表格结构/连线绑定/容器类型/mention 等)将不可恢复,是否继续?
22
25
 
23
- **用户未确认前不得执行后续步骤。**
26
+ 这是**知情确认**(动手前让用户对语义丢失止损);真正的破坏性写入在 Step 4 还会再经 `--overwrite` dry-run 确认一次,二者职责不同、都不可省。
24
27
 
25
28
  ### 1. 导出当前画板 SVG
26
29
 
@@ -54,6 +54,8 @@
54
54
  - 阴影:`<filter>` 里放 `<feDropShadow>` 或标准 drop/inner primitive 链 (`<feGaussianBlur in="SourceAlpha">` + `<feOffset>` + `<feFlood>` + `<feComposite>` + `<feMerge>`), 会被识别成节点阴影, drop 至多 1 个, inner 至多 1 个; 其余 filter 效果不识别
55
55
  - 渐变:`<linearGradient>` / `<radialGradient>` 在 `<defs>` 中定义, 通过 `fill="url(#id)"` 引用 (载体限 `<rect>` / `<circle>` / `<ellipse>` / `<polygon>` / `<path>`), 需要至少 2 个 `<stop>`, `gradientUnits` 只支持默认的 `objectBoundingBox` (不写即可);
56
56
 
57
- **⚠️ [!IMPORTANT] 不支持的装饰特性**
57
+ > [!IMPORTANT]
58
+ > ⚠️ **不支持的装饰特性**
59
+
58
60
  - `<pattern>` / `<clipPath>` / `<mask>` / 非阴影用途的 `<filter>` (blur / hue-rotate / 复合合成 / `flood-color=url(...)` / 多个 `<feDropShadow>` 等) → 画板不支持,**请避免使用,否则会导致画板渲染问题**
59
61
  - 渐变边界:`gradientUnits="userSpaceOnUse"` / `spreadMethod="reflect|repeat"` / stops 少于 2 个 / 复杂 `gradientTransform` 会变成不可编辑图片, 视觉正确但失去可编辑性, 若无必要请沿用默认 `objectBoundingBox`
@@ -0,0 +1,71 @@
1
+ # 提及用户 (@用户 / mentionUser)
2
+
3
+ 适用于:文本节点内需要 @ 某个飞书用户(如"负责人:@张三"、"@李四 请跟进")。mention 不是独立节点,而是文本节点富文本中的一段 run,可与普通文字混排。
4
+
5
+ > 当用户要插入 @用户提及时阅读本页。
6
+
7
+ ## 取值来源(强约束)
8
+
9
+ - 本页只讲 @用户(mentionUser)。@文档(mentionDoc)暂不支持。
10
+ - `mentionUserId` 必须是**真实的飞书用户 open_id**(形如 `ou_xxxxxxxx`)。
11
+ - 用户只给出**姓名**时,先用 `lark-contact` skill 把姓名解析成 open_id,再填入 `mentionUserId`。
12
+ - **无法解析出真实 open_id 时,停下向用户确认,禁止臆造 id**。假 id 会写入失败或 @ 到错误的人。
13
+
14
+ ## Content 约束(关键)
15
+
16
+ - 带 `mentionUserId` 的 run,其 `content` **必须非空**,约定填 `"*"`(单字符占位)。
17
+ - 原因:转换按字符占位来引用样式,`content` 为空串时该 mention 不会产出任何元素(静默丢失)。
18
+ - `content` 的字面内容**不会显示**:画板上显示的是按 open_id 反查到的用户名,不是 `content` 的文字。因此不要把用户名写进 `content`,填单个 `"*"` 即可。
19
+ - 一个 run 只能是一种类型:`mentionUserId` 与 `hyperlink` **互斥**,不能同时出现在同一个 run(校验会报错)。需要"链接 + @用户"时拆成两个 run。
20
+
21
+ ## 骨架示例
22
+
23
+ `text` 用 `WBTextRun[]`,把 @用户 拆成独立 run(`content: "*"` + `mentionUserId`),前后再接普通文字 run:
24
+
25
+ ```json
26
+ {
27
+ "type": "text",
28
+ "width": "fit-content",
29
+ "height": "fit-content",
30
+ "text": [
31
+ { "content": "负责人:", "fontSize": 14 },
32
+ { "content": "*", "mentionUserId": "ou_xxxxxxxxxxxxxxxx", "fontSize": 14 },
33
+ { "content": " 请本周内跟进", "fontSize": 14 }
34
+ ]
35
+ }
36
+ ```
37
+
38
+ 写入画板走标准 DSL 路径(`npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json --to openapi --format json | lark-cli whiteboard +update ... --input_format raw`),无需手写 raw JSON。
39
+
40
+ ## 正反例
41
+
42
+ 正确:
43
+
44
+ ```json
45
+ { "content": "*", "mentionUserId": "ou_abc123" }
46
+ ```
47
+
48
+ 错误(content 空串 → 不产出 @用户):
49
+
50
+ ```json
51
+ { "content": "", "mentionUserId": "ou_abc123" }
52
+ ```
53
+
54
+ 错误(把用户名写进 content → 多余占位,显示仍由 uid 决定):
55
+
56
+ ```json
57
+ { "content": "@张三", "mentionUserId": "ou_abc123" }
58
+ ```
59
+
60
+ 错误(与 hyperlink 同 run → 校验报错,须拆两个 run):
61
+
62
+ ```json
63
+ { "content": "*", "mentionUserId": "ou_abc123", "hyperlink": "https://xxx.com" }
64
+ ```
65
+
66
+ ## 陷阱
67
+
68
+ - **content 为空**:mention 静默丢失,画板上看不到 @用户。必须填 `"*"`。
69
+ - **把用户名写进 content**:无意义,显示名由 open_id 反查决定;且多字符会占用多个字符位。
70
+ - **mentionUserId + hyperlink 同 run**:一个 run 只能是一种元素类型,会被校验拦截,须拆成两个 run。
71
+ - **用假 id 或用户中文名当 id**:`mentionUserId` 只接受真实 open_id,先经 `lark-contact` 解析。
@@ -27,14 +27,14 @@ metadata:
27
27
  - 用户要**按特定主题 / 关键词 / 内容线索查找资料并收集到知识库节点或新建知识库节点下**,必须先阅读 [`../lark-drive/references/lark-drive-workflow.md`](../lark-drive/references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`topic_move_collector`](../lark-drive/references/lark-drive-workflow-topic-move-collector.md) workflow。该 workflow 使用 Drive 全量搜索召回,再按 Wiki 目标解析、确认和移动;不要只用 Wiki 节点列表做局部遍历。
28
28
  - 用户要**整理 / 盘点 / 归类 / 重构知识库、个人文档库、文档库目录或 Wiki 节点结构**,或要生成整理方案、目标目录树、移动计划时,不要只使用 Wiki 节点 API。必须先阅读 [`../lark-drive/references/lark-drive-workflow.md`](../lark-drive/references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`knowledge_organize`](../lark-drive/references/lark-drive-workflow-knowledge-organize.md) workflow;该 workflow 负责 Drive / Wiki / 个人文档库的统一入口解析、资源盘点、分类计划、写前确认和结果验证。
29
29
  - 用户要把**已有 Wiki 节点移出知识库,放到 Drive 文件夹或“我的空间”根目录**:使用 `wiki +move-to-drive`,不要使用 `wiki +move` 或 `drive +move`。这是会改变节点归属和权限继承的写操作,执行前确认源节点与目标位置。
30
- - 用户给的是知识库 URL(`.../wiki/<token>`),且后续要查成员/加成员/删成员:先调用 `lark-cli wiki spaces get_node --params '{"token":"<wiki_token>"}'` 获取 `space_id`,后续成员接口统一使用 `space_id`。
30
+ - 用户给的是知识库 URL(`.../wiki/<token>`),且后续要查成员/加成员/删成员:先确定下游成员操作的身份(默认 `user`;用户明确要求应用 / bot 视角时用 `bot`),再调用 `lark-cli wiki +node-get --node-token '<wiki_url>' --as user --format json`,从 `data.space_id` 获取空间 ID;下游使用 bot 时将示例中的身份改为 `--as bot`。节点解析与后续成员操作必须使用相同身份。
31
31
  - 用户要**删除**知识空间(`wiki +delete-space`)但只给了名称或 URL:**不能**把名称 / URL 原样传给 `--space-id`,必须先解析出真实 `space_id`。解析方式:
32
- - URL(`.../wiki/<token>`):`lark-cli wiki spaces get_node --params '{"token":"<wiki_token>"}' --format json`,读 `data.node.space_id`。
32
+ - URL(`.../wiki/<token>`):先确定后续 `wiki +delete-space` 的身份(默认 `user`;明确要求 bot 视角时用 `bot`),再调用 `lark-cli wiki +node-get --node-token '<wiki_url>' --as user --format json`,读取 `data.space_id`;下游使用 bot 时将示例中的身份改为 `--as bot`。解析和删除必须使用相同身份。
33
33
  - 只知名称:`lark-cli wiki spaces list --format json`,边翻页边收集 items 并按 `name` 精确匹配;**一旦任一页累计到至少 1 条精确匹配就停止翻页**。只有当翻完所有页(`has_more=false`)仍无精确匹配时,才对已收集的全量 items 做宽松匹配(`name` trim 空格、大小写不敏感、子串包含)。
34
34
  - **关键安全约束**:无论精确还是模糊,**无论命中 1 条还是多条,发起删除前都必须把候选(`name` + `space_id` + `description` + `space_type`)列给用户,由用户明确选定一个 `space_id` 再执行**。不要因为"只命中一条"就自动执行删除。
35
35
  - 命中 0 条:停下来问用户是名称拼错了还是调用方无权限;**不要**自行改名字重试。
36
36
  - 用户明确选定后再执行 `lark-cli wiki +delete-space --space-id <ID> --yes`(高风险写操作,必须显式 `--yes`)。
37
- - 反例:不要把 wiki URL / 名称直接当 `--space-id`(如 `--space-id "https://.../wiki/<wiki_token>"`);务必先用 `wiki spaces get_node` 解析出 `data.node.space_id` 再传。
37
+ - 反例:不要把 wiki URL / 名称直接当 `--space-id`(如 `--space-id "https://.../wiki/<wiki_token>"`);务必先用 `wiki +node-get` 解析出 `data.space_id` 再传。
38
38
  - 用户要在知识库中创建新节点,优先使用 `lark-cli wiki +node-create`。
39
39
  - 用户要列出 Wiki 节点:先用 `wiki +space-list --as user` 拿数字 `space_id`,再用 `wiki +node-list --space-id <space_id>`。不要把 wiki URL、node token、doc token、名称直接当 `--space-id`。钻子节点时 `--parent-node-token` 必须是 wiki node token;如果用户给的是 docx/sheet/base URL,先用 `wiki +node-get --node-token <url>` 解析出 `node_token`。
40
40
  - `wiki +node-list` 命中 `invalid_parameters`、`not_found`、`permission_denied` 时,不要重复调用同一参数;按 hint 修 `space_id` / `parent_node_token` / 权限。只有 `rate_limit` 才做退避重试。
@@ -48,6 +48,8 @@ metadata:
48
48
 
49
49
  Shortcut 是对常用操作的高级封装(`lark-cli wiki +<verb> [flags]`)。有 Shortcut 的操作优先使用。
50
50
 
51
+ 获取或解析 Wiki 节点统一优先使用 `wiki +node-get`,包括只为获取 `space_id`、`node_token`、`obj_token` 或 `obj_type` 的中间步骤。只有当前 CLI 不提供该 shortcut,或任务明确需要 shortcut 未输出的原始响应字段时,才回退到 `wiki spaces get_node`;回退前先运行 `lark-cli schema wiki.spaces.get_node`。
52
+
51
53
  | Shortcut | 说明 |
52
54
  |----------|------|
53
55
  | [`+move`](references/lark-wiki-move.md) | Move a wiki node, or move a Drive document into Wiki |
@@ -117,13 +117,16 @@ dry-run 会展示两步调用链:
117
117
 
118
118
  ### 2. 只有知识库 URL(`.../wiki/<token>`)
119
119
 
120
+ 先确定后续 `wiki +delete-space` 使用的身份:默认使用 `user`;用户明确要求应用 / bot 视角时使用 `bot`。下面展示默认 user 身份;下游使用 bot 时将两步都改为 `--as bot`。节点解析和删除必须使用相同身份。
121
+
120
122
  ```bash
121
- lark-cli wiki spaces get_node \
122
- --params '{"token":"<wiki_token>"}' \
123
+ lark-cli wiki +node-get \
124
+ --node-token '<wiki_url>' \
125
+ --as user \
123
126
  --format json
124
127
  ```
125
128
 
126
- 读取 `data.node.space_id`。
129
+ 读取 `data.space_id`。
127
130
 
128
131
  ### 3. 只有知识库名称
129
132
 
@@ -1,219 +0,0 @@
1
- # lark-slides xml_presentation.slide create
2
-
3
- ## 用途
4
-
5
- 在指定的 XML 演示文稿中创建新的幻灯片页面,通常用于给 `slides +create` 创建出的空白 PPT 逐页补充内容。
6
-
7
- ## 命令
8
-
9
- ```bash
10
- lark-cli slides xml_presentation.slide create --as user --params '<json_params>' --data '<json_data>'
11
- ```
12
-
13
- ## 参数说明
14
-
15
- | 参数 | 类型 | 必需 | 说明 |
16
- |------|------|------|------|
17
- | `--params` | JSON string | 是 | 路径参数与查询参数 |
18
- | `--data` | JSON string | 是 | 请求体,包含新页面内容 |
19
-
20
- ### params JSON 结构
21
-
22
- ```json
23
- {
24
- "xml_presentation_id": "slides_example_presentation_id",
25
- "revision_id": -1,
26
- "tid": "idMock"
27
- }
28
- ```
29
-
30
- | 字段 | 类型 | 必需 | 说明 |
31
- |------|------|------|------|
32
- | `xml_presentation_id` | string | 是 | 目标演示文稿的唯一标识符 |
33
- | `revision_id` | integer | 否 | 演示文稿版本号,`-1` 表示最新版本 |
34
- | `tid` | string | 否 | 锁的事务 ID |
35
-
36
- ### data JSON 结构
37
-
38
- ```json
39
- {
40
- "slide": {
41
- "slide_id": "slide_example_id",
42
- "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\">...</slide>"
43
- },
44
- "before_slide_id": "slide_before_target"
45
- }
46
- ```
47
-
48
- | 字段 | 类型 | 必需 | 说明 |
49
- |------|------|------|------|
50
- | `slide.slide_id` | string | 否 | 幻灯片页面 short ID |
51
- | `slide.content` | string | 否 | 新幻灯片的 XML 内容 |
52
- | `before_slide_id` | string | 否 | 插入到指定页面之前 |
53
-
54
- ## slide XML 结构
55
-
56
- `slide.content` 是一个完整的 `<slide>` 元素,遵循 SML 2.0 Schema:
57
-
58
- ```xml
59
- <slide xmlns="http://www.larkoffice.com/sml/2.0">
60
- <data>
61
- <shape type="text" topLeftX="80" topLeftY="80" width="800" height="120">
62
- <content textType="title">
63
- <p>标题</p>
64
- </content>
65
- </shape>
66
- </data>
67
- </slide>
68
- ```
69
-
70
- 详细格式请参考 [xml-schema-quick-ref.md](xml-schema-quick-ref.md)。
71
-
72
- ## 使用示例
73
-
74
- ### 在末尾添加幻灯片
75
-
76
- ```bash
77
- lark-cli slides xml_presentation.slide create --as user --params '{
78
- "xml_presentation_id": "slides_example_presentation_id"
79
- }' --data '{
80
- "slide": {
81
- "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>新页面标题</p></content></shape><shape type=\"text\" topLeftX=\"80\" topLeftY=\"200\" width=\"800\" height=\"180\"><content textType=\"body\"><p>内容文本</p></content></shape></data></slide>"
82
- }
83
- }'
84
- ```
85
-
86
- ### 在指定页面前插入幻灯片
87
-
88
- ```bash
89
- lark-cli slides xml_presentation.slide create --as user --params '{
90
- "xml_presentation_id": "slides_example_presentation_id"
91
- }' --data '{
92
- "slide": {
93
- "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"800\" height=\"120\"><content textType=\"title\"><p>插入的标题页</p></content></shape></data></slide>"
94
- },
95
- "before_slide_id": "slide_before_target"
96
- }'
97
- ```
98
-
99
- ### 带图形元素的幻灯片
100
-
101
- ```bash
102
- lark-cli slides xml_presentation.slide create --as user --params '{
103
- "xml_presentation_id": "slides_example_presentation_id"
104
- }' --data '{
105
- "slide": {
106
- "content": "<slide xmlns=\"http://www.larkoffice.com/sml/2.0\"><data><shape type=\"text\" topLeftX=\"80\" topLeftY=\"80\" width=\"520\" height=\"120\"><content textType=\"title\"><p>数据展示</p></content></shape><shape type=\"rect\" topLeftX=\"700\" topLeftY=\"100\" width=\"200\" height=\"150\"><fill><fillColor color=\"rgb(100, 149, 237)\"/></fill></shape></data></slide>"
107
- }
108
- }'
109
- ```
110
-
111
- ### 从文件读取 XML
112
-
113
- ```bash
114
- # 先创建 slide.xml 文件
115
- cat > slide.xml << 'EOF'
116
- <slide xmlns="http://www.larkoffice.com/sml/2.0">
117
- <data>
118
- <shape type="text" topLeftX="80" topLeftY="80" width="800" height="120">
119
- <content textType="title">
120
- <p>从文件加载</p>
121
- </content>
122
- </shape>
123
- <shape type="text" topLeftX="80" topLeftY="200" width="800" height="180">
124
- <content textType="body">
125
- <p>这是从文件读取的幻灯片内容</p>
126
- </content>
127
- </shape>
128
- </data>
129
- </slide>
130
- EOF
131
-
132
- # 然后创建幻灯片
133
- lark-cli slides xml_presentation.slide create --as user \
134
- --params '{"xml_presentation_id":"slides_example_presentation_id"}' \
135
- --data "$(jq -n --arg content "$(cat slide.xml)" '{slide:{content:$content}}')"
136
- ```
137
-
138
- ## 返回值
139
-
140
- 成功时返回创建的幻灯片信息:
141
-
142
- ```json
143
- {
144
- "code": 0,
145
- "data": {
146
- "slide_id": "slide_example_id",
147
- "revision_id": 100
148
- },
149
- "msg": "success"
150
- }
151
- ```
152
-
153
- ### 返回字段说明
154
-
155
- | 字段 | 类型 | 说明 |
156
- |------|------|------|
157
- | `data.slide_id` | string | 新幻灯片的唯一标识 |
158
- | `data.revision_id` | integer | 演示文稿最新版本号 |
159
-
160
- ## slide 元素可用子元素
161
-
162
- | 元素 | 说明 |
163
- |------|------|
164
- | `<style>` | 页面样式(背景填充) |
165
- | `<data>` | 图形元素容器(shape、img、table、chart 等) |
166
- | `<note>` | 演讲者备注 |
167
-
168
- > [!IMPORTANT]
169
- > **本地图片必须先上传**:`xml_presentation.slide.create` 不识别 `@./local.png` 占位符(那是 `+create --slides` 的语法糖)。直接调本接口添加带图新页时,必须先用 [`slides +media-upload`](lark-slides-media-upload.md) 拿到 `file_token`,再写进 `<img src="<file_token>">`。
170
- >
171
- > 如果是从零开始建带图 PPT,**强烈建议改用 [`slides +create --slides '[...]'`](lark-slides-create.md#本地图片path-占位符)** 一步搞定(自动上传 + 替换 token)。
172
-
173
- ## 常见错误
174
-
175
- | 错误码 | 含义 | 解决方案 |
176
- |--------|------|----------|
177
- | 404 | 演示文稿不存在 | 检查 `xml_presentation_id` 是否正确 |
178
- | 400 | XML 格式错误 | 检查 `slide.content` 是否是完整 `<slide>` 元素 |
179
- | 400 | 请求体结构错误 | 检查是否按 `slide.content` 和 `before_slide_id` 包装 |
180
- | 403 | 权限不足 | 检查是否拥有 `slides:presentation:update` 或 `slides:presentation:write_only` scope |
181
- | 3350001 | XML 非 well-formed 或服务端参数校验失败 | 优先检查未转义字符:文本 `Q&A -> Q&amp;A`,文本 `<` / `>` 写成 `&lt;` / `&gt;`,属性 URL `a=1&b=2 -> a=1&amp;b=2` |
182
-
183
- ## 注意事项
184
-
185
- 1. **执行前必做**: 使用 `lark-cli schema slides.xml_presentation.slide.create` 查看最新的参数结构
186
- 2. **slide.content 格式**: 必须是完整的 `<slide>` 元素,不是整个 presentation
187
- 3. **命名空间建议**: 协议标准写法应带 `xmlns`,例如 `<slide xmlns="http://www.larkoffice.com/sml/2.0">`;当前服务端实现可能兼容不带 `xmlns` 的输入,但不作为协议保证
188
- 4. **fill / border 写法**: 颜色填充使用 `<fill><fillColor color="..."/></fill>`,边框常用 `<border color="..." width="2"/>`
189
- 5. **插入位置**: 通过 `before_slide_id` 指定插入目标,而不是用 `position`
190
- 6. **JSON 转义**: 如果直接内联 XML,需要正确转义双引号
191
- 7. **建议**: 先使用 `slides +xml-get` 获取现有结构,再添加新页面
192
-
193
- ## 批量添加建议
194
-
195
- 如果需要添加多张幻灯片,建议先明确每一页的 `before_slide_id`,或直接按最终顺序逐页追加:
196
-
197
- ```bash
198
- #!/bin/bash
199
-
200
- PRESENTATION_ID="slides_example_presentation_id"
201
-
202
- declare -a slides=(
203
- '<slide xmlns="http://www.larkoffice.com/sml/2.0"><data><shape type="text" topLeftX="80" topLeftY="80" width="800" height="120"><content textType="title"><p>页面 1</p></content></shape></data></slide>'
204
- '<slide xmlns="http://www.larkoffice.com/sml/2.0"><data><shape type="text" topLeftX="80" topLeftY="80" width="800" height="120"><content textType="title"><p>页面 2</p></content></shape></data></slide>'
205
- '<slide xmlns="http://www.larkoffice.com/sml/2.0"><data><shape type="text" topLeftX="80" topLeftY="80" width="800" height="120"><content textType="title"><p>页面 3</p></content></shape></data></slide>'
206
- )
207
-
208
- for slide_xml in "${slides[@]}"; do
209
- payload=$(jq -n --arg content "$slide_xml" '{slide:{content:$content}}')
210
- lark-cli slides xml_presentation.slide create --as user --params "{\"xml_presentation_id\":\"$PRESENTATION_ID\"}" --data "$payload"
211
- done
212
- ```
213
-
214
- ## 相关命令
215
-
216
- - [slides +create](lark-slides-create.md) - 创建空白 PPT
217
- - [slides +xml-get](lark-slides-xml-presentations-get.md) - 读取 PPT 内容并保存到本地文件
218
- - [xml_presentation.slide delete](lark-slides-xml-presentation-slide-delete.md) - 删除幻灯片页面
219
- - [xml-schema-quick-ref.md](xml-schema-quick-ref.md) - XML Schema 快速参考