# Prompt 0.1 — Bootstrap do Projeto

> **Cole exatamente isto no Claude Code, com CLAUDE.md já presente na raiz.**

---

Você está iniciando o projeto Restaurant SaaS. Leia `CLAUDE.md` e `docs/architecture.md` antes de qualquer coisa — eles definem stack e convenções obrigatórias.

## Objetivo deste prompt

Criar o esqueleto do projeto com Laravel 11 + Inertia v2 + Vue 3 (TS) + Tailwind v4, rodando em Docker, com PostgreSQL 16 e Redis 7.

## Tarefas

### 1. Criar projeto Laravel 11
- Use `composer create-project laravel/laravel:^11.0 .` na raiz atual (já tem CLAUDE.md e docs/, preserve esses arquivos).
- PHP 8.3.

### 2. Instalar dependências PHP obrigatórias
```
inertiajs/inertia-laravel
laravel/sanctum
laravel/horizon
laravel/reverb
laravel/pulse
spatie/laravel-permission
spatie/laravel-activitylog
spatie/laravel-medialibrary
spatie/laravel-data
brick/money
nfephp-org/sped-nfe
nfephp-org/sped-da
nfephp-org/sped-common
mike42/escpos-php
ramsey/uuid
tightenco/ziggy
```

Dev:
```
pestphp/pest
pestphp/pest-plugin-laravel
larastan/larastan
laravel/pint
barryvdh/laravel-debugbar
```

Inicialize Pest: `./vendor/bin/pest --init`. Remova `tests/Feature/ExampleTest.php` e `tests/Unit/ExampleTest.php` padrões do PHPUnit.

### 3. Configurar Inertia + Vue 3 + TS
- Rode `php artisan inertia:install --vue --typescript --ssr=false`. Se a flag SSR não existir nessa versão, instale sem SSR manualmente.
- `npm install` deve incluir: `vue@^3.4`, `@inertiajs/vue3`, `typescript`, `@vitejs/plugin-vue`, `@vue/tsconfig`, `vue-tsc`, `tailwindcss@^4`, `@tailwindcss/vite`, `pinia`, `@vueuse/core`, `@vueuse/components`, `lucide-vue-next`, `@inertiajs/progress`, `ziggy-js`.
- Dev deps: `eslint`, `prettier`, `eslint-plugin-vue`, `@typescript-eslint/parser`, `@typescript-eslint/eslint-plugin`, `prettier-plugin-tailwindcss`.

### 4. Estrutura de pastas (criar tudo, mesmo vazio com .gitkeep)

```
app/
├── Modules/
│   ├── Tenancy/
│   ├── Catalog/
│   ├── Sales/
│   ├── Fiscal/
│   ├── Delivery/
│   ├── Finance/
│   ├── Inventory/
│   └── Loyalty/
├── Concerns/
└── Support/

resources/js/
├── Pages/
├── Layouts/
├── Components/
│   ├── ui/
│   ├── forms/
│   ├── tables/
│   └── domain/
├── composables/
├── stores/
├── lib/
└── types/

docs/specs/   (já existe)
```

Cada `app/Modules/{Module}/` deve ter subpastas `Models`, `Http/{Controllers,Requests,Resources}`, `Actions`, `Services`, `Events`, `Listeners`, `Jobs`, `Policies`, e arquivos `routes.php` e `{Module}ServiceProvider.php`.

### 5. ServiceProvider de cada módulo
Crie `App\Modules\{Module}\{Module}ServiceProvider` que registra rotas do módulo e carrega migrations de `app/Modules/{Module}/Database/Migrations`. Registre todos em `bootstrap/providers.php`.

### 6. Configurações
- `.env.example` com PG, Redis, Reverb, Sanctum, MAIL log, etc.
- `config/database.php`: default `pgsql`, schema `public`.
- `config/session.php`: driver `redis`.
- `config/cache.php`: default `redis`.
- `config/queue.php`: default `redis`. Filas nomeadas: `default`, `fiscal`, `printing`, `integrations`, `broadcast`, `notifications`.
- `config/broadcasting.php`: default `reverb`.
- `config/sanctum.php`: stateful domains a partir de `SANCTUM_STATEFUL_DOMAINS`.

### 7. Docker
Criar `docker-compose.yml` na raiz com serviços:
- `app` — PHP 8.3 FPM (Dockerfile próprio em `docker/app/Dockerfile` baseado em `php:8.3-fpm-alpine`, com extensões: pdo_pgsql, redis, gd, intl, zip, bcmath, opcache, soap, exif, sodium)
- `nginx` — alpine, vhost servindo `public/`, na porta 8080
- `postgres` — `postgres:16-alpine`, volume persistente
- `redis` — `redis:7-alpine`, com persistência AOF
- `horizon` — mesma imagem do app, comando `php artisan horizon`
- `reverb` — mesma imagem, comando `php artisan reverb:start --host=0.0.0.0 --port=8080`
- `vite` — `node:22-alpine`, `npm run dev` com `--host`
- `mailhog` — para testes de email em dev

Volume `./:/var/www/html` no app/horizon/reverb. Network bridge interna.

Criar `Makefile` com targets: `up`, `down`, `restart`, `logs`, `shell`, `migrate`, `fresh`, `test`, `pint`, `stan`, `npm-dev`, `npm-build`.

### 8. Tailwind v4
- Configurar via plugin Vite: `import tailwindcss from '@tailwindcss/vite'`
- `resources/css/app.css` com `@import "tailwindcss";` e definição de tema custom (cores primary, dark mode via `.dark` class).
- Configurar dark mode toggle base.

### 9. TypeScript
- `tsconfig.json` com `strict: true`, `target: ES2022`, paths `@/*` → `resources/js/*`.
- `resources/js/types/global.d.ts` com tipos para `route()` (Ziggy) e `usePage<T>()`.
- `resources/js/app.ts` configurando Inertia, Pinia, plugin do Ziggy.

### 10. Página inicial de teste
- Rota `/` retorna `Inertia::render('Welcome', ['app' => config('app.name')])`.
- `resources/js/Pages/Welcome.vue` com componente bonito (gradient bg, card centralizado, título "Restaurant SaaS", versão Laravel + Vue + TS exibidas, dark mode toggle funcional).

### 11. Qualidade
- `pint.json` com preset `laravel` + algumas regras extras (declare_strict_types, ordered_imports).
- `phpstan.neon` (Larastan level 8, ignorar pastas de vendor/Modules vazios por enquanto).
- `eslint.config.js` flat config para Vue 3 + TS.
- `.prettierrc` com `prettier-plugin-tailwindcss`.
- Scripts npm: `dev`, `build`, `lint`, `format`, `type-check`.
- Scripts composer: `pint`, `stan`, `test`.

### 12. CI básico
- `.github/workflows/ci.yml` que:
  - Roda em PR e push para main
  - Job 1: PHP — composer install, pint check, larastan, pest com coverage 70%
  - Job 2: JS — npm ci, eslint, type-check, build

### 13. Git
- `.gitignore` completo (vendor, node_modules, .env, storage/logs, public/build, etc.)
- `.gitattributes` padrão Laravel
- README.md com: visão do projeto, stack, como rodar (`make up`), links para CLAUDE.md e docs/

### 14. Documentação dev
Crie `docs/dev-setup.md` explicando:
- Pré-requisitos (Docker, Make)
- `make up` levanta tudo
- `make migrate` roda migrations (vazio por enquanto)
- `make test` roda Pest
- URLs: `http://localhost:8080` (app), `http://localhost:8025` (mailhog), `http://localhost:8080/horizon`, `http://localhost:8080/pulse`

## Critérios de aceite

Ao terminar, eu devo conseguir:
1. `make up` levantar tudo sem erros.
2. Acessar `http://localhost:8080` e ver a página Welcome com dark mode funcionando.
3. `make test` passar (mesmo só com testes de smoke).
4. `make pint` e `make stan` passarem sem erros.
5. `npm run type-check` passar sem erros.
6. Horizon, Reverb e Pulse acessíveis e rodando.
7. Toda a estrutura de pastas de `app/Modules/` criada com `.gitkeep` nas vazias.

## Importante

- **NÃO** instale pacotes que estão na fase 1+ (NFePHP fica na fase 3, mas instale agora pq já foi listado acima — só não use).
- **NÃO** crie nenhuma migration ou Model de domínio neste prompt. Esse é só o esqueleto.
- **NÃO** invente convenções fora do CLAUDE.md.
- Se algo no CLAUDE.md for ambíguo, **pare e pergunte**.
- Ao final, gere um arquivo `docs/dev-log/0.1-bootstrap.md` resumindo o que foi feito, decisões tomadas e pendências.
