Sync setup-foundation specs to main and archive change.

Promote five capability specs from the completed setup-foundation change into openspec/specs and move the change to archive.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-28 22:56:21 -03:00
parent 236a7d3ea9
commit 58ad990488
14 changed files with 235 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
## Context
Repositório greenfield: contém [SPEC.md](../../../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 15 (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
1. Bootstrap Laravel em diretório temp → mover para raiz.
2. Configurar `.env` / `.env.example` com Postgres e locale.
3. Instalar Filament, Pest, Larastan, Pint; configurar scripts Composer.
4. Adicionar Compose, Dockerfile, CI workflow.
5. Seed admin local; documentar credenciais apenas para dev.
6. Validar `composer quality` e 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/public` ou MinIO opcional no Compose.
- **Provedor de e-mail:** necessário na Fase 2 (notificação de leads); Fase 0 usa `log` driver ou Mailpit no Compose opcional.