- Corrige sincronização do avatar no perfil após upload - Reduz tamanho dos ícones de câmera/lixeira no avatar - Remove atributos title (tooltips nativos) de toda aplicação - Adiciona regra no AGENTS.md sobre uso de tooltips - Permite desmarcar resposta no checklist (toggle) - Torna campo answer opcional na mutation setChecklistItemAnswer - Adiciona edição inline dos campos de resumo no painel de detalhes - Redesenha comentários com layout mais limpo e consistente - Cria tratamento especial para comentários automáticos de sistema - Aplica fundo ciano semi-transparente em comentários públicos - Corrige import do Loader2 no notification-preferences-form 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
11 KiB
Plano de Desenvolvimento — Sistema de Chamados
Diretriz máxima: documentação, comunicação e respostas sempre em português brasileiro.
Contatos
- Esdras Renan — monkeyesdras@gmail.com
Credenciais padrão (Better Auth)
| Papel | Usuário | Senha |
|---|---|---|
| Administrador | admin@sistema.dev |
admin123 |
| Painel telão | suporte@rever.com.br |
agent123 |
Os demais colaboradores reais são provisionados via Convites & acessos. Caso existam vestígios de dados demo, execute node scripts/remove-legacy-demo-users.mjs para limpá-los.
Execute
bun run auth:seedapós configurar.envpara (re)criar os usuários acima (camposSEED_USER_*podem sobrescrever credenciais).
Backend Convex
- Seeds de usuários/tickets demo:
convex/seed.ts. - Para DEV: rode
bun run convex:dev:bune acesse/dev/seeduma vez para popular dados realistas.
Stack atual (06/11/2025)
- Next.js:
16.0.8(Turbopack por padrão; webpack fica como fallback).- Whitelist de domínios em
src/config/allowed-hosts.tsé aplicada pelomiddleware.ts.
- Whitelist de domínios em
- React / React DOM:
19.2.0. - Trilha de testes: Vitest (
bun test) sem modo watch por padrão (--run --passWithNoTests). - CI: workflow
Quality Checks(.github/workflows/quality-checks.yml) rodabun install,bun run prisma:generate,bun run lint,bun test,bun run build:bun. Variáveis críticas (BETTER_AUTH_SECRET,NEXT_PUBLIC_APP_URL, etc.) são definidas apenas no runner — não afetam a VPS. - Disciplina pós-mudanças: sempre que fizer alterações locais, rode obrigatoriamente
bun run lint,bun run build:bunebun testantes de entregar ou abrir PR. Esses comandos são mandatórios também para os agentes/automations, garantindo que o projeto continua íntegro. - Deploy: pipeline
ci-cd-web-desktop.yml(runner self-hosted). Build roda com Bun 1.3 + Node 20. Web é publicado em/home/renan/apps/sistemae o Swarm apontasistema_webpara essa pasta.
Setup local (atualizado)
bun install- Copie
.env.example→.env.local.- Principais variáveis para DEV:
NODE_ENV=development NEXT_PUBLIC_APP_URL=http://localhost:3000 BETTER_AUTH_URL=http://localhost:3000 BETTER_AUTH_SECRET=dev-only-long-random-string NEXT_PUBLIC_CONVEX_URL=http://127.0.0.1:3210 DATABASE_URL=file:./prisma/db.dev.sqlite
- Principais variáveis para DEV:
bun run auth:seed- (Opcional)
bun run queues:ensure bun run convex:dev:bun- Em outro terminal:
bun run dev:bun - Acesse
http://localhost:3000e valide login com os usuários padrão.
Banco de dados
- Local (DEV):
DATABASE_URL=file:./prisma/db.dev.sqlite(guardado emprisma/prisma/). - Produção: SQLite persistido no volume Swarm
sistema_sistema_db. Migrations em PROD devem apontar para esse volume (verdocs/DEPLOY-RUNBOOK.md). - Limpeza de legados:
node scripts/remove-legacy-demo-users.mjsremove contas demo antigas (Cliente Demo, gestores fictícios etc.).
Verificações antes de PR/deploy
bun run lint
bun test
bun run build:bun
Aplicativo Desktop (Tauri)
- Código-fonte:
apps/desktop(Tauri v2 + Vite + React 19). - URLs:
- Produção:
https://tickets.esdrasrenan.com.br - DEV: configure
apps/desktop/.env(exemplo fornecido).
- Produção:
- Comandos:
bun run --cwd apps/desktop tauri dev— desenvolvimento (porta 1420).bun run --cwd apps/desktop tauri build— gera instaladores.
- Fluxo do agente:
- Coleta perfil da dispositivo (hostname, OS, MAC, seriais, métricas).
- Provisiona via
POST /api/machines/registerusandoMACHINE_PROVISIONING_SECRET, informando perfil de acesso (Colaborador/Gestor) + dados do colaborador. - Envia heartbeats periódicos (
/api/machines/heartbeat) com inventário básico + estendido (discos SMART, GPUs, serviços, softwares, CPU window). - Realiza handshake em
APP_URL/machines/handshake?token=...&redirect=...para receber cookies Better Auth + sessão (colaborador →/portal, gestor →/dashboard). - Token persistido no cofre do SO (Keyring); store guarda apenas metadados.
- Envio manual de inventário via botão (POST
/api/machines/inventory). - Updates automáticos: plugin
@tauri-apps/plugin-updaterconsultalatest.jsonpublicado nos releases do GitHub.
- Admin ▸ Dispositivos: permite ajustar perfil/email associado, visualizar inventário completo e remover dispositivo.
Sessão "machine" no frontend
- Ao autenticar como dispositivo, o front chama
/api/machines/session, populamachineContext(assignedUser*, persona) e deriva role/viewerId. - Mesmo quando
get-sessionénullna WebView, o portal utilizamachineContextpara saber o colaborador/gestor logado. - UI remove opção "Sair" no menu do usuário quando detecta sessão de dispositivo.
/portal/debugexibe JSON deget-sessionemachines/session(útil para diagnosticar cookies/bearer).
Observações adicionais
- Planejamos usar um cookie
desktop_shellno futuro para diferenciar acessos do desktop vs navegador (não implementado).
Qualidade e testes
- Lint:
bun run lint(ESLint flat config). - Testes unitários/integrados (Vitest):
- Cobertura atual inclui utilitários (
tests/*.test.ts), rotas/api/machines/*esendSmtpMail. - Executar
bun test -- --watchapenas quando precisar de modo interativo.
- Cobertura atual inclui utilitários (
- Build:
bun run build:bun(next build --turbopack). Quando precisar do fallback oficial, rodebun run build:webpack. - CI: falhas mais comuns
ERR_BUN_LOCKFILE_OUTDATED: confirme que obun.lockfoi regenerado (bun install) após alterar dependências, especialmente do app desktop.- Variáveis Better Auth ausentes (
BETTER_AUTH_SECRET): definidas no workflow (Quality Checks). - Falha de host: confira
src/config/allowed-hosts.ts; o middleware retorna 403 quando o domínio do Traefik não está listado.
Produção / Deploy
- Runner self-hosted (VPS). Build roda fora de
/srv/apps/sistemae rsync publica em/home/renan/apps/sistema. - Swarm:
stack.ymlmonta/home/renan/apps/sistema.current→/app(via symlink). - Para liberar novo release manualmente:
ln -sfn /home/renan/apps/sistema.build.<novo> /home/renan/apps/sistema.current docker service update --force sistema_web - Resolver
P3009(migration falhou) sempre no volumesistema_sistema_db:docker service scale sistema_web=0 docker run --rm -it -e DATABASE_URL=file:/app/data/db.sqlite \ -v /home/renan/apps/sistema.current:/app \ -v sistema_sistema_db:/app/data -w /app \ oven/bun:1 bash -lc "bun install --frozen-lockfile && bun x prisma migrate resolve --rolled-back <migration> && bun x prisma migrate deploy" docker service scale sistema_web=1
Estado do portal / app web
- Autenticação Better Auth com
AuthGuard. - Sidebar inferior agrega avatar, link para
/settingse logout (oculto em sessões de dispositivo). - Formulários de ticket (novo/editar/comentários) usam editor rico + anexos; placeholders e validação PT-BR.
- Relatórios e painéis utilizam
AppShell+SiteHeader. usePersistentCompanyFiltermantém filtro global de empresa em relatórios/admin.- Exportações CSV: backlog, canais, CSAT, SLA, horas (rotas
/api/reports/*.csv). - PDF do ticket (
/api/tickets/[id]/export/pdf). - Play interno/externo com métricas por tipo.
- Admin > Empresas: cadastro + “Cliente avulso?”, horas contratadas, vínculos de usuários.
- Admin > Usuários/Equipe:
- Abas separadas: "Equipe" (administradores e agentes) e "Usuários" (gestores e colaboradores).
- Multi‑seleção + ações em massa: excluir usuários, remover agentes de dispositivo e revogar convites pendentes.
- Filtros por papel, empresa e espaço (tenant) quando aplicável; busca unificada.
- Convites: campo "Espaço (ID interno)" removido da UI de geração.
- Admin > Usuários: vincular colaborador à empresa.
- Alertas enviados: acessível agora em Configurações → Administração do workspace (link direto para /admin/alerts). Removido da sidebar.
- Dashboard: cards por fila e indicadores principais.
Fluxos suportados
- Equipe interna (
admin,agent,collaborator): cria/acompanha tickets, comenta, altera status/fila, gera relatórios. - Gestores (
manager): visualizam tickets da empresa, comentam publicamente, acessam dashboards. - Colaboradores (
collaborator): portal (/portal), tickets próprios, comentários públicos, editor rico, anexos. - Sessão Dispositivo: desktop registra heartbeat/inventário e redireciona colaborador/gestor ao portal apropriado com cookies válidos.
Correções recentes
- Temporizador do ticket (atendimento em andamento): a UI passa a aplicar atualização otimista na abertura/pausa da sessão para que o tempo corrente não "salte" para minutos indevidos. O back‑end continua a fonte da verdade (total acumulado é reconciliado ao pausar).
Backlog recomendado
- E-mails automáticos quando uso de horas ≥ 90% do contratado.
- Ações rápidas (status/fila) diretamente na lista de tickets.
- Limites de anexos por tenant + monitoramento.
- Layout do PDF do ticket alinhado ao visual da aplicação.
- Experimentos com React Compiler (Next 16).
Referências rápidas
- Endpoints agent desktop:
POST /api/machines/registerPOST /api/machines/heartbeatPOST /api/machines/inventory
- Relatórios XLSX:
- Backlog:
/api/reports/backlog.xlsx?range=7d|30d|90d[&companyId=...] - Canais:
/api/reports/tickets-by-channel.xlsx?... - CSAT:
/api/reports/csat.xlsx?... - SLA:
/api/reports/sla.xlsx?... - Horas:
/api/reports/hours-by-client.xlsx?... - Inventário de dispositivos:
/api/reports/machines-inventory.xlsx?[companyId=...]
- Backlog:
- Docs complementares:
docs/DEV.md— guia diário atualizado.docs/STATUS-2025-10-16.md— snapshot do estado atual e backlog.docs/DEPLOY-RUNBOOK.md— runbook do Swarm.docs/admin-inventory-ui.md,docs/plano-app-desktop-maquinas.md— detalhes do inventário/agente.
Regras de Codigo
Tooltips Nativos do Navegador
NAO use o atributo title em elementos HTML (button, span, a, div, etc).
O atributo title causa tooltips nativos do navegador que sao inconsistentes visualmente e nao seguem o design system da aplicacao.
// ERRADO - causa tooltip nativo do navegador
<button title="Remover item">
<Trash2 className="size-4" />
</button>
// CORRETO - sem tooltip nativo
<button>
<Trash2 className="size-4" />
</button>
// CORRETO - se precisar de tooltip, use o componente Tooltip do shadcn/ui
<Tooltip>
<TooltipTrigger asChild>
<button>
<Trash2 className="size-4" />
</button>
</TooltipTrigger>
<TooltipContent>Remover item</TooltipContent>
</Tooltip>
Excecoes:
- Props
titlede componentes customizados (CardTitle, DialogTitle, etc) sao permitidas pois nao geram tooltips nativos.
Acessibilidade
Para manter acessibilidade em botoes apenas com icone, prefira usar aria-label:
<button aria-label="Remover item">
<Trash2 className="size-4" />
</button>
Última atualização: 15/12/2025 (Next.js 16, build padrão com Turbopack e fallback webpack documentado).