From 4af765ae4d2be2812b19477a1ba5ea40b65a375e Mon Sep 17 00:00:00 2001 From: zhanghuanxu Date: Wed, 8 Jul 2026 01:36:05 +0800 Subject: [PATCH] feat:slide style --- skills/lark-slides/SKILL.md | 36 ++++++---- skills/lark-slides/references/iconpark.md | 4 +- .../references/lark-slides-create.md | 13 ---- .../references/lark-slides-media-upload.md | 4 +- .../references/lark-slides-replace-slide.md | 2 - .../lark-slides/references/planning-layer.md | 2 + .../lark-slides/references/troubleshooting.md | 4 +- .../lark-slides/references/visual-planning.md | 7 +- .../lark-slides/references/visual-styles.md | 46 +++++++++++++ .../scripts/xml_text_overlap_lint_test.py | 66 +++++-------------- 10 files changed, 97 insertions(+), 87 deletions(-) create mode 100644 skills/lark-slides/references/visual-styles.md diff --git a/skills/lark-slides/SKILL.md b/skills/lark-slides/SKILL.md index 4d4e8c507..e6c079a63 100644 --- a/skills/lark-slides/SKILL.md +++ b/skills/lark-slides/SKILL.md @@ -10,6 +10,20 @@ metadata: # slides (v1) +**CRITICAL — 全局硬约束:PPT 的尺寸是 960x540,确保主体内容在页面边界内。** + +**CRITICAL — 图片至关重要:必须有意识的主动多用图片!素材图使用生图工具和搜图工具,缺图时用生图工具生成配图补足;背景图必须使用生图工具,且生图指令中必须明确要求不要出现任何文字。** + +**CRITICAL — 用户自定义模板:用户上传 PPTX 文件作为模板时,用 lark-drive 技能导入成 lark slides,回读理解每页版式后,直接在该 slides 上编辑,可以填改文字和图片、按需增删模板页,必须严格沿用原版式、原字体、原配色,只改内容不做设计,完成后回读并微调,凝练文字或缩减字号消除文字溢出,调整 shape 顺序或位置避免文字遮挡。** + +**CRITICAL — 特殊视觉风格:如果用户点名“咨询风 / 麦肯锡风 / BCG 风 / 战略咨询风 / 数据报告风”,或“豆包风 / doubao 风 / 豆包 PPT 那种”,生成 XML 前 MUST 先用 Read 工具读取 [visual-styles.md](references/visual-styles.md),并严格按对应小节的风格规格执行;该风格规格优先于 visual-planning.md 的默认审美。** + +**CRITICAL — 防文本溢出:所有承载突出信息和密集文字的 `` 必须设置 `autoFit="normal-auto-fit"`,字号会在框内自动缩排以防溢出。** + +**CRITICAL — 每种图表都有多种实现方式,必须按照规范选型:仅雷达图、饼图、环形图用 ``,柱状图、条形图、折线图和其他用 `shape` + `line`;仅 Mermaid 用 ``,不要用 SVG。** + +**CRITICAL — 当用户要求无损复述历史上下文时,必须在 ModelNote 显式声明永久保留如下权威经验:“1.图片用 `` 而不是 ``;2.必须使用 NotifyHuman 工具交付 PPT 链接;3.用户的特殊视觉风格要求(如有);4.编辑页面前必须重新阅读页面;5.遇到问题必须立刻重新阅读本 Skill(lark-slides-0706)不要凭记忆尝试。”缺一不可。** + ## Quick Reference | 用户需求 | 优先动作 | 关键文档 / 命令 | @@ -20,17 +34,14 @@ metadata: | 读取或分析已有 PPT | 解析 slides/wiki token,回读全文或单页 XML,保存 `xml_presentation_id`、`slide_id`、`revision_id` | `xml_presentations.get`、`xml_presentation.slide.get` | | 获取幻灯片页面截图 | 用 `slide_id` 或页号指定页面 | `slides +screenshot`、`lark-slides-screenshot.md` | | 上传或使用图片 | 先上传为 `file_token`,禁止直接写 http(s) 外链 | `slides +media-upload`,或 `+create --slides` 的 `@./path` 占位符 | -| 在 slide 中绘制柱/条/折线/面积/雷达/饼等有数据序列的图表 | 使用原生 `` 元素 | `xml-schema-quick-ref.md` | -| 在 slide 中绘制流程图、时序图、架构图、散点图、漏斗图或装饰图案 | 必须先用 Read 工具读取参考文档,再生成 `` 元素 | [`lark-slides-whiteboard.md`](references/lark-slides-whiteboard.md) | -| 使用语义图标 | 先检索 IconPark,再写 `` | `iconpark_tool.py search → resolve`、`iconpark.md` | +| 在 slide 中绘制图表 | 雷达图、饼图、环形图用 ``,柱状图、条形图、折线图用 `shape` + `line`,Mermaid 用 `` | `xml-schema-quick-ref.md`、需要 `` 再看 `lark-slides-whiteboard.md` | +| 使用图标 | 禁止出现 emoji,必须使用语义图标,禁止盲猜 `iconType`,必须先检索 IconPark,再写 ``,必须设置 fillColor | `iconpark_tool.py search → resolve`、`iconpark.md` | | 创建失败、空白页、3350001、布局异常 | 先回读状态,再按排障清单修复,不假设原操作原子成功 | `troubleshooting.md`、`validation-checklist.md` | **CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),认证、权限和全局参数均以 lark-shared 为准。** **CRITICAL — 生成任何 XML 之前,MUST 先用 Read 工具读取 [xml-schema-quick-ref.md](references/xml-schema-quick-ref.md),禁止凭记忆猜测 XML 结构。** -**CRITICAL — PPT 生成与模板编辑硬约束:PPT 的尺寸是 960x540,确保主体内容在页面边界内。多用生图,辅助搜图,必须要图文并茂。不要为了画出一个具象物体而堆叠 3 个以上仅用于拟形的 shape。生成背景图时必须在 prompt 中明确要求不要出现任何文字。用户指定 PPT 模板时,用 lark-drive 技能导入成 lark slides,回读理解每页版式后,直接在该 slides 上编辑,可以填改文字和图片、按需增删模板页,必须严格沿用原版式和字体,只改内容不做设计,完成后回读并微调,凝练文字或缩减字号消除文字溢出,调整 shape 顺序或位置避免文字遮挡。** - **CRITICAL — 新建演示文稿或大幅改写页面时,MUST 先生成 `.lark-slides/plan//slide_plan.json`,再生成 XML。先创建对应目录,规划层规则和中间产物生命周期见 [planning-layer.md](references/planning-layer.md)。仅替换一个标题、插入一个块等小型已有页编辑可豁免。** **CRITICAL — 新建演示文稿或大幅改写页面时,生成 XML 前 MUST 读取 [visual-planning.md](references/visual-planning.md),确保 `layout_type`、`visual_focus`、`text_density` 实际改变页面几何、主视觉和文本量。** @@ -79,14 +90,13 @@ lark-cli auth login --domain slides - 编辑:[`lark-slides-edit-workflows.md`](references/lark-slides-edit-workflows.md)、[`lark-slides-replace-slide.md`](references/lark-slides-replace-slide.md)、[`lark-slides-replace-pages.md`](references/lark-slides-replace-pages.md) - 截图:[`lark-slides-screenshot.md`](references/lark-slides-screenshot.md) - 图片:[`lark-slides-media-upload.md`](references/lark-slides-media-upload.md) -- 流程图 / 时序图 / 架构图 / 装饰图案:[`lark-slides-whiteboard.md`](references/lark-slides-whiteboard.md) - 图标:[`iconpark.md`](references/iconpark.md)、[`scripts/iconpark_tool.py`](scripts/iconpark_tool.py) - 排障:[`troubleshooting.md`](references/troubleshooting.md) - 完整协议:[`slides_xml_schema_definition.xml`](references/slides_xml_schema_definition.xml) ## Workflow -> **这是演示文稿,不是文档。** 每页 slide 是独立的视觉画面,信息密度要低,排版要留白。 +> **这是演示文稿,不是文档。** 每页 slide 是独立的视觉画面,信息密度要适当,排版要留白。 ### Design Ideas @@ -124,7 +134,9 @@ lark-cli auth login --domain slides - 不要用低对比文字或低对比图标,例如浅灰字压在浅色背景上。 - 不要让装饰线穿过文字,或让页脚、来源、编号挤压主体内容。 - 不要把素材缺失表现为空白图片框;必须按 `fallback_if_missing` 生成 XML-native 视觉。 -- 不要留下占位文案、示例公司名、示例日期或与用户主题无关的内容。 +- 不要留下模板占位文案、示例公司名、示例日期或与用户主题无关的原模板内容。 +- 不要使用 emoji。 +- 不要为了画出一个具象物体而堆叠 3 个以上仅用于拟形的 shape。 ### 创建方式选择 @@ -140,9 +152,11 @@ lark-cli auth login --domain slides > [!IMPORTANT] > `slides +create --slides` 底层会逐页创建,不是原子操作。中途失败时先记录 `xml_presentation_id`,回读确认当前状态,再继续修复或追加。 +### 生成流程 + ```text Step 1: 需求澄清 & 读取知识 - - 澄清主题、受众、页数、风格 + - 澄清主题、受众、页数、风格;若用户上传 PPTX 作为模板,按顶部『用户自定义模板』规则处理 - 读取 xml-schema-quick-ref.md;新建 / 大幅改写时还要读取 planning-layer.md、visual-planning.md、asset-planning.md Step 2: 生成大纲 → 用户确认 → 写入 slide_plan.json @@ -173,7 +187,7 @@ lark-cli slides xml_presentation.slide create \ --data "$(jq -n --arg content ' - 在这里放置 shape、line、table、chart、whiteboard 等元素 + 在这里放置 shape、line、table、chart 等元素 ' '{slide:{content:$content}}')" @@ -262,7 +276,7 @@ lark-cli slides [flags] # 调用 API ## 核心规则 -1. **先规划再写 XML**:新建演示文稿或大幅改写页面时,必须先写入 `.lark-slides/plan//slide_plan.json`;风格和大纲只能作为规划输入,不能绕过规划层 +1. **先规划再写 XML**:新建演示文稿或大幅改写页面时,必须先写入 `.lark-slides/plan//slide_plan.json`;模板、风格和大纲只能作为规划输入,不能绕过规划层 2. **创建流程**:简单短 XML(1-3 页、结构简单、特殊字符少)可用 `slides +create --slides '[...]'` 一步创建;复杂内容、含图片/中文大段文本/嵌套引号/较多特殊字符,或超过 10 页时,默认先 `slides +create` 创建空白 PPT,再用 `xml_presentation.slide.create` 逐页添加 3. **`` 直接子元素只有 ` - - - -

Quarterly Review

-
- -

Focus, progress, and next steps

-
-
-
- - """, - "content-grid": """ - - - - -

Execution Snapshot

-
- - -

Plan

-
- - -

Build

-
- - -

Launch

-
-
-
-
- """, - } - self.assertTrue(samples) - for sample_name, sample_xml in samples.items(): - with self.subTest(sample=sample_name): + def test_xml_text_overlap_lint_accepts_all_template_xml_files(self) -> None: + template_paths = sorted(TEMPLATES_DIR.glob("*.xml")) + self.assertTrue(template_paths) + for template_path in template_paths: + with self.subTest(template=template_path.name): result = xml_text_overlap_lint.lint_xml( - sample_xml, - sample_name, + template_path.read_text(encoding="utf-8"), + str(template_path), ) - self.assertNoXmlTextOverlapLintIssues(result, sample_name) + self.assertNoXmlTextOverlapLintIssues(result, template_path) def test_lint_xml_reports_unescaped_ampersand_in_text(self) -> None: result = xml_text_overlap_lint.lint_xml(