Communitygithub.com

chukaofili/agent-plugins

當變更影響到任何使用者可見的內容(如元件、頁面、視圖、畫面、樣式、模板、對話框、表單或文案),並在為此開立 PR 之前使用。涵蓋在真實瀏覽器中驅動變更、遍歷所有狀態、依據儲存庫的設計與框架準則進行審查掃描,以及為 PR 擷取螢幕截圖,包括在沒有瀏覽器可用時的處理方式。

agent-plugins 是什麼?

此「Verify UI」技能確保任何使用者介面(UI)變更在合併前,不僅在開發階段,也在真實瀏覽器中經過徹底驗證。它強制執行一個關鍵工作流程:在真實瀏覽器中驅動變更並使用真實種子資料,涵蓋所有狀態(主題、裝置、邊界情況與轉場),並在開發者工具中檢查錯誤。之後,它會針對儲存庫的設計系統、無障礙性與框架最佳實踐進行審查掃描,建議使用並行的子代理來進行此模式匹配工作。該技能的最終產出是一組在 PR 中直接引用的螢幕截圖(透過提交 SHA),捕捉每個狀態,為審查者提供不執行分支即可判斷工作所需的視覺證據。它明確處理無瀏覽器環境的情況,指示將該限制記錄在 PR 的「測試」區段。透過將修正放入獨立的堆疊 PR,此技能能防止 UI 回歸,並降低開發人員與審查者在最後一刻發現視覺錯誤的可能性。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/chukaofili/agent-plugins/tree/HEAD/plugins/coding-protocol/skills/verify-ui

在你喜歡的 AI 中提問

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

說明文件

驗證 UI

建構畫面只是第一步。UI 變更尚未完成,直到它已在真實瀏覽器中驅動,且其螢幕截圖已附在 PR 中。乾淨的型別檢查、靜態分析執行與單元測試套件表示程式碼能編譯且邏輯正確。但它們都無法說明面板是否渲染,或頁尾是否位於設計所指定的位置。從未執行該分支的審查者只能依據螢幕截圖來評斷工作,或者根本無法評斷。

1. 在真實瀏覽器中,使用真實資料驅動它

使用一個帶有真實(種子資料)資料庫的執行中應用程式,而不是模擬資料,也不只是快樂路徑的螢幕截圖。遍歷設計中每個命名的狀態,以及那些未命名的狀態:

  • 兩種主題。 手寫顏色是深色模式變體容易被忽略的地方。
  • 行動裝置與桌面裝置。 佈局會在斷點處重新排列,且頁尾和工具列可能導致一半內容孤立。
  • 空狀態、載入狀態、達到限制狀態與失敗狀態, 而不僅僅是有資料的狀態。
  • 每個交接點,其中一個對話框或視圖關閉,另一個開啟。
  • 開啟你新增的每個選單、彈出面板與下拉選單。 一個你從未開啟的選單,看起來與一個開啟時會導致頁面當機的選單完全一樣。
  • 在操作過程中檢查瀏覽器主控台與網路面板是否有錯誤。

2. 執行審查掃描

根據儲存庫所使用的設計與框架準則(設計系統、無障礙性、框架最佳實踐)來審查變更。如果你的代理可以產生子代理,請在較便宜的模型上並行為每個準則執行一個審查者。這是模式比對的工作,而非判斷工作。

  • 提供審查者儲存庫自身的規則。 一個未閱讀這些規則的審查者會將已記錄的決策回報為違規。
  • 要求他們僅回報。 然後根據真實世界的機率自行判斷每個發現。拒絕那些對於不同產品而言可能為真的發現,例如針對一個最多只有十幾行的清單所提出的虛擬化建議。

3. 為 PR 擷取螢幕截圖

不是螢幕的描述:而是螢幕本身。擷取它們也是捕捉你實際上尚未看過的狀態最便宜的方法。

  • 驅動真實的應用程式。 使用一個能到達每個狀態的一次性瀏覽器腳本是可行的。使用 E2E 測試工具組的種子輔助工具來到達 UI 流程無法產生的狀態,然後在圖片產生後刪除該腳本。它不進行任何斷言,也不是測試覆蓋率。
  • 在擷取前重新建置。 否則你可能會為你剛剛修復的錯誤拍攝螢幕截圖。
  • 在快門前等待動畫完成。 「可見」會在元素被佈局時解析,而不是在其進入轉場結束時,因此一個簡單的擷取會顯示帶有半透明背景的半透明對話框。等待有限動畫完成(過濾掉無限動畫,例如骨架屏的脈衝效果),並設定超時時間。
  • 盡可能以使用者會使用的方式到達每個狀態。 強制設定標誌會跳過可能暴露錯誤的競爭條件。
  • 將它們提交到 docs/screenshots/<topic>/ 目錄,如果有的話,放在它們所實作的設計旁邊。
  • 使用提交 SHA 而非分支來引用它們, 例如 https://github.com/<org>/<repo>/blob/<sha>/<path>?raw=true。分支 URL 會在分支被合併刪除時失效,並且會使 PR 中充滿損壞的圖片。

無可用的瀏覽器

如果環境確實無法執行 UI(沒有瀏覽器工具、缺少憑證、你無法控制的基礎設施),請在 PR 的「測試」區段中說明。指出是什麼阻止了它,以及你取而代之驗證了什麼。沉默會被理解為「已驗證」。

將審查修正以疊加層的方式出貨

此階段發現的修正應放在一個新的、堆疊在該功能之上的 PR 中,以便建置與審查階段可以分開審查(請參閱 stacked-prs)。

此階段能捕捉到的問題

這些問題都不是來自型別檢查器、靜態分析工具或單元測試套件:

  • 一個與其頁面不符的載入骨架屏。 它為該頁面沒有的工具列顯示了骨架屏,因此每次導航都會在兩個佈局之間跳動。逐行鏡像真實佈局,否則就不要出貨骨架屏。
  • 在交接時同時繪製了兩個對話框, 因為每個對話框都被掛載了,而只有其 open 標誌被切換。隱藏不等於解除掛載。
  • 身分錯誤的閃現: 使用者自己的行在一次繪製中提供了移除他們的選項,因為用戶端在首次渲染後才讀取工作階段。伺服器已知的身分應隨頁面一起傳遞。
  • 一個錯誤的空狀態: 在查詢解析之前,「未找到結果」被渲染了一幀,因為零行同時代表了「載入中」和「空白」。
  • 一個設計 Token 被替換為一個看起來相似但不同的 Token, 在其中一個主題中明顯不同。
  • 一個硬編碼的標籤, 而旁邊其他四個呼叫點都從共享目錄中讀取相同的標籤。
  • 一個開啟時導致頁面當機的選單, 因為某個子元件需要一個它沒有的父元件。手動點擊檢查錯過了它兩次,因為沒有人開啟該選單。
  • 一個規格項目被悄然跳過, 另一個則因正當理由被刪除但未留下記錄。任何偏離設計的地方都需要附帶說明原因。
  • 一個自相矛盾的對話框, 透過查看螢幕截圖發現:一則通知顯示「所有座位均已使用」,而旁邊的頁尾仍然顯示「剩餘 2 個座位」。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能