Communitygithub.com

hadimoti/joy-media-windows-mcp

在 Windows 上使用 Windows-MCP 工具驅動 JOY Media (JOY Studio) Electron 桌面應用程式。啟動隔離的測試副本、建立專案、匯入媒體、點擊匯出 MP4、儲存 Windows 儲存對話方塊,然後檢查結果(ffprobe、完整解碼、色彩樣本、應用程式資料庫中的時間)。當被要求測試、執行、計時或驗證 JOY Media 桌面應用程式中的匯出,或比較建置時使用。

joy-media-windows-mcp 是什麼?

這個技能定義了一個嚴謹的方法,讓 AI 代理程式使用 Windows-MCP 工具安全且隔離地驅動 JOY Media 桌面應用程式(基於 Electron)。它確保每次測試都在一個全新的複製資料目錄(--user-data-dir)中進行,完全避免接觸使用者的真實安裝或個人資料。工作流程涵蓋了從解包應用程式副本、透過 PowerShell 啟動、使用快照和精確座標進行視窗導航,到完整匯出工作流程(匯入媒體、匯出 MP4、處理 Windows 儲存對話方塊)的完整過程。對於驗證,該技能超越單純的視覺檢查,採用基於事實的分析:使用 ffprobe 檢查色彩標籤、使用 ffmpeg 進行完整解碼驗證、透過匯出的 SQLite 資料庫測量階段時間,以及使用專門腳本(如 fxgen.py 和 fxplace.py)進行全面的色彩準確性測試。包含特定的已知行為,例如首次匯出與後續匯出之間編碼差異,強調了跨會話標準化測試條件的重要性,以便在比較不同建置時獲得可重複的結果。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/hadimoti/joy-media-skill/tree/HEAD/skills/joy-media-windows-mcp

在你喜歡的 AI 中提問

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

說明文件

使用 Windows-MCP 驅動 JOY Media

此技能是一種方法,已針對 JOY Media 1.1.0 建置(Electron 44.3.0,Windows 11)進行測試。它告訴代理程式如何不碰觸使用者的真實安裝或資料來執行桌面應用程式、使用 Windows-MCP 工具點擊編輯器,並根據事實而非外觀來判斷匯出結果。

使用的工具:Snapshot、Screenshot、Click、Type、App、Wait(Windows-MCP),以及用於啟動、檔案檢查和 ffmpeg/ffprobe 的 PowerShell。

0. 基本規則(不可跳過)

  • 每次執行前先詢問擁有者。 啟動應用程式、匯入和匯出需要擁有者在電腦前並對該次執行給予明確的「開始」指令。一次只執行一個。絕不能針對使用者的真實設定檔啟動。
  • 絕不碰觸已安裝的應用程式(其資料夾、安裝程式腳本、解除安裝程式)。應改為執行一個單獨的解包副本(第 1 節)。
  • 隔離資料:始終傳遞一個新的 --user-data-dir。若要重用現有專案,請先關閉應用程式,然後使用 robocopy /E 將舊設定檔複製到新資料夾(不使用 /MIR,不清除),並在副本上啟動。
  • joy:// 註冊機碼(HKCU\Software\Classes\joy)不得變更。在啟動前、啟動後和關閉後,使用 reg export 將其匯出到一個新檔案,並比較 SHA-256。如果不同,請停止並告知擁有者;僅在擁有者的指示下恢復。
  • 測試期間不刪除任何內容(副本、設定檔、匯出內容均為證據)。Chromium 可能會清理新測試設定檔內部的暫存檔案;這沒關係。
  • 遇到崩潰證據時停止(GPU 程序退出、應用程式錯誤事件、驅動程式重置):保留所有內容,不要在其上重新執行,告知擁有者。
  • 切勿在應用程式中輸入機密或將令牌放入註解中。

1. 取得可安全執行的應用程式副本

將您要測試的提交建置或解包到一個短路徑(少於 260 個字元),例如 C:\jg\app-<sha>:

  1. 將 git archive <sha> 打包成 tar 檔,解壓縮到 C:\jg\<name>。
  2. pnpm install --offline --frozen-lockfile(需要一個熱的 pnpm 儲存庫)。
  3. 從現有副本的 node_modules\.pnpm\electron@<ver>\node_modules\electron 複製 Electron dist 資料夾和 path.txt(離線安裝不會下載 Electron)。檢查 electron.exe 的 SHA-256。
  4. pnpm build,然後執行 pnpm --filter @joy-media/desktop package:unpacked。
  5. robocopy apps\desktop\dist\joy-media-unpacked C:\jg\app-<sha> /E。

一個解包的副本以 isPackaged = false 執行,因此它不會註冊 joy:// 通訊協定。無論如何都請檢查該機碼。

2. 啟動它(PowerShell)

$env:NODE_ENV = 'production'
$app = 'C:\jg\app-<sha>'
Start-Process -FilePath '<path to>\electron.exe' `
  -ArgumentList @($app, '--user-data-dir=C:\jgp\<new-profile>', '--enable-logging=stderr') `
  -WorkingDirectory $app `
  -RedirectStandardOutput 'C:\jgp\run\stdout.log' -RedirectStandardError 'C:\jgp\run\stderr.log' -PassThru

--enable-logging=stderr 會將渲染程式的 console.* 行放入 stderr 檔案中(對於臨時診斷很有用)。檢查沒有任何程序命令列包含 --joy-media-gpu-encode-fallback(這將是備用重新啟動,而非預設啟動)。視窗標題是 JOY Studio。在新的設定檔上,應用程式會開啟「專案」頁面;在複製的設定檔上,它會恢復最後一個專案。

3. 使用 Windows-MCP 驅動視窗

比例:螢幕截圖大約是真實螢幕的 2.56 倍小。務必使用 Snapshot 中的真實座標進行點擊,絕不使用螢幕截圖的像素。在每次頁面變更後拍攝一個小的 Screenshot(scale 0.4)。

順序:一次只執行一個視窗動作。一次在匯出後立即發送的批次曾導致點擊和輸入落在錯誤的專案中。App switch "JOY Studio" 有時會失敗並顯示「無效的視窗控制代碼」;如果視窗已經在最前面,請繼續。

以下座標來自一個 4920x2160 的螢幕,JOY 視窗處於預設大小和位置。它們是一個起點地圖,而非承諾:當任何看起來不同時,請拍攝 Snapshot 並使用元素列表。

動作位置(真實座標)
檔案選單(910, 288)
檔案 > 專案庫(1077, 358)
新增專案按鈕(3023, 311),然後點擊名稱欄位 (1165, 727),Type 輸入名稱並加上 press_enter
第一個專案卡(1680, 873)
時間軸「匯入媒體」(空的時間軸)(2199, 1312)
開啟檔案對話方塊:名稱方塊 / 開啟(1587, 1208) / (2268, 1264)
匯出 MP4(2672, 288)
選擇片段,檢查縮放點擊片段條 (1762, 1349);檢查器會顯示縮放 X/Y
關閉應用程式視窗(3143, 288)
儲存對話方塊:名稱方塊 / 儲存大約 (1717, 1058) / (2283, 1266)

一個案例的步驟:專案庫 > 新增專案 > 命名 > 匯入媒體 > 輸入完整的檔案路徑 > 開啟(片段會落在時間軸上)> 檢查預覽 > 匯出 MP4 > 等待 > 儲存對話方塊 > 驗證。

儲存對話方塊。 匯出結束於一個標準的 Windows 儲存對話方塊(預設資料夾為「下載」,提供一個不含副檔名的建議名稱)。檔案只有在有人儲存之後才會到達桌面,因此「工作人員完成」和「檔案出現在桌面」之間的延遲僅僅是那個對話方塊在等待。在工作人員應該完成時拍攝螢幕截圖;要嘛擁有者儲存,要嘛(在他們同意下)將完整的目標路徑 ...\Desktop\<建議名稱>.mp4 輸入到名稱方塊中並按一下儲存。應用程式資料庫中的工作計時不受等待影響。

4. 執行前、執行中和執行後

執行前:使用 reg export 匯出 joy:// 機碼並計算其雜湊值;列出使用者的真實設定檔資料夾和任何證據資料夾(scripts/list-tree.ps1),以便您可以證明沒有東西被更改。

執行中(長時間匯出):在背景啟動 scripts/sampler.ps1 -Pattern '*<profile>*' -Out <csv> -Stop <stopfile>。它每秒記錄一次每個 Electron 程序的工作集、私用位元組、CPU 秒數、NVENC 工作階段和 GPU 使用率。建立停止檔案來結束它。

執行後:關閉應用程式(按關閉視窗按鈕),確認沒有 electron 程序殘留,再次匯出機碼,再次列出資料夾並比對差異,檢查設定檔中沒有殘留的 *.upload 檔案,並尋找應用程式錯誤/WER 和 Display/nvlddmkm 事件(忽略不相關的雜訊,例如 Docker)。

5. 根據事實判斷匯出結果

  • ffprobe -show_streams:編解碼器、大小、幀數、持續時間、色彩標籤(color_space、color_primaries、color_transfer、color_range)。
  • 完整解碼必須乾淨:ffmpeg -v error -i out.mp4 -f null - 且退出碼為 0。
  • 對檔案計算雜湊值(Get-FileHash);當程式碼路徑相同時,來自不同建置的相同佈局應產生相同的雜湊值。
  • 來自應用程式自身資料庫的階段時間(一個 joy-media.sqlite3 的副本及其 -wal/-shm,以唯讀方式開啟):scripts/export-times.py <copy> 會為每次匯出輸出瀏覽器階段(從點擊時間戳記到暫存原始檔)、暫存位元組和工作人員時間。點擊時間戳記是檔案名稱中的 13 位數字。
  • 色彩準確性:使用 scripts/fxgen.py <folder> 建立測試素材(具有已知 sRGB 值的純色塊加上一個二進制幀計數器;BT.709、BT.601、未標記的 SD、全範圍、旋轉、VFR、10-bit、HEVC、VP9、AV1、交錯、一個轉場對和音訊速率對),使用 scripts/fxcheck.py <folder> 檢查它們,然後使用命令 JOY_FX_DIR=<folder> python -I scripts/fxplace.py <export.mp4> <fixture-file-name> [frame] 對匯出進行評分。它會找出片段落點(小於畫布的片段會以 1:1 比例放置在左上角,不縮放),並在四種矩陣/範圍讀數下列印最差/平均偏差;正確的讀數應在約 3 個色階內。
  • 音訊:透過 astats 的過零率判斷音高,透過 RMS 判斷音量;單聲道來源會變成立體聲(每個聲道約低 3 dB)。

6. 值得記住的已知行為(JOY Media 1.1.0 建置)

  • 在一個全新的應用程式工作階段中執行每個色彩測試。 在測試機器(RTX 5070 Ti,Electron 44.3.0)上,啟動後的首次匯出編碼為 BT.709(標籤 bt709);同一工作階段中後續的匯出編碼為 BT.601(標籤 smpte170m),在長佈局上尺寸更大、速度更慢,並且具有不同的位元組。一個診斷建置顯示,首次捕獲的畫布幀是 RGBA(GPU 支援),之後的是 BGRA(CPU 支援);應用程式本身沒有設定色彩空間。在應用程式內轉換為 NV12 BT.709 使每次匯出都相同。
  • 未標記的 SD 影片被讀取為 BT.709(顏色偏移最多約 20 個色階)。
  • 沒有音軌的來源會匯出一個靜音的立體聲 AAC 音軌。
  • 僅在同等條件下比較建置:相同的佈局、在工作階段中的相同位置(首次匯出 vs 首次匯出)、視窗在最前面並處於焦點(非聚焦視窗可能慢約 30%)、相同設定檔的副本。
  • 同一桌面上的其他代理程式或聊天視窗可能會竊取焦點:在點擊之前進行螢幕截圖。
  • 對視窗的第一次點擊可能只會使其獲得焦點。

7. 像這樣報告

說明執行的內容(建置、設定檔副本、佈局)、數值(階段時間、尖峰記憶體、大小、標籤)、通過的檢查(joy:// 機碼未變更、資料夾差異為空、解碼乾淨)、未驗證的內容,以及您需要從擁有者那裡獲得的一個決定。當您只有一次執行時,請說「每個建置執行一次」。

相關技能