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.
- package/README.md +156 -148
- package/bin/cli.js +52 -52
- package/lib/init.js +89 -89
- package/package.json +11 -4
- package/templates/.ai/memory/napkin.md +68 -68
- package/templates/.github/agents/backend-coder.md +215 -215
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/agents/doc-writer.md +48 -51
- package/templates/.github/agents/frontend-coder.md +222 -222
- package/templates/.github/agents/infra-coder.md +341 -341
- package/templates/.github/agents/reviewer.md +99 -99
- package/templates/.github/agents/security-reviewer.md +153 -153
- package/templates/.github/copilot-instructions.md +194 -175
- package/templates/.github/instructions/docs.instructions.md +123 -123
- package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
- package/templates/{docs/Desenvolvimento → .github}/rules.md +229 -229
- package/templates/.github/skills/sf-design/SKILL.md +180 -181
- package/templates/.github/skills/sf-dev/SKILL.md +349 -349
- package/templates/.github/skills/sf-discovery/SKILL.md +405 -405
- package/templates/.github/skills/sf-extract/SKILL.md +284 -284
- package/templates/.github/skills/sf-feature/SKILL.md +130 -130
- package/templates/.github/skills/sf-merge-delta/SKILL.md +145 -142
- package/templates/.github/skills/sf-plan/SKILL.md +178 -178
- package/templates/.github/skills/sf-session-finish/SKILL.md +120 -120
- package/templates/.github/skills/sf-setup-projeto/SKILL.md +123 -123
- package/templates/{docs/_templates/estrutura/API.template.md → .github/templates/estrutura/apiContracts.template.md} +151 -144
- package/templates/.github/templates/estrutura/architecture.template.md +158 -0
- package/templates/{docs/_templates/estrutura/Seguranca.template.md → .github/templates/estrutura/conventions.template.md} +202 -138
- package/templates/{docs/_templates/estrutura/ADRs.template.md → .github/templates/estrutura/decisions.template.md} +99 -91
- package/templates/.github/templates/estrutura/domain.template.md +148 -0
- package/templates/{docs/_templates → .github/templates}/feature/PRD.template.md +256 -256
- package/templates/{docs/_templates → .github/templates}/feature/Progresso.template.md +136 -136
- package/templates/{docs/_templates → .github/templates}/feature/TRD.template.md +204 -200
- package/templates/{docs/_templates → .github/templates}/feature/backlog-extraido.template.md +154 -154
- package/templates/{docs/_templates → .github/templates}/feature/context.template.md +42 -42
- package/templates/{docs/_templates → .github/templates}/feature/extract-log.template.md +38 -38
- package/templates/{docs/_templates → .github/templates}/feature/projetos.template.yaml +73 -73
- package/templates/{docs/_templates → .github/templates}/feature/sdd.template.md +372 -372
- package/templates/{docs/_templates → .github/templates}/feature/tasks.template.md +115 -115
- package/templates/{docs/_templates → .github/templates}/global/progresso_global.template.md +57 -57
- package/templates/docs/_templates/estrutura/Arquitetura.template.md +0 -82
- package/templates/docs/_templates/estrutura/Infraestrutura.template.md +0 -104
- package/templates/docs/_templates/estrutura/Modelo_Dados.template.md +0 -99
- package/templates/docs/_templates/estrutura/Stack.template.md +0 -78
- package/templates/docs/_templates/estrutura/Visao.template.md +0 -82
- /package/templates/docs/{Desenvolvimento/.gitkeep → .gitkeep} +0 -0
- /package/templates/{docs/Estrutura → workspace/Input}/.gitkeep +0 -0
- /package/templates/{docs/PM → workspace/Input/setup_projeto}/.gitkeep +0 -0
- /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 | `
|
|
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
|
|
31
|
-
| 4 | `
|
|
32
|
-
|
|
33
|
-
## Passos
|
|
34
|
-
|
|
35
|
-
### 1. Criar estrutura
|
|
36
|
-
```
|
|
37
|
-
|
|
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: "
|
|
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
|
|
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
|
|
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
|
|
73
|
-
- Aguardar conclusão — discovery.md salvo em `
|
|
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
|
|
83
|
-
|
|
84
|
-
Revise o documento. Quando estiver satisfeito, execute:
|
|
85
|
-
/sf-design setup_projeto
|
|
86
|
-
|
|
87
|
-
Se precisar adicionar mais insumos, coloque na pasta
|
|
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/
|
|
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
|
-
- `
|
|
99
|
-
- `
|
|
100
|
-
- `
|
|
101
|
-
|
|
102
|
-
## Saídas indiretas (skills subsequentes)
|
|
103
|
-
- `sdd.md` (via /design)
|
|
104
|
-
- `projetos.yaml` (via /sf-design — manifesto de repos)
|
|
105
|
-
- `docs
|
|
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
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
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/
|
|
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
|
-
#
|
|
2
|
-
|
|
3
|
-
> Padrões
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
=============================================================================
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
Query params: `?
|
|
86
|
-
|
|
87
|
-
|
|
|
88
|
-
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
94
|
-
##
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
|
127
|
-
|
|
128
|
-
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
+
| | | | |
|