Synaplan
기업을 위한 오픈소스 AI 플랫폼
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
SaaS para profissionais da beleza e clientes finais. O produto reúne agenda, catálogo, clientes, equipe, gestão operacional e uma experiência própria para a cliente. • Next.js 16 (App Router) + TypeScript • Tailwind CSS 4 + shadcn/ui • Supabase Auth + PostgreSQL + Row Level Security • Deploy previsto na Vercel • Node.js 22 ou superior Uma pessoa tem uma conta (auth.users + profiles). Capacidades são compostas: • client_profiles → área gratuita /cliente • workspaces + workspace_members → negócio / tenant • subscriptions pertencem ao workspace, não ao usuárioREADME 전문 보기 ↗
SaaS para profissionais da beleza e clientes finais. O produto reúne agenda, catálogo, clientes, equipe, gestão operacional e uma experiência própria para a cliente.
Uma pessoa tem uma conta (auth.users + profiles). Capacidades são compostas:
client_profiles → área gratuita /clienteworkspaces + workspace_members → negócio / tenantsubscriptions pertencem ao workspace, não ao usuáriointended_use no cadastro é apenas roteamento inicial. Não é autorização.
| Rota | Acesso |
|---|---|
/ | pública |
/cadastro /login /verificar-email | autenticação |
/onboarding | e-mail confirmado, sem workspace |
/app | membro de workspace |
/app/agenda | agenda interna (dia/semana) |
/app/equipe | cadastro de profissionais da equipe |
/app/equipe/[member]/disponibilidade | jornada, pausas e bloqueios |
/app/servicos | catálogo de serviços do workspace |
/app/clientes | clientes internos do estabelecimento |
/app/estoque /app/pacotes | estoque e pacotes via RPC |
/app/financeiro /app/relatorios | visão financeira e indicadores dos agendamentos |
/app/avaliacoes | avaliações imutáveis (appointment_reviews) |
/cliente | client_profiles |
/cliente/agendamentos | próximos horários e histórico da cliente |
/cliente/avaliacoes | envio de avaliações de atendimentos concluídos |
/auth/callback /auth/confirm | troca de código / token de e-mail |
Rotas privadas são barradas no servidor (proxy + getUser() + RLS).
status = trialing, datas com clock_timestamp().professional_trial_claims impede trial extra após apagar/recriar.SECURITY DEFINER no schema app, com search_path vaziosubscriptions, workspace_members ou trialsha256(token)cp .env.example .env.local
npm ci
npm run dev
Variáveis:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=
NEXT_PUBLIC_SITE_URL=
Nunca coloque service role em NEXT_PUBLIC_*.
No dashboard do Supabase:
/auth/callback, /auth/confirm)npm run lint
npm run typecheck
npm run test
npm run build
npm run test:e2e
npm run test:e2e:staging
test:e2e sobe o build local com backend sintético (PASS LOCAL). Requer npm run build e Chromium do Playwright (npx playwright install chromium). Porta e evidências: AGENDE_E2E_PORT, AGENDE_E2E_EVIDENCE. Nunca aponta para produção.
test:e2e:staging só navega com AGENDE_STAGING_ACCEPTANCE + AGENDE_STAGING_ORIGIN autorizados. Sem isso, marca BLOQUEADO e sai 0. Detalhes: docs/homologation/e2e.md.
Migrations versionadas em supabase/migrations. Schema app não é exposto na Data API.
Não reescreva migrations já aplicadas no projeto remoto. Correções de banco entram em uma nova migration.
As migrations 20260927014947_launch_readiness_reviews e
20261008131859_launch_hardening_reviews_force_rls estão no Git e ainda não
constam do snapshot remoto de 27/09/2026. Validação e ordem de aplicação:
docs/migrations/launch-readiness-2026-10-08.md.
Não aplicar em produção sem revisão humana.
Os arquivos em supabase/tests/ são executáveis: falham com RAISE EXCEPTION se uma regra quebrar.
Requerem uma conexão privilegiada (postgres / service_role), porque criam usuários em auth.users.
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/foundation.sql
O segundo arquivo imprime a lista de casos que passaram. Usuários de teste usam o domínio @agende-foundation.test e são removidos ao final (também em caso de falha).
Catálogo (equipe, serviços, clientes do estabelecimento):
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/catalog.sql
Agenda (jornada, conflitos, snapshots e IDOR):
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/helpers.sql
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f supabase/tests/agenda.sql
weekday 0–6 = domingo–sábado (EXTRACT(DOW) / Date.getDay()).app.product_timezone() e src/lib/time/timezone.ts (America/Sao_Paulo).EXCLUDE USING gist em appointments ativos + pg_advisory_xact_lock no profissional. cancelled e no_show não ocupam horário.price_cents e duration_minutes são snapshot; override de professional_services ganha do catálogo. O browser não define preço, duração nem ends_at.