--- name: ppt description: 生成 PowerPoint 演示文稿 (.pptx) 文件。✅ 触发:用户明确点名 PPT / 幻灯片 / 演示文稿 / .pptx / slide / deck 之一。⛔ 不触发:用户明确说要"报告 / 文档 / 纪要"等指向纯文档形式的产物。⚠️ 歧义先反问:用户说"汇报 / 方案 / 材料"等产物形态不明的词、且没说成品形式时,不要直接 load 本 skill 也不要假定走文档,先反问一句"这份要做成 PPT 演示稿,还是 Word/Markdown 文档?" 用户确认 PPT 后再 load。 --- # PPT(SVG-first) 把材料变成**可演示、可编辑**的 .pptx。 **核心管线**:`素材 → 策略(spec)→ [配图] → 执行(逐页手写 SVG)→ SVG 质检 → 后处理 → 导出 PPTX → 渲图验收` > **为什么是 SVG**:不再用 python-pptx 拼固定版式件(那是版面单调/AI 味的天花板)。AI 把每页当**矢量设计稿手写成 SVG**(设计自由度 = 浏览器级),再由纯 Python 转换器逐元素译成**原生可编辑的 DrawingML**(形状/文本/渐变都能在 PowerPoint 里选中改)。SVG 与 DrawingML 是同一套"绝对坐标 2D 矢量"世界观的两种方言,转换是翻译而非格式硬凑。详见 `references/shared-standards.md`。 > 进度展示:多页 deck 用 `task_progress` 标记「摄取素材 / 八条对齐 + 逐页大纲 / [配图] / 逐页 SVG / 质检 / 导出 + 验收」等关键阶段;不要把每页内部写入都当进度步骤。 ## 资源 **脚本**(host 上用 `.venv/Scripts/python.exe /scripts/xxx.py ...` 跑;`` = 本 skill 绝对路径): - `svg_quality_checker.py` —— **SVG 结构质检**(禁用特性 / viewBox / spec_lock 漂移 / 配色越界等)。引擎,自包含 - `finalize_svg.py` —— **SVG 后处理**(图标内嵌 / 配图裁切内嵌 / tspan 展平 / 圆角矩形转 path)→ 产出 `svg_final/` - `svg_to_pptx.py` —— **SVG → 原生 PPTX**(逐元素译 DrawingML;默认嵌演讲者备注 + Office 兼容 PNG 兜底) - `total_md_split.py` —— 把 `notes/total.md` 拆成逐页备注(导出前跑) - `update_spec.py` —— 改 `spec_lock.md` 的颜色/字体后,**一键传播到所有已生成 SVG**(改稿用) - `svg_preview.py` —— **无头 Chrome 把 SVG 渲成 PNG** 供肉眼/vision 验收(SVG 是视觉真相;**替代**了浏览器 live preview) - `project_utils.py` / `error_helper.py` —— 引擎辅助(canvas 校验 / 友好报错),被上面脚本 import,不直接调 **设计知识(references/,先读相关的,不默写)**: - `shared-standards.md` —— **SVG→PPT 硬约束(禁用特性清单 / XML 良构陷阱 / 字体栈纪律)**,执行前**必读** - `executor-base.md` —— 执行通则(模板继承 / 逐页 spec_lock 重读 / 字号纪律 / 内容→版式) - `strategist.md` —— 策略通则(八条对齐内容 / 配色派生 / 字号阶 §g / 配图意图 §h / spec 产出);**注:其中"Confirm UI 浏览器确认页"机制在 zcbot 里用聊天确认替代,只取其设计判断** - `image-layout-patterns.md` / `image-layout-spec.md` / `svg-image-embedding.md` —— 图文版式 72 式 + 并排尺寸算法 + 配图嵌入规范 - `canvas-formats.md` —— 画布格式(viewBox / 安全区) - `modes/`(5 种叙事骨架:pyramid/narrative/instructional/showcase/briefing)+ `visual-styles/`(**19 种视觉风格**:editorial/swiss-minimal/glassmorphism/dark-tech/data-journalism/…)—— **去 AI 味的关键**,执行时按 spec 锁定的那一个读 - `animations.md` —— 导出动画(可选,默认只翻页淡入、无逐元素动画) **模板库(templates/,opt-in,默认自由设计不读)**: - `layouts/`(版式模板)/ `decks/`(整套替换:中汽研/招商银行/重庆大学等)/ `brands/`(品牌身份)/ `charts/`(71 个图表/信息图 SVG)—— 索引见各自 `*_index.json` - `icons/` —— **5 套图标库**(tabler-outline/tabler-filled/chunk-filled/phosphor-duotone/simple-icons,共 1.1w+)。executor 写 ``,finalize 自动从这里内嵌(默认目录,无需预取);锁 inventory 前用 `ls templates/icons// | grep <关键词>` 验名 - `design_spec_reference.md` / `spec_lock_reference.md` —— **spec 产出骨架**,策略阶段写 spec 前必读 **素材摄取**:用 `markitdown` CLI 把 PDF/DOCX/PPTX/XLSX/HTML/URL 转 Markdown,落 `/sources/.md`。 ## 工作目录约定 `` = system prompt 注入的绝对路径。**每份 deck 用一个独立 project 目录** ` = //`(`deck_slug` 按主题取,多 deck 不撞)。引擎契约文件(`design_spec.md`/`spec_lock.md`)和各产物子目录都在 `` 下: ``` / ├── sources/ # markitdown 转出的素材 ├── design_spec.md # 人读:设计叙事(受众/风格/配色理由/逐页大纲)——引擎契约之一 ├── spec_lock.md # 机读:执行锁(HEX/字体栈/图标/图片清单/page_rhythm/page_layouts)——executor 每页重读 ├── images/ # 配图(imagegen 生成 / 用户提供 / 公式 PNG);SVG 里用 ../images/ 引用 ├── templates/ # 仅当用户给了模板路径才有(模板 SVG + 其 design_spec) ├── icons/ # 可选:项目本地图标(没有则 finalize 回退到 skill 的 templates/icons/) ├── svg_output/*.svg # ★ executor 逐页手写的 SVG(视觉真相、改稿对象) ├── svg_final/ # finalize 产出(图标/配图已内嵌,供预览) ├── notes/total.md # 演讲者备注(逐页),total_md_split 拆分后导出嵌入 ├── preview/ # svg_preview 渲的验收 PNG ├── exports/_.pptx # ★ 最终产物(原生 DrawingML,可编辑) ├── backup//svg_output/ # SVG 源快照(可不跑模型重新导出) └── REVISIONS.md # 修订日志(见 §修订日志) ``` **所有产物写 `` 下**,不写 cwd / `skills/` / repo 根。 ## 默认主题 — 自由设计(content-driven) **默认不锁死配色**:策略阶段根据**内容 + 受众 + 选定的 visual_style** 派生一套协调配色与版式(在 spec 阶段给用户 ≥3 个配色/风格候选挑)。模板是地板也是天花板 —— 默认自由设计让版面跟着内容走,而非被固定语汇框死。 - 商务红 `#C00000` / 中建材等品牌色,只作为**候选之一**;用户点名("做成蓝色 / 用我们公司紫色")或素材里有 brand guideline → 按其锁定。 - 想用模板/品牌库 → 用户给 `templates/` 下的明确路径才触发(见 strategist.md 模板分发);不主动猜、不模糊匹配。 --- ## 阶段一:策略(Strategist)—— 八条对齐 + 逐页大纲,产出 spec **先读** `references/strategist.md`(取其设计判断)+ `templates/design_spec_reference.md` + `templates/spec_lock_reference.md`(产出骨架)。 **0. 先检测已有 spec**:`glob /*/spec_lock.md`。 - 当前 task 已有 project → 展示给用户,问「**沿用进阶段二** / **重定调**(新建 project 目录,旧的保留)」,⛔ BLOCKING 等决定。 - 没有 → 走下面。 **八条对齐(a–h)**——按下表**一次性给推荐方案**(默认自由设计),然后 ⛔ **BLOCKING:等用户确认/修改**。不要一条条问。zcbot 走**聊天确认**(不开浏览器 Confirm UI),内容与 strategist.md 的 a–h 一致: | # | 项 | 默认 | |---|----|------| | a | 画布 | **16:9**(viewBox `0 0 1280 720`)。其它见 canvas-formats.md | | b | 页数 | 内容量 × 投递目的推导;**封面 + 正文 + 尾页**,常 8–15 页 | | c | 受众 + 核心信息 + 投递目的 | 看材料推断受众;投递目的 `text`(读)/`balanced`(商务,默认)/`presentation`(演讲)定正文字号与密度 | | d | mode + visual_style | mode 选 5 骨架之一;**visual_style 给 ≥3 个候选**(safe/shifted/bold)让用户挑 —— 这是观感主轴 | | e | 配色 | 按 visual_style + 内容**派生 ≥3 套候选**(每套含 bg/primary/accent/text…);自由设计默认 | | f | 图标 | 选 1 个库(tabler-outline 等),stroke 库要定 stroke_width;**锁 inventory 前 `ls templates/icons//|grep` 验名** | | g | 字体 + 字号 | CJK+Latin 字体栈(栈尾必须是预装字体,见 shared-standards §字体);正文字号按投递目的一个定值;公式策略 mixed/render-all/text-only | | h | 配图 | `none`/`ai`(走 imagegen skill)/`provided`/`placeholder`;ai 要定 image_rendering + image_palette(deck 级锁) | **逐页大纲**(写进 design_spec.md §IX,也是 spec_lock 的 page_rhythm/page_layouts 依据):**论断式标题 + 每页标节奏**(`anchor`/`dense`/`breathing`)。三条硬纪律(大纲阶段定死): - **论断标题**:写结论不写主题("渗透率破 60%" 不是 "行业背景"); - **节奏不雷同**:相邻内容页不同版式;narrative 真正停顿处插 `breathing`(单概念/金句/大图,**禁多卡网格**);不要为凑节奏造填充页; - **内容→版式映射**:历程→时间轴、循环→闭环、2-4 数字→KPI、并列→网格、单震撼数字→breathing 大字、≥3 数据点→图表(charts/ 模板或自绘)。 大纲连同 a–h **一起给用户预览,⛔ BLOCKING 等确认整份结构**后再进阶段二(改文字比改 slide 便宜)。 **确认后产出两份引擎契约**(按骨架填,**只填实际用到的行**): - `/design_spec.md` —— 人读叙事(I–XI 节,见 design_spec_reference.md) - `/spec_lock.md` —— 机读执行锁(canvas/mode/visual_style/colors/typography/icons/images/page_rhythm/page_layouts/page_charts/forbidden,见 spec_lock_reference.md)。**executor 每页重读它**,是长 deck 抗漂移的命门。 > 公式策略 mixed/render-all 且有公式 → 写 `images/formula_manifest.json` 后渲染(ppt-master 的 latex_render 未搬;zcbot 可用现有公式渲染或转图后按 `images` 行登记)。 ## 阶段二:配图(条件触发) **仅当 spec §VIII 有 `ai` 行**:把要 AI 生成的配图汇总,**load `imagegen` skill 走它自己的成本确认流**逐张生成(有强制确认门,不要绕过),产物落 `/images/`。`web`/`provided`/`placeholder`/`none` → 跳过本阶段。 > ppt-master 自带的 image_gen.py / image_search.py 配图子系统**未搬**;zcbot 统一走 imagegen skill。spec 的 §VIII 图片清单格式照用,只是获取机制不同。 ## 阶段三:执行(Executor)—— 逐页手写 SVG **先读**(按本 deck spec_lock 锁定值): ``` references/executor-base.md # 执行通则 references/shared-standards.md # SVG/PPT 硬约束 references/modes/.md # 锁定的叙事骨架 references/visual-styles/.md # 锁定的视觉风格 ``` 只读锁定的那一个 mode + 一个 visual-style,别 glob 整个目录。 **纪律(来自 SKILL 全局 + executor-base,务必遵守)**: 1. **逐页串行手写,不批量、不脚本生成**:每页由当前主 agent 在同一上下文里手写 SVG;**禁止写循环脚本批量产 SVG**(跨页视觉一致性靠逐页带上游上下文,生成器做不到),也不要 5 页一组。 2. **每页前重读 `spec_lock.md`**:颜色/字体/图标/图片只能来自它;查本页 `page_rhythm`/`page_layouts`/`page_charts`。抗上下文压缩漂移。 3. **模板供结构不供皮**(非 mirror):继承几何/标签位置/编码逻辑,**重新上 visual_style + spec_lock.colors 的皮**;字号按 spec_lock 角色锁定值,不继承模板占位字号。 4. **图标(锁了就必须用,非可选装饰)**:spec_lock 有 `icons.library` + 非空 `inventory` 时,**每个内容页必须放 1–3 个 inventory 内的图标**(KPI/列表/流程/对比/特性网格版式尤其要,常一卡一图标)——自由设计没有模板可继承图标,只能逐页手写 `` 才有图标。封面/纯排版分节页/单数字·金句 breathing 页/尾页可不放。写法:``,name 必须在 inventory 内、文件在 `templates/icons//`。**质检会硬卡**:锁了 inventory 但全 deck 0 图标 → error 退非零(见阶段四)。 5. **配图**:``,croppable 用 `preserveAspectRatio="xMidYMid slice"`,`| no-crop` 行用 `meet`;意图与版式见 image-layout-*。 逐页写到 `/svg_output/_.svg`。**演讲者备注**写 `/notes/total.md`(每页 2–4 句结论先行口语)。 ## 阶段四:SVG 质检(强制门) ``` .venv/Scripts/python.exe /scripts/svg_quality_checker.py ``` - **任何 `error`(禁用特性 / viewBox 不符 / spec_lock 漂移 / **锁了图标 inventory 却全 deck 0 图标** 等)必须改:回阶段三重写该页再跑**,不放过。 - `warning`(低分辨率图 / 非 PPT 安全字体等):能顺手改就改,否则知会后放行。 - 跑 `svg_output/`(不要在 finalize 后跑 —— finalize 改写 SVG 会掩盖源级违规)。 ## 阶段五:后处理 + 导出 ⚠️ 三步**一步步来**,别合并成一条命令: ``` # 5.1 拆备注 .venv/Scripts/python.exe /scripts/total_md_split.py # 5.2 SVG 后处理(图标/配图内嵌 / 文本展平 / 圆角转 path) .venv/Scripts/python.exe /scripts/finalize_svg.py # 5.3 导出原生 PPTX(默认嵌备注 + Office 兼容 PNG 兜底) .venv/Scripts/python.exe /scripts/svg_to_pptx.py # 产物:exports/_.pptx(原生,读 svg_output/)+ backup//svg_output/(源快照) ``` - ❌ 别用 `cp` 代替 finalize_svg(它做了多步关键处理);❌ 别加 `--only` / 强制 `-s output`。 - 动画可选:`-t fade`(翻页,默认)/ `-a auto`(逐元素入场,**默认 none**,用户要才开)。全表见 animations.md。 - 改稿:只改 `spec_lock.md` 的颜色/字体 → `update_spec.py ` 传播到所有 SVG;改版式/内容 → 重写对应页 SVG 再跑 5.2–5.3,**不要直接 edit 成品 .pptx**。 ## 阶段六:验收(渲图肉眼/vision 看) ``` .venv/Scripts/python.exe /scripts/svg_preview.py --pages 1,3,5 -o /preview ``` `read` 渲出的 PNG 亲眼过:封面、一个内容页、一个 breathing 页 —— 看标题层级、卡片过挤/过空、文字是否都正常、节奏是否单调、配图位置。不通过的回阶段三改对应页 SVG 重跑。 > svg_preview 渲的是 SVG(视觉真相,与导出的 pptx 1:1),比渲最终 pptx 更早更准暴露观感问题。需要校验"SVG→DrawingML 转换是否保真",再开导出的 pptx 在 PowerPoint 里看。 完成后:用 `update_spec` / 重写页迭代;用户确认**实质改动**后追加一行到 `REVISIONS.md`。 ## 修订日志(REVISIONS.md) `/REVISIONS.md` 是迭代 changelog。**spec 是宪法(定调一次),REVISIONS 是实施日志(每次卡点累加)**。 | 情形 | 记? | |---|---| | 用户确认改**版式/主色/字体/mode/visual_style 方向** | ✅ | | 用户确认换/增/删**页/关键图标/数据图表** | ✅ | | 用户确认改**文案要点/核心信息/受众定位** | ✅ | | 自查发现越界/不一致后的修正 | ✅(注明触发的 quality_check 项) | | 页首次起草 / 字号间距微调 / 模型自己改撤未经确认 | ❌ | 格式(倒序,最新在上,插在头注释之后): ``` - `` | <第 N 页 / spec §X> | <一句话改了什么> — <为什么> ``` ## 反模式 - 用户没给材料就硬编内容(没材料只给主题 → 先补素材/反问,别凭空发挥) - 八条没对齐、没产出 spec_lock 就开始写 SVG - **写脚本批量生成 SVG**(破坏跨页一致性,禁;逐页手写) - **执行时不每页重读 spec_lock**(长 deck 必漂色/漂字号) - **同 deck 混用多个图标库** / 用 inventory 外的图标名 - 用了 `