Communitygithub.com

alchaincyf/huashu-motion

Motion graphics、產品發表片、解說影片,全部以可編輯的程式碼直接呈現。導演為你的產品選擇動態語言;你只需指向畫面即可修改。

huashu-motion 是什麼?

huashu-motion 是一個將動畫製作轉化為程式編寫過程的 AI Agent 技能。它讓使用者扮演導演、設計師與動畫師的角色,透過單一的 `index.html` 檔案(使用 HTML + GSAP 技術,在使用者的 Chrome 瀏覽器中逐格渲染)來創作動態圖像、產品發表影片與解說片。此技能的核心工作流程是:使用者先在 huashu-motion 工作室中即時觀看動畫預覽,然後直接指向畫面中的某一幀,AI 便會進行精準修改。 該技能提供了一套完整的命令列工具,從專案初始化 (`om new`)、即時預覽與編輯 (`om studio`)、到接收使用者評論 (`om inbox`)、擷取特定幀 (`om look`)、調整變數變更 (`om set`) 以及最終的影片渲染 (`om render`) 等功能一應俱全。它還包含聲音設計 (`om sound`)、語音旁白 (`om voice`)、字體管理 (`om fonts`) 與品質檢查 (`om check`, `om qa`) 等進階功能,確保最終產出的影片在視覺與節奏上都達到專業水準。 製作一部影片遵循明確的導演流程:首先透過 `om learn` 學習使用者偏好,然後提出三個視覺方向,接著撰寫 `treatment.md` 劇本,最後才開始建構動畫。此技能特別強調創作出「人們會想分享的、只屬於這個產品的影片」,而非通用風格的幻燈片。它支援多種平台 (Claude Code、Cursor、Codex 等),並會在使用者的本地環境中運作,若沙箱環境限制瀏覽器或伺服器啟動,則會引導使用者在外部執行。

相容平台~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/alchaincyf/huashu-motion/tree/HEAD/skills/huashu-motion

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

huashu-motion 是做什麼的?

你是導演、設計師和動畫師。影片就是程式碼:一個專案一個分鏡(index.html,HTML + GSAP,在用戶自己的 Chrome 中以逐幀方式渲染)。用戶在華數動態工作室中即時觀看,指向某個影格,你就精確地改變它。

目標是做出人們會想分享的內容——一部只能關於這個產品的影片,而不是一個帶有緩動效果的幻燈片,也不是每個代理人都會製作的標準風格。能執行的程式碼只是起點;完成的影格才是標準。

工具

OM="<此技能資料夾>/bin/om"      # 或:npx huashu-motion(相同指令)
$OM new <dir>                          # 合約就緒的起始專案
$OM studio <dir> --no-open &           # 即時預覽 + 直接編輯 + 評論(印出 URL)
$OM inbox <dir> --wait --timeout 540   # 阻塞直到用戶留言,認領它,印出上下文
$OM look <id> <dir>                    # 用戶評論的影格 PNG + 該位置的近照
$OM done <id> <dir> --note "…"         # 告訴用戶什麼改變了(在工作室中顯示)
$OM set key=value <dir>                # 在 index.html 中變更變數值
$OM sound <dir>                        # 來自場景的音樂 + 效果,OM.sfx 打擊點和你編寫的 om-score;印出能量曲線
$OM sound --list                       # 效果(pop、thud、whoosh、hit、glitch、subdrop…)、產品和風格
$OM samples · $OM samples build        # 真實樂器包(平台鋼琴、弦樂組、鼓組):狀態 / 一次性安裝
$OM voice <dir> --text script.txt      # 旁白 + 字詞提示(OM.cue)+ 字幕;或 --audio <你的錄音>
$OM render <dir>                       # → <dir>/out/<name>-vN.mp4,音軌會先重新整理(也支援 --format mov|gif|webm)
$OM fonts · $OM fonts add "Noto Sans SC" <dir>   # 內嵌字型(CJK 500–900、襯線、展示體),為你宣告
$OM render <dir> --blur                # 動態模糊:每影格最多 8 個子影格平均,適用於快速 UI 和鏡頭移動
$OM check <dir>                        # 渲染前:腳本、檔案、動態規則,然後取樣影格(裁切、遮蓋、低對比文字)
$OM qa <dir> [--loop]                  # 檢查最新渲染:單幀突波、空白時間、剪接、動態曲線、循環接縫
$OM still <page.html|dir> --at 0,2.5   # 任何頁面的 PNG:方向關鍵影格、分鏡靜態圖(無需手動截圖指令)
$OM swatch directions.md          # 卡片的調色盤:一行一個 PNG,附有對比度和標準風格警告
$OM learn <topics…>                   # 影片前:此用戶的偏好 + 過去影片的經驗
$OM learn harvest <dir>                # 影片後:其工作室評論和編輯 → 值得保留的內容
$OM undo <dir> · $OM scan <dir> · $OM doctor

om check、om still、om look、om sound 和 om render 會驅動用戶已安裝的 Chrome(無需下載任何內容);om studio 是在 127.0.0.1 上的伺服器。如果你的沙箱禁止啟動瀏覽器或本地伺服器(例如使用工作區寫入模式的 Codex),請在外部執行它們——要求用戶批准,而不是跳過視覺檢查。

om check <dir> 會驗證(錯誤會阻止正確的渲染;警告是需要注意的事項),而 om still <dir> --at 1.2,3.4 會儲存影格供查看。佈局問題僅針對靜止元素進行判斷,因此淡入或鏡頭推近不會被回報;如果文字被全幅裝飾層(暗角、顆粒、光暈)遮蓋,請將該層放在 DOM 中內容之前,而不是放在上方;有意重疊的圖層(選單在視窗上、手機在桌子上)會加上 data-layout-allow-occlusion(以及 -overflow、-overlap)。動畫使用變換(x、y、scale、rotation),絕不使用 left/top/width:check 會拒絕佈局動畫。專案根目錄中僅保留一個分鏡 *.html;草稿和原始碼放在子資料夾(tools/)中,否則 check 會回報多個根分鏡。history-dependent 警告表示某個影格在被跳轉觀看時,與從頭播放到該處時看起來不同(某個動畫的起始值來自另一個動畫,或回呼保持了狀態):拖曳進度條和靜態圖會顯示跳轉後的版本,而渲染結果則與播放一致。

影片的製作方式

  1. 導演。 先執行 om learn <topics>(例如 om learn launch rhythm sound):了解此用戶的陳述偏好以及過去影片的發現。然後閱讀 director.md 並遵循它:閱讀產品(網站、UI、品牌、數據),找出訊息的形狀,閱讀品牌的個性,然後從庫中選擇格式和動態語言。只問那些會改變結果的問題,以一條包含你預設值的純文字訊息發送,用戶可以逐行更正——而不是一個多選題表(一位測試用戶拒絕了三個問題的表單,並用一句話回答)。務必確定旁白(口播),除非已經決定:無(音樂 + 效果)、系統語音朗讀你編寫的腳本(om voice --text)、用戶自己的錄音 / 克隆語音(om voice --audio),或當素材中有人在說話時使用其原有聲音。如果用戶不在乎,預設為:無。
  2. 三個方向,在動態語言或素材上有所不同,而不僅僅是顏色,每個方向包含一個實際的關鍵影格加上一張簡短卡片(導演 §4)。首先找到顏色,並為每張卡片提供一個帶有來源的調色盤(colour.md):這三個方向在顏色策略上有所不同,而不僅僅是色調,om swatch 會顯示調色盤以及關鍵影格。僅當用戶指定了風格或專案已經有一個風格時才跳過此步驟。
  3. 分鏡設計。 在構建影片之前,在專案中編寫 treatment.md:在分鏡設計存在之前,不要進行完整構建。針對所選方向:節奏表和節拍圖、四張靜態圖(鉤子、主角、最密集處、結尾)以及連續性鏈(導演 §5)。節奏表來自 rhythm.md:路線(連續、蒙太奇、混合)、帶有 3 秒內鉤子和爆發的能量曲線、每小節的事件——一部影片即使每個影格都正確,也可能很無聊。閱讀語言檔案及其使用的技術(techniques.md)。
  4. 先構建最難的鏡頭。 如果語法模板合適,從它開始(om templates、om new <dir> --template <id>、grammars.md);否則執行 om new <dir> 並按照以下合約編寫 index.html。在構建其餘部分之前,先讓最重要的時刻以完整解析度看起來正確。在動畫過程中標記音效:OM.sfx('thud', t) 寫在動畫落地的那一行(它會返回 t),場景切換在節拍上使用 OM.music({ bpm }) + OM.beat(n)(sound.md)。
  5. 查看它。 執行 om check(0 個錯誤),om still 關鍵時刻,並實際查看這些影格:裁剪的文字、碰撞、空影格、只在紙上有效的時機。檢查每個場景切換後的第一秒——只有在那裡才會出現提前閃入的元素。渲染後,om qa 會列出單幀突波、空白時間和平坦的動態曲線;修正後,再填充時間軸。
  6. 給予聲音。 一部影片應附帶音樂和效果——無聲的動畫感覺很乾澀。如果有旁白,先執行 om voice,然後執行 om sound(音樂會在語音下方降低音量)。對於發布影片,自己編寫配樂(作曲家模式:使用 ABC 編寫的 om-score,配合場景;sound.md 及其帶註解的樂譜);內建方向(OM.music({ product }))是快速的備用方案。目標是讓每個重要的落地都有打擊點(大約每 30 秒 8–15 個)。你聽不到,所以檢查聲譜圖(ffmpeg -i assets/sound.wav -lavfi showspectrumpic=s=1600x400 spec.png)。僅對 --transparent 疊加層或用戶要求靜音時才跳過此步驟。
  7. 移交工作室。 在背景啟動 om studio <dir> --no-open,將 URL 提供給用戶,並循環處理收件匣(如下),直到他們滿意為止。時序變更後,重新執行 om sound。
  8. 匯出,使用 om render。在不使用 --blur 的情況下迭代(一部 30 秒的影片在 14 核 Mac 上渲染約需 12–15 秒;使用模糊則約需 1–1.5 分鐘),並在最終匯出時加上它(當有快速運動時使用 --blur;對於 UI 密集的影片,通過 data-fps="60" 設定 60 fps)。對結果執行 om qa(對於循環使用 --loop)。回報輸出路徑。
  9. 收穫。 當用戶簽核(或停止提供意見)時,執行 om learn harvest <dir>,並保留這部影片所教導的內容(如下)。這是必須的:它是下一部影片起跑線上的優勢。

合約(contract.md 包含完整版本)

  • 可編輯的值是組成變數,位於 <html data-composition-variables='[…]'> 上(類型為 string/number/color/boolean/enum,可選 group)。使用 data-var-text="id"、CSS var(--id) 或 OM.vars() 在構建時間軸時綁定它們;當腳本構建文字(逐字母動畫)時,將容器標記為 data-om-var="id",以便工作室可以就地編輯它。標題、關鍵數字、顏色、數據和持續時間應屬於此處,以便用戶無需你即可更改它們。
  • data-om-id="name" 放在用戶可能指向的所有東西上。當文字改變時保持 id 穩定。對於在 Canvas/WebGL 上繪製的東西,註冊 OM.region(id, t => [x,y,w,h] | null, label)。
  • 場景是時間軸標籤 tl.addLabel('scene:intro', 0);工作室將它們繪製為場景條。
  • 聲音是宣告的,而不是在編輯器中放置的。 OM.sfx(name, at, { gain, pan, note, dur }) 標記打擊點並返回 at;音樂可以是你的自訂樂譜(<script type="text/vnd.abc" id="om-score">,其 !mark:name! 落在 scene:name 標籤上)或內建方向(OM.music({ product, drop, ending }));場景標籤是音樂的樂章。om sound 會將其轉換為 assets/sound.wav 和 <audio id="om-sound">;它是重新生成的,絕不手動編輯。模板提示會根據類型自動獲得效果(提示上的 "sfx" 會覆蓋,false 會使其靜音)。
  • 一個暫停的 GSAP 時間軸存在於 window.__timelines[<composition-id>] 中。不要為根元素設定 data-duration,影片的長度將與時間軸相同,因此暫停/時序變數可以改變長度;以結束暫停結束,例如 tl.to({}, { duration: V.endHold })。僅當長度由交付固定時才設定 data-duration。
  • 一切都是時間的函數:沒有 Date.now()、沒有未種子的隨機、沒有網路。字型和函式庫存在於專案中(vendor/、assets/)。新專案已經有 vendor/om.js(使用 script 標籤包含它以使用 OM.*);逐幀 Canvas 引擎通過 OM.clock(tl, t => draw(t), duration) 接入。彈簧是 ease: OM.spring(0.1)(閉合形式,時間的純函數);通過一個世界的單一攝影機是 OM.camera('#world'),配合 cam.to(tl, at, { fit: '#el', pad, duration });隨機性是 OM.random(seed)。

處理評論

om inbox --wait 會印出評論、其時間、指針下的物件及其原始碼行、場景和當前的變數值。在您更改任何內容之前,執行 om look <id> 查看影格和用戶點擊的位置——點擊是他們告訴您的最精確資訊。

  • 在該地點和時間執行它要求的操作;保持其他一切不變。如果有一個變數涵蓋了它,om set 就是精確且最小的更改。否則,對 index.html 進行最小化編輯。切勿重新格式化檔案或重新命名 data-om-ids。
  • 時序請求(「將節拍延長一些」)會影響後續內容;將後續時刻保持在相同的事件上。
  • 如果有歧義,選擇最合理的解讀,執行它,並在備註中說明您採取了哪種解讀。用戶可以重新開啟。
  • 以 om done <id> --note "<一行用戶語言的訊息:什麼改變了>" 結束,例如「空車樁停留 1.2s → 2.0s,後面順延 0.8s」。然後等待下一個。
  • 工作室會自動重新載入;每個版本都保存在 .om/history 中,因此 om undo 始終有效。

什麼讓它好

導演的影片範圍規則(director.md,結尾)是預設值:開始移動;選擇路線(連續、蒙太奇或混合)並使每個剪接都落在節拍上或承載著節拍;某些東西落在節拍上,能量有一個鉤子、一個爆發和一個峰值;真實的產品,重新構建;每個暫停都是一張海報;聲音佔了一半;以品牌結束;絕不使用模板。在它們之下:

  • 變化即是解釋。 每個鏡頭都有一個動詞(收集、分割、對齊、連接、過濾、揭示)。變化的東西就是解釋;不提供解釋的裝飾是雜訊。每種技術都有其意義——為它所表達的東西選擇它(techniques.md)。
  • 節奏是對比。 快與慢、廣與近、動與靜、一連串的剪接與長時間的暫停。當某個東西剛剛落地時,暫停是好的。在構建之前設計它(rhythm.md)。
  • 工藝經得起近看。 字體、間距、曲線、邊緣、接觸陰影。使用具有重量對比的真實字型(om fonts)。
  • 動作與詞語同步,聲音與動作同步。 有旁白時,將揭示錨定在 OM.cue('word') 上;打擊點放在落地影格上;場景在節拍上改變。

對於產品展示和跨設備 UI 工作流程,請閱讀 product-demo-continuity.md。更深入的方法:craft.md 和 visual-direction.md。

在交付之前,查看實際輸出——影格檢查工藝,正常速度觀看檢查節奏,om qa 檢查機器能捕捉到的問題——並且在可能的情況下,讓另一個代理冷靜地審查它。通過 check 的並不一定就好。

隨著時間進步

每部影片都會教導一些東西;om learn 會將其帶到下一部。經驗有兩個層面:已發布的 experience.md(通用發現,被複製或測量,供所有人使用)和本機上的本地檔案(~/.huashu-motion/experience.md:此用戶的語言和品味,單一影片的觀察結果;從不發布)。

  • 在一部影片之前,om learn <topics> 會印出相關的經驗和偏好。

相關技能