Releases: ph7ti/Screen-Diff-Watcher
Releases · ph7ti/Screen-Diff-Watcher
Release list
v0.7.1
[0.7.1] — 2026-10-01
Detalhes e exemplos: doc/releases/v0.7.1.md
(PT).
Adicionado
- Som default empacotado (
alert.mp3): ofilepadrão dos alertassoundpassa a ser
"alert.mp3", e o resolver procura também emscreen_watch/assets/sounds/(empacotado), entre
app_home()/soundse o CWD. Novas configs já apontam para o som que vem no instalador; configs
existentes comalert.wav/outro caminho não mudam (arquivo ausente continua caindo nobeep). - Popup ao escolher o som: depois de cada Escolher…, a GUI mostra um aviso orientando a colar
o caminho noconfig.yamldo perfil desejado, com Copiar caminho e abrir YAML (padrão),
Só abrir o YAML e Fechar. - Repaginação da janela principal: painel superior em grid 2×2 (Seleções à esquerda,
Monitoramento à direita; Ações da sessão à esquerda, Detecção e alertas à direita), Status + Log
no rodapé com os botões Prints / Testar alerta… / Abrir YAML na coluna direita.
Mudado
- Ver local passou do grupo Monitoramento para a fileira de botões do grupo Seleções;
Gravar prints (evidências) passou para o Monitoramento. - Textos da GUI: Ver local da seleção, Armar Ações e Desarmar Ações.
- O campo do som exibe o trecho
file: "..."(o rótulo de snippet separado foi removido);
Copiar caminho e Reproduzir ficam desabilitados sem valor.
Notas
- Novas chaves i18n
dialog.sound_*nos dois catálogos; o default empacotado vive em
src/screen_watch/assets/sounds/alert.mp3(declarado empackage-datae nodatasdo PyInstaller). - A 0.7.1 é uma escolha consciente de PATCH (a regra documentada seria MINOR — só layout/UX e
o default do som, sem quebra de API nem de dados).
v0.7.0
[0.7.0] — 2026-10-01
Detalhes e exemplos: doc/releases/v0.7.0.md
(PT).
Adicionado
- Nome da seleção com renomeação do arquivo: campo Nome da seleção abaixo da lista (confirma
pelo botão Renomear ou Enter). O nome vira prefixo do rótulo
(verificando download - Seleção App — Região …) e o arquivo passa a ser o slug do nome
(selections/verificando-download.json; acentos normalizados, máx. 60). Nunca sobrescreve outra
seleção (colisão avisa e nada muda), faz rollback em falha e atualiza o
state.json:last_selection. Renomear é bloqueado com sessão rodando. O nome também aparece no
rune nolist-selections. - Ver local: botão no grupo Monitoramento (que passou a ter duas colunas) que destaca a ROI
na tela por ~2 s. O realce nunca pinta dentro da ROI (camada escura só fora + borda logo por
fora), não captura cliques/foco e fecha sozinho — por isso funciona com a sessão rodando. - Reeditar a região por duplo clique: reabre o overlay para a janela da seleção e regrava
roi_relative/origin_at_selectionpreservando nome, modo e overrides; as máscaras são limpas
(eram relativas à ROI antiga), com log explícito.
Mudado
- Duplo clique na lista não inicia mais o monitoramento — agora reedita a região. Para
iniciar/parar, use Enter na lista, o botão Iniciar/Parar, o tray ou as hotkeys. --selection <nome>dos scripts passa a exigir o novo nome de arquivo após renomear uma
seleção (olast_selectione olist-selectionsacompanham).- O slug de novas seleções
select/select-manualagora remove acentos e tem limite de 60
caracteres (naming.slugify, compartilhado com a GUI).
Notas
- 4 códigos de erro novos (
selection.name_invalid,selection.name_too_long,
selection.name_conflict,selection.rename_failed), chavesmain.*/dialog.*/highlight.*/
help.*nos dois catálogos i18n. Selectionv2 ganhounameopcional (seleções antigas continuam carregando);TargetConfig
ganhoulabel(exibição; onamecontinua sendo o arquivo).
v0.6.0
[0.6.0] — 2026-09-30
Detalhes e exemplos: doc/releases/v0.6.0.md
(PT).
Adicionado
- Som selecionável e em mais formatos (
.wav,.mp3,.m4a,.aac,.ogg,.oga,.flac,
.wmaconforme a camada): a GUI toca peloQMediaPlayer(QtMultimedia, já empacotado), o
CLI/runusaminiaudio(agora dependência core; thread daemon, sem bloquear o loop) e o
backend legado (winsound/paplay/aplay/ffplay/afplay) segue como fallback.filerelativo
procura emapp-data/sounds/antes do CWD; arquivo ausente ou formato sem decoder cai no
beep()+ aviso (nunca silêncio nem exceção). Ofeaturesmostra camadas, formatos e a pasta. - Grupo “Detecção e alertas” na GUI: linha Som do alerta com o caminho efetivo,
Escolher… (só pré-visualiza; nada é gravado), Reproduzir e Copiar caminho (trecho
file: "<caminho>"para colar no alertasounddo YAML); text_watch— alertar quando um texto aparece/desaparece na ROI (somente no modoadvanced):
com o filtro configurado (compare_options.advanced.text_watchno perfil ou
overrides.text_watchna seleção, que tem precedência), o alerta dispara somente na transição
escolhida (expect: appears|disappears) e as demais mudanças de texto não disparam. Casamento por
substring comcase_sensitive: falseeignore_accents: true(NFKD + remoção de diacríticos nos
dois lados) por padrão; a transição valeseverity: 3. Na GUI, a linha Verificar texto edita o
override da seleção atual (habilitada só noadvanced) e é limpa ao trocar o modo.
Corrigido
- Telegram não enviava quando o
chat_iddo perfil estava com o placeholder doinit-config
(123456789): o erro do Telegram ("chat not found") era apenas logado. Agora otest-alert
reportaalert <id> failed: ...e retorna código != 0 mesmo que outro canal (som/popup) tenha
funcionado. test-alert --only <id>e o botão Testar alerta… sinalizam token/URL ausentes como falha
(TELEGRAM_BOT_TOKEN not set/no url resolved) em vez de reportar "sent".httpx/httpcorenão logam mais a URL completa em INFO — ela carregava o token do Telegram e
segredos de webhook (vazamento em logs).
Mudado
- Modo
advanced: agora ophash(default) roda como gate de pixel antes do OCR
(MODE_STAGES["advanced"] = ("default", "advanced")). O OCR só roda/pontua quando os pixels
mudaram, reduzindo falsos positivos ("mudanças" repetidas sem alteração real). O threshold do gate
écompare_options.default.threshold. - Com
text_watchconfigurado o gate é bypassado (("advanced",)): o OCR roda a cada tick e o
veredito do filtro é autoritativo — ochangeddo OCR não é propagado escore/thresholddele
ficam apenas nodetail(calibração pelocompare-modes). Sem o bypass o gate esconderia a
transição. - Seleção de ROI: uma ROI que não cabe inteiramente na janela é rejeitada
(runtime.roi_outside_window) em vez de salva com um aviso. Uma ROI fora da janela fazia o tick
capturar uma região alheia ao alvo, gerando prints e alertas que não correspondiam à janela.
Notas
text_watchfora doadvancedé erro de config (config.text_watch_needs_advanced); a GUI limpa
o override ao trocar o modo. Como o filtro decide ochanged, as ações também só rodam na
transição configurada.- Custo do bypass: OCR a cada tick (100–500 ms; o intervalo default é 2 s); o veredito por presença
não sofre o ruído de OCR que motivou o gate. - Matriz de formatos: a GUI no Windows (Media Foundation) toca M4A/AAC; no CLI isso depende de um
player externo (ffplay) — senãobeep. No Linux (GUI), depende dos plugins do GStreamer. - 5 códigos de erro novos (
config.text_watch_*), chavesmain.*/help.*nos dois catálogos.
v0.5.0
[0.5.0] — 2026-09-30
Detalhes e exemplos: doc/releases/v0.5.0.md
(PT).
Adicionado
- Canais de alerta
webhook,http_postesyslog(bloco aninhadooptions:; os quatro canais
atuais mantêm os campos planos, sem migração): POST JSON para webhook (Teams Workflows,
Slack, Discord, Mattermost), POST JSON para host/IP + porta e envio syslog informacional
(udp/tcp,facility,severity_map), todos com modelo de payload (payload:mapping ou
payload_raw:) e placeholders${campo}/${env:VAR}. idestável por alerta (defaulttype;type#nquando repetido), usado como chave de cooldown
— corrige dois webhooks compartilhando o mesmo cooldown — e para selecionar o destino no teste.- Teste de envio:
test-alert --listetest-alert --only <id>no CLI e botão Testar alerta… na
GUI (envio em thread de trabalho, com modo texto quando não há ROI). verify_tls(defaulttrue) nos canais HTTP, com aviso em log a cada envio quandofalse.doc/releases/(EN/PT): notas detalhadas de release, linkadas noCHANGELOG.
Mudado
- Tipo de alerta desconhecido passa a ser erro de config (
config.alert_unknown_type) em vez de
aviso silencioso — um canal "mudo" deixa de passar batido (o CLI avisa quando o config existente é
inválido e cai para os alertas padrão). - Cooldown por
id: a chave deixou de ser o nome da classe. Um perfil com dois alertas do mesmo
tipo passa a disparar os dois por janela de cooldown (antes compartilhavam a chave).
Notas
- Segredos:
urlliteral ouurl_env: VAR;${env:VAR}também emheaders/payload. Erros e logs
nunca expõem a URL resolvida nem os valores das variáveis. - Limitações: sem imagem/ROI nos canais novos (Telegram continua o único com
attach_roi); syslog
por UDP não confirma entrega (usetcpquando precisar); Incoming Webhooks do Teams sendo
descontinuados (prazo 31/03/2026; desligamento maio/2026 — use Workflows). - 12 códigos de erro novos (
config.alert_*+alert.http_*/alert.syslog_unavailable) nos dois
catálogos i18n.
v0.4.1
[0.4.1] — 2026-09-30
Removido
- Flag
--dry-rundotest-action(redundante: o ensaio já é o comportamento padrão sem--armed).
Mudado
- Refatoração interna sem mudança de comportamento: particionamento do CLI em
cli/(commands+
parser, deixando__main__.pysó commain()), centralização dos caminhos de log/auditoria
emplatform.paths, remoção da herança deValueErroremConfigError/ActionErrore limpeza
dos testes.
v0.4.0
[0.4.0] — 2026-09-30
Removido
- Flag de CLI
--target(deprecada) — use--selection. - Campo de configuração
schedule.timezone(aceitava apenaslocale não era lido em runtime). seed: nulldeixou de ser gravado noconfig.yamlgerado porinit-config(o campo
seedcontinua aceito no YAML).
Mudado
- Refatoração interna sem mudança de comportamento: remoção de código morto, deduplicação dos
helpers de coerção de tipos (config/coerce.py), centralização da construção deFramenos
comandos de teste e da execução de ações armadas (actions/execute.py).
v0.3.0
[0.3.0] — 2026-09-30
Adicionado
- Multi-idioma (i18n) da GUI: catálogos JSON no pacote (
screen_watch/i18n/*.json,
pt-BReen-US), descoberta dinâmica, seletor de Idioma na janela,--languagee
ui.languageno YAML; precedência--language>state.json>ui.language>auto
(locale do SO). A troca vale no próximo start. CLI eloggingpermanecem em inglês fixo. validate-i18n: valida chaves faltando/sobrando,error.*/help.*e_meta; roda no CI.- Erros com código estável (
errors.py::AppError/ERROR_CODES): a GUI mostra a mensagem
traduzida por código;str(exc)continua imprimível em inglês no CLI/log. - Novo layout da janela seguindo o
UI.txt(Monitoramento/Seleções/Ações da sessão/Log num
QSplitter), com seletor de idioma e indicador de arming. - Armar/desarmar pela janela:
Armar ações,Desarmar,Armar por…e rótulo de estado,
ligados ao mesmo caminho do tray/hotkey (arming por sessão). - Editar e reordenar passos no editor:
Subir/Descer, drag&drop,Editar passo(modo
edição comSalvar alteração/Cancelar) eDuplicar passo; reordenação em função pura
(actions/steps.py). - Ajuda no hover (2 s): tooltip HTML com propósito + exemplo em cada controle
(gui/help.py+gui/hover_help.py; texto emhelp.*no catálogo).
Mudado
- Textos de CLI e
loggingreescritos em inglês; painel de log da GUI também é inglês. ArmingController.label()passa a devolver inglês; a GUI traduz porstate/remaining_s.
v0.2.1
[0.2.1] — 2026-09-30
Adicionado
- Editor de ações na GUI: criar, editar e remover ações por seleção (gravadas em
overrides.actionsdo JSON de seleção) — funciona também com config v1, sem migração. - Localizador de posição do mouse nos passos
click/move(a caixa segue o cursor;Enter/clique esquerdo confirma,Esc/clique direito cancela), convertendo para orefescolhido (roi/window/screen). - Contagem regressiva de 3s antes de executar/gravar ações (overlay Qt sem roubar foco);
--no-countdownpara pular. - Checklist "Ações da sessão" com seleção por nome, persistida em
state.jsone aplicada no próximo start; no CLI,--actions a,b|all|none(one-shot) elist-actions. - Log ao vivo das ações na GUI/CLI (
kind: action_event), distinto dos comandos de tray/hotkey; gatilho barrado por cooldown reportado comoskipped -> cooldown. - Botão "Abrir pasta de prints" e linha
capturas:noshow-paths. - Checkbox "Gravar prints (evidências)" na GUI, persistido em
state.json, com precedência sobre oevidencedo YAML. - Comando
features(diagnóstico do ambiente) e empacotamento (PyInstaller; Inno Setup no Windows,.debno Linux) com workflows de CI/Release.
Corrigido
- Evidências de execuções manuais (
test-action --armede botão "Executar ação (3s)") não gravavam print: agora gravam (respeitandoper_step) e registram os caminhos na auditoria. - Hotkey
toggledefault era inválida nopynput(<ctrl>+<alt>+space); corrigida para<ctrl>+<alt>+<space>. start_hotkeys: um combo inválido não derruba mais todas as hotkeys (valida combo a combo e ignora só os inválidos).activatedas ações: confirmação de foco com retry (~0,5 s) e motivo claro (activate recusado×foco não confirmou), reduzindofocus_changedespúrio.- Localizador não recebia teclado/mouse sob o diálogo modal (agora é filho do diálogo e captura teclado/mouse).
profileinválido reportado com mensagem clara; overrides de ações validados.
Instaladores
- Windows:
screen-diff-watcher_0.2.1_windows_x64_setup.exe - Linux:
screen-watch_0.2.1_amd64.deb - Checksums:
SHA256SUMS.txt
Notas
- Requer Python 3.11+; extras:
input(pynput),sound,ocr-preproc,build. - Monitores a 100% são recomendados para a ROI; escala ≠ 100% pode deslocar a captura (doc §5.1).