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 userobocopy /Epara 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 comreg exportantes 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>:
git archive <sha>para um tar, extraia paraC:\jg\<nome>.pnpm install --offline --frozen-lockfile(precisa de um cache pnpm aquecido).- Copie a pasta
distdo Electron epath.txtde uma cópia existente emnode_modules\.pnpm\electron@<ver>\node_modules\electron(instalações offline não baixam o Electron). Verifique o SHA-256 doelectron.exe. pnpm build, depoispnpm --filter @joy-media/desktop package:unpacked.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ção | Onde (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 Escala | clique 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 / Salvar | aproximadamente (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.sqlite3mais 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 comscripts/fxcheck.py <pasta>, depois pontue uma exportação comJOY_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.