1

Google Antigravity IDE: como resolvi o bug do reset de tamanho da janela com Python puro

Olá pessoal!

Quem já está usando o Google Antigravity (a nova IDE agêntica da Google) provavelmente notou um incômodo diário no macOS, Windows e Linux:

Ao fechar e reabrir o programa, a janela sempre reseta para o tamanho padrão de 1400×900, esquecendo o redimensionamento feito pelo usuário.

Em telas grandes ou monitores ultrawide, ter que esticar a janela manualmente a cada inicialização quebra o fluxo de trabalho. Como o core da IDE é fechado e o repositório público não recebe PRs para a aplicação Desktop, desenvolvi uma solução em código aberto:

🔗 Repositório no GitHub: https://github.com/amiltonjr/Antigravity-IDE-WindowSize


Arquitetura da solução: Zero Dependências

O objetivo principal foi não exigir que o desenvolvedor precisasse ter node, npm, bibliotecas no pip ou pacotes globais instalados. O patch roda 100% autônomo usando apenas a biblioteca padrão do Python 3 (struct, json, hashlib, pathlib):

  1. Leitura e rebuild do .asar em memória: O script lê o cabeçalho binário do pacote Electron, extrai o arquivo dist/utils.js, injeta o ouvinte de geometria e reconstrói o arquivo .asar em memória, recalculando os hashes SHA-256 de integridade.

  2. Proteção multi-monitor: Valida as coordenadas salvas contra as telas ativas (screen.getAllDisplays()). Se um monitor externo for desconectado entre sessões, a janela não abre fora do campo visual; ela é reposicionada automaticamente na tela principal.

  3. Debounce de escrita: As alterações de tamanho e posição têm debounce de 250ms antes de gravar no app_storage.json, evitando engasgos de I/O enquanto você arrasta a janela.

  4. Assinatura ad-hoc no macOS: Re-assina o binário automaticamente com codesign --force --deep --sign - para satisfazer as checagens de integridade do Gatekeeper (ElectronAsarIntegrity).

  5. Reversão com 1 comando: Cria um backup de fábrica (app.asar.orig) antes de alterar qualquer byte. Para desfazer o patch a qualquer momento, basta executar:

    python3 patch_antigravity_window.py --restore
    

O repositório já conta com scripts utilitários prontos (run.sh, run.bat e run.ps1) para facilitar a execução em cada sistema operacional.

Feedbacks e melhorias são muito bem-vindos!

Carregando publicação patrocinada...
1

Um cuidado com o --restore: quando o Antigravity atualizar, o app.asar novo substitui o patcheado e, dependendo de como o update instala, o app.asar.orig pode ficar sobrando da versão antiga. Aí quem rodar o restore depois volta um asar velho em cima do app novo. Guardar o hash do asar que foi patcheado e só restaurar se o arquivo atual ainda for ele resolve.

No macOS tem também a assinatura ad-hoc, que tira a da Google. Isso pode atrapalhar o auto-update e o que depender do keychain, então eu deixaria um aviso no README.

1

Fala @plugandship, excelente observação! Ambos os pontos foram cirúrgicos e já corrigi no repositório:

Proteção de Downgrade no --restore: Implementei um rastreador de metadados (app.asar.patch_info.json) gravando versão e hashes SHA-256 antes e depois do patch. Agora, se o Antigravity atualizar e o usuário rodar --restore, o script detecta que o arquivo atual é um novo release oficial limpo e aborta a restauração para não rebaixar a versão do app por engano (com opção de --force caso a pessoa realmente deseje). Além disso, quando o patch é reaplicado em uma versão nova, ele rotaciona o backup mestre para a versão oficial mais recente.

Aviso de Assinatura Ad-hoc e Keychain: Adicionei uma seção dedicada no README.md e um aviso no próprio terminal após o codesign, explicando que a troca da assinatura da Google pela ad-hoc pode disparar o aviso do Keychain na primeira abertura ("Sempre Permitir") e que os updates de fundo do Squirrel podem requerer download manual ou simplesmente sobrescrever o binário com o da Google na versão seguinte.

Muito obrigado pelo feedback 🚀

1

ficou bem completo, curti o --force pra quem quer restaurar mesmo assim. e o aviso no terminal depois do codesign ajuda bastante, quase ninguém abre o README antes de dar problema.