Fonte única de regras do projeto SAMMwise para qualquer agente de IA (Claude Code, Cursor, Copilot, Windsurf, Codex). Edite somente este arquivo. Use o prompt abaixo para re-exportar para outras ferramentas:
Leia o AGENTS.md e exporte as regras para [Cursor / Copilot / Windsurf],
criando o arquivo de destino no formato esperado.
Este projeto segue Spec-Driven Secure Development (SDSD). Toda funcionalidade nova começa com specs em specs/.
| Escala | Fases | Quando usar |
|---|---|---|
| QUICK | E → V | Bugfix, ajuste de texto, fix visual pequeno |
| SMALL | P → E → V | Feature simples, nova rota sem lógica complexa |
| MEDIUM | P → R → E → V | Feature regular, nova entidade, integração externa |
| LARGE | P → R → E → V → C | Sistema complexo, múltiplos stakeholders, compliance |
Regra de ouro: spec é fonte da verdade, código implementa o spec, CHANGELOG registra o histórico. Nunca codar sem spec; nunca alterar código sem sincronizar o spec.
specs/ ← Constituição + specs de feature
├── mission.md ← Por que existimos
├── tech-stack.md ← Stack e razões
├── roadmap.md ← Fases (✅ já feitas, [ ] pendentes)
└── YYYY-MM-DD-nome-feature/ ← Uma pasta por feature
├── plan.md ← Grupos numerados de tarefas
├── requirements.md ← Escopo + decisões + NFRs
├── validation.md ← Definition of Done
└── security.md ← Entry points + riscos + DoD security
src/
├── components/ ← Shared UI
├── features/<dominio>/ ← Feature slices (assessment, ai-analysis)
├── lib/ ← Utilitários cross-feature (exportPdf)
├── messages/ ← i18n (en.json, pt.json)
├── pages/ ← Next.js Pages Router
└── types/
__tests__/ ← Jest test suites (espelha src/)
tsgo --noEmitdeve ser 0 erros sempre. Rodenpm run typecheckantes do commit.- Não use
anyexceto em casts de mock de teste (as unknown as X). - Use
jest.mocked()para mocks tipados — nãoas jest.Mocksolto. - Path alias
@/*aponta para a raiz; prefira import relativo dentro defeatures/.
- Pages Router — não migre para App Router sem ADR explícito (impacto em SurveyJS).
- Componentes server-safe por padrão; marque
"use client"somente quando necessário. - Evite re-renders custosos em pages/results.tsx (charts são pesados).
- Toda string de UI passa por
useTranslations(<namespace>). - Namespaces existentes:
nav,home,assessment,results,charts,upload,notFound,footer,buttons,errors,practices,meta,llm. - Adicionar string em
en.jsonobriga adicionar empt.jsonna mesma posição. Teste__tests__/i18n.test.tsvalida isso. - Conteúdo do questionário SAMM: traduzir via
translateSurveyemtranslations-pt.ts, não via i18n namespace.
sessionStoragepara dados do assessment em uso (assessmentState,userState,dataResults,prevResults,loadedResults).localStorageapenas para configs persistentes (sammwise_llm_settings,sammwise_enc_key).- Nunca armazenar API key em texto plano. Use
encryptApiKey/decryptApiKeydefeatures/ai-analysis/llmCrypto.ts.
- Botões de navegação criados em
survey.onAfterRenderPanel.add()(DOM, não JSX). - Strings traduzidas devem ser capturadas antes do callback —
useTranslations()não funciona dentro do callback DOM. - Painéis vivem em
features/assessment/surveys/surveypanels/<domain>/<practice>.tse páginas emsurveypages/<domain>.ts.
- CSS-first (
@tailwindcss/postcss) — semtailwind.config.jsclássico. - Tema dark base:
#0f111acom glassmorphism (bg-white/5,backdrop-blur-md,border-white/10). - Charts e SurveyJS herdam dark via CSS variable overrides.
npm run dev # Next.js Turbopack em :3600
npm run build # Production build
npm run typecheck # tsgo --noEmit (0 erros obrigatório)
npm run typecheck:watch # tsgo em watch
npm test # Jest (123/123 deve passar)
npm run test:watch # Jest em watch
npm run test:coverage # Jest com coverage report
npm run lint # ESLint- SAST: Semgrep —
semgrep --config auto src/ - SCA: safedep/vet — roda no CI; localmente
npm audit --audit-level=high - Secrets: TruffleHog —
trufflehog filesystem . --only-verified
.github/workflows/cicd.semgrep-reusable.yml.github/workflows/vet-sca-reusable.yml.github/workflows/trufflehog.yml
- Rotas API (
pages/api/*) → rodar Semgrep local - Dependências (
package.json) → rodarnpm audit - Configs e ENV → checar com TruffleHog filesystem
- Revogar credencial no painel do serviço (não esperar)
- Rotar (gerar nova, atualizar em
.env/CI) git filter-repo --replace-textpara limpar histórico- Auditar logs de uso da credencial
- Documentar incidente
- Pegar próxima fase em
specs/roadmap.md(primeiro[ ]) - Branch:
git checkout -b YYYY-MM-DD-nome-kebab - Specs primeiro (P):
specs/YYYY-MM-DD-nome/{plan,requirements,validation,security}.md - AskUserQuestion agrupada em 3 antes de escrever no disco
- Implementar (E) seguindo grupos do
plan.md - Validar (V):
npm run typecheck+npm test+ verificação manual + scans de segurança - Atualizar specs se algo mudou — sempre em sincronia com código
- Confirmar (C): marcar fase ✅ no roadmap, atualizar CHANGELOG, commit, merge
--no-ff, deletar branch
- ❌ Codar sem spec → criar spec primeiro
- ❌ Spec e código dessincronizados → sincronizar e documentar decisão em
requirements.md - ❌ Branch longa com múltiplas features → uma feature = uma branch = um merge
- ❌ Versão flutuante em prod (
^/~em deps críticas) → fixar - ❌ Cache sem TTL, listener sem cleanup, conexão sem close → revisar checklist da PARTE 8 do guia SDSD
- ❌ Mock sem tipagem em testes (
as any) →jest.mocked()ouas unknown as X
Seguir a tradição existente do repo (Conventional Commits leve):
feat:nova funcionalidadefix:correção de bugchore:manutenção, bumps, configsdocs:documentaçãotest:adição/ajuste de testesrefactor:reorganização sem mudança de comportamento
Sem requisito de scope obrigatório. Mensagens em PT ou EN aceitáveis (manter consistência por commit).