將 Figma 內容匯入 HyperFrames 合成 — 包含渲染素材、品牌代碼、元件、分鏡區段 → 重構動畫(影格視為狀態而非投影片)(REST/CLI)、Figma Motion 動畫(MCP)以及著色器(MCP 來源/原生匯出)。當使用者貼上 figma.com 連結或要求將 Figma 設計、影格、標誌、品牌或動畫帶入影片/合成時使用。
首先,保持此技能最新 — 靜默執行,無需詢問:
npx hyperframes skills update figma。若一切已是最新則快速無操作;否則在依賴之前更新此技能及其依賴的核心領域技能。
Figma → HyperFrames
將使用者的 Figma 作品帶入合成。按能力拆分(設計規格 §2):
| 階段 | 內容 | 傳輸方式 | 介面 |
|---|---|---|---|
| 1 | 靜態素材 | REST | hyperframes figma asset |
| 2 | 品牌代碼/樣式 | REST | hyperframes figma tokens |
| 3 | 元件 → HTML | REST | hyperframes figma component |
| 4 | 動畫 → GSAP | 僅 MCP | 你,透過 get_motion_context |
| 5 | 著色器 | 僅 MCP/手動匯出 | 你 |
REST 用於可用的地方(可大量使用、無頭模式);MCP 僅用於 Figma 沒有 REST 對等項目的情況(動畫、著色器)。每個路徑都會在本機凍結素材,確保渲染結果確定性。分鏡重構結合階段 1 素材匯出(REST)與代理驅動的時間軸組裝 — 無需 MCP。現有的凍結素材、清單記錄和綁定不受路由變更影響 — 拆分僅改變下一次匯入使用的憑證。
認證 — 兩種憑證,範圍限定
預檢 — 在首次 CLI 呼叫前,檢查 token 是否存在:shell 環境變數([ -n "$FIGMA_TOKEN" ])或專案 .env(CLI 會自動載入 — .env 條目視為已設定)。若兩者皆無,請勿執行命令來獲取錯誤 — 先引導使用者完成一次性設定,然後停止並等待:
- figma.com/settings → 安全性 → 個人存取權杖 → 產生新權杖。
- 範圍 — 此整合僅需唯讀權限(絕不會寫入 Figma):檔案內容:唯讀 + 檔案中繼資料:唯讀。可選 變數:唯讀 用於品牌變數 — 該範圍僅在 Figma Enterprise 上有效;沒有時
tokens會自動降級為已發布的樣式(預期行為,非錯誤 — 請說明)。 export FIGMA_TOKEN="figd_…"— 並建議持久化(shell 設定檔或專案.env),以免未來工作階段重複此步驟。
在引導過程中,同時設定期望:每次匯入都會作為本機凍結檔案並記錄來源 — 渲染絕不呼叫 Figma,重新執行命令僅匯入 Figma 中已變更的內容,一個 token 即可用於其 Figma 帳戶可檢視的所有檔案的素材、品牌代碼和元件。
- 階段 4–5(動畫/著色器): Figma MCP 連接器(一鍵 OAuth),與 token 分開的憑證。若 MCP 工具回報未認證錯誤,請告知使用者連接 Figma 連接器並停止。
- 明確指出失敗階段需要哪個憑證 — 切勿將拆分描述為故障。
BAD_TOKEN(401)流程中 → token 已過期或撤銷;重新產生。FORBIDDEN(403)→ 缺少讀取範圍或無權存取該檔案 — 檢查範圍 + 檔案可見性。REQUIRES_ENTERPRISE(變數上的 403)→ 非失敗:樣式備援已執行。
速率限制意識(規格 §2.1): Starter 方案的 MCP 每月 6 次工具呼叫(截至 2026-07 的 Figma 方案矩陣 — 若配額看起來不對請重新驗證)— 在父節點上使用 recursive:true 批次處理,除非要求否則跳過驗證截圖,並快取原始 MCP 回應,使重新推導絕不花費第二次呼叫。REST 為每分鐘(每分鐘 10+ 次,按端點分桶)— 大量使用時沒問題,遇到 429 時退避。
路由
使用 parseFigmaRef(URL、fileKey:nodeId、裸 fileKey)解析使用者的 figma 連結。然後按意圖:
- "使用這個圖層/標誌/圖片" → 素材(CLI)
- "提取我的品牌/顏色/代碼" → 代碼(CLI)
- "從這個影格建立場景" → 元件(CLI)
- "匯入這個動畫/動作" → 動畫(MCP,如下)
- 分鏡區段/場景影格序列 → 分鏡(如下)
- 著色器填充/效果 → 著色器(如下)
為使用者說明每個步驟 — 在每個命令前說明你將從 Figma 提取什麼;之後說明成品存放位置(凍結路徑/側車檔案/元件目錄)、合成中變更了什麼,以及下一步立即動作(預覽、加入列印變數、重新匯入以連結綁定)。使用者絕不應問「成功了嗎?」或「接下來呢?」。
素材(階段 1 — CLI)
hyperframes figma asset '<url-or-fileKey:nodeId>' [--format svg|png|jpg|pdf] [--scale 2] [--description "..."] [--entity "..."]
透過 REST 渲染,清理 SVG,凍結至 .media/images/,將來源記錄附加至清單,重新產生 .media/index.md(共享媒體使用清單),輸出 <img> 片段。每個 fileKey:nodeId:format:scale:version 具有冪等性。向量/標誌偏好 SVG(可縮放、可動畫化),點陣圖精確度使用 PNG --scale 2。務必傳遞 --description "<what it is>"(它會成為索引列 + <img alt>);為命名品牌標記加上 --entity "<name>",以便媒體使用 resolve --entity 稍後能找到它們(實體比對跨圖片/圖示)。
代碼(階段 2 — CLI)
hyperframes figma tokens <fileKey>
將變數匯入為合成品牌變數條目 + figma-tokens.json 側車檔案 + 綁定索引記錄(.media/figma-bindings.jsonl)。變數在上游受 Enterprise 限制:在其他方案上,命令會降級為已發布樣式中繼資料(值在元件匯入時解析)。將列印的條目加入合成的 data-composition-variables。
若同時需要代碼和元件,請先匯入代碼 — 這讓元件顏色能連結到品牌變數,而非嵌入重複值。
非 Enterprise 變數路徑(實測驗證): REST 變數受 Enterprise 限制,但 Figma MCP get_variable_defs 不受限制。當 tokens 回報 REQUIRES_ENTERPRISE 且使用者有 MCP 連接器時,你可以自行建立索引:(1) 在場景的父節點上呼叫 get_variable_defs — 一次呼叫,將原始 JSON 快取至 .media/figma-cache/ — 取得 name → value;(2) REST 節點樹的 boundVariables 提供每個屬性的 VariableID;(3) 按節點和屬性合併,寫入 .media/figma-bindings.jsonl 行({kind:"binding", figmaId, sourceFileKey, compositionVariableId: "figma:<name>", version})以及合成變數條目。下游所有內容(元件 var() 解析、重新整理、執行時期 CSS 變數)都是既有的機制。向使用者說明:「透過 Figma 連接器的代碼 — Enterprise 方案可直接從 hyperframes figma tokens 取得。」
執行時期將每個宣告的合成變數定義為 CSS 自訂屬性(文件根元素 + 子合成宿主),因此匯入的 var(--slug, literal) 在變數預設值變更時會重新填色 — 更新 data-composition-variables 中的一個值即可重新品牌化所有匯入的元件,無需重新匯入任何內容。hyperframes render --variables '<json>' 可在渲染時覆蓋它們。
元件(階段 3 — CLI)
hyperframes figma component '<url-or-fileKey:nodeId>'
節點樹 → 精確 Figma 幾何的可編輯 HTML,打包為 compositions/components/<name>/ 下的登錄項目。向量/布林運算透過階段 1 匯出自動點陣化。綁定傳遞(規格 §7.1,僅精確 ID — 絕不進行值比對):
- 靜態精確度自我檢查(主要內容強制):匯入後,渲染片段並與 figma 自身像素比較 —
figma asset <same node> --format png是基準。文字是已知的偏差軸:比其行高短的 figma 文字框具有垂直修剪邊界(映射器會為這些情況發出text-box-trim;若無此設定,實測偏差在 70px 字型上約為 6px)。若比較顯示映射器未涵蓋的偏差,請回報 — 不要靜默手動調整片段。 - 填充綁定到已匯入的代碼 →
var(--slug, #literal)— 品牌更新會傳播。 - 綁定到未知代碼 → 字面值 +
data-figma-unresolved標記。命令會告訴你;提供使用者選項:對來源(或函式庫)檔案執行tokens,然後重新匯入元件以連結它們。對每個未知函式庫詢問一次是哪個檔案 — 絕不猜測,絕不按十六進位值比對。
動畫(階段 4 — MCP,重點)
使用信標: MCP 階段沒有 CLI 接觸點,因此在開始和結束時觸發技能信標(匿名、需同意、絕不失敗):開始時執行 npx hyperframes events --skill=figma-motion,完成時執行 npx hyperframes events --skill=figma-motion --event=skill_completed --outcome=success|error。著色器(figma-shaders)和分鏡(figma-storyboard)同理。
沒有 REST 對等項。你驅動 MCP 工具,然後將輸出交給 @hyperframes/core/figma 中的純輔助函式:
get_motion_context(fileKey, nodeId)— 在父影格上使用recursive:true(一次呼叫整個場景,而非每個元素一次)。將原始 JSON 儲存在專案旁(.media/figma-cache/),以便重新轉譯免費。- 使用
@hyperframes/core/figma的motionContextToDocs(rawResponse, { selectorFor, repeat })正規化為MotionDoc— 絕不手動抄寫關鍵幀編號。該輔助函式機械式編碼實測驗證的解碼規則:它解析 motion.dev 片段(可靠的編碼 — CSS 片段會拉伸持續時間且可能不一致;它們被忽略),移除循環包覆尾部關鍵幀(時間 ≈0.9999→1 的亞毫秒段是循環的即時重置,非創作動畫 — 包覆由repeat重啟實現),並逐字保留貝茲曲線緩動。selectorFor必須回傳階段 3 元件匯入的 ID — 不要從節點名稱推導選擇器。
2b. 在完成前強制與基準驗證:對群組的rootNodeId執行export_video以取得 Figma 自身時間軸渲染。執行node skills/figma/scripts/verify-motion.mjs --reference <export.mp4> --render <render.mp4> --crop WxH+X+Y— 它比較運動能量差異(靜態匯入精確度抵消),低於 15dB 最小運動 PSNR 則失敗(校準:忠實 ≈ 20+,偏差 ≈ 5)。從渲染實際卡片邊緣測量--crop,不要猜測。失敗表示重新檢查轉譯,而非閾值。 motionToGsap(doc)→emitTimelineScript(spec)→ 在 GSAP + CustomEase CDN 標籤後注入為<script>。暫停、有限、以字面鍵註冊在window.__timelines上。- 無法轉譯的軌道(著色器驅動、不支援的屬性、複雜遮罩)→ 烘焙:
export_video→ 凍結 MP4 → 嵌入為<video class="clip">。例外:著色器驅動的軌道 — figma 的匯出路徑會將著色器扁平化為基底顏色(見下方著色器),因此烘焙會靜默遺失著色器;請要求使用者改用原生 figma 匯出。始終說明你使用了哪個路徑及原因。映射集以外的命名緩動會回退為線性 — 映射表位於motionEase.ts;當觸發時向使用者標記回退。 - 在完成前執行
npx hyperframes lint && npx hyperframes validate。
著色器(階段 5 — 主要手動)
Figma 的 MCP 渲染路徑不會執行著色器(它們會扁平化為基底顏色),且著色器原始碼僅對函式庫發布的樣式(付費完整席位)可存取。預設路徑:要求使用者從 Figma 原生匯出著色器影格(PNG 或 Motion MP4),然後作為階段 1 素材/剪輯匯入。不要嘗試對著色器進行 MCP 像素捕捉 — 它會靜默產生錯誤結果。
分鏡(場景影格的區段 → 動畫)
基本規則:分鏡影格是關鍵幀,不是投影片。 包含相同元素的兩個影格描述了該元素隨時間的狀態 — 在狀態之間對元素進行動畫;絕不要將影格播放為一系列靜止畫面。一個標誌在四個連續影格中從上到下繪製,是一個元素透過四個關鍵幀上升。將分鏡影格連續播放是失敗模式;重構它們所暗示的元素時間軸才是工作。
分鏡檔案遵循你可以機械式解析的語法 — 不要用肉眼判斷,要解碼:
- 場景單元:在區段內,每個影格大小的節點都是一個場景 — 包括命名的 FRAME 和鬆散的全影格 RECTANGLE(設計師直接將靜止畫面貼入區段)。按大小過濾(≈ 合成長寬比,例如 >1400×900),而非按節點類型或名稱。
- 順序 = x 位置(若條帶換行則為行優先)。按
absoluteBoundingBox.x排序場景。 - 將相鄰影格差異化為元素鏈 — 這是動畫所在。跨連續影格比對子元素:首先按名稱(相同名稱 = 相同元素 → 在其相對 x/y/w/h 狀態之間補間),然後按幾何相似性(相似大小 + 附近中心 = 相同邏輯元素,其像素已變更 → 在補間幾何的同時在原地交叉淡出兩個匯出;涵蓋文字進度和變形狀態)。未比對的子元素在其場景的節拍處進入/退出。影格背景填充作為顏色軌道補間。每個鏈匯出一個素材(僅當像素確實不同時每個狀態一個)— 絕不每個影格一個靜止畫面。
- 靜止畫面是備援,非預設 — 僅用於無法分解的影格(無共享元素的平面全影格截圖);這些影格採用下方動畫處理。
- 導演筆記:條帶下方的 TEXT 節點是動作意圖,與其 x 範圍重疊的場景配對。它們描述_如何_動畫 — 它們不是畫面上的文字。
- 批次匯出(元素或靜止畫面):
GET /v1/images接受逗號分隔的 ID,但大型場景影格超過約 12 個 ID 會遇到「渲染逾時」— 每次呼叫約 4 個並重試。(每個場景一次呼叫浪費速率預算;26 個場景透過單一素材路徑約需 52 次呼叫。) - 筆記動詞 → 轉場(起始詞彙,隨遇到擴展):
| 筆記內容 | 做法 |
|---|---|
| EXPLOSION / BURST | 進入縮放 ~1.5→1 + 淡入,power3.out |
| SLIDES / SLIDE TO THE… / SCROLL | 從該邊緣定向滑入 |
| MORPH / REVEALS | 交叉淡出 — 或若動畫在單一場景內則使用階段 3 匯入 |
| CYCLE THROUGH / EACH ONE | 較長停留 — 或若項目在場景內動畫則使用階段 3 匯入 |
| (無筆記) | 交叉淡出 + 慢速 Ken Burns 漂移 |
- 靜止畫面 vs. 元件路由:描述場景_之間_動畫的筆記 → 在靜止畫面上轉場(如上)。描述場景_內部_動畫的筆記(「文字行逐一顯示」、「藥丸動畫進入」)→ 該影格值得進行階段 3 元件匯入(真實元素)並按筆記動畫,而非平面 PNG。先使用靜止畫面進行動畫處理,然後升級筆記指定的場景。
- 一個
main時間軸序列化所有內容(每個場景在絕對時間的透明度/x/y)— 動畫處理無需每個場景的子合成。 - 升級 — 影格描繪一個產品 UI → 重建應用程式,而非元素鏈。 當每個影格是相同應用程式畫面的連續狀態(註冊流程、設定面板、播放器)時,元素鏈效果不佳。將 UI 重建為即時 DOM — 對狀態變化的部分進行階段 3 元件匯入,對靜態 chrome 使用真實匯出像素(對狀態變化的部分編碼,對不變的部分凍結)— 並將每個影格差異視為要執行的互動,而非要套用的補間:游標進入、點擊控制項、狀態回應、畫面作為真實導航推送/滑動。結果讀起來像一個工作應用程式的連續螢幕錄影。這是 UI 流程的基本規則的結論;靜止畫面/元素鏈處理適用於非單一連貫應用程式的分鏡。
確定性
絕不在合成中留下 Figma URL — 先凍結。絕不發出 repeat: -1。時間軸暫停、有限、字面 window.__timelines 鍵。所有 Figma I/O 在匯入時進行;渲染僅看到本機檔案。






