# Slide Writer

> 把想法、大纲、文档或草稿变成结构清晰、设计精良的企业级 HTML 演示文稿。 Use when this capability is needed.

- Skill: `tomevault-io/slide-writer` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/slide-writer`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/slide-writer/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/slide-writer

---


# Slide-Writer

把任意输入（想法、大纲、草稿文档、会议纪要）转化为企业级 HTML 演示文稿，自动匹配所在公司的品牌主题。

## 核心原则

1. **品牌一致** — 从请求中自动识别公司，应用对应品牌色主题；内置 14 家互联网公司主题。
2. **内容为王** — 自动润色每句话：去冗余、精简、让表达更有力。
3. **不溢出** — 每张幻灯片必须在 100vh 内完整呈现，内容多则分页，绝不出现滚动条。
4. **单文件交付** — 输出单个 `.html` 文件，CSS/JS 全部内联，零依赖，浏览器直接打开。

---

## Phase 0：准备

### 自动更新（第一步，必须执行）

```bash
git pull --ff-only
```

成功 → 静默继续；失败（无网络 / 有冲突）→ 静默忽略，继续使用当前版本。

### 模式识别

- **Mode A：全新制作** — 从主题/大纲/草稿创建，进入 Phase 1。
  - **A1：内容压缩** — 用户提供了演讲稿、大纲或草稿（输入字数 ≥ 200 字），目标是提炼精简，应用演讲稿转PPT规则和密度上限。
  - **A2：主题创作** — 用户只提供了主题/标题（输入字数 < 200 字），目标是**主动生成丰富内容**，充分展开每个子话题，**不受演讲稿压缩规则约束**，卡片描述上限放宽至 120 字，页数默认 10–15 页。
- **Mode B：增强改稿** — 在现有 HTML 上修改或扩充内容：
  1. 完整读取现有 HTML，识别所有 `<section>` 的 `id`、`class`、标题，输出当前幻灯片清单
  2. **范围判断**：修改 ≤ 3 张 → 精确改稿；修改 > 30% 或新增 > 原有 → 建议用 Mode A 重新生成
  3. 识别原有主题（用户未要求更换则保留）
  4. 按用户描述（序号、标题关键词）定位目标 `<section>`，**确认后再操作**
  5. 只改被点名的 `<section>`，新增页插入逻辑最合适的位置
  6. 未被点名的幻灯片保持原样，不做"顺手优化"
  7. 改完检查：目录议程项数与内容页数是否一致？章节逻辑是否连贯？不一致则列出，询问用户是否同步更新
  8. 执行与 Mode A 相同的质量检查

### 主题检测

读取 [themes/_index.md](themes/_index.md)，从用户请求提取公司关键词，优先级从高到低：

1. 用户明确指定的公司名、产品名
2. 署名中的部门/团队名称
3. 内容中出现的公司名

- 识别到 → 记录主题 ID 和 `themes/[id].md` 路径
- 未识别到 → 默认蚂蚁集团+支付宝双 Logo 主题
- 多品牌冲突 → 按 `themes/_index.md` 优先级链执行

---

## Phase 1：内容收集

一次性收集以下信息（运行环境支持 `AskUserQuestion` 则用它补问，否则发一条消息补问）：

| 字段 | 说明 |
|---|---|
| **公司** | 所在公司或品牌名称（用于匹配主题色） |
| **主题** | 演讲 / 汇报的核心主题 |
| **受众** | 管理层 / 团队内部 / 跨部门 / 外部客户 |
| **页数** | 5–8 页 / 10–15 页 / 20 页以上 |
| **内容** | 粘贴大纲、草稿或关键要点；只有主题时说明即可 |
| **署名** | 演讲者姓名 + 角色/岗位/Title（用于封面） |
| **日期** | 演讲日期（默认今天） |

**缺失字段的推断规则：**

- **公司** → 从内容、署名、部门名称推断；仍无法识别则默认蚂蚁集团
- **受众** → 含"汇报/review/决策/管理层" → 管理层；含"分享/复盘/团队" → 团队内部；含"提案/客户/合作" → 外部客户；无法判断 → 内部汇报
- **页数** → 按模式和字数推断：
  - **Mode A2（主题创作）**：默认 10–15 页，主题内涵丰富（含多子话题、历史文化、数据等）可到 15–20 页；
  - **Mode A1（内容压缩）**：< 500 字 → 4–6 页；500–1500 字 → 8–12 页；1500–3000 字 → 12–18 页；> 3000 字 → 18 页以上；
  - 推断结果与内容明显不符时，进入 Phase 2 前显式确认
- **日期** → 默认今天
- **署名** → 从内容或当前用户信息推断；无法推断则默认"演讲者"

Phase 1 完成后通知：`已收集：[公司] · [受众] · [页数] 页 · [署名]`

---

## Phase 2：结构规划

### 必须包含的页面

| 页面类型 | Slide Class | 豁免条件 |
|---|---|---|
| 封面页 | `slide-cover` | 无豁免 |
| 目录页 | `slide-white` | 总页数 ≤ 6 时省略 |
| 章节过渡页 | `slide-section` | 该章节内容页 < 3 时省略；章节页总数不超过内容页的 1/3 |
| 结尾页 | `slide-qa` | 无豁免 |

> **小型 PPT（≤ 6 页）**：封面 + 内容页 + 结尾，不强插目录和章节页。

### 演讲稿转 PPT 规则（**仅 Mode A1** 执行，Mode A2 跳过）

1. **PPT 是辅助，不是原文上墙** — 禁止逐段照搬，单页文字量必须明显少于讲稿密度。
2. **一页一判断** — 提炼一个结论句作为标题，保留 2–4 个支撑点；多论点拆成多页。
3. **留金句，删铺垫** — 保留数字、判断、类比；删寒暄、重复、口语化过渡；引用只取 1 句。
4. **3 秒可读** — 满足任一条即达标：① 单页总字数 ≤ 80 字；② bullet ≤ 4 条且每条 ≤ 15 字；③ 数字 ≤ 3 个且说明 ≤ 30 字；④ 视觉块占页面 ≥ 40%。
5. **第一视角** — 标题优先用"我们 / 今天想讲"，不用"作者认为""整场发言围绕"。

不适合搬到 PPT 的内容：开场寒暄、重复表达、口语化连接词、大段故事细节、抒情句、可口头补充的背景说明。

### 主题创作原则（**仅 Mode A2** 执行）

1. **内容深度优先** — 每个子话题充分展开，给出背景、细节、意义，让读者看完幻灯片本身就能获得完整信息，无需演讲者补充。
2. **完整性** — 凡主题中含有明确数量的事物（如"十景"、"三原则"、"五步骤"），必须全部列出，不得因排版便利而截断；超出单页容量则拆分为多页并在标题注明"（上）""（下）"。
3. **引用原话** — 文化/历史类主题应引用原始诗句、史料或名言，不用泛泛描述代替。
4. **卡片描述上限放宽** — 信息卡片描述 ≤ 120 字，步骤卡描述 ≤ 80 字，单页总字数 ≤ 300 字；超出则拆页，不压缩内容。
5. **标题是结论，不是话题** — 即便是介绍性内容，标题也应给出判断（"苏堤是人工干预自然的最美典范"而非"苏堤简介"）。

### 视觉化原则

1. **先做结构，再放文字** — 优先用数字、卡片、对比、流程承载内容。
2. **主视觉节奏清晰** — 多个视觉区块间必须有明确层级和分组；内容超出屏幕时拆页，不缩字号强塞。
3. **把段落改成组件** — 长段优先改写成组件；可复用 `stat-block`、`step-card`、`quote-box`、`agenda-item`，也可按内容需要设计新的页面骨架与信息组件。
4. **关键词可扫读** — 数字、判断句必须一眼能扫到；长句只作补充。
5. **多横向，少纵向** — 优先并列卡片、对比、矩阵，少用连续纵向文字。
6. **每 3–4 页变换节奏** — 穿插章节页、金句页、大字判断页或轻内容页。
7. **先判内容形态，再选版式** — 见「内容类型 → 组件选择」表。
8. **标题区固定** — 所有内容页标题区位置一致，不因正文密度漂移。
9. **SVG 优先** — 数量对比、趋势、占比、流程优先用内联 SVG；禁止纯数字+文字句子描述可视化数据。
10. **视觉效果分层** — 重点卡片叠加渐变背景 + 顶部色条 + pill 标签；径向渐变光圈作点缀，不要每张卡都加。
11. **组件库是起点，不是边界** — `components.md` 提供的是高频可复用参考，不是完整上限；当主题更适合地图、时间带、关系网、年表、分镜、注释图、海报式大字、档案卡、实物标注、时间切片、城市剖面等表达时，应优先为内容发明更合适的新组件。

### 内容类型 → 组件选择

在写每页 HTML 前，先判断内容形态，再选布局。优先级：**页面骨架 > 成组组件 > 普通 bullet**。下表是推荐起点，不是限制清单；若现有组件不够贴合，应自定义新骨架而不是勉强套用。

| 内容形态 | 推荐组件 / 骨架 | 避免 |
|---|---|---|
| 全文总览 / 章节预告 | `agenda-item`、分组目录页 | 普通 bullet 平铺目录 |
| 开场判断 / 问题定义 | 开场钩子页、`highlight-box` + `info-card` | 整页长段正文 |
| 单一核心结论 | `highlight-box`、`stat-block`、大数字 | 密集列表或多主题混页 |
| 核心结论 + 数据支撑 | `insight-panel` | 判断句和数字分散在两张独立卡片 |
| 并列要点 / 三原则 | `three-col`、`info-card`、`stat-block` | 三个平级观点写成纵向长段 |
| 双对象对比 | `two-col`、左右图文混排 | 单列顺序写法 |
| 分阶段推进 | `step-card`、`step-flow-grid` | 普通 bullet 描述"第一第二第三" |
| 月度 / 季度路线图 | `roadmap-col` | 普通 step-card 忽略时间轴感 |
| 工作流 / 研发流程 | `flow-item`（4列×N行） | 有序列表平铺 8 个步骤 |
| 能力成熟度 / 等级体系 | `level-row` | 普通 bullet 描述各等级 |
| 组织支撑 / 能力体系 | `support-board`、`support-card`、`role-card` | 多段正文描述体系 |
| 责任清单 / 人员分工 | `support-mini-card` + `@负责人` | 普通 bullet 列名字 |
| 多角色流转 / 跨方协同 | `demand-flow-board` | 静态列表描述角色 |
| 数据 / 占比 / 趋势 | `stat-block`、进度条、SVG 图表、表格 | 只写数字句子无图形支撑 |
| 排名 / 优先级 | `bar-rank` | 纯数字列表 |
| 业务线 / 产品集合 | `tag-cloud` | 等高等大标签平铺 |
| 产品截图 | `browser-mockup` | 裸放图片无上下文 |
| 引用原话 | `quote-box`、`insight` | 堆多段长引用 |
| 结尾总结 | 分组总结页、`agenda-item`、`highlight-box` | 结尾再展开大量新信息 |

**组件约束：**
- 先选骨架，再选骨架内组件；强结构页（`support-board`、`demand-flow-board`）不退回普通卡片页。
- 卡片未铺满一行时容器收窄居中：1张→40%、2张→60%、3张→80%、4张以上→100%；用 `style="max-width:X%;margin:0 auto;"` 写在容器上。
- 内容偏少时 `slide-body` 显式加 `justify-content:center`，避免内容贴在上半屏。
- `components.md` 是参考库，不是白名单。允许自定义 HTML、CSS class 和新的信息组件，只要遵守当前模板的 CSS 变量、字号体系、留白系统与交互约束。
- 自定义组件应优先解决“现有组件表达不清”的问题，而不是只换视觉皮肤；新组件必须有清晰的信息任务，例如表达时间跨度、地理关系、因果链、空间层级、证据标注、版本差异、结构剖面。
- 新组件优先保持语义化命名，例如 `timeline-band`、`map-note-card`、`artifact-callout`、`split-metric-stage`、`city-axis-board`，避免无语义的 `box-1`、`layout-a`。
- 新组件可以是整页骨架，不必退化成卡片拼贴；允许使用注释线、时间轴带、分层底图、局部放大框、编号锚点、档案标签、印章式视觉、报纸栏、策展墙、编年表、示意地图等展示方式。
- **叙述型卡片页禁止 5 列**：含标题+描述+bullet 的解释型页面最多 4 列；5 列只用于极短标签卡或纯图标卡。
- **禁止"上实下空"**：页面底部留白明显大于顶部时，视为未完成布局。

### 新组件设计规则

当需要超出 `components.md` 时，按以下规则设计：

1. **先定义信息任务** — 先说清楚这页要表达的是时间、空间、关系、证据、对照、层次还是叙事，再决定组件形态。
2. **一页只引入 1 个主创意** — 可以有辅助组件，但主视觉语言必须单一，避免一页内同时出现时间轴 + 地图 + 大表格 + 多层卡片。
3. **可扫读优先于炫技** — 新组件必须让读者 3 秒内看懂主结论，不能为了“新”而牺牲信息获取速度。
4. **结构先于装饰** — 先确定信息区块、阅读顺序、锚点和对齐关系，再加渐变、阴影、纹理、印章、边框等装饰。
5. **允许为主题定制组件** — 历史类可用编年轴、文物注释卡、古今对照图；战略类可用战区图、优先级棋盘；产品类可用分镜、界面放大镜、漏斗剧场；教育类可用黑板式推演、题眼拆解图。
6. **复用已有设计语言** — 即便新建组件，也要继续使用现有颜色变量、圆角、阴影、字号层级和 reveal 动画，不要做成另一个完全割裂的系统。
7. **能抽象再抽象** — 如果某个新组件在 2 页以上重复出现，第二次开始应抽成稳定 class 命名，而不是每页一套散装内联样式。

### 内容密度规则

| 内容类型 | Mode A2（主题创作） | Mode A1（内容压缩） |
|---|---|---|
| 文字要点 | 10–15 条 bullet，每条 ≤ 40 字 | **6–8 条**，每条 ≤ 25 字 |
| 信息卡片（横向） | 5–6 列，描述 ≤ 120 字 | **4–5 列**，描述 ≤ 50 字 |
| 信息卡片（纵向） | 单列 ≤ 10 张，描述 ≤ 120 字/张 | 单列 ≤ 6 张，描述 ≤ 35 字/张 |
| 数据统计 | 6–9 个 stat-block，配 1–2 句解读 | 6 个，配 1 句解读 |
| 对比/流程 | 4–6 个 step-card，描述 ≤ 80 字 | **4 个**，描述 ≤ 35 字 |
| 表格 | 最多 12 行 × 6 列 | 最多 8 行 × 5 列 |
| 引用原话 | 1–3 段，每段 ≤ 150 字 | 1 段，**≤ 80 字** |
| 卡片描述正文 | **3–5 句话**，≤ 120 字 | **2–3 句话**，≤ 50 字 |
| 单页总字数 | ≤ 300 字 | ≤ 150 字 |

超出限制 → 自动拆成多页，页间用连贯的过渡标题衔接。

### 布局多样性

**规划完成后，进入 Phase 3 前必须执行以下自检：**

1. 统计各类型布局的页数（多列卡片、流程、bullet、纯视觉）
2. 检查局部连续约束：
   - `three-col` / `info-card` ≥ 4 连续 → 中间插入过渡页或大字判断页
   - `step-card` ≥ 3 连续 → 第 4 页换其他骨架
   - `styled-list` ≥ 4 连续 → 至少 1 页改为卡片或图表
3. 检查全局约束：
   - 多列卡片页占内容页 > 55% → 替换超出部分
   - 总页数 > 10 且无纯视觉页 → 插入至少 1 页（建议放中段）
4. 有调整则在规划清单中用 `[调整]` 标注改动位置

### 文字润色（自动执行）

1. **去冗余** — 删除"我们认为""需要指出的是"等无信息量前缀。
2. **名词化** — "进行分析"→"分析"，"做出决策"→"决策"。
3. **数字化** — 只润色原文已有数字的表达（"百分之三十七"→"37%"）；禁止编造原文无源的具体数字。
   - ✅ 原文含"50+"→ 保留"50+ 轮测试"；原文含"故障率""下降"→ 可补"故障率下降 40%"
   - ❌ 原文"取得成果"→ 不可杜撰"节省 200 万元"；原文"反馈不错"→ 不可杜撰"满意度 92%"
4. **动词有力** — 用"推进""落地""打通""提升"替代"做""进行""开展"。
5. **层级清晰** — 主标题是结论/判断，副标题是补充说明，内容是支撑。
6. **引用克制** — 只保留最有代表性的 1 句；同页不出现多段长引用。

Phase 2 完成后通知：`规划完成，共 N 张，开始生成…`

---

## Phase 3：生成 HTML

### Step 3.1：准备文件

**① 复制模板**
```bash
cp template.html [输出文件名].html
```
- 禁止直接编辑 `template.html` 本身
- 文件名使用英文小写 + 连字符，例如 `antgroup-q1-review.html`

**② 并行读取**（同时发起）

- **`themes/[id].md`** — 获取 CSS 变量、`.slide-section` / `.slide-qa` 覆盖、logo 路径
- **`components.md`** — 只 Grep Phase 2 中用到的组件章节，不必全读
- **`components.md`** — 作为高频组件参考；若规划包含创新布局，只需读取相关章节借鉴命名、字号和留白，不要把它当成白名单
- **`icons.md`**（含图标槽时按需 Grep）— 中文主题 → 英文图标名参考：

  | 中文关键词 | 推荐图标名 |
  |---|---|
  | 安全、防护、权限、合规 | `shield`, `lock`, `eye-off` |
  | 数据、分析、统计、报告 | `bar-chart-2`, `pie-chart`, `trending-up` |
  | 用户、客户、团队、人员 | `users`, `user`, `user-check` |
  | 流程、步骤、推进、路径 | `arrow-right`, `git-branch`, `navigation` |
  | 目标、战略、方向、规划 | `target`, `flag`, `compass` |
  | 技术、系统、架构、平台 | `cpu`, `server`, `layers` |
  | 效率、性能、速度、优化 | `zap`, `clock`, `activity` |
  | 成本、金融、收益、预算 | `dollar-sign`, `credit-card`, `trending-down` |
  | 协同、沟通、对接、整合 | `link`, `share-2`, `message-circle` |
  | 风险、问题、告警、异常 | `alert-triangle`, `x-circle`, `bell` |
  | 创新、产品、功能、特性 | `star`, `package`, `box` |
  | 运营、推广、增长、运作 | `trending-up`, `repeat`, `refresh-cw` |

### Step 3.2：填充占位符

`template.html` 已内置蚂蚁集团默认值（双 logo、页脚文字）。标题、主题样式、logo 全部改为脚本直接写回 HTML，不再手工替换。

**① 标题**
**② 主题样式**
**③ Logo**

```bash
# `theme-id` 默认为 `ant-group`
python3 scripts/apply-template-branding.py [文件名].html \
  --title "[演讲主题]" \
  --speaker "[演讲者]" \
  --theme-id [theme-id]
```

规则：

- `theme-id=ant-group` 时保留 `<!-- %%THEME_STYLE%% -->`
- 其他主题从 `themes/[id].md` 的 `## CSS` 代码块注入 `<style>...</style>`
- `#globalLogoGroup` 是唯一 logo 节点，**禁止在任何 `<section>` 内写 logo**
- logo 文件缺失时按脚本 fallback；必要时自动隐藏并输出 warning

**④ 幻灯片内容（必填）**
```
old: <!-- %%SLIDES%% -->
new: 所有 <section> 幻灯片 HTML
```

**主题应用说明：**
- `.slide-section` / `.slide-qa` 必须用 `!important` 覆盖基础 CSS 中的硬编码渐变
- `--primary-pale` 会自动影响 `info-card` 背景、`agenda-item` hover 等，无需逐一覆盖

### Step 3.3：写幻灯片

每张写入前先输出进度：`→ 03/12  技术架构现状`（序号补零到总数位数）

**封面页**
```html
<section class="slide slide-cover" id="slide-1">
    <div class="cover-arcs" aria-hidden="true">
        <div class="arc arc-1"></div><div class="arc arc-2"></div><div class="arc arc-3"></div>
    </div>
    <div class="cover-top reveal" style="display:flex;align-items:center;">
        <span style="color:rgba(255,255,255,0.65);font-size:clamp(0.65rem,1.1vw,0.85rem);">[部门]</span>
    </div>
    <div class="cover-main">
        <h1 class="cover-title reveal">[主标题]</h1>
        <p class="cover-subtitle reveal">[副标题]</p>
        <p class="reveal" style="font-size:clamp(0.85rem,1.5vw,1.1rem);color:#fff;font-weight:700;">[姓名｜角色/Title]</p>
    </div>
    <div class="cover-bottom"><div class="cover-date reveal">[日期]</div></div>
</section>
```

**内容页（白色）**
```html
<section class="slide slide-white" id="slide-N">
    <div class="slide-header center-stack">
        <span class="header-mark"></span>
        <h2 class="header-title">[结论/判断句]</h2>
        <p class="header-sub">[补充说明]</p>
    </div>
    <div class="slide-body" style="justify-content:center;">
        <!-- 组件区 -->
    </div>
</section>
```

**章节过渡页**
```html
<section class="slide slide-section" id="slide-N">
    <p class="section-num reveal">PART [N]</p>
    <h2 class="section-title reveal">[章节标题]</h2>
    <p class="section-desc reveal">[一句话说明本章节要回答的问题]</p>
</section>
```

**结尾页**
```html
<section class="slide slide-qa" id="slide-N">
    <h2 class="qa-title reveal">Q&amp;A</h2>
    <p class="qa-sub reveal">[感谢语]</p>
</section>
```

**写入约束（所有幻灯片必须遵守）：**

| 场景 | 写法 |
|---|---|
| 普通间距、字号 | `clamp()` 或 CSS 变量 |
| 固定 px 尺寸 | `calc(Npx * var(--vp-scale, 1))` |
| 容器最大宽度 | `min(calc(XYZpx * var(--vp-scale, 1)), 100%)` |
| `max-width` 写死 px | **禁止** |
| 内容区宽度 | `<div style="width:min(100%,var(--deck-safe-width));margin:0 auto;">` |

**密度自检**（每页必须执行，按模式选对应上限）：

| 检查项 | A2 主题创作上限 | A1 内容压缩上限 | 处理 |
|---|---|---|---|
| bullet 条数 | ≤ 15 条 | ≤ 8 条 | 超出则拆页 |
| 每条 bullet 字数 | ≤ 40 字 | ≤ 25 字 | 超出则压缩 |
| 单页总字数 | ≤ 300 字 | ≤ 150 字 | 超出则拆页 |
| info-card 描述 | ≤ 120 字/张 | ≤ 35 字/张 | A1 超出则精简；A2 超出则拆页 |
| 标题类型 | 结论句 | 结论句 | 话题词改判断句 |

---

## Phase 4：输出

**Step 4.1：保存**

文件名英文小写 + 连字符；中文关键词转拼音或英译。

**Step 4.2：单体化兜底扫描**

logo 应在 Step 3.2 ③ 直接从 `themes/logos/*.txt` 写入。此步骤仅处理其他外部图片遗漏的边缘情况：

```bash
python3 scripts/inline-images.py [文件名].html
```

**Step 4.3：Smoke Test（必须执行，不得跳过）**

生成完成后立即运行静态检查；失败时必须修复后重跑，不得跳过也不得仅凭”看起来没问题”省略：

```bash
./scripts/smoke-test.sh [文件名].html
```

> **执行后在回复中明确写出：** `smoke-test: passed（N 张幻灯片）` 或 `smoke-test: FAILED — [原因]`。未写出视为未执行。

**Step 4.4：用浏览器直接打开文件（必须执行，不得跳过）**

```bash
open [文件名].html
```

> **执行后在回复中明确写出：** `已用 open 打开浏览器` 或 `受环境限制无法打开 — [原因]`。未写出视为未执行。

成功标准：浏览器直接打开本地 HTML 文件，且不依赖本地 HTTP 服务。

**Step 4.5：最终交付摘要（必须输出，格式固定）**

在回复的最后输出以下固定格式的摘要块，所有字段必填，缺任何一项视为未完成：

```
📦 交付摘要
文件路径：[绝对路径或相对路径]
文件大小：[X KB]
幻灯片数：[N] 张
主题：[theme-id]
smoke-test：通过 / 失败（[原因]）
浏览器：已打开 / 无法打开（[原因]）
导航：方向键 / 空格翻页 · 右侧圆点 · F 全屏
```

### Phase 4 完成门槛（硬性约束）

> **在以下全部条件满足前，禁止输出”完成””Done””已生成”或任何等价的结束表述。**

- [ ] Step 4.1 文件已保存，文件名符合命名规范
- [ ] Step 4.2 `inline-images.py` 已执行
- [ ] Step 4.3 `smoke-test.sh` 已执行，结果已在回复中明确写出
- [ ] Step 4.4 `open` 已执行，结果已在回复中明确写出
- [ ] Step 4.5 交付摘要已按固定格式输出
- [ ] Step 4.5 已向用户回报上述结果

如果任一步未完成，最终答复必须改为“当前进度 + 阻塞原因”，不能伪装成完整交付。

---

## 附录 A：支持文件

| 文件 | 用途 | 何时读取 |
|---|---|---|
| [template.html](template.html) | 预构建引擎壳（含完整 CSS/JS） | Step 3.1 `cp`（必须） |
| [themes/_index.md](themes/_index.md) | 主题识别规则 + 子品牌表 + logo 索引 | Phase 0 主题检测 |
| `themes/[id].md` | CSS 变量 + logo 路径 + 补充规则 | Step 3.1 并行读取 |
| [components.md](components.md) | 组件 HTML 片段参考 | Step 3.1 按需 Grep |
| [icons.md](icons.md) | 287 个 Feather Icons 内联 SVG | 有图标槽时按需 Grep |
| `themes/logos/` | 品牌 logo 的 data URI 文本文件 | Step 3.2 ③ 直接读取 `.txt` |
| [examples/index.html](examples/index.html) | 完整示例文档 | 需要查阅组件骨架时 |

---

## 附录 B：进度通知规范

格式统一为纯文本，不用 markdown 列表或标题。

| 时机 | 格式 | 示例 |
|---|---|---|
| Phase 1 完成后 | 一句话确认元数据 | `已收集：腾讯 · 管理层汇报 · 12 页 · 张三 总监` |
| Phase 2 完成后 | 一句话说明页数 | `规划完成，共 12 张，开始生成…` |
| Step 3.3 每张写入前 | `→ 序号/总数  标题` | `→ 03/12  技术架构现状` |
| Step 4.2 完成后 | 一句话含文件大小 | `单体化完成，1.2 MB，无外部依赖。` |
| Step 4.3 | 见 Phase 4 Step 4.3 | — |

序号统一补零到总数位数（总数 12 则写 `01`，总数 100 则写 `001`）。

---

## 附录 C：执行检查清单

### Phase 0
- [ ] `git pull --ff-only`（失败则静默忽略）
- [ ] 提取公司关键词，确定主题文件路径

### Phase 1
- [ ] 一次性收集所有字段；缺失项按推断规则补全
- [ ] 页数推断结果与内容不符时，显式确认

### Phase 2
- [ ] 演讲稿输入：应用"演讲稿转换规则"，禁止逐段照搬
- [ ] 内容密度符合对应场景上限
- [ ] 布局多样性自检通过（局部连续 + 全局比例）
- [ ] 封面、目录、章节过渡、结尾均已规划

### Phase 3
- [ ] `cp template.html` 完成
- [ ] 填充 ① 标题 ② 主题样式 ③ logo（base64）④ 幻灯片内容
- [ ] 当前主题所需的 logo `.txt` 文件存在并已直接写入；文件缺失时执行 Fallback
- [ ] 每张幻灯片密度自检通过
- [ ] 所有 info-card / step-card 包含图标

### Phase 4
- [ ] Step 4.1 保存
- [ ] Step 4.2 扫描无残留外部引用
- [ ] Step 4.3 `smoke-test` 已执行并检查结果
- [ ] Step 4.4 已执行浏览器直接打开本地文件；若受限，已明确说明阻塞
- [ ] Step 4.5 已告知用户文件信息与验证结果

### 最终答复模板（必须对照）
- [ ] 文件路径
- [ ] 文件大小 / 幻灯片总数 / 主题名称
- [ ] `smoke-test` 结果
- [ ] 浏览器打开结果或阻塞原因
- [ ] 下一步可选动作

### 禁止项
- ❌ 在 `<section>` 内写 logo 代码
- ❌ `max-width` 写死 px
- ❌ 直接编辑 `template.html`
- ❌ 编造原文无源的具体数字
- ❌ 演讲稿逐段照搬
- ❌ info-card 不加图标
- ❌ 少量卡片在全宽容器里偏左留白

---

## 非目标

- 不生成 .pptx，只输出单个 HTML
- 不自动抓取互联网内容，除非用户提供素材
- 不伪造演讲者身份、职位、部门
- 不擅自修改未被点名的现有页面
- 不保证所有品牌主题与官方品牌规范完全一致

---
> Source: [FeeiCN/slide-writer](https://github.com/FeeiCN/slide-writer) — distributed by [TomeVault](https://tomevault.io).
<!-- tomevault:4.0:skill_md:2026-06-21 -->

