Communitygithub.com

hadimoti/joy-media-windows-mcp

Steuern Sie die JOY Media (JOY Studio) Electron-Desktop-App unter Windows mit den Windows-MCP-Tools. Starten Sie eine isolierte Testkopie, erstellen Sie ein Projekt, importieren Sie Medien, klicken Sie auf „Export MP4“, bedienen Sie den Windows-Speicherdialog und prüfen Sie das Ergebnis (ffprobe, vollständige Dekodierung, Farbfelder, Zeitmessungen aus der app-eigenen Datenbank).

Was ist joy-media-windows-mcp?

Diese Fähigkeit beschreibt eine sichere und reproduzierbare Methode für KI-Agenten, die JOY Media Desktop-App (JOY Studio, Electron 44.3.0, Windows 11) zu testen. Sie ist zentral für das Vergleichen von Builds, das Laufzeitverhalten und die Exportqualität. Der Agent verwendet Windows-MCP-Tools (Snapshot, Klick, Screenshot) und PowerShell, um die App in einer vollständig isolierten Umgebung zu starten, ohne die echte Installation oder Daten des Benutzers zu beeinträchtigen. Der Workflow umfasst das Erstellen eines ausgepackten App-Klons, das Starten mit einem neuen `--user-data-dir`, das Importieren von Medien und das Exportieren als MP4. Die Auswertung des Exports erfolgt faktenbasiert: ffprobe prüft Codec und Farbkodierung, eine vollständige Dekodierung testet die Integrität, und die app-eigene Datenbank liefert präzise Phasen- und Arbeitszeiten. Ein besonderes Werkzeug ist die Farbgenauigkeitsanalyse mit generierten Testmustern und einem Skript (fxplace.py), das Abweichungen in Ebenen misst. Die Fähigkeit enthält strenge Sicherheitsregeln: Niemals die echte App oder Registry (joy://-Schlüssel) verändern, nach jedem Lauf die Registry auf Konsistenz prüfen und Abstürze sofort melden. Sie ist essenziell, um Exporte objektiv und wiederholbar zu bewerten – ideal für Entwickler, die Builds vergleichen oder Qualitätsregressionen erkennen möchten.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

JOY Media mit Windows-MCP steuern

Diese Fähigkeit ist eine Methode, erlernt an JOY Media 1.1.0 Builds (Electron 44.3.0, Windows 11). Sie beschreibt einem Agenten, wie die Desktop-App ohne Berührung der echten Installation oder Daten des Benutzers ausgeführt, mit den Windows-MCP-Tools durch den Editor navigiert und ein Export anhand von Fakten statt nach Augenmaß beurteilt wird.

Verwendete Werkzeuge: Snapshot, Screenshot, Click, Type, App, Wait (Windows-MCP) sowie PowerShell für das Starten, Dateiprüfungen und ffmpeg/ffprobe.

0. Grundregeln (nicht überspringen)

  • Fragen Sie den Eigentümer zuerst, bei jedem Durchlauf. Das Starten der App, Importieren und Exportieren erfordern, dass der Eigentümer am PC ist und ein klares „Go“ für diesen Durchlauf gibt. Jeweils ein Durchlauf. Niemals gegen das echte Profil des Benutzers starten.
  • Berühren Sie niemals die installierte App (deren Ordner, Installationsskripte oder Deinstallationsprogramm). Stattdessen eine separate, ausgepackte Kopie ausführen (Abschnitt 1).
  • Daten isolieren: Immer ein neues --user-data-dir übergeben. Um ein bestehendes Projekt wiederzuverwenden, die App schließen, dann das alte Profil mit robocopy /E in einen neuen Ordner kopieren (kein /MIR, keine Löschung) und auf die Kopie starten.
  • Der Registrierungsschlüssel joy:// (HKCU\Software\Classes\joy) darf sich nicht ändern. Vor dem Start, nach dem Start und nach dem Schließen mit reg export in eine neue Datei exportieren und per SHA-256 vergleichen. Bei Abweichung anhalten und den Eigentümer informieren; nur auf dessen Anweisung wiederherstellen.
  • Nichts löschen während des Testens (Kopien, Profile, Exporte sind Beweise). Chromium kann eigene temporäre Dateien innerhalb des neuen Testprofils bereinigen; das ist in Ordnung.
  • Bei Hinweisen auf einen Absturz anhalten (GPU-Prozess beendet, Application Error-Ereignisse, Treiber-Rücksetzungen): alles aufbewahren, nicht erneut ausführen, den Eigentümer informieren.
  • Niemals Geheimnisse in die App eingeben oder Token in Notizen ablegen.

1. Eine sichere App-Kopie erstellen

Den gewünschten Commit in einen kurzen Pfad (unter 260 Zeichen) bauen oder entpacken, z. B. C:\jg\app-<sha>:

  1. git archive <sha> in ein tar-Archiv, nach C:\jg\<name> entpacken.
  2. pnpm install --offline --frozen-lockfile (benötigt einen warmen pnpm Store).
  3. Den Electron dist-Ordner und path.txt aus einer vorhandenen Kopie kopieren (node_modules\.pnpm\electron@<ver>\node_modules\electron; Offline-Installationen laden Electron nicht herunter). SHA-256 der electron.exe prüfen.
  4. pnpm build, dann pnpm --filter @joy-media/desktop package:unpacked.
  5. robocopy apps\desktop\dist\joy-media-unpacked C:\jg\app-<sha> /E.

Eine ausgepackte Kopie läuft mit isPackaged = false und registriert daher nicht das joy://-Protokoll. Dennoch den Schlüssel prüfen.

2. App starten (PowerShell)

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

--enable-logging=stderr schreibt console.*-Ausgaben des Renderers in die Fehlerdatei (nützlich für temporäre Diagnosen). Prüfen, dass keine Prozesskommandozeile --joy-media-gpu-encode-fallback enthält (das wäre der Fallback-Neustart, kein Standardstart). Der Fenstertitel lautet JOY Studio. Bei einem neuen Profil öffnet die App die Projekte-Seite; bei einem kopierten Profil stellt sie das letzte Projekt wieder her.

3. Das Fenster mit Windows-MCP steuern

Skalierung: Screenshots sind etwa 2,56-mal kleiner als der reale Bildschirm. Zum Klicken immer die echten Koordinaten aus Snapshot verwenden, niemals Pixel eines Screenshots. Nach jedem Seitenwechsel einen kleinen Screenshot (scale 0.4) aufnehmen.

Reihenfolge: Fensteraktionen nur einzeln ausführen. Ein Batch, der direkt nach einem Export gesendet wurde, hat schon einmal dazu geführt, dass Klicks und Tippeingaben im falschen Projekt landeten. App switch "JOY Studio" schlägt gelegentlich mit „Ungültiges Fensterhandle“ fehl; wenn das Fenster bereits im Vordergrund ist, fortfahren.

Die Koordinaten unten stammen von einem 4920x2160 Bildschirm mit dem JOY-Fenster in Standardgröße und -position. Sie sind eine Ausgangskarte, kein Versprechen: immer einen Snapshot aufnehmen und die Elementliste verwenden, wenn etwas anders aussieht.

AktionPosition (echte Koordinaten)
Dateimenü(910, 288)
Datei > Projekte-Bibliothek(1077, 358)
Schaltfläche „Neues Projekt“(3023, 311), dann Namensfeld (1165, 727) anklicken, Namen mit press_enter eingeben
Erste Projektkarte(1680, 873)
Timeline „Medien importieren“ (leere Timeline)(2199, 1312)
Datei-öffnen-Dialog: Namensfeld / Öffnen(1587, 1208) / (2268, 1264)
„Export MP4“(2672, 288)
Clip auswählen, Skalierung prüfenClip-Leiste anklicken (1762, 1349); der Inspektor zeigt Skalierung X/Y
App-Fenster schließen(3143, 288)
Speichern-Dialog: Namensfeld / Speichernetwa (1717, 1058) / (2283, 1266)

Rezept für einen Fall: Projekte-Bibliothek > Neues Projekt > Name > Medien importieren > vollständigen Dateipfad eingeben > Öffnen (der Clip landet auf der Timeline) > Vorschau prüfen > „Export MP4“ > warten > Dialog speichern > überprüfen.

Der Speichern-Dialog. Der Export endet in einem normalen Windows-Speichern-Dialog (Standardordner Downloads, ein vorgeschlagener Name ohne Erweiterung). Die Datei erreicht den Desktop erst, wenn jemand sie speichert. Ein Verzug zwischen „Worker fertig“ und „Datei auf dem Desktop“ liegt also nur an diesem wartenden Dialog. Einen Screenshot aufnehmen, wenn der Worker fertig sein sollte; entweder speichert der Eigentümer, oder (mit dessen OK) den vollständigen Zielpfad ...\Desktop\<vorgeschlagener-Name>.mp4 in das Namensfeld eingeben und auf Speichern klicken. Job-Zeiten in der App-Datenbank werden durch die Wartezeit nicht beeinflusst.

4. Vor, während und nach einem Durchlauf

Vorher: reg export des joy://-Schlüssels und Hashbildung; das echte Profil des Benutzers und alle Beweisordner auflisten (scripts/list-tree.ps1), um nachweisen zu können, dass sich nichts geändert hat.

Währenddessen (lange Exporte): scripts/sampler.ps1 -Pattern '*<profil>*' -Out <csv> -Stop <stopdatei> im Hintergrund starten. Es zeichnet einmal pro Sekunde Arbeitsmenge, Private Bytes, CPU-Sekunden, NVENC-Sitzungen und GPU-Nutzung pro Electron-Prozess auf. Die Stop-Datei erstellen, um es zu beenden.

Nachher: App schließen (Fenster-Schließen-Button), bestätigen, dass kein electron-Prozess mehr läuft, den Schlüssel erneut exportieren, die Ordner erneut auflisten und via Diff vergleichen, prüfen, dass keine *.upload-Überreste im Profil sind, und nach Anwendungsfehler/WER- und Display/nvlddmkm-Ereignissen suchen (ignorieren von irrelevantem Rauschen wie Docker).

5. Export anhand von Fakten beurteilen

  • ffprobe -show_streams: Codec, Größe, Frames, Dauer, Farb-Tags (color_space, color_primaries, color_transfer, color_range).
  • Vollständige Dekodierung muss sauber sein: ffmpeg -v error -i out.mp4 -f null - und Exit-Code 0.
  • Datei hashen (Get-FileHash); identische Layouts von unterschiedlichen Builds sollten identische Hashes ergeben, wenn der Codepfad gleich ist.
  • Phasenzeiten aus der app-eigenen Datenbank (einer Kopie von joy-media.sqlite3 plus deren -wal/-shm, schreibgeschützt geöffnet): scripts/export-times.py <kopie> gibt pro Export die Browser-Phase (Klick-Zeitstempel bis gestaffeltes Original), gestaffelte Bytes und Worker-Zeit aus. Der Klick-Zeitstempel ist die 13-stellige Zahl im Dateinamen.
  • Farbgenauigkeit: Testdateien mit scripts/fxgen.py <ordner> erstellen (einfarbige Farbfelder mit bekannten sRGB-Werten plus einem binären Frame-Zähler; BT.709, BT.601, ungetaggtes SD, Full Range, gedreht, VFR, 10-Bit, HEVC, VP9, AV1, interlaced, ein Übergangspaar und ein Audio-Raten-Paar), mit scripts/fxcheck.py <ordner> prüfen, dann einen Export mit JOY_FX_DIR=<ordner> python -I scripts/fxplace.py <export.mp4> <testdatei-name> [frame] bewerten. Es findet, wo der Clip gelandet ist (Clips, die kleiner als die Leinwand sind, liegen 1:1 oben links, nicht skaliert) und gibt die schlechteste/mittlere Abweichung unter vier Matrix/Range-Messungen aus; die richtige Messung sollte innerhalb von etwa 3 Stufen liegen.
  • Audio: Tonhöhe über die Nulldurchgangsrate von astats, Pegel über RMS; Mono-Quellen werden stereo (etwa 3 dB leiser pro Kanal).

6. Bekanntes Verhalten, das man sich merken sollte (JOY Media 1.1.0 Builds)

  • Jeden Farbtest in einer neuen App-Sitzung ausführen. Auf dem getesteten Rechner (RTX 5070 Ti, Electron 44.3.0) wird der erste Export nach dem Start als BT.709 (Tag bt709) codiert; spätere Exporte in derselben Sitzung werden als BT.601 (Tag smpte170m) codiert, fallen größer und langsamer aus bei einem langen Layout und haben andere Bytes. Ein Diagnose-Build zeigte, dass der Capture-Canvas-Frame das erste Mal RGBA (GPU-gestützt) und danach BGRA (CPU-gestützt) ist; die App setzt selbst keinen Farbraum. Die Umwandlung zu NV12 BT.709 innerhalb der App machte jeden Export identisch.
  • Ungetaggtes SD-Video wird als BT.709 gelesen (Farbverschiebungen von bis zu etwa 20 Stufen).
  • Eine Quelle ohne Tonspur exportiert stille Stereospur (AAC).
  • Builds nur auf gleicher Grundlage vergleichen: gleiches Layout, gleiche Position in der Sitzung (erster Export vs. erster Export), Fenster im Vordergrund und fokussiert (ein nicht fokussiertes Fenster kann etwa 30 % langsamer sein), eine Kopie desselben Profils.
  • Andere Agenten oder Chat-Fenster auf demselben Desktop können den Fokus stehlen: vor dem Klicken einen Screenshot machen.
  • Der erste Klick auf ein Fenster fokussiert es möglicherweise nur.

7. So berichten

Angeben, was ausgeführt wurde (Build, Profil-Kopie, Layout), die Zahlen (Phasenzeiten, Spitzenspeicher, Größen, Tags), die bestandenen Prüfungen (joy://-Schlüssel unverändert, Ordner-Diffs leer, Dekodierung sauber), was nicht verifiziert wurde, und die eine Entscheidung, die vom Eigentümer benötigt wird. „Ein Durchlauf pro Build“ sagen, wenn das alles ist, was man hat.

Verwandte Skills