Communitygithub.com

mujingquan835/dashiai-ppt-skill

DashiAI PPT public enhanced skill with editable PPTX export, theme matching, and safe revisions.

¿Qué es dashiai-ppt-skill?

dashiai-ppt-skill is a Claude Code agent skill that dashiAI PPT public enhanced skill with editable PPTX export, theme matching, and safe revisions.

Compatible conClaude CodeCodex CLI~Cursor
npx skills add mujingquan835/dashiai-ppt-skill

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

DashiAI PPT

DashiAI PPT 生成静态 HTML 横向翻页 PPT。使用本 skill 时,先把用户的自然语言需求整理成 JSON 计划,再调用本地项目生成器输出 index.htmlassets/

版本

当前版本: 0.4.0

每次完成用户请求、准备最终回复前,运行:

node <skill-root>/scripts/check_latest_version.mjs

如果脚本有输出,把输出内容附在最终回复末尾提醒用户更新;如果脚本无输出或检查失败,保持静默,不要提版本检查。

Skill 目录

当前 SKILL.md 所在目录就是 Skill 根目录,下文记为 <skill-root>

内置生成器目录:

<skill-root>/project

渲染脚本:

<skill-root>/scripts/render_goal_deck.sh

版本检查脚本:

<skill-root>/scripts/check_latest_version.mjs

安全返工脚本:

<skill-root>/project/scripts/revise-goal.mjs

模式与任务分流

  • 每次任务先判断是 new(新建)还是 revise(返工)。用户本次明确要求永远优先。
  • 用户说“做一份 / 新建 / 重新做 / 再做一个 / 生成 PPT”,且没有指定一个可定位的已有成品或 goal.json,一律进入 new。历史对话里做过 PPT 不能成为复用旧稿的理由。
  • new 是永久保留的完整能力:每次新建都创建独立输出目录、独立 goal.json 和独立 PPT;不能因为增加返工能力而变成只能修改旧稿。
  • 只有用户明确指出要改哪一份现有 PPT、哪一页或哪个 goal.json 时才进入 revise。目标不唯一时先定位或询问,不得擅自把“最新一份”当目标。
  • 用户提供知识库、素材目录或参考文件时,只读取本次任务明确指定且实际存在的内容;不得猜测本机路径或套用未提供的业务资料。

生成原则

本 Skill 是模板编排器。默认目标是快速、稳定地把用户需求套入已登记页面组件,输出可离线打开的 HTML PPT。

默认模式是“锁模板填文案”:保留所选页面组件的原始视觉、结构、数量、显隐、强调、配色、图表类型和图片槽位,只替换可见文字内容。除非用户明确要求调整页面属性,不要改任何非文案 props。

默认不做视觉精修,不做截图审美判断,不因为普通断行或局部排版不完美反复返工。只有用户明确要求“视觉精修”“100% 检查”“帮我调到满意”时,才进入视觉 QA 流程。

使用规则

  • 运行生成器需要 Node.js 20+ 和 npm;首次生成时渲染脚本会在 Skill 内置 project/ 目录安装依赖。
  • 风格选择是 new 模式生成前强制门禁:理解本次主题、受众、语气、信息密度和媒体需求后,先对库内 12 套风格做匹配排序,取最适合的 9 套;除非用户明确说“风格也由你定”“跳过风格确认”,否则不得代选最终风格。即使用户已给出风格倾向,也把该风格置顶并请用户确认。revise 模式只改文案或数据时沿用原主题;只有用户明确要求换风格时才重新执行门禁。
  • 9 套候选的匹配必须综合内容领域、目标人群、正式/活力程度、数据密度和图像依赖,不只做单一关键词匹配;按适配度从高到低排列,同分时保留明暗、严肃与活力方向的有效差异。不得声称风格库只有 9 套,应说明是“从 12 套中智能匹配的 9 套”。
  • 使用 node <skill-root>/project/scripts/build-theme-style-grid.mjs --themes <themeA,...,themeI> --out <current-workdir>/output/<deck-name>/theme-style-grid.png 按排名顺序生成本次专属 3×3 九宫格。用户可见回复必须用展开后的绝对路径嵌入该图,并按同样顺序列出 1-9themeXX + 风格名 + 一句适配理由,标出排名第一的“首选推荐”,请用户用序号或风格名选择。九宫格只用于回复展示,不可写入 goal.json 或任何 media 字段。
  • 发出九宫格选择请求后必须暂停并等待用户答复;未选定 themePack 时,不得创建 goal.json、运行 layout:query、生成媒体或渲染 PPT。
  • 开工前确认两件事:主题风格、是否需要图片/视频。主题风格按上述九宫格门禁确认;媒体需求不明确时同时简短询问。无法提问的环境(脚本/批处理)才自选,并在交付说明中列出排名第一的风格与理由。
  • 委托模式:用户只对内容或整体说“都你来定”“不用问,直接开干”时,仍执行九宫格风格门禁;只有用户明确把“最终风格”也委托给智能体或明确要求跳过确认时,才直接选排名第一的主题。用户只说文案“随意”“自拟”时,仅自拟内容;风格、页数、媒体等已给的不得擅自改变。
  • 非交互/一次性执行(无法追问)时:未指定风格按内容主题自选已验收主题;无真实素材且不能生图时优先选无媒体页,不调 image-gen;最终说明全部假设。
  • Deck 语言跟随用户沟通语言:非中文用户在 goal.json 顶层加 "language": "en";全部文案字段用目标语言撰写,页面自带的默认中文文案(含结尾页“感谢阅读”类装饰字段)一律覆盖,不得残留中文。编辑器界面语言自动跟随打开者的系统语言,右上角可手动切换,无需在生成时处理。
  • 交付格式:默认交付可编辑 PPTX,同时保留 HTML 预览源便于继续修改。用户明确只要 HTML、PDF 或图片时按其要求交付;通用新建 PPT 能力不受该默认值影响。
  • PPTX 文件:仍先生成 HTML 并启动本机预览服务,再调用本机 HTTP 导出服务;最终只给 PPTX 文件路径或下载结果。
  • 当前可选风格: theme01 轻拟态风、theme02 炫光紫绿风、theme03 深浅代码风、theme04 玻璃糖果风、theme05 色谱图表风、theme06 深色图谱风、theme07 冷白调研风、theme08 黑金实验风、theme09 深蓝杂志风、theme10 金色指数风、theme11 高能增长风、theme12 声波霓虹风。
  • 普通自动选择不选 theme10;只有用户明确指定,或金融/投资指数内容强相关且 inspect 确认可填时才用。
  • theme01 轻拟态风 | 适合: 产品介绍 / 企业汇报 | 人群: 创业团队 / 产品经理
  • theme02 炫光紫绿风 | 适合: 科技发布会 / AI/自动驾驶/机器人主题 | 人群: 科技公司创始人 / 技术负责人
  • theme03 深浅代码风 | 适合: 技术方案 / 开发者大会 | 人群: 工程师 / 技术管理者
  • theme04 玻璃糖果风 | 适合: 年轻化品牌 / 消费产品 | 人群: 品牌团队 / 设计师
  • theme05 色谱图表风 | 适合: 数据报告 / 市场分析 | 人群: 数据分析师 / 咨询顾问
  • theme06 深色图谱风 | 适合: 高密度数据展示 / 战略分析 | 人群: 战略团队 / 投资人
  • theme07 冷白调研风 | 适合: 调研报告 / 白皮书 | 人群: 研究机构 / 咨询团队
  • theme08 黑金实验风 | 适合: 高端发布 / 品牌提案 | 人群: 高端品牌 / 创意总监
  • theme09 深蓝杂志风 | 适合: 品牌故事 / 人物访谈 | 人群: 公关团队 / 媒体编辑
  • theme10 金色指数风 | 适合: 金融数据 / 投资报告 | 人群: 投资机构 / 金融分析师
  • theme11 高能增长风 | 适合: 增长复盘 / 商业计划 | 人群: 创业者 / 增长团队
  • theme12 声波霓虹风 | 适合: 音乐娱乐 / 潮流活动 | 人群: 娱乐品牌 / 活动策划
  • 不使用旧 token、旧主题、旧媒体槽、旧风格分支或旧入场动画控制。
  • 选页先用 npm --prefix <skill-root>/project run layout:query -- --theme <themePack> --role <role> --limit 8;需要媒体槽时加 --needs-media--planned-images <n>--provided-images <n>--image-gen。候选顺序每次随机,从中任选合适的即可,不要固定只用列表第一条。
  • 字段不清楚、对象/数组/count、图片/媒体:先运行 npm --prefix <skill-root>/project run inspect:layout -- --compact <layout...>;写对象、数组、数量或图片 props:运行 props:safe,整份 goal 用 props:safe -- --goal <file> --write
  • layout:query / inspect:layout 的 JSON 管道给程序解析时,改用 node <skill-root>/project/scripts/layout-query.mjs / node <skill-root>/project/scripts/inspect-layout.mjs:npm run 会在 stdout 前打印生命周期 banner,污染 JSON。
  • 长 deck:先用 npm --prefix <skill-root>/project run goal:scaffold -- --title <title> --goal <goal> --theme <themePack> --pages <n> --chunk-size 5 --out output/<deck-name>/goal.json 生成唯一 layout 骨架和 goal.fill-plan.json,再按 fillPlan 分段补 props。
  • 文案长度和数组数量:优先按 fillPlan.text[].maxCharsfillPlan.arrays[].visibleCountfillPlan.arrays[].nestedArrays 写;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 + propsrole 只允许在草稿阶段辅助选页,渲染前必须换成具体 layout
  • 每套主题的前 5 页 themeXX_page001themeXX_page005 都是封面候选。一个 deck 只能从前 5 页中选择 1 页作为封面,不要同时使用多个封面页;正文页从第 6 页以后选择。
  • 同一套 PPT 中不要出现重复的页面组件:最终 slides[].layout 必须唯一。选页时记录已用 layout,不同内容页要换同主题其它候选,不要通过改文案复用同一个 layout。
  • 面向用户交付的 deck 不能只写 role 后依赖页面默认文案。除非用户明确要默认 demo,每一页可见内容都必须写和用户主题对应的 props 文案。
  • 优先只写 layout:query / inspect:layout 暴露的文案字段。字段是对象或数组时按 fillPlanpropShapes 填内部 key。copyKeys 已展开嵌套路径(如 copy.quoteitems[].label),按列出的路径直接填。
  • inspect:layoutcontentLocked: true 的页正文由组件固定、props 填不进:换一页能填正文的布局,或仅当用户接受其默认正文时使用。数组按 fillPlan.arrays[].visibleCount 填满可见项;decorativeKeys 是装饰位,不要填。
  • 不要改页面元数据、组件源码、className、CSS、样式字段或默认视觉结构来完成内容填充。只在 props 内填写内容和用户明确要求的页面属性。
  • 允许用顶层 text 覆盖可见文字槽位,但只用于替换文字内容。不要在普通生成中启动浏览器批量抽取全页面文本槽位;只有用户明确要求“彻底清除所有模板默认文案/逐页校对可见文案”时才做运行时槽位抽取。
  • new 模式禁止复用 output/ 里已有的旧 goal.json 或旧 HTML,每次请求都新建本次输出目录和本次 JSON 计划。revise 模式必须使用用户指定的目标文件,先由 goal:revise 生成快照和变更报告,不得在快照前手改目标 goal.json
  • 输出目录写在当前会话工作目录;用户明确指定其他目录时按其要求。任何模式都不要写入 <skill-root>/project/output
  • HTML 交付:给用户的预览地址只给 http://127.0.0.1:<port>/(不给 https 或 .local 变体);本机 HTTP 可导出 HTML/PDF/PPTX,本地 HTML 或 file:// 不能导出可编辑 PPTX。不要返回 theme-preview。在自带浏览器的 Agent APP(如 Codex)里生成时,提醒用户导出 PDF/PPTX 前把该地址在系统浏览器中打开。
  • PPTX 交付:调用 /api/export-editable-pptx;最终只给 PPTX 文件路径或下载结果。
  • 无浏览器会话、脚本直调、或预览导出接口返回 403/5xx 时:改用 npm run export:pptx -- <deck>/ppt <out.pptx>(PDF 用 export:pdf)直接产出文件,不需要先起浏览器会话。
  • 如果输出正文里出现与用户主题无关的默认文案,例如 AI Capital / 投融资 / SoundWave / 声浪 / Key Metrics / Roadmap / End of Report 等,必须重写 JSON 后重新渲染,不能交付。

媒体工作流

  • 媒体字段只写 mediaSlots[].canPresetMedia: true 的槽,按该槽 presetProp / fieldPath 写路径;goal.json 只引用 deck 内相对媒体路径,不可引用临时目录、外部绝对路径、file:// 或远程 URL。
  • 视觉素材任务先判断意图:无图但需要视觉素材时先问是否预留图片槽;无真实素材且不能生图时优先选无媒体页。用户提供素材库/素材目录路径即视为有图意图:至少选 2 个带媒体槽页面并填入合适素材。素材路径不可访问时改选无媒体页并在交付说明中告知,不在页面内留占位提示文字。用户同意用 --planned-images <n> / --needs-media,用户给素材用 --provided-images <n> / --provided-media,用户明确要求原创视觉图/生图时,Codex 环境用 image-gen 生成图片并加 --image-gen;未明确生图时先询问用户。plannedImages / needsVisual / imageGen 只表示选页意图,除非用户明确选择预留空槽,交付前必须写入真实媒体路径,不能交付空媒体槽或伪造路径。
  • 用户本地图片/视频先运行 npm --prefix <skill-root>/project run media:stage -- <deck-output-dir-or-ppt-dir> <media-file...>,使用返回的 relative 路径;AVIF 会转成浏览器可用格式。image-gen 输出也先落到本次 deck 目录。
  • 渲染后核对 goal 引用的每个图片/视频:ppt/<relative> 存在且 HTML 包含文件名;缺失时只补最终 ppt/assets 并重跑校验。图片/视频素材每个最多使用一次;素材用完后,媒体插槽留空或改选无媒体插槽页面;除非用户明确要求,不要重复填充同一素材。
  • 需要 image-gen 生成 2 张以上独立图片时,用多个 subagent 并行生成,不要串行逐张等待;每张图独立生成,不要用一张拼图/素材板再拆分。subagent 只用于生图,不用于选题、文案、选页或校验。

新建工作流(必须保留)

只要任务被判定为 new,必须完整执行本节。即使用户说“沿用上次风格做一份新的”,也只能复用风格偏好,不能复用上次内容、goal.json 或输出目录。

  1. 提炼用户目标: titlegoalaudienceowner、页数、内容重点和最终产物格式。用户未指定页数时,普通长 deck 默认 10 页左右;用户明确要求单页时必须生成 1 页。
  2. 执行九宫格风格门禁:对 12 套风格匹配排序,取前 9 套,运行 build-theme-style-grid.mjs,在用户可见回复中嵌入 3×3 图片并列出 9 项理由,然后暂停等待选择。用户选定后再设置 themePack 并生成 randomSeed,例如 <主题>-<日期>-<3位随机词>,保证随机选页可复现。
  3. 判断图片意图:无图但需要视觉素材时先问是否预留图片槽;用户给本地素材先 media:stage;明确生图时用 image-gen。
  4. layout:query 选候选;对象/数组/count/图片 props 用 inspect:layout + props:safe
  5. 每页只承载一个主要信息角色。无法安全覆盖的页面优先换 layout,不要改样式字段硬凑。
  6. 把 JSON 写入本次工作目录的 output/<deck-name>/goal.json;用户明确指定其他输出目录时按其要求。渲染前运行 npm --prefix <skill-root>/project run props:safe -- --goal <goal-file> --write 和 goal spec 校验。--write 后核对输出的 layoutChanges;不认可替换就改回并换页。
  7. 图表页填入自己的数据后,页内 insight/读图/结论类文案字段必须据新数据一并改写,不保留默认结论。
  8. 运行渲染脚本输出 <deck-output-dir>/ppt/index.html;脚本会使用 Skill 内置生成器,不要切回外部项目目录。
  9. 渲染后核对素材路径,缺失时补最终 <deck-output-dir>/ppt/assets
  10. 确认脚本完成 validate:swissvalidate:goal-copy 校验。
  11. 运行 node <skill-root>/scripts/check_latest_version.mjs 做静默版本检查。
  12. 渲染脚本会启动本地 HTTP 预览服务并输出 http://127.0.0.1:<port>/;需要指定端口时设置 DASHI_PPT_PREVIEW_PORT 后再运行脚本(端口用 5200-5999 段,4178/4300/4400 为用户保留端口不可用)。只能用该预览服务,不得用 python -m http.servernpx serve 等静态服务器替代:静态服务器没有导出和自动保存接口。预览服务下编辑自动保存到 index.html 本体;file:// 打开的本地文件不自动保存,交付前需导出。
  13. 按交付格式回复:默认调用 /api/export-editable-pptx 交付可编辑 PPTX 文件路径,并保留 HTML 预览源;用户明确只要 HTML 时只给 http://127.0.0.1:<port>/

安全返工工作流

仅在用户明确指定已有成品、页面或 goal.json 时使用。只收到“改一下”但目标不唯一时,先定位目标,不得误改其他 PPT。

  1. 记录目标 goal.json、对应输出目录和用户要求。若只有 PPTX 而没有本 Skill 的 goal.json / HTML 源,不得假装能无损最小修改;应说明需要源文件,或按导入重建任务另行处理。
  2. 将“其余不变”作为硬约束:默认锁定 themePackpageCountslides 数量、每页 layout、每页 role 和未点名的所有内容。先把本次改动写成 JSON Patch 文件,例如:
{
  "note": "第 4 页标题改为年度重点项目,其余不变",
  "changes": [
    {"op": "replace", "path": "/slides/3/props/title", "value": "年度重点项目"}
  ]
}
  1. 执行 npm --prefix <skill-root>/project run goal:revise -- --goal <goal.json> --patch <patch.json>。脚本会在目标目录的 revisions/ 下保存修改前快照与变更报告,并拒绝主题、页数、整页、布局和角色的结构性修改。
  2. 只有用户明确要求改主题、页数或版式时,才允许结构性返工。换主题仍先执行 9 宫格风格门禁并等待确认;确认后再使用 --allow-structure,随后重新检查所有 layout 和 props 契约。
  3. 返工后运行 props:safevalidate:goal-spec 和渲染校验,并将变更报告中的 changedPaths 与用户要求逐项核对。若出现额外字段变化,从快照恢复后重新生成最小 patch。
  4. 交付时说明修改对象、实际变更路径和快照位置;新建任务仍回到“新建工作流(必须保留)”,不得继续沿用本次返工目标。

质量修复与浏览器检查

只在以下情况返工:渲染失败、validate:swiss 失败、validate:goal-copy 失败、输出中出现明显不属于用户主题的模板文案、用户明确指出某页内容有问题。

默认最多修复 2 轮。仍失败时说明阻塞原因,不要继续无边界尝试。

默认不打开浏览器,不创建 Chrome profile,不抽取全量文本槽位。只有修改了生成器/预览模板/导出逻辑、用户明确要求检查页面效果,或上一轮出现过运行后 props 被默认值覆盖的问题时,才做一次浏览器 smoke check。

浏览器 smoke check 只确认页面能打开、页数正确、首尾页不是空白。不要默认截图精修,不要因为普通换行问题反复改稿。

示例命令:

<skill-root>/scripts/render_goal_deck.sh \
  output/client-review/goal.json \
  output/client-review/ppt/index.html

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 融资周期。"}},
    {"layout": "theme01_page006", "props": {"kicker": "核心数字", "value": "970", "unit": "亿美元", "sub": "2024 年美国 AI 风险投资规模创历史新高。"}},
    {"layout": "theme01_page010", "props": {"kicker": "# 研究方法", "title": "横纵分析法", "cn": "用时间维度和赛道维度交叉识别融资变化。"}},
    {"layout": "theme01_page030", "props": {"kicker": "# 典型案例", "title": "里程碑 · 头部公司融资节奏"}},
    {"layout": "theme01_page084", "props": {"kicker": "# 附录", "title": "数据来源与研究说明"}}
  ]
}

如果 slides 为空,pageCount 只适合临时草稿预览。面向用户交付前,必须改成具体 layout + 对应 props

页面角色

role 只用于草稿选页,最终 JSON 必须落成具体 layout。角色说明见 references/layout-roles.md;真实候选以 layout:query 输出为准。

cover 只能从当前主题前 5 页选择。image / media 候选基于真实 mediaSlots,不是页面标题关键词。动态背景页可用 ambient 作为氛围页或章节页。

可以直接指定页面:

{"layout": "theme01_page030", "props": {"title": "典型案例"}}

交付能力

新生成的演示默认使用内嵌的 OPPO Sans 4.0 作为标题和正文字体。生成后的预览页支持翻页、打开侧边栏编辑文本、按标题/正文/等宽文字三类替换全局字体、关闭全局字体开关后点击任意文字设置专属字体或自定义本机字体、调整页面 props、替换组件暴露的图片/视频媒体槽、逐个调整图片槽宽高与形状、切换页面切换动画、导出 HTML/PDF/PPTX。全局字体、专属字体和图片槽设置写入 deck state,预览服务下自动回写 HTML;导出可编辑 PPTX 时按浏览器最终计算样式生成对象。面向用户交付的页面底部不显示页码标识、翻页引导、圆点导航或索引提示。

页面属性契约

普通生成不要读 layout-manifest.json。先用 layout:query 输出的候选摘要。只有需要更细契约时,再用 npm --prefix <skill-root>/project run inspect:layout -- --compact <layout...> 看页面契约:

  • copyKeys: 可安全改写的文案/数据字段。
  • copyBudgets: 文案长度预算;display / metric 超长会被 goal spec 拦截。
  • propShapes: copyKeys / 数组字段的内部形状;写 copycellsitemsrows 等对象字段时只使用这里列出的 key。
  • mediaSlots: 图片/视频写入字段、count key、默认数量和最大数量。
  • countBindings: 数量参数与数组字段的绑定。
  • fillPlan 里数值字段看 numericBounds 填数:enforced:false 是提示、真实数据可超出,enforced:true 必须遵守,semantics:'normalized' 填 0-1 比例;定长嵌套数组看 fixedLength/fixedLengths 按下标填,不试错。
  • controlKeys: 右侧面板可操作字段,不是普通内容填充清单;仅用户明确要求调整页面属性时使用。默认只填 copyKeys、可见数组和真实媒体槽。

校验

  • 渲染前必须运行 validate:goal-spec
  • 输出后必须运行 validate:swiss
  • 输出后必须运行 validate:goal-copy
  • 改动展示 demo 后运行 npm run showcase:update

Skills relacionados