Communitygithub.com

hadimoti/joy-media-windows-mcp

Controla o aplicativo de desktop Electron JOY Media (JOY Studio) no Windows usando as ferramentas Windows-MCP. Inicie uma cópia de teste isolada, crie um projeto, importe mídia, clique em Exportar MP4, salve a caixa de diálogo Salvar do Windows e verifique o resultado (ffprobe, decodificação completa, patches de cor, tempos do próprio banco de dados do aplicativo). Use quando solicitado a testar, executar, cronometrar ou verificar uma exportação no aplicativo de desktop JOY Media, ou para comparar builds.

O que é joy-media-windows-mcp?

Este skill permite que um agente de IA (como Claude Code ou Cursor) controle o aplicativo de desktop JOY Media (JOY Studio) no Windows de forma segura e isolada. Ele utiliza as ferramentas do Windows-MCP (Snapshot, Screenshot, Click, Type, App, Wait) para navegar pela interface, criar projetos, importar mídia, exportar vídeos MP4 e interagir com caixas de diálogo do Windows. O isolamento é total: o agente nunca toca na instalação real do aplicativo ou nos dados do usuário, usando uma cópia descompactada e um perfil de dados separado. Além do controle da interface, o skill inclui scripts de verificação automatizada: ffprobe para análise de streams, decodificação completa com ffmpeg, verificação de precisão de cor com patches de cores conhecidos (usando scripts fxgen/fxcheck/fxplace) e extração de tempos do banco de dados SQLite do aplicativo. É útil para testes de regressão, comparação entre builds, verificação de qualidade de exportação (codec, cores, áudio) e validação de desempenho.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Conduzindo o JOY Media com Windows-MCP

Este skill é um método, aprendido em builds do JOY Media 1.1.0 (Electron 44.3.0, Windows 11). Ele instrui um agente sobre como executar o aplicativo de desktop sem tocar na instalação real ou nos dados do usuário, navegar pelo editor com as ferramentas Windows-MCP e julgar uma exportação com base em fatos, não em aparências.

Ferramentas usadas: Snapshot, Screenshot, Click, Type, App, Wait (Windows-MCP), além de PowerShell para iniciar, verificar arquivos e ffmpeg/ffprobe.

0. Regras básicas (não pule)

  • Pergunte ao proprietário primeiro, a cada execução. Iniciar o aplicativo, importar e exportar exigem que o proprietário esteja no PC e uma autorização clara para aquela execução. Uma execução por vez. Nunca inicie contra o perfil real do usuário.
  • Nunca toque no aplicativo instalado (sua pasta, seus scripts de instalação, seu desinstalador). Execute uma cópia descompactada separada (seção 1).
  • Isole os dados: sempre passe um novo --user-data-dir. Para reutilizar um projeto existente, feche o aplicativo e use robocopy /E para copiar o perfil antigo para uma nova pasta (sem /MIR, sem purgar) e inicie na cópia.
  • A chave de registro joy:// (HKCU\Software\Classes\joy) não deve ser alterada. Exporte-a para um novo arquivo com reg export antes de iniciar, após iniciar e após fechar, e compare o SHA-256. Se for diferente, pare e informe ao proprietário; restaure somente sob autorização dele.
  • Não exclua nada durante os testes (cópias, perfis, exportações são evidências). O Chromium pode limpar seus próprios arquivos temporários dentro do novo perfil de teste; isso é aceitável.
  • Pare se houver evidência de falha (processo GPU encerrado, eventos de Erro de Aplicativo, redefinições de driver): mantenha tudo, não execute novamente, informe ao proprietário.
  • Nunca digite segredos no aplicativo nem coloque tokens em notas.

1. Obtenha uma cópia do aplicativo segura para executar

Compile ou descompacte o commit desejado em um caminho curto (menos de 260 caracteres), por exemplo, C:\jg\app-<sha>:

  1. git archive <sha> para um tar, extraia para C:\jg\<nome>.
  2. pnpm install --offline --frozen-lockfile (precisa de um cache pnpm aquecido).
  3. Copie a pasta dist do Electron e path.txt de uma cópia existente em node_modules\.pnpm\electron@<ver>\node_modules\electron (instalações offline não baixam o Electron). Verifique o SHA-256 do electron.exe.
  4. pnpm build, depois pnpm --filter @joy-media/desktop package:unpacked.
  5. robocopy apps\desktop\dist\joy-media-unpacked C:\jg\app-<sha> /E.

Uma cópia descompactada executa com isPackaged = false, portanto não registra o protocolo joy://. Verifique a chave mesmo assim.

2. Inicie-o (PowerShell)

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

--enable-logging=stderr coloca as linhas console.* do renderizador no arquivo stderr (útil para diagnósticos temporários). Verifique se nenhuma linha de comando de processo contém --joy-media-gpu-encode-fallback (isso seria a reinicialização de fallback, não uma inicialização padrão). O título da janela é JOY Studio. Em um novo perfil, o aplicativo abre a página de Projetos; em um perfil copiado, ele restaura o último projeto.

3. Conduza a janela com Windows-MCP

Escala: as capturas de tela são cerca de 2,56 vezes menores que a tela real. Sempre clique em coordenadas reais do Snapshot, nunca em pixels da captura. Tire uma pequena Screenshot (scale 0.4) após cada mudança de página.

Ordem: execute as ações da janela uma de cada vez. Um lote enviado logo após uma exportação já fez com que cliques e digitação caíssem no projeto errado. App switch "JOY Studio" às vezes falha com "Identificador de janela inválido"; se a janela já estiver na frente, continue.

As coordenadas abaixo são de uma tela 4920x2160 com a janela do JOY em seu tamanho e posição padrão. Elas são um mapa inicial, não uma garantia: tire um Snapshot e use a lista de elementos quando algo parecer diferente.

AçãoOnde (coordenadas reais)
Menu Arquivo(910, 288)
Arquivo > Biblioteca de Projetos(1077, 358)
Botão Novo projeto(3023, 311), depois clique no campo de nome (1165, 727), Type o nome com press_enter
Primeiro cartão de projeto(1680, 873)
Linha do tempo "Importar mídia" (linha do tempo vazia)(2199, 1312)
Caixa de diálogo Abrir arquivo: caixa de nome / Abrir(1587, 1208) / (2268, 1264)
Exportar MP4(2672, 288)
Selecionar o clipe, verificar Escalaclique na barra do clipe (1762, 1349); o inspetor mostra Escala X/Y
Fechar a janela do aplicativo(3143, 288)
Caixa de diálogo Salvar: caixa de nome / Salvaraproximadamente (1717, 1058) / (2283, 1266)

Receita para um caso: Biblioteca de Projetos > Novo projeto > nome > Importar mídia > digite o caminho completo do arquivo > Abrir (o clipe cai na linha do tempo) > verifique a pré-visualização > Exportar MP4 > aguarde > salve a caixa de diálogo > verifique.

A caixa de diálogo Salvar. A exportação termina em uma caixa de diálogo Salvar normal do Windows (pasta padrão Downloads, um nome sugerido sem extensão). O arquivo chega à Área de Trabalho somente depois que alguém salva, portanto, um atraso entre "trabalhador concluído" e "arquivo na Área de Trabalho" é apenas essa caixa de diálogo esperando. Tire uma captura de tela quando o trabalhador deveria estar concluído; ou o proprietário salva, ou (com a permissão dele) digite o caminho completo do destino ...\Desktop\<nome-sugerido>.mp4 na caixa de nome e clique em Salvar. Os tempos do trabalho no banco de dados do aplicativo não são afetados pela espera.

4. Antes, durante e após uma execução

Antes: reg export a chave joy:// e calcule o hash; liste a pasta de perfil real do usuário e quaisquer pastas de evidência (scripts/list-tree.ps1) para que você possa provar que nada mudou.

Durante (exportações longas): inicie scripts/sampler.ps1 -Pattern '*<profile>*' -Out <csv> -Stop <stopfile> em segundo plano. Ele registra, uma vez por segundo, conjunto de trabalho, bytes privados, segundos de CPU, sessões NVENC e uso de GPU por processo Electron. Crie o arquivo de parada para encerrá-lo.

Após: feche o aplicativo (botão Fechar janela), confirme que nenhum processo electron permanece, exporte a chave novamente, liste as pastas novamente e diferencie, verifique se não há sobras *.upload no perfil e procure por eventos de Erro de Aplicativo/WER e Display/nvlddmkm (ignore ruído não relacionado, como Docker).

5. Julgue a exportação por fatos

  • ffprobe -show_streams: codec, tamanho, quadros, duração, tags de cor (color_space, color_primaries, color_transfer, color_range).
  • A decodificação completa deve estar limpa: ffmpeg -v error -i out.mp4 -f null - e código de saída 0.
  • Calcule o hash do arquivo (Get-FileHash); layouts idênticos de builds diferentes devem dar hashes idênticos quando o caminho do código é o mesmo.
  • Tempos das fases do próprio banco de dados do aplicativo (uma cópia de joy-media.sqlite3 mais seus -wal/-shm, aberta somente leitura): scripts/export-times.py <cópia> imprime, por exportação, a fase do navegador (carimbo de clique até original preparado), bytes preparados e tempo do trabalhador. O carimbo de clique é o número de 13 dígitos no nome do arquivo.
  • Precisão de cor: crie fixtures com scripts/fxgen.py <pasta> (manchas de cor plana com valores sRGB conhecidos mais um contador de quadros binário; BT.709, BT.601, SD não marcado, full range, rotacionado, VFR, 10 bits, HEVC, VP9, AV1, entrelaçado, um par de transição e par de taxa de áudio), verifique-os com scripts/fxcheck.py <pasta>, depois pontue uma exportação com JOY_FX_DIR=<pasta> python -I scripts/fxplace.py <export.mp4> <nome-do-arquivo-fixture> [quadro]. Ele encontra onde o clipe caiu (clipes menores que a tela ficam 1:1 no canto superior esquerdo, não redimensionados) e imprime o desvio pior/médio sob quatro leituras de matriz/faixa; a leitura correta deve estar dentro de aproximadamente 3 níveis.
  • Áudio: pitch via taxa de cruzamento zero astats, nível via RMS; fontes mono se tornam estéreo (cerca de 3 dB mais baixas por canal).

6. Comportamento conhecido que vale lembrar (builds JOY Media 1.1.0)

  • Execute cada teste de cor em uma nova sessão do aplicativo. Na máquina testada (RTX 5070 Ti, Electron 44.3.0) a primeira exportação após a inicialização é codificada como BT.709 (tag bt709); exportações posteriores na mesma sessão são codificadas como BT.601 (tag smpte170m), saem maiores e mais lentas em um layout longo e têm bytes diferentes. Uma build de diagnóstico mostrou que o quadro da tela de captura é RGBA (suportado por GPU) na primeira vez e BGRA (suportado por CPU) depois; o aplicativo não define nenhum espaço de cor por si mesmo. A conversão para NV12 BT.709 dentro do aplicativo tornou cada exportação idêntica.
  • Vídeo SD não marcado é lido como BT.709 (as cores mudam em até cerca de 20 níveis).
  • Uma fonte sem faixa de áudio exporta uma faixa AAC estéreo silenciosa.
  • Compare builds apenas em condições iguais: mesmo layout, mesma posição na sessão (primeira exportação vs primeira exportação), janela na frente e focada (uma janela não focada pode ser cerca de 30 por cento mais lenta), uma cópia do mesmo perfil.
  • Outros agentes ou janelas de chat no mesmo desktop podem roubar o foco: tire uma captura de tela antes de clicar.
  • O primeiro clique em uma janela pode apenas focá-la.

7. Relate assim

Informe o que foi executado (build, cópia do perfil, layout), os números (tempos das fases, pico de memória, tamanhos, tags), as verificações que passaram (chave joy:// inalterada, diferenças de pasta vazias, decodificação limpa), o que não foi verificado e a única decisão de que você precisa do proprietário. Diga "uma execução por build" quando isso é tudo o que você tem.

Habilidades Relacionadas