| name | aliang-ppt-skill |
| description | 阿亮 PPT 生成器。内容引擎驱动的 HTML 演示文稿:先提炼核心论点、选叙事骨架、One-Message 大纲确认后才生成;8 套锁死美学模板看图选型、交付自带调色+密度面板、生成后 Puppeteer 自动渲染自检。当用户要做 PPT、幻灯片、演示文稿、路演材料、分享材料、课件时使用。 |
aliang-ppt-skill
核心信念:好 PPT 的本质是好内容被正确切分。先内容,后视觉。
四个差异点:① 内容引擎(先论点后排版)② 机器自检(不靠肉眼)
③ 交付后可调(调色+密度面板)④ 锁死美学(8 套模板禁改色,不翻车)。
大纲未经用户确认,绝不进入生成阶段。
文件地图
| 文件 | 用途 | 何时读 |
|---|
references/content-engine.md | 内容引擎:提问→消化→骨架→大纲→文案→逐字稿全部规则 | 每次必读,先读它 |
references/templates.md | 模板索引:选型表 + 8 套一览 + 节奏规则 | 阶段 2 读 |
references/contract.md | 模板契约:变量/八件套/密度/禁忌(造新模板照它做) | 新增模板时读 |
templates/01…08-*.html | 8 套模板参考稿(单一真相源:配方注释+骨架+示意内容) | 只读选中的那一套 |
assets/deck-stage.js | 共享翻页引擎(缩放/缩略图栏/键盘导航/打印PDF) | 不读,生成时复制 |
assets/tweaks-panel.html | 调色+密度面板组件 | 不读,生成时注入 |
总流程
阶段 0 入口判断(新建 / 转换 / 增强)
阶段 1 内容引擎(见 content-engine.md,大纲确认是硬门槛)
阶段 2 模板选型(推荐 2-3 套 + 截图看图选)
阶段 3 生成 deck(复制模板骨架,替换全部示意内容)
阶段 3.5 注入调色+密度面板 / 复制 deck-stage.js
阶段 4 渲染自检(Puppeteer 自动,不通过不交付)
阶段 5 可选配图(百炼 API,明确告知收费,绝不默认开启)
阶段 6 交付(浏览器打开 + 操作说明 + 可选导出)
阶段 0:入口判断
| 用户输入 | 模式 | 动作 |
|---|
| 提供 .pptx 文件 | 转换 | 按 content-engine.md 第七步提取内容,照常过内容引擎 |
| 提供文章/笔记/大纲 | 精炼 | 先完整读素材,进内容引擎第二步(素材消化) |
| 只有一个想法/话题 | 创作 | 进内容引擎第一步(意图收集) |
| 指向已生成的 deck 要改 | 增强 | 读现有文件改动,仍受密度上限约束,超限拆页并告知 |
阶段 1:内容引擎
完整规则在 references/content-engine.md,必须先读再执行。 硬约束:
- 先读素材再提问,素材能回答的不许问;提问一轮问完(AskUserQuestion 单次调用)
- 提炼核心论点:一句话说清"观众必须记住的那件事"
- 叙事骨架五选一(钩子式/SCQA/黄金圈/对比式/清单式),按场合推荐并说明理由
- 每页先写 message,message 写不出的页删掉
- 骨架页规则:封面必有;≥7 页必有目录;有目录必有章节页且编号三处一致;尾页禁止只写"谢谢"
- 大纲展示给用户确认后,才能进入阶段 2
- 演讲场景逐字稿与内容同步生成,写入
<aside class="notes">
- 禁止虚构数据;缺证据的论点明确告知用户
阶段 2:模板选型(看图选)
- 读
references/templates.md,按内容特征推荐 2-3 套候选,说明推荐理由
- 看图选:起本地服务器(见阶段 4 的服务器命令),Puppeteer 打开每套候选
goTo(0) 截首页图展示给用户 —— 人对视觉的反应比对形容词准确
- 用户选定后,只读选中的那一个
templates/NN-*.html:
头部注释是配方(锁死色/字体/八件套类名/特有的坑),正文是可直接复用的骨架与版式
阶段 3:生成 deck
方式:复制选中模板的骨架与版式块,替换全部示意内容。 不从零写样式。
- 输出 = 输出目录下两个文件:
{主题}-slides.html + deck-stage.js(从 assets/ 复制)
<style> 整块原样保留(锁死美学);幻灯片按大纲从八件套取用,
同类页复制多份换内容(3 个章节 = section 版式 × 3)
- 示意内容必须全部替换,咖啡课的字一个不留
- 密度上限见 contract.md 第 4 节,超限拆页;同一版式不连续出现 2 次以上
- 深浅页节奏照 templates.md"深浅页节奏"一节
- 标题/正文文案规则、反 AI 腔清单照 content-engine.md 第五步
- 图片用相对路径;概念图示用 CSS/SVG 画
生成时的高频陷阱(实测踩过的坑)
<section> 上禁写 position/inset/宽高 —— deck-stage 自己管定位,写了会翻页空白
- 大字多行层叠
line-height ≥ 0.98,低于 0.9 实色行与描边行糊成一团
- 大号中文句号在部分字体栈渲染异常,标题结尾慎用
- 背景装饰层(网格/辉光)选择器保持原样的具体度,别简化(会被通用规则挤掉 absolute)
- 任何颜色走
var(),不写死 hex —— 否则面板调色时该元素不联动
阶段 3.5:注入面板
- 把
assets/tweaks-panel.html 整段(<style>+按钮+面板+<script>)原样粘到
生成文件 </body> 之前,无需改动——面板自动读取模板默认色
- 面板功能:主色(6 预设+拾色)/ 背景色(6 预设+拾色,文字按明暗自动黑白翻转)/
密度(简洁 1.15 · 标准 1 · 满格 0.8)
- 模板已全部遵守 contract.md 变量契约,面板开箱即用;
失效征兆=调主色某元素不变色(写死了 hex)→ 回阶段 3 改成 var()
阶段 4:渲染自检(自动执行,不通过不交付)
python3 -m http.server 4311 --directory <输出目录的绝对路径>
Puppeteer 打开 http://localhost:4311/{文件名}.html 后执行:
(function(){
var ds=document.querySelector('deck-stage');
if(!ds) return 'FAIL: no deck-stage';
var secs=[...ds.children], issues=[];
secs.forEach(function(s,i){
var f=s.querySelector('.frame');
if(!f){issues.push((i+1)+':no-frame');return;}
if(f.scrollHeight>f.clientHeight+2)issues.push((i+1)+':v-overflow');
if(f.scrollWidth>f.clientWidth+2)issues.push((i+1)+':h-overflow');
if(s.textContent.trim().length===0)issues.push((i+1)+':empty');
});
var cs=getComputedStyle(secs[0]);
return JSON.stringify({total:secs.length,
accent:cs.getPropertyValue('--accent').trim(),
paper:cs.getPropertyValue('--paper').trim(),
issues:issues.length?issues:'none'});
})();
任何 issue → 回阶段 3 修复重测。通过后 goTo(0)、goTo(1) 截图肉眼复核
(文字重叠/贴边/对比度),再用 goTo(n) 抽查 1-2 个内容密集页。
内容自检(同时执行)
阶段 5:可选配图(百炼)
deck 已生成、自检通过后才询问(一次性、可拒绝):
需要 AI 生成配图吗?使用阿里百炼 API,按张计费。也可以跳过,图片位保持占位样式。
同意后:检查 bl CLI 可用性(参考 bailian-cli skill)→ 按每页 message + 模板气质写
prompt(全 deck 统一艺术风格)→ 存 assets/ 相对路径引用 → 重跑阶段 4。
阶段 6:交付
open http://localhost:4311/{文件名}.html 浏览器打开(强调:发给别人时两个文件一起发)
- 告知操作:
←/→/空格翻页、左侧缩略图跳页与拖拽重排、R 回首页、
右上"🎨 调色"自调主色/背景/密度、浏览器打印即可存 PDF
- 报告:页数、模板、文件位置、(如有)逐字稿和配图情况
- 可选项(不替用户决定):导出 PDF(打印或 Playwright)/
npx vercel 部署分享 / 改内容走增强模式
红线(任何阶段不可违反)
- 大纲未确认不生成
- 不虚构数据、不编造引用
- 模板配色锁死:生成时不改模板的颜色变量值(交付后用户用面板自调是另一回事)
- 配图不默认开启(收费项必须用户点头)
- 渲染自检不通过不交付
- 页内永不滚动,超限内容拆页解决
- 讲者提示文字永不出现在可见页面上(只进
.notes)
- 示意内容零残留