Speccanvas 是做什麼的?
使用此技能來產生與維護 Spec Canvas 工件,可輸出為可攜式 YAML 規格,或透過已設定的 SpecCanvas MCP 伺服器進行持久化儲存。
將規格視為結構與意圖的真理來源。傾向於精簡、可重複使用的規格,這些規格無需額外說明即可直接貼入 Spec Canvas、IDE、終端機代理或儲存庫中使用。
以此技能中的 format-description YAML 檔案作為撰寫指南。使用此技能中捆綁的 JSON Schema 副本以及本機驗證邏輯作為最終檢查。
核心理念
Spec Canvas 規格是產品意圖與實作之間的精簡橋樑。它們應幫助代理與人類在程式碼變更之前就產品樣貌達成共識,但不應成為每個 CSS、佈局或元件微調的執行日誌。
- UI 規格描述意圖與結構。 捕捉畫面、主要區塊、導航、關鍵使用者任務、重要狀態以及有意義的回應式結構。
- 資料規格描述邏輯領域。 捕捉實體、欄位、列舉、關係與領域限制;避免提及實體資料庫或框架細節。
- 規格優先原則適用於語意變更。 當請求改變產品意義、使用者旅程或領域結構時,應先更新規格再進行實作。
- 實作微變更可跳過規格。 如果請求僅是外觀、佈局調整或對使用者不可見,則直接修改實作,無需更動規格。
- 精簡的規格才是好規格。 傾向於用簡短的用途說明來解釋畫面/區塊存在的原因,而非描述其建構方式的實作細節。
粒度閘門
在編輯 UI 規格之前,先判斷請求的變更是否具有足夠的語意重要性,從而應納入規格中。
當請求改變以下項目時,更新 UI 規格:
- 畫面、畫面群組或主要區塊;
- 使用者旅程、導覽、進入點或可用操作;
- 重要的面向使用者的狀態、模式、權限,或空白/錯誤/復原流程;
- 主要元件的用途或行為;
- 有意義的回應式結構,例如明顯不同的桌面/行動體驗;
- 產品術語或標籤,當其意義改變時;
- 公開、管理、編輯、玩家、入門等產品區域之間的邊界。
不要因實作微調而更新 UI 規格:
- 間距:padding、margin、gap、line-height;
- 確切尺寸:像素值、font-size、width/height,除非它們表達高階佈局意圖;
- CSS 類別、Tailwind 類別、元件名稱、檔案名稱或特定框架的結構;
- 確切顏色、漸層、陰影、border-radius、圖示或裝飾性樣式;
- 在已描述的區塊內的局部對齊、排序、換行或外觀重新排列;
- 動畫時序、防反彈時序、淡入淡出秒數、toast 位置、載入轉動指示器機制;
- 瀏覽器/平台實作細節,除非是核心面向使用者的功能;
- 不改變意義的局部文案編輯;
- 對使用者不可見的重構。
如果使用者要求的是外觀或佈局微調,請直接進行程式碼變更,並明確避免觸碰 UI 規格。
預設檔案放置位置
除非使用者明確要求不同的位置,否則請在專案根目錄下的 spec/ 目錄中建立與更新 Spec Canvas 檔案。
- UI 規格路徑:
spec/ui-spec.yaml - 資料規格路徑:
spec/data-spec.yaml
如果 spec/ 目錄不存在,請建立它。當僅要求一個工件時,只建立相關的檔案。
MCP 模式
當使用者要求與即時的 SpecCanvas 專案、文件、修訂版、實作存檔進行協作,或環境中明確存在 MCP 工具時,使用名為 speccanvas 的已設定 MCP 伺服器。
- 如果 MCP 可用,請在建立或更新即時 SpecCanvas 資料之前先閱讀 references/mcp-workflow.md。
- 如果任務是建立或更新 UI 規格,也請閱讀 references/ui-spec-workflow.md。
- 如果任務是建立畫面實作,也請閱讀 references/implementation-workflow.md。
- 如果 MCP 不可用,請不要憑空發明連線細節。請使用可攜式 YAML 檔案,或要求使用者設定
speccanvasMCP 伺服器。 - 請勿將 MCP URL、Bearer Token、暫存主機或本機機密儲存在此技能中。這些應屬於代理的 MCP 設定與環境變數。
MCP 模型身分規則
當透過 MCP 儲存代理編寫的畫面實作時,請始終提供穩定的模型身分,格式為 { identityKey, provider, model, version }。
- 在呼叫
add_implementation之前,從全域代理規則、環境變數或當前工作階段解析作用中模型。 - 對於
add_implementation,直接傳遞modelIdentity。請勿將其替換為agentName。 agentName僅是手動/舊版後備方案。僅在實作由人類上傳或模型身分故意無法使用時,搭配modelIdentity: null使用。- 如果作用中模型未知、不明確或未註冊,請停止並要求澄清,而不是在
agentName下默默儲存。
工作流程
-
界定工件邊界。 判斷任務需要:
- 僅 UI 規格
- 僅資料規格
- 兩個規格
- 對現有規格進行說明、審查、清理或驗證
- 完全不需要變更規格,因為請求是實作微調
- 對專案、規格、修訂版、實作或存檔進行即時 MCP 持久化
-
應用粒度閘門。 對於 UI 工作,判斷請求是否變更產品意圖/結構,或僅變更實作細節。如果只是微調,則保留現有規格。
-
收集來源材料。 僅使用定義結構的輸入:
- 產品構想或功能請求
- 現有螢幕截圖或 UI 描述
- 程式碼庫結構
- 目前的 YAML 規格
- 實體列表、API 筆記或領域規則
-
閱讀所需的工作流程與格式參考資料。
- 對於 UI 規格的建立或修訂,請閱讀 references/ui-spec-workflow.md。
- 對於畫面實作的建立,請閱讀 references/implementation-workflow.md。
- 對於即時 MCP 持久化,請閱讀 references/mcp-workflow.md。
- 對於 UI 規格編寫,請閱讀 references/ui-spec-format-0-0-3.yaml。
- 對於資料規格編寫,請閱讀 references/data-spec-format-0-0-1.yaml。
- 對於本機驗證行為與審查啟發式規則,請視需要閱讀 references/workflow.md、references/validation-rules-ui.md 和 references/validation-rules-data.md。
- 目前捆綁的 Schema 位於 schemas/ui-spec.schema.json 和 schemas/data-spec.schema.json。
-
草擬或修訂規格。 保持文件為有效的 YAML,並停留在格式欄位內。除非格式明確允許,否則不要發明自訂的頂層區段。進行最能保留意圖的最小語意更新;不要用像素級實作註解來擴充規格。
-
驗證結果。 如果 scripts/validate-spec.mjs 可用,請在傳回結果之前對最終的 YAML 執行該腳本。在傳回規格之前修正驗證錯誤。
-
傳回結果。 傳回驗證過的 YAML,或者對於審查任務,先列出問題,然後再提供修正後的片段或檔案。
核心規則
使用格式檔案作為撰寫來源
格式描述的 YAML 檔案是此技能的主要編寫參考。請優先遵循它們的結構、欄位命名、範例與指引。對於 UI 規格,references/ui-spec-format-0-0-3.yaml 是當前的本機真理來源,並應與捆綁的 Schema 和驗證器保持一致。
使用 Schema 驗證作為最終檢查
Schema 驗證不是撰寫指南。它是最後的驗證步驟。
- 從格式檔案撰寫規格。
- 使用
scripts/validate-spec.mjs驗證已撰寫的規格。 - 在傳回最終的 YAML 之前,修正 Schema 和驗證規則的失敗。
schemas/ 中捆綁的 Schema 應與 Spec Canvas 實作以及此技能中的格式描述參考保持同步。如果它們看起來不一致,請將其視為技能錯誤,並明確指出,而不是默默發明妥協方案。
保持 UI 與資料一致
當兩個規格都存在時:
- 匹配畫面、實體和操作之間的命名
- 確保 UI 操作暗示真實的實體或工作流程
- 確保資料規格關係支援 UI 結構
- 指出差異,而不是默默發明後端概念
保持格式的可攜性
產出純 YAML 檔案,使其可以存在於儲存庫中並被任何代理重複使用。請勿讓規格依賴於 Spec Canvas UI 狀態、隱藏元數據或僅限於聊天的假設。
保持 UI 規格高於實作細節
請勿將 UI 規格用作 CSS、元件文件或變更日誌的替代品。好的 purpose 是從使用者的角度解釋畫面或區塊的用途。它不應列舉確切的間距、類別名稱、像素大小、暫時的實作機制或每個小型控制項,如果這些細節不改變產品意義的話。
任務模式
建立新的 UI 規格
- 從
docType、format_version和metadata開始。 - 在 UI 規格中,
metadata.description是必填的,應承載頂層產品意圖。 - 一旦主應用程式樣貌確定,立即加入
screens。 - 當使用者想要可見結構時加入
blocks;在探索階段可以省略blocks。 - 僅在它們實質上有幫助時加入
templates、navigation或回應式欄位。 - 當前本機格式支援的 UI 回應式編寫包括
metadata.breakpoints、自適應screen.template、自適應block.columns和block.visible。 - 保留原始格式檔案的慣例,包括 UI 格式檔案中的引號指引。
- 在可用時使用
scripts/validate-spec.mjs驗證完成的檔案。
建立新的資料規格
- 描述邏輯領域模型,而非實體資料庫。
- 僅在共享控制詞彙重要時加入
enums。 - 使用具有業務意義的
fields定義entities。 - 使用
relations來表達跨實體的邏輯結構。 - 避免洩漏僅與實作相關的關注點,如索引、遷移或 ORM 特定的語法,除非使用者明確要求在規格之外使用它們。
- 在可用時使用
scripts/validate-spec.mjs驗證完成的檔案。
審查或修復現有規格
檢查:
- 無效或不支援的欄位
- 缺少必要的區段
- 損壞的畫面、範本或導覽引用
- 資料規格中的列舉、外鍵或關係錯誤
- 由本機驗證規則引發的自訂驗證失敗
- 原始格式檔案與當前本機實作之間的 Schema 格式不匹配
- 描述實作機制而非產品意圖的過於詳細的 UI
purpose文字
修復時,保留原始產品意圖,並進行能恢復清晰度的最小修正。
壓縮過於詳細的 UI 規格
- 除非產品結構真的改變,否則保持現有畫面、範本、區域和區塊 ID 穩定。
- 將冗長的
purpose段落替換為一句話的使用者面向意圖摘要。 - 保留畫面、主要區塊、導覽、重要狀態和有意義的模式。
- 移除 CSS/佈局微細節、平台怪癖、確切時序、日誌記錄行為和元件內部機制。
- 避免整個檔案的 YAML 重新格式化;使用目標編輯,以便 diff 保持可審查性。
- 編輯後進行驗證。
從現有應用程式重建規格
- 從可見的工作流程推斷畫面
- 從重複的區域和使用者任務推斷區塊
- 從領域名詞和狀態變更推斷實體
- 區分觀察到的和猜測的內容
- 當來源材料不完整時,明確指出不確定性
驗證
在可用時使用 scripts/validate-spec.mjs。
- 輸入:YAML 規格檔案的路徑
- 從
docType偵測文件類型 - 針對此技能捆綁的 JSON Schema 進行驗證
- 執行相關的自訂驗證規則
- 將警告視為建議
- 將錯誤視為最終輸出時的阻塞項(當您正在傳回修正後的規格時)
如果由於缺少本機 Spec Canvas 依賴項而無法執行腳本,請簡短說明,並回退到使用格式檔案和驗證規則參考進行手動審查。
輸出預期
當傳回規格時:
- 提供有效的 YAML
- 在格式預期的地方保持 ID 為 snake_case
- 保持欄位名稱完全符合格式檔案的定義
- 提及對結構有重大影響的假設
- 提及是否已執行驗證
當傳回審查結果而不是重寫的檔案時:
- 先列出結構性問題
- 然後提供具體修正
- 如果有的話,提供修正後的程式碼片段或完整規格