diff --git a/agents.md b/agents.md index 3f56060..57de2d7 100644 --- a/agents.md +++ b/agents.md @@ -19,9 +19,9 @@ - Para DEV: rode `pnpm convex:dev` e acesse `/dev/seed` uma vez para popular dados realistas. ## Stack atual (16/10/2025) -- **Next.js**: `16.0.0-beta.0` (Turbopack em produção + cache de filesystem em DEV). - - `next.config.ts` mantém `experimental.turbopackFileSystemCacheForDev` e `experimental.trustHostHeader`; a lista de domínios válidos mora em `src/config/allowed-hosts.ts` e é aplicada pelo `middleware.ts`. -- **React / React DOM**: `19.2.0`. +- **Next.js**: `15.5.5` (Turbopack em produção + cache de filesystem em DEV). + - `next.config.ts` mantém `experimental.turbopackFileSystemCacheForDev`; whitelist de domínios em `src/config/allowed-hosts.ts` usada tanto no `server.allowedHosts` quanto no `middleware.ts`. +- **React / React DOM**: `18.2.0`. - **Trilha de testes**: Vitest (`pnpm test`) sem modo watch por padrão (`--run --passWithNoTests`). - **CI**: workflow `Quality Checks` (`.github/workflows/quality-checks.yml`) roda `pnpm install`, `prisma:generate`, `lint`, `test`, `build`. Variáveis críticas (`BETTER_AUTH_SECRET`, `NEXT_PUBLIC_APP_URL`, etc.) são definidas apenas no runner — não afetam a VPS. - **Deploy**: pipeline `ci-cd-web-desktop.yml` (runner self-hosted). Build roda com pnpm 9, Node 20. Web é publicado em `/home/renan/apps/sistema` e o Swarm aponta `sistema_web` para essa pasta. @@ -91,7 +91,7 @@ pnpm build - **CI**: falhas mais comuns - `ERR_PNPM_OUTDATED_LOCKFILE`: mantenha `pnpm-lock.yaml` atualizado (principalmente após alterar dependências do desktop). - Variáveis Better Auth ausentes (`BETTER_AUTH_SECRET`): definidas no workflow (`Quality Checks`). - - Falha de host (Next 16): confira `src/config/allowed-hosts.ts`; o middleware retorna 403 quando o domínio do Traefik não está listado. + - 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/sistema` e rsync publica em `/home/renan/apps/sistema`. @@ -155,4 +155,4 @@ pnpm build - `docs/admin-inventory-ui.md`, `docs/plano-app-desktop-maquinas.md` — detalhes do inventário/agente. --- -_Última atualização: 16/10/2025 (Next.js 16 beta, Turbopack, fluxos desktop + portal documentados)._ +_Última atualização: 16/10/2025 (Next.js 15.5.5 estável, Turbopack, fluxos desktop + portal documentados)._ diff --git a/docs/DEV.md b/docs/DEV.md index 996297d..0b8a49c 100644 --- a/docs/DEV.md +++ b/docs/DEV.md @@ -4,8 +4,8 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve ## Resumo rápido -- **Node/PNPM**: Node 20.9+ (Next.js 16 exige essa versão mínima) + pnpm 9 (habilite via `corepack enable && corepack prepare pnpm@9 --activate`). -- **Next.js 16 (beta)**: Projeto já está em `next@16.0.0-beta.0`, com Turbopack como bundler padrão, cache de filesystem habilitado e `experimental.trustHostHeader` + middleware validando os domínios expostos pelo Traefik. +- **Node/PNPM**: Node 20.9+ (alinhado ao requisito do Next 15) + pnpm 9 (habilite via `corepack enable && corepack prepare pnpm@9 --activate`). +- **Next.js 15.5.5**: Projeto voltou para a versão estável (`next@15.5.5`) com Turbopack como bundler padrão, cache de filesystem habilitado e whitelist de domínios via `server.allowedHosts` + middleware. - **Lint/Test/Build**: `pnpm lint`, `pnpm test`, `pnpm build`. O script de testes usa `vitest --run --passWithNoTests`, eliminando o modo watch interativo. - **Banco DEV**: SQLite em `prisma/prisma/db.dev.sqlite`. Defina `DATABASE_URL="file:./prisma/db.dev.sqlite"` ao chamar CLI do Prisma. - **Desktop (Tauri)**: fonte em `apps/desktop`. Usa Radix tabs + componentes shadcn-like, integra com os endpoints `/api/machines/*` e suporta atualização automática via GitHub Releases. @@ -31,12 +31,12 @@ Este documento consolida o estado atual do ambiente de desenvolvimento, descreve > **Por quê inline?** Evitamos declarar `DATABASE_URL` em `prisma/.env` porque o Prisma lê também o `.env` da raiz (produção). O override inline garante isolamento do banco DEV. -## Next.js 16 (beta) +## Next.js 15 (estável) -- Comportamento sujeito a mudanças; acompanhe o changelog antes da GA. Breaking changes relevantes já mitigados: `params`/`searchParams` assíncronos, `cookies()`/`headers()` com await e `revalidateTag` aguardando novo perfil (não utilizamos). -- **Turbopack** é o bundler padrão. Mantemos `experimental.turbopackFileSystemCacheForDev = true` no `next.config.ts` para acelerar reinicializações do `pnpm dev`. -- **React Compiler (opcional)**: habilite com `reactCompiler: true` no `next.config.ts` e instale `babel-plugin-react-compiler`. Use apenas para experiências controladas (a compilação fica mais lenta). -- **Caching APIs**: considere `updateTag()`/`refresh()` em novas Server Actions. Atualmente não usamos `revalidateTag`. +- Mantemos o projeto em `next@15.5.5`, priorizando estabilidade enquanto acompanhamos as novidades do 16. +- **React 18.2**: voltamos para a versão suportada oficialmente pelo Next 15. Evite APIs exclusivas do React 19 (`use(...)`, `useActionState`, etc.). +- **Turbopack** segue como bundler padrão. Mantemos `experimental.turbopackFileSystemCacheForDev = true` no `next.config.ts` para acelerar reinicializações do `pnpm dev`. +- **Whitelist de hosts**: `server.allowedHosts` + middleware em `middleware.ts` garantem que apenas os domínios Traefik/localhost sejam aceitos. ## Comandos de qualidade diff --git a/next.config.ts b/next.config.ts index 1790907..87f03a1 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,9 +1,14 @@ import type { NextConfig } from "next" +import { ALLOWED_HOSTS } from "./src/config/allowed-hosts" const nextConfig = { experimental: { turbopackFileSystemCacheForDev: true, - trustHostHeader: true, + }, + // No Next 16 specific trustHostHeader flag; we whitelist via classic server.allowedHosts. + // @ts-expect-error server.allowedHosts disponível na linha 15.x + server: { + allowedHosts: [...ALLOWED_HOSTS], }, } satisfies NextConfig diff --git a/package.json b/package.json index 0b524f3..c62e1ec 100644 --- a/package.json +++ b/package.json @@ -52,12 +52,12 @@ "date-fns": "^4.1.0", "dotenv": "^16.4.5", "lucide-react": "^0.544.0", - "next": "16.0.0-beta.0", + "next": "15.5.5", "next-themes": "^0.4.6", "pdfkit": "^0.17.2", "postcss": "^8.5.6", - "react": "19.2.0", - "react-dom": "19.2.0", + "react": "18.2.0", + "react-dom": "18.2.0", "react-hook-form": "^7.64.0", "recharts": "^2.15.4", "sanitize-html": "^2.17.0", @@ -75,12 +75,12 @@ "@tauri-apps/cli": "^2.8.4", "@types/node": "^20", "@types/pdfkit": "^0.17.3", - "@types/react": "^19", - "@types/react-dom": "^19", + "@types/react": "^18", + "@types/react-dom": "^18", "@types/sanitize-html": "^2.16.0", "@types/three": "^0.180.0", "eslint": "^9", - "eslint-config-next": "16.0.0-beta.0", + "eslint-config-next": "15.5.5", "eslint-plugin-react-hooks": "^5.0.0", "prisma": "^6.16.2", "tailwindcss": "^4", diff --git a/src/app/admin/machines/[id]/page.tsx b/src/app/admin/machines/[id]/page.tsx index e72806d..507cf11 100644 --- a/src/app/admin/machines/[id]/page.tsx +++ b/src/app/admin/machines/[id]/page.tsx @@ -1,5 +1,3 @@ -"use client" -import { use } from "react" import { AppShell } from "@/components/app-shell" import { SiteHeader } from "@/components/site-header" import { DEFAULT_TENANT_ID } from "@/lib/constants" @@ -9,8 +7,8 @@ import { MachineBreadcrumbs } from "@/components/admin/machines/machine-breadcru export const runtime = "nodejs" export const dynamic = "force-dynamic" -export default function AdminMachineDetailsPage({ params }: { params: Promise<{ id: string }> }) { - const { id } = use(params) +export default function AdminMachineDetailsPage({ params }: { params: { id: string } }) { + const { id } = params return ( }>