Communitygithub.com

dtthaison/uix-skill

設計並構建獨特且可存取的 UI,並對其進行審計、打磨或添加動畫。適用於建置、重新設計、審計、主題化或動畫化登陸頁面、行銷網站、儀表板、應用程式畫面、表單或元件時;撰寫或閱讀 DESIGN.md 時;或當使用者輸入「/uix」、「讓它看起來更好」、「審計此畫面」或「加入動畫」時。會挑選藝術方向,將設計記號鎖定在 DESIGN.md 中,然後透過靜態與瀏覽器檢查來建構。涵蓋 22 種技術棧。Web - React、Next.js、Vue、Nuxt、Nuxt UI、Svelte、Angular、Astro、Laravel、shadcn/ui、Three.js、HTML + Tailwind。原生 - SwiftUI、Jetpack Compose、Flutter、React Native、WPF、WinUI、UWP、Uno、Avalonia、JavaFX。僅使用免費工具。

uix-skill 是什麼?

uix-skill 是一個 AI 代理技能,旨在幫助開發人員建立具有設計感、一致且可存取的 UI,避免出現「看起來像是 AI 生成的」結果。它透過建立或使用現有的 `DESIGN.md` 檔案來決策設計記號(如顏色、字型、間距),然後根據這些記號進行建構。此技能會自動檢測專案的技術棧(支援 22 種 Web 和原生技術棧,包括 React、Next.js、SwiftUI、Flutter 等),並載入特定的指南。其工作流程包括專案初始化(透過三個問題/方向進行設計規劃)、建構(從 `DESIGN.md` 建立元件)、審計(執行規則/瀏覽器檢查)、打磨(修復問題)和動畫(新增或檢視動畫)。它強制使用免費工具,並對每個 UI 建構執行嚴格的檢查(如規則檢查和視覺回歸測試)。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/dtthaison/uix-skill/tree/main/skills/uix-skill

在你喜歡的 AI 中提問

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

說明文件

uix-skill 是做什麼的?

建立看起來經過設計、而非生成的 UI。一次決定外觀(DESIGN.md),從中建構,並透過腳本檢查結果。

路徑:以下所有 references/、data/ 和 scripts/ 路徑都是相對於包含此 SKILL.md 的資料夾。請從使用者的專案根目錄以 node <該資料夾>/scripts/<名稱>.mjs 執行腳本。腳本需要 Node 22。

指令

指令工作
/uix init讀取專案,詢問 3 個問題,提供 3 個方向,撰寫並 lint DESIGN.md。
/uix build從 DESIGN.md 建構頁面、畫面或元件,檢查並修正。預設指令。
/uix audit執行檢查並報告。不編輯任何內容。
/uix polish修正主要的審計問題。保留邏輯、路由和文案含義。
/uix motion在回答 4 個問題後,審閱或加入動畫。

動詞可以以 /uix-skill <動詞>、uix <動詞> 或純文字請求(「製作設定頁面」、「審計這個畫面」)的形式出現。將純文字請求對應到最接近的動詞。若無明確匹配:則為 build。

嚴格規則

  1. 如果 DESIGN.md 存在:優先讀取它並據此建構。跳過初始導入和方向選取。絕不發明它未定義的顏色、字型或圓角。
  2. 在 scripts/rules.mjs 執行完畢前,且對於 Web 技術棧,在 scripts/check.mjs 也執行完畢前,絕不報告完成。如果無法執行檢查(參閱檢查章節),則報告 unverified: <原因>。
  3. 檢查後最多進行 2 輪修復。然後報告剩餘問題。
  4. 圖片:優先使用專案資源,然後是 Openverse/Wikimedia(需標註來源),最後是 CSS/SVG 藝術。絕不使用空白佔位符。
  5. 僅使用免費工具。不使用付費 API,不需要金鑰。
  6. 不編輯請求 UI 範圍之外的檔案。/uix audit 不編輯任何內容。
  7. 只載入下方表格中命名的檔案。載入一個技術棧檔案,但 shadcn 和 nuxt-ui 除外:載入該指南以及主機框架的指南。

執行順序

  1. 讀取專案:package.json、設定檔、現有樣式、DESIGN.md、public/ 或 assets/。
  2. 偵測技術棧(下方表格)。載入其指南。
  3. 初始導入。在同一個訊息中一併詢問 3 個問題:目標受眾、畫面的功能、調性。行動端技術棧:調性也會詢問「平靜或有活力的動畫?」;將答案記錄為 DESIGN.md 中的動畫層級(references/design-md.md)。跳過使用者或專案已回答的任何問題。
  4. 從 references/directions.md 提供 3 個在調性、密度和色溫上明顯不同的方向。等待選擇。如果擁有者已提前選定方向,則跳過提供步驟。
  5. 撰寫 DESIGN.md(references/design-md.md)並對其進行 lint。修正每個 lint 錯誤。
  6. 從 references/layouts-web.md(行銷、內容)或 references/layouts-app.md(已登入畫面)中選擇一個結構。
  7. 建構第一個區塊。使用真實文案、真實圖片、所有元件狀態。
  8. 檢查(如下)。先修正錯誤,再修正警告。最多 2 輪。
  9. 報告。

步驟 3 到 5 屬於 init 指令。build 使用現有的 DESIGN.md;若無,則先執行 init。

現有設計系統優先

  • DESIGN.md 存在:讀取它、對其 lint、從中建構。
  • 沒有 DESIGN.md,但專案有自己的設計記號或主題(Tailwind 設定檔、CSS 變數、主題檔案):/uix init 會從這些記號撰寫一個 DESIGN.md(在專案根目錄)。除非使用者要求新的外觀,否則不要提供新的方向。
  • 兩者皆無:執行完整的 init。
  • 「自己的設計記號」意指超出框架預設起始值的顏色、字型或間距,這些記號存在於 Tailwind v4 的 @theme 區塊、Tailwind 設定檔、CSS 自訂屬性或平台主題檔案中。create-next-app 的預設 --background/--foreground 不計入。

應載入的內容

除非必要,否則不載入其他內容。

時機載入
任何建構、打磨或審計references/anti-slop.md、references/components-a11y.md
init,或任何 DESIGN.md 的撰寫references/design-md.md
init(提供方向時)references/directions.md,然後是 data/fonts.csv、data/palettes.csv、data/styles.csv 中選定的行
行銷、內容、目錄頁面references/layouts-web.md
儀表板、表格、表單、設定、認證references/layouts-app.md
任何動畫,或 /uix motionreferences/motion.md
行動端建構、打磨或審計references/mobile-foundations.md、references/mobile-patterns.md
行動端動畫載入 references/mobile-motion.md 而非 references/motion.md
行動端:安全檢視應用程式、Expo Go 與開發建置版本的差異、點擊與滑動檢查references/mobile-testing.md
針對行動端應用程式的 init載入 data/mobile-styles.csv 而非 data/styles.csv(選定的行)
任何圖片位置references/images.md
範例 DESIGN.md 格式data/examples/ledger.md、field-notes.md 或 harbor.md。僅一個。
每次任務一個 references/stacks/<id>.md。對於 shadcn 或 nuxt-ui,還需要主機指南(參閱技術棧偵測)。

技術棧偵測

從上到下,第一個匹配即為結果。若無匹配:則為 html-tailwind。匹配精確的依賴名稱(next,而不是 next-themes)。

訊號技術棧 ID
package.json 中存在 @nuxt/uinuxt-ui
存在帶有 shadcn 的 components.json,或 @/components/uishadcn
存在 artisan 檔案或 composer.json 中存在 laravel/frameworklaravel
package.json 中存在 nuxtnuxtjs
package.json 中存在 nextnextjs
@angular/core 或 angular.jsonangular
package.json 中存在 astro 或 astro.config.*astro
svelte 或 @sveltejs/kitsvelte
package.json 中存在 vuevue
package.json 中存在 threethreejs
package.json 中存在 react-native 或 exporeact-native
package.json 中存在 reactreact
pubspec.yamlflutter
帶有 Compose (androidx.compose) 的 build.gradle(.kts)jetpack-compose
*.xcodeproj 或帶有 SwiftUI 的 Package.swiftswiftui
帶有 Avalonia 的 *.csprojavalonia
帶有 Uno. 或 Uno.WinUI 的 *.csprojuno
帶有 Microsoft.WindowsAppSDK 的 *.csprojwinui
帶有 <UseWPF>true</UseWPF> 的 *.csprojwpf
帶有 TargetPlatformIdentifier 為 UAP 或 Microsoft.NETCore.UniversalWindowsPlatform 的 *.csprojuwp
帶有 javafx 的 pom.xml 或 build.gradlejavafx
以上皆非html-tailwind

Web 端 ID:angular, astro, html-tailwind, laravel, nextjs, nuxt-ui, nuxtjs, react, shadcn, svelte, threejs, vue。其餘為原生端。 「行動端技術棧」指的是 react-native、flutter、swiftui 或 jetpack-compose。這些請求也會載入「應載入的內容」中的行動端相關行。 更具體的技術棧優先:nextjs 優先於 react,react-native 優先於 react,laravel 優先於其 JS 前端。 元件層技術棧會載入兩個指南:shadcn 加上主機指南(nextjs、react、astro、laravel …,由本表格偵測,但跳過 shadcn 行),以及 nuxt-ui 加上 nuxtjs。其他所有專案載入一個。

檢查

從使用者的專案根目錄執行。將 <skill> 替換為包含此 SKILL.md 的資料夾。

node <skill>/scripts/rules.mjs [--design DESIGN.md] <路徑...>
node <skill>/scripts/check.mjs <url|檔案> [--widths 375,768,1280] [--out .uix/shots] [--themes attr=v1,v2]
node <skill>/scripts/images.mjs "<查詢>" [--count 6]
  • 三個腳本都會輸出 JSON。rules.mjs 輸出 {findings, skipped}:最小化、超過 1 MB 或無法讀取的檔案會被歸入 skipped 並附帶原因,這不算錯誤。check.mjs 輸出 {shots, findings, notes};請閱讀 notes(例如,載入超時提早探測到,或某個截圖失敗)。退出碼 0:乾淨。退出碼 1:存在錯誤發現(rules.mjs、check.mjs)。退出碼 2:使用方式或環境問題(全部三個腳本)。images.mjs 僅會退出 0 或 2。
  • 退出碼 2 絕不代表乾淨結果,也不計入修復輪次。如果 check.mjs 無法訪問頁面,但專案有顯而易見的開發腳本(npm run dev 等),則在背景啟動一次並重試。否則詢問使用者。指出缺少什麼(Chrome、Node 22、未執行的伺服器)。
  • 如果檢查仍無法執行,報告應顯示 unverified: <原因>。
  • Web 技術棧:對原始碼執行 rules.mjs,然後對開發伺服器 URL 或建置後的檔案執行 check.mjs。寬度為 375、768 和 1280。截圖存放於 .uix/shots:<w>.png 為完整頁面,<w>-<n>.png 為高度最多 1600 像素的區塊。請查看區塊截圖,而非完整頁面截圖;它會被縮小到難以閱讀。check.mjs 會先滾動頁面,以便滾動才顯示的內容能被捕捉到。
  • 當專案定義了多個主題([data-theme]、[data-skin]、.dark),請使用 --themes 傳遞,例如 --themes data-skin=oatmeal,rose 或 --themes class=dark。每個主題會以最後一個寬度進行測試;其發現結果會帶有 theme 欄位。
  • 對比度發現結果會按顏色配對分組(count、sample、selectors)。請修正設計記號,而非每個元素。
  • React Native (Expo):執行 rules.mjs,然後對正在執行的 Metro 伺服器執行 node <skill>/scripts/check-mobile.mjs --app exp://127.0.0.1:<埠號>;針對 Android 模擬器則添加 --platform android(旗標和路由檔案在技術棧指南中)。它會輸出 {shots, findings, notes} 並像 check.mjs 一樣以退出碼 0、1 或 2 結束。如果 notes 以 maestro missing: 開頭,表示階層和流程未執行;請將其報告為 unverified: <原因>,而不是一次成功的執行。截圖存放於 .uix/mobile-shots。發現結果 route-not-navigated 是一個錯誤,絕不代表乾淨結果:該截圖顯示了另一個畫面。修復循環:使用 --only <路由> 和一個 --devices 條目重新檢查,而不是完整的測試矩陣。
  • 其他行動端技術棧:執行 rules.mjs。原生 iOS 應用程式 (SwiftUI) 隨後使用 check-mobile.mjs --native(旗標在技術棧指南中);在審計過程中,使用 --out "$(mktemp -d)"。其他則使用技術棧檔案「如何檢查」部分的手動截圖配方(淺色、深色、xxxl 文字)。如果沒有模擬器可用:報告 unverified: <原因>。2 輪限制仍然適用。
  • 其他原生技術棧:執行 rules.mjs,然後執行技術棧檔案「如何檢查」部分的手動檢查清單。沒有瀏覽器檢查。
  • 先修正 error 級別的發現結果,再修正 warn 級別。保留的 warn 需要一行理由。
  • 修復循環:檢查、修正、重新檢查。最多 2 輪。然後停止並報告。
  • 規則 ID 及其修正方法在 references/anti-slop.md 中。它也列出腳本無法捕捉的判斷規則;請自行審閱這些規則。

指令合約

init

  1. 讀取專案,偵測技術棧,載入其指南。
  2. 如果存在現有設計記號或 DESIGN.md:請參閱「現有設計系統優先」。
  3. 否則,詢問 3 個問題,提供 3 個明顯不同的方向,然後等待。 任何技術棧:偵測內容語言(lang、i18n 檔案、文案),並僅選取 data/fonts.csv 中 scripts 欄位涵蓋該語言的資料行。
  4. 撰寫 DESIGN.md。Lint:執行 npx --yes @google/[email protected] lint DESIGN.md。修正錯誤。
  5. 報告所選方向、已撰寫的檔案以及 lint 結果。

build

  1. 讀取 DESIGN.md、技術棧指南和佈局檔案。
  2. 選擇一個結構。用一行說明選擇了哪個結構及其原因。
  3. 先完整建構第一個區塊。然後建構其餘部分。
  4. 執行檢查。在最多 2 輪內修正。
  5. 報告。

audit

  1. 偵測技術棧並載入其指南。
  2. 執行檢查。審閱判斷規則。將 --out "$(mktemp -d)" 傳遞給 check.mjs 和 check-mobile.mjs,以便審計不在專案中寫入任何內容。
  3. 輸出一個表格。不編輯任何內容。
之前之後原因
目前的內容應有的內容規則 ID 或原因

polish

  1. 偵測技術棧並載入其指南。
  2. 先執行審計。
  3. 修正主要問題,從錯誤開始。不要更改邏輯、路由或文案含義。
  4. 重新執行檢查。最多 2 輪。報告。

motion

  1. 載入 references/motion.md(行動端技術棧:references/mobile-motion.md)。對每個動畫,以書面形式回答其中的 4 個問題:是否必要、它傳達了什麼、使用何種緩動函數、持續時間多長。
  2. 刪除任何沒有明確答案的動畫。加入 prefers-reduced-motion 處理(技術棧指南會指出原生的對應處理方式)。
  3. 輸出一個「之前 / 之後 / 原因」表格。僅在使用者要求新增或修正動畫(而非僅審閱)時才套用變更。

報告

每次執行結束時報告:

  • 哪些內容已更改(檔案)。
  • 仍然存在的發現結果,每個都附帶規則 ID 和原因。
  • 在 .uix/shots 中的截圖和區塊路徑(Web 端)、在 .uix/mobile-shots 中的截圖路徑(行動端)或已執行的手動檢查(其他原生端)。
  • 已加入的圖片來源資訊。

相關技能