| name | dashi-ppt |
| description | 制作 PPT、演示文稿、幻灯片、汇报材料时使用。Dashi PPT 基于预置视觉主题组合页面,生成可离线打开、可在浏览器编辑的 HTML 演示,支持导出 PPTX / PDF 文件。 |
Dashi PPT
Dashi PPT 生成静态 HTML 横向翻页 PPT。使用本 skill 时,先把用户的自然语言需求整理成 JSON 计划,再调用本地项目生成器输出 index.html 和 assets/。
版本
当前版本: 0.4.5
服务端 Agent 不运行版本检查。dashi_script 仅允许只读 layout-query.mjs;不得调用它执行 check_latest_version.mjs 或其他维护脚本。版本检查由部署维护者在 Agent 链路外完成,用户内容生成结束后直接交付。
Skill 目录
当前 SKILL.md 所在目录就是 Skill 根目录,下文记为 <skill-root>。
内置生成器目录:
<skill-root>/project
底层渲染脚本(由 dashi_render 内部调用,Agent 不直接执行):
- macOS / Linux:
<skill-root>/scripts/render_goal_deck.sh
- Windows PowerShell:
<skill-root>/scripts/render_goal_deck.ps1
维护侧版本检查脚本(服务端 Agent 不调用):
<skill-root>/scripts/check_latest_version.mjs
生成原则
本 Skill 是模板编排器。默认目标是快速、稳定地把用户需求套入已登记页面组件,输出可离线打开的 HTML PPT。
默认模式是“锁模板填文案”:保留所选页面组件的原始视觉、结构、数量、显隐、强调、配色、图表类型和图片槽位,只替换可见文字内容。除非用户明确要求调整页面属性,不要改任何非文案 props。
成果验收是默认流程。每次生成后都要判断最终产物是否达到用户目标;默认检查目标、内容、结构、明显可见问题和交付完整性,不做截图审美精修,不因普通断行反复返工。用户明确要求“视觉精修”“100% 检查”“帮我调到满意”时,再扩展为视觉 QA。
使用规则
- 生成器需要 Node.js 20+ 和 npm;服务端工具会在 Skill 内置
project/ 目录管理依赖。Agent 只可通过 dashi_script 运行只读 layout-query.mjs;其他底层脚本不直接执行。
- 风格选择提问:用户可见回复必须嵌入
<skill-root>/assets/skill/theme-style-grid.png 的 Markdown 图片,先展开绝对路径;这是回复展示用内置风格图,不可写入 goal.json 或任何 media 字段;列出当前可选风格和极简“适合/人群”,不能只在内部进度提示中提到风格图。
- 开工前确认两件事:主题风格、是否需要图片/视频。用户未明确表达且非整体委托时,先提问等答复,不得代选;无法提问的环境(脚本/批处理)才自选,并在交付说明中列出所选与理由。
- 委托模式:仅当用户对整体明确委托(“都你来定”“不用问,直接开干”)时,才自选主题、默认 HTML、默认不使用 image-gen,最终说明假设。用户只说内容/文案“随意”“自拟”时,仅自拟内容;风格、页数、媒体等已给的不得擅自改变,未给的按上一条先问。
- 非交互/一次性执行(无法追问)时:未指定风格按内容主题自选已验收主题;无真实素材且不能生图时优先选无媒体页,不调 image-gen;最终说明全部假设。
- Deck 语言跟随用户沟通语言:非中文用户在
goal.json 顶层加 "language": "en";全部文案字段用目标语言撰写,页面自带的默认中文文案(含结尾页“感谢阅读”类装饰字段)一律覆盖,不得残留中文。编辑器界面语言自动跟随打开者的系统语言,右上角可手动切换,无需在生成时处理。
- 交付格式:默认 HTML;“生成 PPT”“做 PPT”“做一个 PPT”“制作 ppt”表示 PPT 呈现形态。只有明确
PPTX、PowerPoint、可编辑 PPTX、导出 PPTX、PPT 格式 或“格式/文件类型为 PPT/PPTX”时才交付 PPTX 文件。
- PPTX 文件:仍由
dashi_render 先生成 HTML 再完成导出;最终原样使用其同源相对 download_url,不得交付内部预览地址或本机文件路径。
- 当前可选风格:
theme01 轻拟态风、theme02 炫光紫绿风、theme03 深浅代码风、theme04 玻璃糖果风、theme05 色谱图表风、theme06 深色图谱风、theme07 冷白调研风、theme08 黑金实验风、theme09 深蓝杂志风、theme10 金色指数风、theme11 高能增长风、theme12 声波霓虹风。
- 普通选择不选
theme10;只有用户明确指定,或金融/投资指数内容强相关且 dashi_scaffold 返回的契约确认可填时才用。
theme01 轻拟态风 | 适合: 产品介绍 / 企业汇报 | 人群: 创业团队 / 产品经理
theme02 炫光紫绿风 | 适合: 科技发布会 / AI/自动驾驶/机器人主题 | 人群: 科技公司创始人 / 技术负责人
theme03 深浅代码风 | 适合: 技术方案 / 开发者大会 | 人群: 工程师 / 技术管理者
theme04 玻璃糖果风 | 适合: 年轻化品牌 / 消费产品 | 人群: 品牌团队 / 设计师
theme05 色谱图表风 | 适合: 数据报告 / 市场分析 | 人群: 数据分析师 / 咨询顾问
theme06 深色图谱风 | 适合: 高密度数据展示 / 战略分析 | 人群: 战略团队 / 投资人
theme07 冷白调研风 | 适合: 调研报告 / 白皮书 | 人群: 研究机构 / 咨询团队
theme08 黑金实验风 | 适合: 高端发布 / 品牌提案 | 人群: 高端品牌 / 创意总监
theme09 深蓝杂志风 | 适合: 品牌故事 / 人物访谈 | 人群: 公关团队 / 媒体编辑
theme10 金色指数风 | 适合: 金融数据 / 投资报告 | 人群: 投资机构 / 金融分析师
theme11 高能增长风 | 适合: 增长复盘 / 商业计划 | 人群: 创业者 / 增长团队
theme12 声波霓虹风 | 适合: 音乐娱乐 / 潮流活动 | 人群: 娱乐品牌 / 活动策划
- 不使用旧 token、旧主题、旧媒体槽、旧风格分支或旧入场动画控制。
- 服务端生成只有一条链路:
dashi_script(layout-query.mjs) → dashi_scaffold(layouts=[...]) → (有素材时 dashi_stage_media) → dashi_write_goal → dashi_render。查询只读候选;不得直接运行其他底层 CLI 来手写或发布 goal.json。
- 先用 layout-query 的主题/角色/媒体/关键词筛选能力取得候选摘要,结合每页语义选择 1 个封面和互不重复的正文布局,再把完整 ID 列表传给
dashi_scaffold。layouts 必填;scaffold 内部用 inspect-layout 取得类型契约。
dashi_scaffold 返回的 goal_json 是唯一内容起点;按每页 slides_spec / fill_plan 填写全部文案、数组、count 和媒体字段。带点路径表示嵌套对象层级,例如 copy.quote 必须写为 props.copy.quote。
layout-query.mjs 是唯一允许 Agent 调用的底层脚本,且只能只读选候选。inspect-layout.mjs、props:safe 和其他项目脚本仅供服务工具内部实现或维护诊断,不得成为替代生成工作流。
- 长 deck 先查询足量且互不重复的候选,再由
dashi_scaffold(..., layouts=[...]) 生成唯一类型骨架,按返回信息补齐内容并通过 dashi_write_goal 原子发布。
- 文案长度和数组数量:按 scaffold 返回的
fill_plan.text[].recommendedMaxChars(存在时优先)、fill_plan.text[].maxChars、fill_plan.arrays[].visibleCount、fill_plan.arrays[].nestedArrays 写;maxChars 是硬上限而非写满目标。中文或中英混排的 lead / sub / intro / conclusion 默认使用推荐值,给实际渲染留出换行余量;短英文标签不超过 10 个拉丁字符,必要时使用通用缩写。display / metric 字段只写短词、短句或数字。
- Html 字段(如
headlineHtml / quoteHtml)写文案只用 <br> 换行加 <b> / <em> 行内强调,禁止 <span> 等自由 HTML;主题默认值里的 <span class> 依赖主题 CSS,只是占位,不要照抄。validate:goal-spec 会拦截自由 HTML。
- 可见数组项必须写实文案;被 count/显隐控制隐藏的尾项可保留“请输入文本”占位。
- 元素出现动画使用页面组件自带的原生效果。
- 页面切换动画可以在预览控制面板里调整。
- 面向用户交付的 deck 默认不显示风格/主题切换选项;风格切换只保留在内部调试 demo 页面。用户明确要求保留主题切换时,在 goal 顶层写
preview: {"themeSwitcher": true}。
- 不手写自由 HTML slide;面向用户交付的每页必须写
layout + props。role 只允许在草稿阶段辅助选页,渲染前必须换成具体 layout。
- 每套主题的前 5 页
themeXX_page001 到 themeXX_page005 都是封面候选。一个 deck 只能从前 5 页中选择 1 页作为封面,不要同时使用多个封面页;正文页从第 6 页以后选择。
媒体工作流
dashi_scaffold.slides_spec[].fill_plan.media 已只包含可写媒体槽;按每项的 write 路径写入 deck 内相对媒体路径,用 key 识别字段并同步 countKey。不可引用临时目录、外部绝对路径、file:// 或远程 URL。
- 视觉素材任务先判断意图:无图但需要视觉素材时先问是否预留图片槽;无真实素材且不能生图时优先选无媒体页。用户提供素材库/素材目录路径即视为有图意图:至少选 2 个带媒体槽页面并填入合适素材。素材路径不可访问时改选无媒体页并在交付说明中告知,不在页面内留占位提示文字。用户同意用
--planned-images <n> / --needs-media,用户给素材用 --provided-images <n> / --provided-media,用户明确要求原创视觉图/生图时,Codex 环境用 image-gen 生成图片并加 --image-gen;未明确生图时先询问用户。plannedImages / needsVisual / imageGen 只表示选页意图,除非用户明确选择预留空槽,交付前必须写入真实媒体路径,不能交付空媒体槽或伪造路径。
- 用户上传的图片/视频先调用
dashi_stage_media(output_dir="output/<deck-name>", media_paths=[...]),使用返回的 items[].relative 路径;AVIF 会转成浏览器可用格式。不得直接运行底层 staging 脚本。
- 渲染后核对 goal 引用的每个图片/视频:
ppt/<relative> 存在且 HTML 包含文件名;缺失时只补最终 ppt/assets 并重跑校验。图片/视频素材每个最多使用一次;素材用完后,媒体插槽留空或改选无媒体插槽页面;除非用户明确要求,不要重复填充同一素材。
- 需要 image-gen 生成 2 张以上独立图片时,用多个 subagent 并行生成,不要串行逐张等待;每张图独立生成,不要用一张拼图/素材板再拆分。subagent 只用于生图,不用于选题、文案、选页或校验。
工作流
- 提炼用户目标:
title、goal、audience、owner、页数、内容重点和最终产物格式;同时形成验收清单,记录用户显式要求、已确认选项和必要假设。用户未指定页数时默认 10 页左右,不少于 8 页。
- 确认
themePack。用户未指定时先询问风格;用户选定后生成 randomSeed,例如 <主题>-<日期>-<3位随机词>,保证随机选页可复现。
- 判断图片意图:无图但需要视觉素材时先问是否预留图片槽;用户给本地素材先
dashi_stage_media;明确生图时用 image-gen。
- 用
dashi_script(script_name="layout-query.mjs", ...) 查询封面和正文候选,结合每页语义选择足量、同主题、互不重复的 layout ID;随后调用 dashi_scaffold(..., layouts=[...]),由其内嵌 inspect-layout 取得类型骨架、slides_spec 和 fill_plan。
- 每页只承载一个主要信息角色。无法安全覆盖的页面优先换 layout,不要改样式字段硬凑。
- 仅在 scaffold 返回的
goal_json 上补齐内容,再调用 dashi_write_goal(goal_path="output/<deck-name>/goal.json", goal_data=...);只有校验成功时才会原子替换有效文件。
- 图表页填入自己的数据后,页内 insight/读图/结论类文案字段必须据新数据一并改写,不保留默认结论。
- 调用
dashi_render(goal_path="output/<deck-name>/goal.json") 完成预校验、HTML 渲染和所需导出。
- 渲染后核对素材路径,缺失时补最终
ppt/assets。
- 确认脚本完成
validate:swiss 和 validate:goal-copy 校验。
- 渲染脚本可能启动仅供渲染/导出的内部预览服务;不得把内部地址交付给用户,也不得用
python -m http.server、npx serve 等静态服务器替代。服务端最终预览和下载地址只使用 dashi_render 返回值。
- 对最终产物执行成果验收,按验收清单核对用户目标、逐页内容、叙事结构、明显可见问题和交付完整性。
- 状态为“待修正”时定位不合格页,修改 scaffold 骨架中的文案/数据/媒体;需要更换 layout 时重新 layout-query、scaffold,再写入、渲染并复验。
- 直接交付结果;服务端 Agent 不发起版本检查或其他维护脚本调用。
- 验收通过后按交付格式回复:原样使用
dashi_render.preview_url 和存在时的 dashi_render.download_url;两者必须保持同源相对 /preview、/download 形式。
成果验收与返工
机器校验通过只是技术基线,不等于成果达标。最终验收以用户原始需求、已确认选项、明示假设和最终渲染产物为准:
- 目标一致性:Deck 回答用户的核心问题,重点、结论和语气适合目标受众。
- 内容覆盖:指定的主题、必含要点、页数、风格、语言、媒体和产物格式都已落实,无跑题、缺项或无关模板文案。
- 逐页检查:每页都服务于整体目标;标题、正文、数据、图表和 insight 相互一致,没有重复、断层、空白页或明显不匹配的 layout。
- 叙事完整性:开场、论证/展开和结论/行动顺序清晰,页与页之间有逻辑承接。
- 交付完整性:最终文件存在且能打开,页数和格式正确,素材可用,首尾页非空白。
有浏览器能力时,最终一轮必须逐页打开预览,检查内容可见、媒体正常,无明显溢出、遮挡或裁切;不创建专用 Chrome profile,不默认做截图审美精修。无浏览器能力的脚本/批处理环境至少复核 goal.json、校验结果和输出文件,并不得声称已完成视觉验收。
验收状态只有“通过”“待修正”“阻塞”。发现任一不合格项就标记“待修正”:文案、数据、insight 或媒体错误时改对应 props;页面信息角色或容量不匹配时重新 layout-query 并调用 dashi_scaffold 更换 layout;内容缺失时补写或重新生成对应页。修正后从 dashi_write_goal、dashi_render、素材核对到成果验收全部重跑。
默认最多修正 2 轮。验收通过后才能交付;两轮后仍不通过则标记“阻塞”,说明未达标项和阻塞原因,不得将其表述为已完成成果。
服务端示例:
dashi_script(script_name="layout-query.mjs", args="--theme theme07 --role cover --limit 5")
dashi_script(script_name="layout-query.mjs", args="--theme theme07 --role content --limit 15")
dashi_scaffold(title="客户复盘", goal="总结关键成果并明确下一阶段行动", theme="theme07", pages=8, layouts=[<1 个封面和 7 个正文 layout ID>], out="output/client-review/goal.json")
dashi_write_goal(goal_path="output/client-review/goal.json", goal_data=<填充后的 goal_json>)
dashi_render(goal_path="output/client-review/goal.json")
JSON 结构
{
"title": "美国 AI 融资调研",
"goal": "面向投资团队汇报 2024-2026 年美国 AI 大额融资结构、资本流向和后续判断",
"audience": "投资团队 / 产业研究团队",
"owner": "研究团队",
"randomSeed": "ai-funding-20260609-a7k",
"pageCount": 8,
"themePack": "theme01",
"slides": [
{"layout": "theme01_page001", "props": {"kicker": "融资调研 · VOL.01", "titleTop": "美国 AI", "titleBottom": "融资调研", "lead": "从资本体量、赛道结构和典型公司拆解本轮 AI 融资周期。"}},
如果 slides 为空,pageCount 只适合临时草稿预览。面向用户交付前,必须改成具体 layout + 对应 props。
页面角色
role 只用于 layout-query 筛选候选,最终 JSON 必须落成具体 layout。角色说明见 references/layout-roles.md;真实候选以 layout-query 返回结果为准。
cover 只能从当前主题前 5 页选择。image / media 候选基于真实媒体槽,不是页面标题关键词。动态背景页可用 ambient 作为氛围页或章节页。
用户明确指定页面时,只能把完整 layout ID 传给 scaffold,例如:
dashi_scaffold(..., pages=1, layouts=["theme01_page030"])
不得据此直接手写 slides 或 goal.json;页面 props 仍以 scaffold 返回的类型骨架为准。
交付能力
生成后的预览页支持翻页、打开侧边栏编辑文本、调整页面 props、替换组件暴露的图片/视频媒体槽、切换页面切换动画、导出 HTML/PDF/PPTX。面向用户交付的页面底部不显示页码标识、翻页引导、圆点导航或索引提示。
页面属性契约
普通生成不要读 layout-manifest.json,也不要直接调用 inspect-layout。layout-query 只负责返回候选摘要;字段契约以 dashi_scaffold.slides_spec / fill_plan 为准:
text_props: 可安全改写的文案/数据字段及长度预算;display / metric 超长会被校验拦截。
fill_plan: 对象与数组字段的内部形状;写 copy、cells、items、rows 等对象字段时只使用这里列出的 key。
fill_plan.arrays[].itemFields[].enum: 该字段为结构枚举,只能从列出的值中选,不是自由文案。
fill_plan.media: 图片/视频写入 key、countKey、默认数量、最大数量和接受的媒体类型。
fill_plan 里数值字段看 numericBounds 填数:enforced:false 是提示、真实数据可超出,enforced:true 必须遵守,semantics:'normalized' 填 0-1 比例;定长嵌套数组看 fixedLength/fixedLengths 按下标填,不试错。
allowed_keys: 仅用于拒绝未知字段,不是普通内容填充清单。默认只填 text_props、可见数组、必需 countKey 和真实媒体槽。
校验
dashi_write_goal 必须返回校验成功且 slides_empty 为 0。
dashi_render 必须通过 goal spec、HTML、Swiss 及 goal-copy 校验后才可交付。
- 改动展示 demo 后运行
npm run showcase:update。