Introduces Filament management for site settings, services, portfolio cases, and testimonials with admin-only policies, validated media uploads, and deterministic seeding. Includes comprehensive design and task documentation for the implementation. Co-authored-by: Cursor <cursoragent@cursor.com>
6.4 KiB
Context
Repositório greenfield: contém SPEC.md (especificação normativa aprovada), scaffold OpenSpec e um commit inicial. Não existe aplicação Laravel, banco, CI ou contêiner.
Versões-alvo confirmadas no Packagist (jul/2026): Laravel 13.23, Filament 5.7, Livewire 4.3, Pest 4.7, Larastan 3.10, Pint 1.29. Ambiente local: PHP 8.5.8, Composer 2.9.5, Node 22, Docker 29 + Compose v5.3.
ADRs ADR-001..ADR-010 do SPEC §21 são aceitas e serão registradas em docs/adr/ sem reabertura de decisões.
Goals / Non-Goals
Goals:
- Entregar esqueleto Laravel funcional com Filament autenticado, Livewire/Tailwind configurados e Postgres local.
- Estabelecer gates de qualidade (Pint, Larastan, Pest, arch tests) e scripts Composer padronizados.
- Produzir imagem Docker FrankenPHP reproduzível com healthcheck e processos web/queue/scheduler.
- CI verde nos 5 jobs bloqueantes antes de avançar para Fase 1.
- Design tokens mínimos e layout público placeholder para validar pipeline visual futuro.
Non-Goals:
- Implementar requisitos funcionais das Fases 1–5 (site, CRM, eventos, financeiro, documentos).
- Deploy em staging ou produção (adiado).
- FrankenPHP worker mode, Redis, S3 em produção, integração de e-mail transacional.
- Qualquer item listado em SPEC §4.2 "Fora do MVP".
Decisions
1. Bootstrap via composer create-project em diretório temporário
Decisão: Instalar Laravel 13 com composer create-project laravel/laravel em diretório temporário e mover arquivos para a raiz, preservando SPEC.md, openspec/ e .codex/.
Alternativas: Instalar na raiz (conflita com arquivos existentes); copiar skeleton manualmente (mais erro-prone).
Rationale: Padrão Laravel garante estrutura correta; evita sobrescrever artefatos de spec.
2. PostgreSQL 17 via Docker Compose local
Decisão: Serviço postgres:17 no Compose com volume nomeado, healthcheck e credenciais em .env.example.
Alternativas: SQLite local (proibido pelo SPEC §14.2 para integração); Postgres instalado no host (sem psql no ambiente).
Rationale: Alinha dev local com CI; evita diferenças SQLite/Postgres.
3. Sessão, cache e fila em database
Decisão: SESSION_DRIVER=database, CACHE_STORE=database, QUEUE_CONNECTION=database.
Alternativas: Redis (fora do MVP, ADR-008); file/cookie session (menos alinhado com deploy containerizado).
Rationale: ADR-008; sem dependência extra; migrations padrão Laravel cobrem tabelas.
4. Papéis via enum UserRole na coluna users.role
Decisão: Enum PHP UserRole: admin|assistant + coluna is_active boolean. Filament canAccessPanel() nega inativos.
Alternativas: Spatie Permission (proibido pelo SPEC §3.4); flags booleanas separadas.
Rationale: YAGNI; atende ADM-01 e §12.2 sem complexidade.
5. Design tokens como CSS custom properties + Tailwind theme extension
Decisão: Arquivo resources/css/tokens.css com custom properties; tailwind.config.js referencia tokens via theme.extend.
Alternativas: SCSS variables espalhadas; JSON tokens com build step extra.
Rationale: Centraliza SPEC §6.3; Tailwind consome nativamente; sem dependência extra.
6. Isolamento visual: layout público separado do painel Filament
Decisão: Layout Blade público em resources/views/layouts/public.blade.php com tokens próprios; Filament usa tema padrão do painel.
Alternativas: Tema Filament customizado para site (mistura concerns); component library compartilhada prematura.
Rationale: Mitiga conflito Tailwind 4 / Filament 5 / tema público premium.
7. FrankenPHP regular mode, multi-stage Dockerfile
Decisão: Dockerfile com stages composer, frontend, runtime (FrankenPHP). PHP fixado conforme suporte Laravel 13 no momento da instalação (8.4 ou 8.5). config:cache apenas no entrypoint/deploy, nunca em stage sem env final.
Alternativas: Nginx + PHP-FPM (SPEC exige FrankenPHP); worker mode (ADR-006 proíbe no MVP).
Rationale: ADR-006; imagem única para web/queue/scheduler (§15.2).
8. CI em GitHub Actions com PostgreSQL service container
Decisão: Workflow .github/workflows/ci.yml com jobs static, unit, feature, browser, container. Feature tests usam Postgres service; browser job builda imagem e roda Pest Browser com locale pt-BR, TZ America/Fortaleza, animações desabilitadas.
Alternativas: GitLab CI; CircleCI (remote já é GitHub).
Rationale: Remote manoel-freitas/amore-site; SPEC §14.1.
9. Estrutura de diretórios modular preparada, não populada
Decisão: Criar apenas diretórios quando primeiro arquivo for adicionado (SPEC §9.4). Na Fase 0, garantir tests/Architecture/ e namespace base; não criar app/Application/, app/Domain/ vazios.
Rationale: YAGNI; arch tests validam boundary quando Domain existir na Fase 2+.
Risks / Trade-offs
| Risco | Mitigação |
|---|---|
| Conflito Tailwind 4 + Filament 5 + tema público | Layouts separados; Vite entries distintos se necessário |
| Snapshots visuais instáveis no CI | Imagem Linux fixa, fontes instaladas, relógio congelado, seed determinístico (preparação na Fase 1) |
config:cache congela env incorreto |
Cache apenas no entrypoint com env final do deploy |
| PHP 8.5 muito novo para alguma extensão | Fixar versão PHP no Dockerfile conforme matriz Laravel 13; testar build no job container |
| Filament panel + Livewire 4 coexistência | Seguir docs oficiais de instalação Filament 5; testes feature de login |
Migration Plan
- Bootstrap Laravel em diretório temp → mover para raiz.
- Configurar
.env/.env.examplecom Postgres e locale. - Instalar Filament, Pest, Larastan, Pint; configurar scripts Composer.
- Adicionar Compose, Dockerfile, CI workflow.
- Seed admin local; documentar credenciais apenas para dev.
- Validar
composer qualitye jobs CI no PR.
Rollback: Reverter commit da Fase 0; repo volta ao estado spec-only.
Open Questions
- Staging target: VPS próprio, Fly.io, Render ou Railway — decisão adiada; change futura para deploy.
- Registry de imagem: GitHub Container Registry vs Docker Hub — definir na change de deploy.
- Provedor S3-compatible: necessário na Fase 1+ para mídia pública; local usa
storage/app/publicou MinIO opcional no Compose. - Provedor de e-mail: necessário na Fase 2 (notificação de leads); Fase 0 usa
logdriver ou Mailpit no Compose opcional.