Communitygithub.com

rbikbov/frontend-starter

Inicia um novo projeto frontend com Next.js (App Router) + TypeScript: a base que se constrói antes da primeira funcionalidade. Use quando precisar: criar um projeto do zero; decidir se Next.js, monorepo, BFF, micro-frontends são necessários; aplicar FSD sobre o roteamento do Next; configurar TypeScript estrito, linter de limites, configuração de env, modelo de erros e cliente de API, testes, git hooks, CI, esqueleto de README; organizar um projeto jovem gerado por um template.

O que é frontend-starter?

Este skill define a configuração fundamental e o checklist para iniciar um novo projeto frontend moderno usando Next.js (App Router), TypeScript e Feature-Sliced Design (FSD). Ele orienta desde decisões arquiteturais iniciais (quando usar Next.js vs SPA, monorepo, micro-frontends) até a implementação prática de TypeScript estrito, linter de limites entre camadas, configuração segura de variáveis de ambiente, modelo de erros e cliente de API, testes (Vitest, MSW, Playwright), git hooks, CI/CD e um README padronizado. O principal objetivo é evitar dívida técnica futura, fornecendo uma base sólida e repetível. O skill é compatível com assistentes de código como Claude Code, Cursor e Codex, e enfatiza que as regras do usuário e arquivos agent do projeto (AGENTS.md, CLAUDE.md) têm prioridade sobre este documento. Também recomenda consultar a documentação oficial do Next.js (em node_modules/next/dist/docs/) sempre que houver dúvidas de configuração.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/rbikbov/frontend-starter/tree/HEAD/.claude/skills/frontend-bootstrap

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Início de projeto com Next.js

A base é mais barata de estabelecer no primeiro dia: depois, cada regra precisa ser introduzida em cima de código que a viola. Se o template frontend-starter existir — comece copiando o template: nele, os passos abaixo já estão feitos e verificados, e este documento serve como explicação das decisões e checklist de auditoria. Este documento define a ordem dos passos e o conjunto mínimo. Como escrever o código em si — no skill fsd-frontend (se existir no projeto), autorização — em frontend-auth-session, verificação pré-commit — em anti-slop-review. Configurações prontas — em references/configs.md, estrutura Next + FSD com exemplos de código — em references/next-structure.md.

Prioridade das regras. Instruções explícitas do usuário e arquivos agent do projeto (AGENTS.md, CLAUDE.md) são mais importantes que este documento. Versões de bibliotecas mudam: antes de copiar uma configuração, verifique-a com a documentação da versão instalada e não afirme que ela funciona até testar.

Fatos sobre Next.js — da documentação no pacote, não deste documento nem da memória. A partir da versão 16.2, a documentação está em node_modules/next/dist/docs/, e o AGENTS.md do projeto faz referência a ela. Em caso de divergência com os exemplos aqui, a documentação da versão instalada é a correta.

Notações: MUST — não pode ser violado; SHOULD — sim por padrão, desvio requer justificativa.


1. Decisões antes do código

Cada decisão da tabela é registrada no README (seção "Decisões") ou em ADR, com justificativa. Desvio do valor padrão sem justificativa registrada — não é feito.

PerguntaPadrãoQuando diferente
Next.js ou SPANext.js, se precisar de pelo menos um: SSR/SEO, BFF (segredos, HttpOnly-cookie), route handlersAplicação interna atrás de login sem SEO e sem BFF → Vite + React Router: build e deploy mais simples
RoteadorApp RouterPages Router — apenas em projeto existente
MonorepoNão, uma aplicaçãoSegunda aplicação ou pacote realmente apareceu → pnpm workspaces; Nx/Turborepo — quando build ou CI começam a ficar lentos
Multi-Zones, micro-frontendsNãoEquipes independentes com releases independentes
Dados do servidorServer Components para carregamento inicial; TanStack Query para dados interativos do cliente e mutaçõesAplicação puramente cliente → apenas TanStack Query
Textos e i18nMódulo de tradução desde o primeiro dia (next-intl ou similar), mesmo para um único locale, se o projeto seguir fsd-frontendDecisão explícita "sem i18n" registrada no README
Gerenciador de pacotespnpm, versão em packageManager—
DeployDecidir imediatamente: Vercel, servidor Node (output: "standalone") ou DockerDisso dependem env, cache, CI

MUST: não adicionar tecnologia "para o futuro". Monorepo, segundo roteador, Storybook, gerenciador de estado, MSW "como tipo de backend" aparecem quando têm um primeiro consumidor real.


2. Ordem dos passos

  1. Criar o projeto (pnpm create next-app@latest): TypeScript, ESLint, Tailwind, App Router. Fixar packageManager, engines.node (Next 16 requer Node 20.9+) e .nvmrc.
  2. Remover imediatamente o template do gerador: página inicial, SVG de public/, README template, estilos de demonstração. Substituir README pelo esqueleto de references/configs.md. Um template deixado "para depois" chega à produção. AGENTS.md e CLAUDE.md do create-next-app não são removidos: o bloco entre <!-- BEGIN:nextjs-agent-rules --> e <!-- END:nextjs-agent-rules --> aponta os agentes para a documentação da versão instalada, next dev o mantém sozinho. Regras próprias do projeto são escritas fora desses marcadores.
  3. TypeScript estrito (seção 4 de references/configs.md) e script typecheck (tsc --noEmit).
  4. Estrutura FSD sobre Next (seção 3 abaixo).
  5. Linter e formatação: ESLint flat config do eslint-config-next + regras type-aware + linter de limites + Prettier. Next 16 removeu next lint e não faz lint em next build — o linter é executado como script separado e no CI.
  6. Configuração de env (seção 4).
  7. Modelo de erros e cliente de API em shared/api (seção 5).
  8. Provedores na camada _app: QueryClient, tema, i18n, serviços globais (toast, confirm) como porta em shared + implementação em _app.
  9. Base de UI (seção 6).
  10. Testes: Vitest + Testing Library + MSW, Playwright para e2e (seção 7).
  11. Git hooks: husky + lint-staged (eslint --fix, prettier) + commitlint.
  12. CI: lint, typecheck, test, build em cada push e PR (seção 8).
  13. Segurança padrão (seção 9).
  14. README preenchido com o que já é verdade (seção 10), e Definition of Done cumprido (seção 11).

Passos 1–3 — commit separado "scaffold": assim o histórico mostra o que o gerador fez e o que você fez.


3. FSD sobre o roteamento Next

Conforme o guia oficial do FSD para App Router: a pasta de serviço Next app/ — na raiz do projeto, as camadas FSD — em src/, e as camadas app e pages recebem o prefixo _ para não confundir com as pastas de serviço Next.

app/                         roteamento Next: apenas arquivos de rota
├── layout.tsx               layout raiz → provedores de src/_app
├── (auth)/sign-in/page.tsx  export { SignInPage as default } from "@/_pages/sign-in"
└── api/auth/login/route.ts  route handler (BFF), fino
proxy.ts                     Next 16+ (antes middleware.ts), junto com app/
src/
├── _app/                    camada app: provedores, estilos globais, implementações de serviços
├── _pages/                  camada pages
├── widgets/                 (se o projeto os usar)
├── features/
├── entities/
└── shared/{ui,api,lib,config}

MUST:

  • Arquivos em app/ são finos: reexportação da página de src/_pages, generateMetadata, parsing de params/searchParams (no Next 15+ é Promise, precisa de await) e passagem como props. Sem lógica neles.
  • Route handlers e Server Actions são finos: analisar e validar entrada → chamar função de src → retornar resposta. Cada um deles é um ponto de entrada público: verifica autorização por conta própria, não confia em proxy.ts.
  • Não criar src/app e src/pages: Next procura pastas de serviço tanto na raiz quanto em src, e uma pasta com esse nome pode facilmente se tornar um segundo roteador.
  • Linter de limites conhece os prefixos: padrões src/_app, src/_pages/* em vez de src/app, src/pages/* (config — fsd-frontend, references/conventions.md, seção 11).
  • "use client" é colocado o mais baixo possível na árvore. Página é servidora por padrão, as clientes são folhas com interatividade.
  • Módulos com segredos começam com import "server-only", módulos com window — com import "client-only".

Detalhado e com código: references/next-structure.md.


4. Configuração de ambiente

MUST:

  • Variáveis são lidas em dois módulos: shared/config/env.server.ts (import "server-only") e shared/config/env.client.ts. Esquema — zod, validação na importação: erro de configuração cai na inicialização, não na primeira requisição. No resto do código, process.env é proibido (regra de linter).
  • NEXT_PUBLIC_* são embutidos no bundle no build e apenas com acesso direto process.env.NEXT_PUBLIC_X: sem desestruturação e process.env[name]. Não é possível construir uma imagem para vários ambientes com diferentes valores públicos — esses valores são lidos no servidor e passados para baixo.
  • Segredos — apenas sem o prefixo NEXT_PUBLIC_.
  • .env.example contém cada variável com comentário e valor seguro; .env* em .gitignore, exceto .env.example. O build no CI usa valores de .env.example.

5. Modelo de erros e cliente de API

MUST:

  • Erros são normalizados em AppError com kind uma vez, na fronteira de shared/api (modelo — fsd-frontend, references/conventions.md, seção 1). Acima de shared/api, ninguém analisa Response, status e textos de erro.
  • Um request() sobre fetch (ou cliente gerado, envolvido da mesma forma): propaga signal, traduz erro de rede para network, status HTTP para kind, valida corpo da resposta com esquema. Exemplo — references/next-structure.md.
  • Tipo de erro — pelo código: status, extensions.code (GraphQL responde 200 também para erros), code no corpo. Se o backend retorna apenas texto — mapeamento por texto em um mapeador, com comentário de justificativa e testes.
  • Resposta do backend é mapeada para tipo de domínio na fronteira; DTOs não vão para a UI.
  • Dados do usuário não são cacheados entre usuários: nada de "use cache"/unstable_cache para respostas que dependem da sessão.
  • Cliente é gerado a partir do esquema (OpenAPI, GraphQL), se o esquema existir. Esquema ou código gerado ficam no repositório: o CI não deve acessar o backend ao vivo.

SHOULD: interface sobre o transporte (AuthApi + fábrica) — apenas quando já tem um segundo consumidor (fsd-frontend, references/state-and-data.md, 2.1). Valor de configuração do tipo type: "mock" que lança "não implementado" não é criado.


6. Base de UI

  • Tokens de design — variáveis CSS em :root (e para tema escuro), conectadas ao Tailwind v4 via @theme. Nos componentes — apenas tokens; valores HEX crus e arbitrários (text-[#3a3a3a]) — exceção única com comentário.
  • Classes existem. Componentes copiados de shadcn/ui e exemplos vêm com seus próprios tokens (bg-card, text-muted-foreground). Ou crie esses tokens, ou substitua as classes — senão o componente fica silenciosamente sem estilos.
  • Primitivas shared/ui são construídas sobre biblioteca headless (Radix, React Aria) para acessibilidade; variantes — cva, junção de classes — cn (clsx + tailwind-merge).
  • Fontes — next/font, imagens — next/image com dimensões, images.remotePatterns listados explicitamente.
  • Storybook — quando o kit de UI é reutilizado por várias aplicações ou equipes, não antes.

7. Testes

  • Vitest + Testing Library + jsdom + MSW com onUnhandledFrame: "error" (MSW 3; no MSW 2 — onUnhandledRequest). Config — references/configs.md.
  • Vitest não renderiza async Server Components. Lógica deles deve ser extraída para funções e testada com testes unitários; a página em si — em e2e.
  • Playwright para 3–10 caminhos críticos. No CI, e2e rodam contra backend previsível (servidor mock, ambiente com BD de teste), não contra ambiente compartilhado onde testes alteram dados de outros.
  • O primeiro teste é escrito no dia zero: ele verifica que a infraestrutura de testes funciona e define um padrão.

8. CI

MUST: em cada push para branch principal e em cada PR: lint, typecheck, test, build. Template do GitHub Actions — references/configs.md. Para repositórios públicos, Actions é gratuito; para privados, há uma cota mensal de minutos.

  • Build no CI usa .env.example, sem segredos.
  • e2e — job separado, quando há backend isolado; até lá, marcação explícita no README explicando por que não estão no CI.
  • Badge do CI no README aparece junto com o workflow.

9. Segurança padrão

  • poweredByHeader: false; cabeçalhos via headers() em next.config.ts: X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, X-Frame-Options: DENY (ou frame-ancestors no CSP). CSP com nonce — tarefa separada, mas a decisão "existe / não existe e por quê" é registrada imediatamente.
  • Server Actions e route handlers — endpoints públicos: validação de entrada com esquema e verificação de permissões em cada um.
  • dangerouslySetInnerHTML — apenas com sanitizador e comentário de justificativa.
  • Dados pessoais e tokens não são logados.
  • Autorização — conforme frontend-auth-session.

10. README

Esqueleto — references/configs.md. Regra única: no README apenas o que é verdade para o código neste commit. Cada seção é atualizada no mesmo commit que o código que ela descreve. Planos — em seção separada "Próximos passos", com nota de que não foram implementados.


11. Definition of Done para início

  • Template do gerador removido; README — esqueleto preenchido com a verdade.
  • packageManager, engines.node, .nvmrc fixados.
  • TS strict; typecheck, lint, test, build passam localmente (executados, não presumidos).
  • Estrutura FSD com prefixos _app/_pages; linter de limites detecta importação para cima.
  • Env através de dois módulos com esquema; process.env fora deles proibido por linter; .env.example completo.
  • AppError e request() em shared/api, cobertos por testes (rede, status, esquema inválido).
  • Provedores em _app; QueryClient não compartilhado entre usuários no servidor.
  • Tokens de design em variáveis CSS; todas as classes usadas existem.
  • Vitest + MSW + Playwright configurados, pelo menos um teste vivo de cada.
  • Git hooks e commitlint funcionando.
  • CI verde.
  • Cabeçalhos de segurança e poweredByHeader: false.
  • Decisões da seção 1 registradas.

12. Quando estiver em dúvida

  • Entre "adicionar agora" e "adicionar quando precisar" — quando precisar.
  • Entre "configurar manualmente" e "deixar como gerado pelo create-next-app" — deixe, enquanto não houver motivo para mudar, e registre o motivo quando mudar.
  • Entre "uma aplicação" e "monorepo" — uma aplicação.
  • Entre "config de memória" e "config da documentação da versão atual" — da documentação.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

rbikbov/frontend-starter

Creates Architecture Decision Records documenting key technical decisions with context, alternatives considered, tradeoffs, consequences, and decision owners. Use when documenting "architecture decisions", "technical choices", "design decisions", or "ADRs".

rbikbov/frontend-starter

Проверка фронтенд-кода и документации на «нейрослоп» перед коммитом, PR или публикацией репозитория: остатки генераторов, мёртвые и недоделанные опции, утверждения в README и комментариях, не подтверждённые кодом, маркетинговый тон и эмодзи, лишние абстракции, хрупкая обработка ошибок, персональные данные в логах, несуществующие классы стилей. Использовать, когда просят проверить код или репозиторий «на слоп», подготовить проект к публикации или показу, сделать ревью кода, написанного с помощью ИИ, или перед тем как закоммитить собственную большую правку.

rbikbov/frontend-starter

Процесс разработки фичи с агентом: PRD с Non-Goals → компактная спецификация → задачи по одной на коммит → read-only исследование → tracer bullet → сборка с тестом сначала → независимое ревью субагентом → проверка в браузере. Использовать, когда просят сделать фичу, экран, пользовательский сценарий или заметное изменение поведения; когда нужно написать PRD, спецификацию или разбить работу на задачи; когда работа больше одного коммита. Не использовать для опечаток и однострочных правок.

rbikbov/frontend-starter

Авторизация и сессия во фронтенде на Next.js (App Router): где хранить токены, BFF на route handlers с HttpOnly-cookie, refresh токена без гонок, определение «не авторизован» (включая GraphQL, который отвечает 200), проверки в proxy.ts и Data Access Layer, безопасный редирект после входа, выход без утечки данных прошлого пользователя, токены в ссылках сброса пароля, формы входа и восстановления. Использовать, когда проектируешь или пишешь вход, регистрацию, восстановление пароля, защищённые страницы, API-клиент с refresh-токеном, или ревьюишь такой код.

Habilidades Relacionadas