From toolkit-agent-skills
Container Pattern — arquitetura frontend React em 5 camadas (Types → Infra → Pages → Routes → Components). Define regras de dependência entre camadas, organização de pastas e fluxo de dados. Use ao criar novos features, refatorar componentes, decidir onde posicionar lógica (hook vs container vs presentational), revisar PRs de frontend ou planejar nova feature React/TypeScript. Trigger examples: "onde colocar este hook", "criar nova feature", "refatorar componente", "estruturar página", "container pattern". Do NOT use para projetos que não sejam React/TypeScript no padrão Container.
How this skill is triggered — by the user, by Claude, or both
Slash command
/toolkit-agent-skills:architectureThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Padrão de organização para aplicações React que separa **o que renderizar** de **como renderizar**, usando 5 camadas com regras de dependência unidirecionais.
Padrão de organização para aplicações React que separa o que renderizar de como renderizar, usando 5 camadas com regras de dependência unidirecionais.
Questão central: como escalar sem quebrar?
Types → contratos (interfaces puras, sem dependências)
↓
Infra → implementa os contratos (queries + mutations por domínio)
↓
Pages → conecta Infra com Components (lógica de wiring)
↓
Routes → containers finos (decide o que renderizar, boundaries)
↓
Components → puramente presentacionais (só recebem props)
| Route (Container) | Page | |
|---|---|---|
| Responsabilidade | Decidir o que renderizar | Conectar dados com UI |
| Chama hooks de infra? | Não (só no beforeLoad) | Sim |
| Conhece a URL? | Sim (Route.useParams) | Não (recebe via props) |
| Tem Suspense/ErrorBoundary? | Sim | Não |
O container centraliza o que renderizar — as Pages. A page centraliza como renderizar — juntando infra com components.
| Camada | Pode importar de | Nunca importa de |
|---|---|---|
| Types | — | nada |
| Infra | Types | Components, Pages, Routes |
| Pages | Types, Infra, Components | Routes |
| Routes | Types, Infra (beforeLoad), Pages | — |
| Components | Types (via props) | Infra, Pages, Routes |
Cada domínio repete a mesma estrutura nas 5 camadas:
src/
├── types/
│ ├── order.ts # Order, CreateOrderPayload
│ └── components/
│ └── order.ts # OrderTableProps, OrderFormProps
│
├── infra/orders/
│ ├── queries.ts # useOrdersQuery, useOrderByIdQuery
│ └── mutations.ts # useCreateOrderMutation
│
├── components/features/orders/ # OrderTable, OrderForm (presentacionais)
│
├── pages/orders/
│ └── OrdersPage.tsx # wiring: useOrdersQuery → <OrderTable />
│
└── routes/_private/orders/
└── index.tsx # container: Suspense + ErrorBoundary + <OrdersPage />
Adicionar um domínio novo não altera nenhum arquivo existente.
URL: /characters?search=mario&page=2
│
▼
Route (container)
├── ErrorBoundary
├── Suspense fallback={<Loading />}
└── <CharactersPage />
│
▼
Page (wiring)
├── useQueryStates() ← lê search params
├── useCharactersQuery(params) ← GET /characters?search=mario&page=2
├── useDeleteCharacterMutation() ← DELETE /characters/:id
└── <CharacterList ← Component (presentacional)
characters={data.items}
onDelete={deleteMutate}
/>
| Conhecimento | Camada |
|---|---|
| Qual URL a rota responde | Route |
| Se o usuário precisa estar autenticado | Route (beforeLoad) |
| Que o dado vem de uma API e fica em cache | Infra |
| Que o botão "Excluir" chama a API | Page |
| Como renderizar uma lista de cards | Component |
npx claudepluginhub sergiolneves/toolkit-agent-skills --plugin toolkit-agent-skillsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.