Publicação da extensão na Chrome Web Store¶
Instalação em modo desenvolvedor¶
- Abra
chrome://extensions. - Ative Modo do desenvolvedor.
- Clique em Carregar sem compactação.
- Selecione
browser-extension/. - Confirme no popup a versão do manifesto e execute o diagnóstico de compatibilidade.
- Abra um repositório público do GitHub e confirme o botão SotuHire Insight.
Gerar o ZIP¶
python scripts/package_extension.py
O script valida:
- Manifest V3 e versão;
- permissões e host permissions conhecidos;
- ícones 16, 48 e 128;
- arquivos executáveis, incluindo
queue_runtime.js; - ausência de
.env, chave privada e padrões Gemini/OpenAI/GitHub; - exclusão de testes, documentação e materiais da listagem.
O nome segue dist/sotuhire-extension-v{manifest_version}.zip. A versão atual do manifesto gera
dist/sotuhire-extension-v0.9.3.zip.
Arquivos da listagem¶
browser-extension/store/
├── listing.md
├── privacy-policy.md
├── test-instructions.md
├── description-short.txt
├── description-full.md
├── screenshots/
└── promo-assets/
Esses arquivos não entram no ZIP executável. Revise textos, política, screenshots e instruções de teste a cada mudança de permissão, provider, storage ou coleta.
Permissões¶
| Permissão/host | Justificativa |
|---|---|
activeTab |
captura somente a aba atual após clique explícito |
scripting |
executa o extrator assistivo na aba selecionada |
storage |
preferências, lote e fila offline; nunca chrome.storage.sync para segredo |
127.0.0.1:8765 |
Local Companion |
127.0.0.1:8787 |
API local do SotuHire |
github.com e api.github.com |
botão contextual e sinais públicos |
| Gemini/OpenAI | catálogo e análise quando a pessoa escolhe provider próprio |
Não há <all_urls>, cookies, histórico, downloads, webRequest ou acesso a headers autenticados.
Chaves e privacidade¶
A chave configurada no app nunca chega à extensão. Uma chave própria Gemini/OpenAI:
- usa
chrome.storage.sessionpor padrão; - pode usar IndexedDB do service worker após consentimento explícito;
- não possui alegação de criptografia adicional;
- nunca entra em content script, página, Companion, fila, export ou screenshot;
- nunca usa
chrome.storage.sync; - pode ser removida no popup.
O conteúdo público só é enviado ao provider quando a pessoa inicia a análise. A extensão não captura cookies, tokens, senhas, sessão, storage de terceiros ou dados privados ocultos. Não automatiza login, CAPTCHA, candidatura ou inscrição.
Estados visuais para a listagem¶
Gere as imagens determinísticas, sem rede nem chave:
python scripts/capture_extension_screenshots.py
Revise no mínimo:
- popup principal;
- Companion conectada e offline;
- captura de vaga, edital e GitHub;
- fila offline;
- configuração Gemini/OpenAI sem chave;
- contexto seguro e diagnóstico de compatibilidade;
- modal GitHub.
Não publique imagem com dado pessoal, segredo, erro inesperado ou texto cortado.
Verificação antes de publicar¶
node --check browser-extension/queue_runtime.js
node --check browser-extension/github_injected.js
node --check browser-extension/project_analysis.js
node --check browser-extension/popup.js
node --check browser-extension/background.js
node --check browser-extension/content.js
pytest -q -k "extension or browser"
python scripts/package_extension.py
Depois, abra o ZIP e confirme que contém apenas os arquivos listados por RUNTIME_FILES em
scripts/package_extension.py.