/sdd-stack
Entrada: $ARGUMENTS. Você conduz uma entrevista sobre a stack e só escreve arquivos no fim, depois de o usuário confirmar o resumo.
0. Antes de perguntar: descubra os fatos
Fato do ambiente é trabalho seu, nunca pergunta ao usuário. Olhe (ou delegue a um subagente):
- manifestos e código existentes (
package.json,pyproject.toml,go.mod,Dockerfile,.github/workflows/, pastas de topo); .agents/specs/stack.mdearchitecture.md(se já preenchidos e não houver--revisar, mostre o resumo e pergunte só o que falta);.specify/memory/constitution.md(restrições já decididas, ex.: LGPD, banco único);sddkit suggest --json(stacks detectadas).
O que já está decidido no código entra como decisão tomada, não como pergunta.
1. Método
- Skill
grillinginstalada em.agents/skills/→ siga o método dela (rodadas pela fronteira da árvore de decisões, cada pergunta com resposta recomendada, até a fronteira esvaziar). - Não instalada → mesmo formato: em cada rodada, todas as perguntas cujas pré-condições já estão respondidas, numeradas, cada uma assim:
❓ **Q1 — <título>**: <pergunta, com 2–4 opções e o trade-off de cada em 1 linha>
➡️ <sua recomendação e o porquê, em 1–2 linhas>
Escreva cada pergunta de modo que "sim" aceite a recomendação. Prefira tecnologia chata e madura, que a equipe já conhece, ao estado da arte; uma linguagem para o projeto todo, salvo motivo forte; o mínimo de peças que atende ao escopo (cada serviço a mais é custo de operação). Se a resposta contradiz uma anterior ou a constituição, aponte e pergunte qual vale.
2. Árvore de decisões da stack
Percorra nesta ordem de dependência; pule ramos que não se aplicam (ex.: sem UI → sem perguntas de frontend).
- Produto: o que é (app web, API, app mobile, desktop, CLI, biblioteca, worker), quem usa, escala esperada (usuários, dados, picos), restrições (LGPD, offline, custo, prazo).
- Equipe: linguagens que a equipe domina; quem vai manter.
- Forma: monólito modular, monorepo com pacotes ou serviços separados; o que precisa ser assíncrono.
- Linguagem e runtime (versão maior): ex.: TypeScript/Node 22, Python 3.12.
- Frontend (se houver UI): framework (React/Next, Vue/Nuxt, Svelte, Astro…), renderização (SPA, SSR, estático), biblioteca de componentes e estilo (MUI, shadcn+Tailwind…), estado de servidor (TanStack Query…), i18n, acessibilidade.
- Mobile/desktop (se houver): nativo, React Native/Expo, Flutter, Tauri, Electron.
- Backend/API: framework (Express, Fastify, NestJS, Hono, FastAPI, Django…), estilo (REST, GraphQL, tRPC), contratos e validação (Zod, Pydantic, OpenAPI).
7b. Paradigma do backend (só se houver backend; nunca para o frontend, que segue o idioma do framework):
- Estilo: OOP com SOLID (entidades com invariantes, serviços dependendo de interfaces), funcional (funções puras, dados imutáveis, efeitos nas bordas) ou pragmático (módulos simples, abstração só com 2+ implementações — o padrão do
ponytail). - Arquitetura: camadas simples (controller → service → repository), clean/hexagonal (domínio sem dependência de framework, portas e adaptadores) ou DDD (bounded contexts, agregados). Recomende o mais simples que o domínio aguenta: clean/DDD só com regra de negócio rica.
- Quais pastas são backend (ex.:
server/**,services/**,modules/**). É isso que limita o paradigma ao backend.
- Estilo: OOP com SOLID (entidades com invariantes, serviços dependendo de interfaces), funcional (funções puras, dados imutáveis, efeitos nas bordas) ou pragmático (módulos simples, abstração só com 2+ implementações — o padrão do
- Dados: banco (PostgreSQL, MySQL, MongoDB, SQLite), ORM/acesso (Prisma, Drizzle, SQLAlchemy…), migrations, cache.
- Assíncrono: fila/jobs (BullMQ, Celery, pg-boss…), eventos, tempo real (WebSocket/SSE).
- Autenticação e autorização: provedor ou próprio, sessões/JWT, papéis/permissões.
- Integrações externas: pagamentos (PIX…), e-mail, IA (SDK da Anthropic…), MCP.
- Hospedagem e operação: onde roda (Vercel, VPS com Docker, cloud gerenciada), ambientes, segredos, observabilidade (logs, erros, métricas).
- Qualidade: testes (unidade, integração, e2e com Playwright), lint/format, typecheck, CI (GitHub Actions), commits (Conventional Commits/commitlint).
3. Confirmação
Com a fronteira vazia, mostre o resumo em uma tabela (camada · escolha · versão · por quê · alternativa descartada) e pergunte: "Fechamos assim?". Não escreva nada antes do "sim".
4. Gravar
.agents/specs/stack.md: substitua o conteúdo (incluindo o marcador[PREENCHER) por:## Por componente— cada camada com tecnologia, versão maior e as bibliotecas principais pelo nome do pacote (ex.:react,@prisma/client,bullmq,fastapi): osddkitusa esses nomes para sugerir papéis e skills;## Infraestrutura— banco, fila, cache, hospedagem, CI, observabilidade;## Decisões— cada escolha relevante com o porquê e a alternativa descartada (data de hoje).
.agents/specs/architecture.md: preencha a seção## Visão geral(componentes e como conversam; um diagrama mermaid se houver mais de 2 peças) e tire o[PREENCHER. Se já houver código, preencha também## Mapa do código(uma linha por área: entrada, pastas-chave, testes). As demais seções ficam para quando houver código.- Paradigma do backend (se decidido em 7b e não for "pragmático"):
.agents/specs/coding-standards.md: seção## Backend — paradigmacom o estilo, a arquitetura, as pastas de backend, 3–5 regras concretas com um exemplo curto cada, e a ferramenta que impõe as regras (abaixo). Deixe claro que o frontend não segue esta seção.- Memória do sddkit, para o agente saber o escopo em toda sessão:
sddkit memory add "Paradigma <estilo>/<arquitetura> só no backend (<pastas>); no frontend siga o idioma do framework" -t paradigma sddkit memory add "No backend, a seção 'Backend — paradigma' de coding-standards.md vence o ponytail sobre interfaces e camadas" -t paradigma sddkit memory add "<regra concreta mais importante>" -t paradigma-backend --paths "<pastas de backend>" - Skills (opcionais no catálogo, carregadas só pelos papéis de backend
api,data,event-module,queue-worker): OOP/SOLID →sddkit add solid; clean/hexagonal →sddkit add clean-architecture; DDD →sddkit add domain-driven-design. Funcional: não há skill geral boa; as regras emcoding-standards.mde o lint fazem o papel. - Imposição determinística (lint restrito às pastas de backend; vira a primeira tarefa de setup do
/sdd-featurese ainda não há código):- camadas/clean/hexagonal/DDD:
dependency-cruiseroueslint-plugin-boundaries(TypeScript),import-linter(Python) — o domínio não importa infraestrutura nem framework; - funcional em TypeScript:
eslint-plugin-functionalnum bloco do ESLint comfiles: ["<pastas de backend>"](sem classes, sem mutação, semlet); - OOP: não há linter que exija OOP; use as regras de camadas acima e a revisão.
- camadas/clean/hexagonal/DDD:
- Constituição: se surgiram restrições inegociáveis (ex.: "PostgreSQL é a única fonte de verdade"), proponha o texto e sugira
/speckit-constitution— não edite a constituição direto. - Diga ao usuário para rodar no terminal:
sddkit init # lê a stack declarada e oferece papéis e skills dela (nada existente é apagado) sddkit doctor
Relatório final (≤ 8 linhas)
Stack decidida em 1 linha por camada · paradigma do backend e como é imposto · arquivos gravados · restrições sugeridas para a constituição · próximo passo (sddkit init, depois /sdd-feature).