DashiAI PPT
DashiAI PPT 生成靜態 HTML 橫向翻頁 PPT。使用本 skill 時,先把使用者的自然語言需求整理成 JSON 計劃,再呼叫本地專案產生器輸出 index.html 和 assets/。
版本
目前版本: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-9的themeXX + 風格名 + 一句適配理由,標出排名第一的「首選推薦」,請使用者用序號或風格名選擇。九宮格只用於回覆展示,不可寫入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[].maxChars、fillPlan.arrays[].visibleCount、fillPlan.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+props。role只允許在草稿階段輔助選頁,渲染前必須換成具體layout。 - 每套主題的前 5 頁
themeXX_page001到themeXX_page005都是封面候選。一個 deck 只能從前 5 頁中選擇 1 頁作為封面,不要同時使用多個封面頁;正文頁從第 6 頁以後選擇。 - 同一套 PPT 中不要出現重複的頁面元件:最終
slides[].layout必須唯一。選頁時記錄已用layout,不同內容頁要換同主題其它候選,不要透過改文案復用同一個 layout。 - 面向使用者交付的 deck 不能只寫
role後依賴頁面預設文案。除非使用者明確要預設 demo,每一頁可見內容都必須寫和使用者主題對應的props文案。 - 優先只寫
layout:query/inspect:layout暴露的文案欄位。欄位是物件或陣列時按fillPlan和propShapes填內部 key。copyKeys已展開巢狀路徑(如copy.quote、items[].label),按列出的路徑直接填。 inspect:layout標contentLocked: 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 或輸出目錄。
- 提煉使用者目標:
title、goal、audience、owner、頁數、內容重點和最終產物格式。使用者未指定頁數時,普通長 deck 預設 10 頁左右;使用者明確要求單頁時必須生成 1 頁。 - 執行九宮格風格門禁:對 12 套風格匹配排序,取前 9 套,執行
build-theme-style-grid.mjs,在使用者可見回覆中嵌入 3×3 圖片並列出 9 項理由,然後暫停等待選擇。使用者選定後再設定themePack並生成randomSeed,例如<主題>-<日期>-<3位隨機詞>,保證隨機選頁可重現。 - 判斷圖片意圖:無圖但需要視覺素材時先問是否預留圖片槽;使用者給本地素材先
media:stage;明確生圖時用 image-gen。 - 用
layout:query選候選;物件/陣列/count/圖片 props 用inspect:layout+props:safe。 - 每頁只承載一個主要資訊角色。無法安全覆蓋的頁面優先換 layout,不要改樣式欄位硬湊。
- 把 JSON 寫入本次工作目錄的
output/<deck-name>/goal.json;使用者明確指定其他輸出目錄時按其要求。渲染前執行npm --prefix <skill-root>/project run props:safe -- --goal <goal-file> --write和 goal spec 驗證。--write後核對輸出的layoutChanges;不認可替換就改回並換頁。 - 圖表頁填入自己的資料後,頁內 insight/讀圖/結論類文案欄位必須據新資料一併改寫,不保留預設結論。
- 執行渲染腳本輸出
<deck-output-dir>/ppt/index.html;腳本會使用 Skill 內建產生器,不要切回外部專案目錄。 - 渲染後核對素材路徑,缺失時補最終
<deck-output-dir>/ppt/assets。 - 確認腳本完成
validate:swiss和validate:goal-copy驗證。 - 執行
node <skill-root>/scripts/check_latest_version.mjs做靜默版本檢查。 - 渲染腳本會啟動本地 HTTP 預覽服務並輸出
http://127.0.0.1:<port>/;需要指定埠時設定DASHI_PPT_PREVIEW_PORT後再執行腳本(埠用 5200-5999 段,4178/4300/4400 為使用者保留埠不可用)。只能用該預覽服務,不得用python -m http.server、npx serve等靜態伺服器替代:靜態伺服器沒有匯出和自動儲存介面。預覽服務下編輯自動儲存到index.html本體;file://開啟的本地檔案不自動儲存,交付前需匯出。 - 按交付格式回覆:預設呼叫
/api/export-editable-pptx交付可編輯 PPTX 檔案路徑,並保留 HTML 預覽源;使用者明確只要 HTML 時只給http://127.0.0.1:<port>/。
安全返工工作流
僅在使用者明確指定既有成品、頁面或 goal.json 時使用。只收到「改一下」但目標不唯一時,先定位目標,不得誤改其他 PPT。
- 記錄目標
goal.json、對應輸出目錄和使用者要求。若只有 PPTX 而沒有本 Skill 的goal.json/ HTML 源,不得假裝能無損最小修改;應說明需要原始檔,或按匯入重建任務另行處理。 - 將「其餘不變」作為硬約束:預設鎖定
themePack、pageCount、slides數量、每頁layout、每頁role和未點名的所有內容。先把本次改動寫成 JSON Patch 檔案,例如:
{
"note": "第 4 頁標題改為年度重點項目,其餘不變",
"changes": [
{"op": "replace", "path": "/slides/3/props/title", "value": "年度重點項目"}
]
}
- 執行
npm --prefix <skill-root>/project run goal:revise -- --goal <goal.json> --patch <patch.json>。腳本會在目標目錄的revisions/下儲存修改前快照與變更報告,並拒絕主題、頁數、整頁、佈局和角色的結構性修改。 - 只有使用者明確要求改主題、頁數或版式時,才允許結構性返工。換主題仍先執行 9 宮格風格門禁並等待確認;確認後再使用
--allow-structure,隨後重新檢查所有 layout 和 props 契約。 - 返工後執行
props:safe、validate:goal-spec和渲染驗證,並將變更報告中的changedPaths與使用者要求逐項核對。若出現額外欄位變化,從快照恢復後重新生成最小 patch。 - 交付時說明修改物件、實際變更路徑和快照位置;新建任務仍回到「新建工作流(必須保留)」,不得繼續沿用本次返工目標。
品質修復與瀏覽器檢查
只在以下情況返工:渲染失敗、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/ 陣列欄位的內部形狀;寫copy、cells、items、rows等物件欄位時只使用這裡列出的 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。