Corrigido
Cinco bugs que já estavam em produção, todos encontrados ao introduzir o
ESLint (#50) — nenhum deles quebrava o build, todos quebravam na tela ou na
requisição:
deliverWithRetryusavarequest.tenantId, mas roda fora do ciclo da
requisição (entrega assíncrona, com retry agendado porsetTimeout). Toda
atualização de estatística de webhook estouravaReferenceError. O tenant
agora sai do próprio webhook.GETePATCH /databases/:idreferenciavam umobjectIdque nunca foi
declarado — quebravam em toda chamada.- A tela de Revisões estava inteiramente quebrada: importava
useTranslation
e nunca chamava o hook, com 57 usos det()sem escopo. - A tela de Atividade dos Usuários chamava
useTranslationsem importar. - Em KBView,
getErrorMessagevivia no escopo de módulo e chamavat()— a
função criada para consertar o "Erro desconhecido" quebrava justamente
quando havia erro. Agora recebetpor parâmetro. - O editor de texto tinha violação de
rules-of-hooks: um retorno antecipado
antes de umuseCallbackmudava a ordem dos hooks entre renders. - A URL do WebSocket era montada com a porta 3000 fixa, o que quebra atrás de
qualquer proxy reverso. Passa a derivar da origem atual (#54).
Adicionado
docker compose up -dsobe a plataforma inteira — banco, API e interface —
respondendo emhttp://localhost:8080. A interface é servida por nginx, que
faz o proxy de/apie do WebSocket, então só uma porta precisa existir no
host. Os dados de demonstração ficam sob demanda
(docker compose --profile demo run --rm seed), porque o seed não é
idempotente (#54).- ESLint no backend e no frontend, rodando no CI antes dos testes. As regras
apontam bug, não estilo: variável fora de escopo, hook condicional,catch
vazio, declaração vazando entrecase(#50). SECURITY.mdcom canais privados de reporte, prazos e escopo, e
CODE_OF_CONDUCT.md(Contributor Covenant 2.1). O projeto já havia publicado
três correções de segurança sem ter canal privado (#52).- Guarda contra release esquecida: o CI avisa quando um PR muda código de
produto sem bumpar a versão, e um workflow mantém uma issue aberta enquanto a
mainestiver à frente da última tag, fechando-a sozinho quando a release
sair (#49).