spec-first-copilot 0.4.0 → 0.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +156 -148
  2. package/bin/cli.js +52 -52
  3. package/lib/init.js +89 -89
  4. package/package.json +11 -4
  5. package/templates/.ai/memory/napkin.md +68 -68
  6. package/templates/.github/agents/backend-coder.md +215 -215
  7. package/templates/.github/agents/db-coder.md +165 -165
  8. package/templates/.github/agents/doc-writer.md +48 -51
  9. package/templates/.github/agents/frontend-coder.md +222 -222
  10. package/templates/.github/agents/infra-coder.md +341 -341
  11. package/templates/.github/agents/reviewer.md +99 -99
  12. package/templates/.github/agents/security-reviewer.md +153 -153
  13. package/templates/.github/copilot-instructions.md +194 -175
  14. package/templates/.github/instructions/docs.instructions.md +123 -123
  15. package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
  16. package/templates/{docs/Desenvolvimento → .github}/rules.md +229 -229
  17. package/templates/.github/skills/sf-design/SKILL.md +180 -181
  18. package/templates/.github/skills/sf-dev/SKILL.md +349 -349
  19. package/templates/.github/skills/sf-discovery/SKILL.md +405 -405
  20. package/templates/.github/skills/sf-extract/SKILL.md +284 -284
  21. package/templates/.github/skills/sf-feature/SKILL.md +130 -130
  22. package/templates/.github/skills/sf-merge-delta/SKILL.md +145 -142
  23. package/templates/.github/skills/sf-plan/SKILL.md +178 -178
  24. package/templates/.github/skills/sf-session-finish/SKILL.md +120 -120
  25. package/templates/.github/skills/sf-setup-projeto/SKILL.md +123 -123
  26. package/templates/{docs/_templates/estrutura/API.template.md → .github/templates/estrutura/apiContracts.template.md} +151 -144
  27. package/templates/.github/templates/estrutura/architecture.template.md +158 -0
  28. package/templates/{docs/_templates/estrutura/Seguranca.template.md → .github/templates/estrutura/conventions.template.md} +202 -138
  29. package/templates/{docs/_templates/estrutura/ADRs.template.md → .github/templates/estrutura/decisions.template.md} +99 -91
  30. package/templates/.github/templates/estrutura/domain.template.md +148 -0
  31. package/templates/{docs/_templates → .github/templates}/feature/PRD.template.md +256 -256
  32. package/templates/{docs/_templates → .github/templates}/feature/Progresso.template.md +136 -136
  33. package/templates/{docs/_templates → .github/templates}/feature/TRD.template.md +204 -200
  34. package/templates/{docs/_templates → .github/templates}/feature/backlog-extraido.template.md +154 -154
  35. package/templates/{docs/_templates → .github/templates}/feature/context.template.md +42 -42
  36. package/templates/{docs/_templates → .github/templates}/feature/extract-log.template.md +38 -38
  37. package/templates/{docs/_templates → .github/templates}/feature/projetos.template.yaml +73 -73
  38. package/templates/{docs/_templates → .github/templates}/feature/sdd.template.md +372 -372
  39. package/templates/{docs/_templates → .github/templates}/feature/tasks.template.md +115 -115
  40. package/templates/{docs/_templates → .github/templates}/global/progresso_global.template.md +57 -57
  41. package/templates/docs/_templates/estrutura/Arquitetura.template.md +0 -82
  42. package/templates/docs/_templates/estrutura/Infraestrutura.template.md +0 -104
  43. package/templates/docs/_templates/estrutura/Modelo_Dados.template.md +0 -99
  44. package/templates/docs/_templates/estrutura/Stack.template.md +0 -78
  45. package/templates/docs/_templates/estrutura/Visao.template.md +0 -82
  46. /package/templates/docs/{Desenvolvimento/.gitkeep → .gitkeep} +0 -0
  47. /package/templates/{docs/Estrutura → workspace/Input}/.gitkeep +0 -0
  48. /package/templates/{docs/PM → workspace/Input/setup_projeto}/.gitkeep +0 -0
  49. /package/templates/{docs/PM/setup_projeto → workspace/Output}/.gitkeep +0 -0
@@ -1,123 +1,123 @@
1
- ---
2
- name: sf-setup-projeto
3
- description: |
4
- Bootstrap do projeto. Cria contexto TRD, chama /sf-extract, para no checkpoint.
5
- Trigger: /sf-setup-projeto
6
- author: GustavoMaritan
7
- version: 1.0.0
8
- date: 2026-04-08
9
- ---
10
-
11
- # Skill: /sf-setup-projeto
12
-
13
- > Orquestrador de bootstrap do projeto. Executa uma única vez.
14
- > Cria contexto TRD, chama `/extract` e para no checkpoint de aprovação.
15
-
16
- ## Tipo
17
- Orquestrador (primeira etapa do pipeline)
18
-
19
- ## Uso
20
- ```
21
- /sf-setup-projeto
22
- ```
23
-
24
- ## Pré-condições
25
-
26
- | # | Validação | Se falhar |
27
- |---|-----------|-----------|
28
- | 1 | `docs/PM/setup_projeto/` existe | Parar → "Crie a pasta docs/PM/setup_projeto/ e adicione seus insumos" |
29
- | 2 | Pasta contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Adicione insumos na pasta (aceitos: .md, .txt, .sql, .xml, .html, .json, .csv, .png, .jpg, .pdf — qualquer formato)" |
30
- | 3 | `docs/Estrutura/` está vazio ou contém apenas templates vazios | Parar → "Setup já foi executado. Use /sf-feature para novas funcionalidades" |
31
- | 4 | `docs/Desenvolvimento/setup_projeto/.context.md` não existe ou status é `not_started` | Parar → "Setup já está em andamento. Verifique o status em .context.md" |
32
-
33
- ## Passos
34
-
35
- ### 1. Criar estrutura
36
- ```
37
- docs/Desenvolvimento/setup_projeto/
38
- ├── .context.md ← criado agora
39
- └── (TRD.md será criado pelo /extract)
40
- ```
41
-
42
- ### 2. Criar `.context.md`
43
- ```yaml
44
- ---
45
- nome: "setup_projeto"
46
- tipo: "setup"
47
- documento: "TRD"
48
- pm_path: "docs/PM/setup_projeto/"
49
- status: "not_started"
50
- ultima_skill: "/sf-setup-projeto"
51
- atualizado_em: "{{ISO_DATETIME}}"
52
- ---
53
- ```
54
-
55
- ### 3. Sugerir /sf-discovery (RECOMENDADO)
56
-
57
- Antes de extrair, perguntar ao usuário:
58
- ```
59
- 📋 Insumos encontrados em docs/PM/setup_projeto/.
60
-
61
- Recomendo rodar /sf-discovery antes da extração para:
62
- - Análise profunda dos insumos (parseia drawio, XML, SQL completo)
63
- - Identificar gaps e contradições antes de estruturar
64
- - Validar entendimento com você (mapa do sistema)
65
-
66
- Quer rodar /sf-discovery docs/PM/setup_projeto/ agora? (s/n)
67
- Se SIM → rodar discovery, salvar discovery.md, depois continuar com extract
68
- Se NÃO → pular direto para /sf-extract (ok para insumos simples)
69
- ```
70
-
71
- Se o usuário aceitar:
72
- - Rodar `/sf-discovery docs/PM/setup_projeto/`
73
- - Aguardar conclusão — discovery.md salvo em `docs/Desenvolvimento/setup_projeto/`
74
- - Continuar para o passo 4
75
-
76
- ### 4. Chamar `/sf-extract setup_projeto`
77
- O `/sf-extract` lê os insumos + discovery.md (se existir), gera o TRD e atualiza status para `extract_done`.
78
-
79
- ### 5. CHECKPOINT — Parar e informar o usuário
80
- Mensagem ao usuário:
81
- ```
82
- ✅ TRD gerado em docs/Desenvolvimento/setup_projeto/TRD.md
83
-
84
- Revise o documento. Quando estiver satisfeito, execute:
85
- /sf-design setup_projeto
86
-
87
- Se precisar adicionar mais insumos, coloque na pasta docs/PM/setup_projeto/
88
- e execute:
89
- /sf-extract setup_projeto
90
- ```
91
-
92
- **O orquestrador encerra aqui.** O restante do pipeline é responsabilidade do usuário chamar as skills atômicas na ordem:
93
- 1. `/sf-design setup_projeto` (pergunta aprovação → gera SDD + docs/Estrutura/ + projetos.yaml)
94
- 2. `/sf-plan setup_projeto` (gera tasks com campo Repo por task)
95
- 3. `/sf-dev setup_projeto` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
96
-
97
- ## Saídas diretas desta skill
98
- - `docs/Desenvolvimento/setup_projeto/.context.md`
99
- - `docs/Desenvolvimento/setup_projeto/TRD.md` (via /extract)
100
- - `docs/Desenvolvimento/setup_projeto/.extract-log.md` (via /extract)
101
-
102
- ## Saídas indiretas (skills subsequentes)
103
- - `sdd.md` (via /design)
104
- - `projetos.yaml` (via /sf-design — manifesto de repos)
105
- - `docs/Estrutura/` populado (via /design)
106
- - `*_tasks.md` + `Progresso.md` (via /plan)
107
- - `projetos/` com repos criados/clonados (via /sf-dev INFRA-001)
108
-
109
- ## Erros
110
-
111
- | Erro | Ação |
112
- |------|------|
113
- | PM/setup_projeto/ não existe | Parar, instruir criação |
114
- | PM/setup_projeto/ vazio | Parar, listar formatos aceitos |
115
- | Estrutura/ já populado | Parar, sugerir /sf-feature |
116
- | Pipeline já iniciado | Parar, mostrar status atual do .context.md |
117
-
118
- ## Notas
119
- - Esta skill roda **uma única vez** por projeto
120
- - docs/Estrutura/ é gerado pelo /sf-design (passo 3), não por tasks DOC
121
- - `projetos.yaml` é gerado pelo /sf-design (passo 3b) — mapeia serviços para repos
122
- - Repos são criados/clonados pelo /sf-dev (INFRA-001) dentro de `projetos/`
123
- - O `/merge-delta` NÃO se aplica ao setup (é criação, não atualização)
1
+ ---
2
+ name: sf-setup-projeto
3
+ description: |
4
+ Bootstrap do projeto. Cria contexto TRD, chama /sf-extract, para no checkpoint.
5
+ Trigger: /sf-setup-projeto
6
+ author: GustavoMaritan
7
+ version: 1.0.0
8
+ date: 2026-04-08
9
+ ---
10
+
11
+ # Skill: /sf-setup-projeto
12
+
13
+ > Orquestrador de bootstrap do projeto. Executa uma única vez.
14
+ > Cria contexto TRD, chama `/extract` e para no checkpoint de aprovação.
15
+
16
+ ## Tipo
17
+ Orquestrador (primeira etapa do pipeline)
18
+
19
+ ## Uso
20
+ ```
21
+ /sf-setup-projeto
22
+ ```
23
+
24
+ ## Pré-condições
25
+
26
+ | # | Validação | Se falhar |
27
+ |---|-----------|-----------|
28
+ | 1 | `workspace/Input/setup_projeto/` existe | Parar → "Crie a pasta workspace/Input/setup_projeto/ e adicione seus insumos" |
29
+ | 2 | Pasta contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Adicione insumos na pasta (aceitos: .md, .txt, .sql, .xml, .html, .json, .csv, .png, .jpg, .pdf — qualquer formato)" |
30
+ | 3 | `docs/` está vazio ou contém apenas templates vazios | Parar → "Setup já foi executado. Use /sf-feature para novas funcionalidades" |
31
+ | 4 | `workspace/Output/setup_projeto/.context.md` não existe ou status é `not_started` | Parar → "Setup já está em andamento. Verifique o status em .context.md" |
32
+
33
+ ## Passos
34
+
35
+ ### 1. Criar estrutura
36
+ ```
37
+ workspace/Output/setup_projeto/
38
+ ├── .context.md ← criado agora
39
+ └── (TRD.md será criado pelo /extract)
40
+ ```
41
+
42
+ ### 2. Criar `.context.md`
43
+ ```yaml
44
+ ---
45
+ nome: "setup_projeto"
46
+ tipo: "setup"
47
+ documento: "TRD"
48
+ pm_path: "workspace/Input/setup_projeto/"
49
+ status: "not_started"
50
+ ultima_skill: "/sf-setup-projeto"
51
+ atualizado_em: "{{ISO_DATETIME}}"
52
+ ---
53
+ ```
54
+
55
+ ### 3. Sugerir /sf-discovery (RECOMENDADO)
56
+
57
+ Antes de extrair, perguntar ao usuário:
58
+ ```
59
+ 📋 Insumos encontrados em workspace/Input/setup_projeto/.
60
+
61
+ Recomendo rodar /sf-discovery antes da extração para:
62
+ - Análise profunda dos insumos (parseia drawio, XML, SQL completo)
63
+ - Identificar gaps e contradições antes de estruturar
64
+ - Validar entendimento com você (mapa do sistema)
65
+
66
+ Quer rodar /sf-discovery workspace/Input/setup_projeto/ agora? (s/n)
67
+ Se SIM → rodar discovery, salvar discovery.md, depois continuar com extract
68
+ Se NÃO → pular direto para /sf-extract (ok para insumos simples)
69
+ ```
70
+
71
+ Se o usuário aceitar:
72
+ - Rodar `/sf-discovery workspace/Input/setup_projeto/`
73
+ - Aguardar conclusão — discovery.md salvo em `workspace/Output/setup_projeto/`
74
+ - Continuar para o passo 4
75
+
76
+ ### 4. Chamar `/sf-extract setup_projeto`
77
+ O `/sf-extract` lê os insumos + discovery.md (se existir), gera o TRD e atualiza status para `extract_done`.
78
+
79
+ ### 5. CHECKPOINT — Parar e informar o usuário
80
+ Mensagem ao usuário:
81
+ ```
82
+ ✅ TRD gerado em workspace/Output/setup_projeto/TRD.md
83
+
84
+ Revise o documento. Quando estiver satisfeito, execute:
85
+ /sf-design setup_projeto
86
+
87
+ Se precisar adicionar mais insumos, coloque na pasta workspace/Input/setup_projeto/
88
+ e execute:
89
+ /sf-extract setup_projeto
90
+ ```
91
+
92
+ **O orquestrador encerra aqui.** O restante do pipeline é responsabilidade do usuário chamar as skills atômicas na ordem:
93
+ 1. `/sf-design setup_projeto` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
94
+ 2. `/sf-plan setup_projeto` (gera tasks com campo Repo por task)
95
+ 3. `/sf-dev setup_projeto` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
96
+
97
+ ## Saídas diretas desta skill
98
+ - `workspace/Output/setup_projeto/.context.md`
99
+ - `workspace/Output/setup_projeto/TRD.md` (via /extract)
100
+ - `workspace/Output/setup_projeto/.extract-log.md` (via /extract)
101
+
102
+ ## Saídas indiretas (skills subsequentes)
103
+ - `sdd.md` (via /design)
104
+ - `projetos.yaml` (via /sf-design — manifesto de repos)
105
+ - `docs/` populado (via /design)
106
+ - `*_tasks.md` + `Progresso.md` (via /plan)
107
+ - `projetos/` com repos criados/clonados (via /sf-dev INFRA-001)
108
+
109
+ ## Erros
110
+
111
+ | Erro | Ação |
112
+ |------|------|
113
+ | workspace/Input/setup_projeto/ não existe | Parar, instruir criação |
114
+ | workspace/Input/setup_projeto/ vazio | Parar, listar formatos aceitos |
115
+ | docs/ já populado | Parar, sugerir /sf-feature |
116
+ | Pipeline já iniciado | Parar, mostrar status atual do .context.md |
117
+
118
+ ## Notas
119
+ - Esta skill roda **uma única vez** por projeto
120
+ - docs/ é gerado pelo /sf-design (passo 3), não por tasks DOC
121
+ - `projetos.yaml` é gerado pelo /sf-design (passo 3b) — mapeia serviços para repos
122
+ - Repos são criados/clonados pelo /sf-dev (INFRA-001) dentro de `projetos/`
123
+ - O `/merge-delta` NÃO se aplica ao setup (é criação, não atualização)
@@ -1,144 +1,151 @@
1
- # Convenções de API
2
-
3
- > Padrões globais para todas as APIs do sistema: versionamento, autenticação, paginação, erros.
4
-
5
- ---
6
-
7
- <!--
8
- =============================================================================
9
- INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
10
- =============================================================================
11
-
12
- ORIGEM: Gerado pelo /setup-projeto a partir do TRD §5.
13
- ATUALIZAÇÃO: /merge-delta quando features adicionam endpoints (Delta Specs do SDD §5 e §11).
14
-
15
- COMO GERAR:
16
- 1. Ler TRD §5 (Convenções de API) — padrão geral, versionamento, autenticação
17
- 2. Padrão geral e convenções são FIXOS após setup — definidos uma vez
18
- 3. Catálogo de endpoints é DINÂMICO — cresce a cada feature
19
- 4. Formatos de paginação, filtro e erro são FIXOS toda API segue
20
-
21
- REGRAS:
22
- - Convenções são LEI todo SDD §5 (endpoints) deve seguir estes padrões
23
- - Catálogo de endpoints atualizado a cada merge-delta
24
- - Mudanças em convenções (raro) devem gerar ADR
25
- - Rate limiting definido por categoria de endpoint, não individual
26
-
27
- =============================================================================
28
- -->
29
-
30
- ## Padrão Geral
31
-
32
- | Aspecto | Padrão |
33
- |---------|--------|
34
- | Estilo | <!-- REST / GraphQL / gRPC --> |
35
- | Formato | <!-- JSON / Protobuf --> |
36
- | Versionamento | <!-- /api/v1/ no path? Header? --> |
37
- | Autenticação | <!-- Bearer JWT? API Key? --> |
38
- | Content-Type | <!-- application/json --> |
39
- | Encoding | <!-- UTF-8 --> |
40
-
41
- ## Convenções de Rotas
42
-
43
- | Operação | Método | Rota | Exemplo |
44
- |----------|--------|------|---------|
45
- | Listar | GET | `/api/v1/{recurso}` | |
46
- | Detalhar | GET | `/api/v1/{recurso}/:id` | |
47
- | Criar | POST | `/api/v1/{recurso}` | |
48
- | Atualizar completo | PUT | `/api/v1/{recurso}/:id` | |
49
- | Atualizar parcial | PATCH | `/api/v1/{recurso}/:id` | |
50
- | Remover/Inativar | DELETE | `/api/v1/{recurso}/:id` | |
51
-
52
- ### Convenções de nomenclatura
53
- | Regra | Exemplo |
54
- |-------|---------|
55
- | Recursos no plural, kebab-case | `/api/v1/order-items` |
56
- | Ações não-CRUD como sub-recurso | `/api/v1/users/:id/activate` |
57
- | Filtros via query params | `/api/v1/users?status=active` |
58
- | Relações aninhadas (max 2 níveis) | `/api/v1/users/:id/orders` |
59
-
60
- ## Paginação
61
-
62
- ```json
63
- {
64
- "data": [],
65
- "meta": {
66
- "page": 1,
67
- "per_page": 20,
68
- "total": 0,
69
- "total_pages": 0
70
- }
71
- }
72
- ```
73
-
74
- Query params: `?page=1&per_page=20&sort=campo&order=asc`
75
-
76
- | Parâmetro | Default | Máximo | Descrição |
77
- |-----------|---------|--------|-----------|
78
- | `page` | 1 | — | Página atual |
79
- | `per_page` | 20 | <!-- Ex: 100 --> | Itens por página |
80
- | `sort` | — | — | Campo para ordenação |
81
- | `order` | `asc` | — | `asc` ou `desc` |
82
-
83
- ## Filtros
84
-
85
- Query params: `?busca=termo&campo=valor`
86
-
87
- | Tipo de filtro | Formato | Exemplo |
88
- |----------------|---------|---------|
89
- | Igualdade | `?campo=valor` | `?status=ativo` |
90
- | Busca textual | `?busca=termo` | `?busca=joao` |
91
- | Range de data | `?de=YYYY-MM-DD&ate=YYYY-MM-DD` | `?de=2026-01-01&ate=2026-12-31` |
92
- | Múltiplos valores | `?campo=a,b,c` | `?status=ativo,pendente` |
93
-
94
- ## Respostas de Erro
95
-
96
- ```json
97
- {
98
- "error": {
99
- "code": "ERROR_CODE",
100
- "message": "Mensagem legível para o usuário",
101
- "details": [
102
- { "field": "campo", "message": "Detalhe do erro" }
103
- ]
104
- }
105
- }
106
- ```
107
-
108
- ### Códigos HTTP
109
-
110
- | Código | Quando usar | Exemplo |
111
- |--------|-------------|---------|
112
- | 200 | Sucesso (GET, PUT, PATCH) | Recurso retornado/atualizado |
113
- | 201 | Criado com sucesso (POST) | Recurso criado, retorna o objeto |
114
- | 204 | Sucesso sem conteúdo (DELETE) | Recurso removido |
115
- | 400 | Dados inválidos (formato) | JSON malformado |
116
- | 401 | Não autenticado | Token ausente ou expirado |
117
- | 403 | Sem permissão | Papel sem acesso ao recurso |
118
- | 404 | Recurso não encontrado | ID inexistente |
119
- | 409 | Conflito (duplicidade) | Email já cadastrado |
120
- | 422 | Validação de negócio falhou | CPF inválido, regra RN-XXX violada |
121
- | 429 | Rate limit excedido | Muitas requisições |
122
- | 500 | Erro interno | Bug não tratado |
123
-
124
- ### Códigos de erro do domínio
125
-
126
- | Código | Descrição | HTTP |
127
- |--------|-----------|------|
128
- | <!-- Ex: DUPLICATE_EMAIL --> | <!-- Email cadastrado --> | <!-- 409 --> |
129
-
130
- ## Catálogo de Endpoints
131
-
132
- > Atualizado a cada feature via /merge-delta. Visão consolidada de todas as APIs.
133
-
134
- | Método | Rota | Feature | Descrição |
135
- |--------|------|---------|-----------|
136
- | | | | |
137
-
138
- ---
139
-
140
- ## Changelog
141
-
142
- | Data | Feature | Tipo | Descrição |
143
- |------|---------|------|-----------|
144
- | | | | |
1
+ # Contratos de API
2
+
3
+ > Padrões de endpoint, convenções de rotas, paginação, filtros, respostas de erro
4
+ > e catálogo global. Contratos HTTP do sistema.
5
+ > Autenticação detalhada e códigos de erro do domínio vivem em conventions.md.
6
+
7
+ ---
8
+
9
+ <!--
10
+ =============================================================================
11
+ INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
12
+ =============================================================================
13
+
14
+ ORIGEM: Gerado pelo /setup-projeto a partir do TRD §5 (API).
15
+ ATUALIZAÇÃO: /merge-delta quando features adicionam endpoints
16
+ (Delta Specs do SDD §5 e §11).
17
+
18
+ COMO GERAR:
19
+ 1. Ler TRD §5 (Convenções de API)padrão geral, versionamento
20
+ 2. Padrão geral e convenções são FIXOS após setup — definidos uma vez
21
+ 3. Catálogo de endpoints é DINÂMICO — cresce a cada feature via merge-delta
22
+ 4. Formatos de paginação, filtro e resposta de erro são FIXOS
23
+
24
+ O QUE NÃO VAI AQUI:
25
+ - Autenticação detalhada (hash, refresh, fluxo) conventions.md
26
+ - Autorização, roles, matriz de permissões → conventions.md
27
+ - Códigos de erro do domínio → conventions.md
28
+ - Rate limiting → conventions.md
29
+ - CORS → conventions.md
30
+
31
+ REGRAS:
32
+ - Convenções são LEI — todo SDD §5 (endpoints) deve seguir
33
+ - Catálogo atualizado a cada merge-delta
34
+ - Mudanças em convenções (raro) devem gerar registro em decisions.md
35
+
36
+ =============================================================================
37
+ -->
38
+
39
+ ## Padrão Geral
40
+
41
+ | Aspecto | Padrão |
42
+ |---------|--------|
43
+ | Estilo | <!-- REST / GraphQL / gRPC --> |
44
+ | Formato | <!-- JSON / Protobuf --> |
45
+ | Versionamento | <!-- /api/v1/ no path? Header? --> |
46
+ | Content-Type | <!-- application/json --> |
47
+ | Encoding | <!-- UTF-8 --> |
48
+
49
+ > **Autenticação**: definida em [conventions.md Autenticação](./conventions.md#autenticação).
50
+
51
+ ## Convenções de Rotas
52
+
53
+ | Operação | Método | Rota | Exemplo |
54
+ |----------|--------|------|---------|
55
+ | Listar | GET | `/api/v1/{recurso}` | |
56
+ | Detalhar | GET | `/api/v1/{recurso}/:id` | |
57
+ | Criar | POST | `/api/v1/{recurso}` | |
58
+ | Atualizar completo | PUT | `/api/v1/{recurso}/:id` | |
59
+ | Atualizar parcial | PATCH | `/api/v1/{recurso}/:id` | |
60
+ | Remover/Inativar | DELETE | `/api/v1/{recurso}/:id` | |
61
+
62
+ ### Convenções de nomenclatura
63
+
64
+ | Regra | Exemplo |
65
+ |-------|---------|
66
+ | Recursos no plural, kebab-case | `/api/v1/order-items` |
67
+ | Ações não-CRUD como sub-recurso | `/api/v1/users/:id/activate` |
68
+ | Filtros via query params | `/api/v1/users?status=active` |
69
+ | Relações aninhadas (max 2 níveis) | `/api/v1/users/:id/orders` |
70
+
71
+ ## Paginação
72
+
73
+ ```json
74
+ {
75
+ "data": [],
76
+ "meta": {
77
+ "page": 1,
78
+ "per_page": 20,
79
+ "total": 0,
80
+ "total_pages": 0
81
+ }
82
+ }
83
+ ```
84
+
85
+ Query params: `?page=1&per_page=20&sort=campo&order=asc`
86
+
87
+ | Parâmetro | Default | Máximo | Descrição |
88
+ |-----------|---------|--------|-----------|
89
+ | `page` | 1 | | Página atual |
90
+ | `per_page` | 20 | <!-- Ex: 100 --> | Itens por página |
91
+ | `sort` | | | Campo para ordenação |
92
+ | `order` | `asc` | — | `asc` ou `desc` |
93
+
94
+ ## Filtros
95
+
96
+ Query params: `?busca=termo&campo=valor`
97
+
98
+ | Tipo de filtro | Formato | Exemplo |
99
+ |----------------|---------|---------|
100
+ | Igualdade | `?campo=valor` | `?status=ativo` |
101
+ | Busca textual | `?busca=termo` | `?busca=joao` |
102
+ | Range de data | `?de=YYYY-MM-DD&ate=YYYY-MM-DD` | `?de=2026-01-01&ate=2026-12-31` |
103
+ | Múltiplos valores | `?campo=a,b,c` | `?status=ativo,pendente` |
104
+
105
+ ## Respostas de Erro
106
+
107
+ ```json
108
+ {
109
+ "error": {
110
+ "code": "ERROR_CODE",
111
+ "message": "Mensagem legível para o usuário",
112
+ "details": [
113
+ { "field": "campo", "message": "Detalhe do erro" }
114
+ ]
115
+ }
116
+ }
117
+ ```
118
+
119
+ ### Códigos HTTP
120
+
121
+ | Código | Quando usar | Exemplo |
122
+ |--------|-------------|---------|
123
+ | 200 | Sucesso (GET, PUT, PATCH) | Recurso retornado/atualizado |
124
+ | 201 | Criado com sucesso (POST) | Recurso criado, retorna o objeto |
125
+ | 204 | Sucesso sem conteúdo (DELETE) | Recurso removido |
126
+ | 400 | Dados inválidos (formato) | JSON malformado |
127
+ | 401 | Não autenticado | Token ausente ou expirado |
128
+ | 403 | Sem permissão | Papel sem acesso ao recurso |
129
+ | 404 | Recurso não encontrado | ID inexistente |
130
+ | 409 | Conflito (duplicidade) | Email já cadastrado |
131
+ | 422 | Validação de negócio falhou | CPF inválido, regra RN-XXX violada |
132
+ | 429 | Rate limit excedido | Muitas requisições |
133
+ | 500 | Erro interno | Bug não tratado |
134
+
135
+ > **Códigos de erro do domínio**: definidos em [conventions.md → Códigos de Erro do Domínio](./conventions.md#códigos-de-erro-do-domínio).
136
+
137
+ ## Catálogo de Endpoints
138
+
139
+ > Atualizado a cada feature via /merge-delta. Visão consolidada de todas as APIs.
140
+
141
+ | Método | Rota | Feature | Descrição |
142
+ |--------|------|---------|-----------|
143
+ | | | | |
144
+
145
+ ---
146
+
147
+ ## Changelog
148
+
149
+ | Data | Feature | Tipo | Descrição |
150
+ |------|---------|------|-----------|
151
+ | | | | |