spec-first-copilot 0.8.0-beta.1 → 0.8.0-beta.3
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/package.json
CHANGED
|
@@ -8,6 +8,51 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 0.8.0-beta.3 (2026-05-11) — Working directory blindado
|
|
12
|
+
|
|
13
|
+
Esclarecimento crítico em brownfield (e em qualquer cenário com múltiplos
|
|
14
|
+
repos em `projetos/`): o cwd do agente **nunca muda** — é sempre a raiz SFW.
|
|
15
|
+
Repos clonados são alvo de trabalho, não ambiente de trabalho. Evita conflito
|
|
16
|
+
entre regras SFW e regras do time do repo legado (`CLAUDE.md`, `.cursorrules`,
|
|
17
|
+
`AGENTS.md` etc. internos ao repo).
|
|
18
|
+
|
|
19
|
+
### Adicionado
|
|
20
|
+
|
|
21
|
+
- **Regra inviolável #7** em `rules.md`: "Working directory é a raiz SFW"
|
|
22
|
+
- **Seção "Working Directory — raiz SFW é a casa do agente"** em `rules.md`:
|
|
23
|
+
tabela do que faz/não faz, fronteira clara entre operacional/descritivo/histórico
|
|
24
|
+
- **Bloco "Working Directory"** no topo de `copilot-instructions.md` —
|
|
25
|
+
antes de qualquer outra seção
|
|
26
|
+
- **Aviso reforçado no Passo 3 do `/sf-onboard`** (logo após clone):
|
|
27
|
+
usar `git -C projetos/<repo>` em vez de `cd`; não carregar arquivos de
|
|
28
|
+
instrução internos do repo legado (`CLAUDE.md`, `.cursorrules`, `AGENTS.md`)
|
|
29
|
+
|
|
30
|
+
### Por quê
|
|
31
|
+
|
|
32
|
+
Repo legado pode ter próprio `CLAUDE.md` ou `copilot-instructions.md` que
|
|
33
|
+
conflita com SFW. Sem regra explícita, agente pode confundir "padrões
|
|
34
|
+
observados" (descritivos, TRD §1.6) com "regras invioláveis" (prescritivas,
|
|
35
|
+
`rules.md`). Resultado: bagunça. Fronteira agora é explícita.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 0.8.0-beta.2 (2026-05-11) — Auth check pré-clone
|
|
40
|
+
|
|
41
|
+
`/sf-onboard` agora verifica autenticação git **antes** de tentar clonar,
|
|
42
|
+
detectando SSH vs HTTPS e testando ssh-agent / credential helper / GH CLI.
|
|
43
|
+
Falha cedo com mensagem específica em vez de erro genérico do `git clone`.
|
|
44
|
+
|
|
45
|
+
### Adicionado
|
|
46
|
+
|
|
47
|
+
- Passo 0 do `/sf-onboard`: verificação proativa de auth
|
|
48
|
+
- SSH: `ssh-add -l` (agent vazio?) + `ssh -T git@<host>` (chave autorizada?)
|
|
49
|
+
- HTTPS: `git config credential.helper` + `gh auth status` + `git ls-remote`
|
|
50
|
+
- 6 mensagens de erro específicas (ssh-agent off, agent vazio, chave não
|
|
51
|
+
autorizada, sem helper nem GH CLI, GH CLI deslogado, falha desconhecida)
|
|
52
|
+
- Nota Windows/PowerShell sobre ssh-agent + alternativas (GH CLI, PAT)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
11
56
|
## 0.8.0-beta.1 (2026-05-11) — Brownfield onboarding
|
|
12
57
|
|
|
13
58
|
Skill nova `/sf-onboard` pra assumir aplicações **já existentes**. Lê o
|
|
@@ -49,6 +49,31 @@ Se algum command não for encontrado → avisar o usuário.
|
|
|
49
49
|
|
|
50
50
|
---
|
|
51
51
|
|
|
52
|
+
## Working Directory — onde o agente trabalha
|
|
53
|
+
|
|
54
|
+
> ⚠️ **Crítico** — não mude isso.
|
|
55
|
+
|
|
56
|
+
O cwd do agente é a **raiz deste projeto SFW** (onde estão `.github/`, `docs/`,
|
|
57
|
+
`specs/`, `workspace/`, `projetos.yaml`). Repos clonados em `projetos/<repo>/`
|
|
58
|
+
são **alvo de trabalho**, NUNCA **ambiente de trabalho**.
|
|
59
|
+
|
|
60
|
+
| Faz | NÃO faz |
|
|
61
|
+
|-----|---------|
|
|
62
|
+
| Lê/escreve código via path relativo: `projetos/api/src/...` | Troca cwd pra `projetos/<repo>/` |
|
|
63
|
+
| Roda git: `git -C projetos/api <comando>` | Lê `copilot-instructions.md` que exista DENTRO de `projetos/<repo>/` |
|
|
64
|
+
| Lê regras de `rules.md` da raiz SFW | Lê `CLAUDE.md` do repo legado |
|
|
65
|
+
| Lê padrões do TRD §1.6 (na raiz SFW) | Carrega `.cursor/`, `AGENTS.md`, `.cursorrules` do repo legado |
|
|
66
|
+
|
|
67
|
+
**Por quê**: repos legados (`/sf-onboard`) podem ter próprias regras/convenções
|
|
68
|
+
que conflitam com SFW. A verdade operacional é sempre a raiz SFW — código nos
|
|
69
|
+
`projetos/` é objeto de leitura/escrita, não fonte de regras vivas. Padrões do
|
|
70
|
+
repo legado, quando relevantes, foram **descritos** no TRD §1.6 pelo `/sf-onboard`.
|
|
71
|
+
|
|
72
|
+
Detalhamento completo em `.github/rules.md` (Regra Inviolável #7 + seção
|
|
73
|
+
"Working Directory").
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
52
77
|
## Identidade do Projeto
|
|
53
78
|
|
|
54
79
|
Este é um projeto que utiliza desenvolvimento **spec-first** assistido por IA.
|
|
@@ -1,229 +1,266 @@
|
|
|
1
|
-
# Regras de Desenvolvimento
|
|
2
|
-
|
|
3
|
-
> Regras que todos os agentes de desenvolvimento devem seguir.
|
|
4
|
-
> Lido pelo Coder/Senior Coder e Reviewer antes de cada task.
|
|
5
|
-
> Aplicado globalmente a todas as features.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
<!--
|
|
10
|
-
=============================================================================
|
|
11
|
-
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
12
|
-
=============================================================================
|
|
13
|
-
|
|
14
|
-
QUANDO LER: Toda vez que /sf-dev executar uma task. Obrigatório.
|
|
15
|
-
QUEM LÊ: Coder, Senior Coder e Reviewer.
|
|
16
|
-
COMO USAR: Regras aqui são LEI — não são sugestões. Violações reprovam a task no quality gate.
|
|
17
|
-
|
|
18
|
-
PERSONALIZAÇÃO: Este arquivo é editado manualmente pelo time.
|
|
19
|
-
As regras abaixo são o padrão do framework. O time pode:
|
|
20
|
-
- Adicionar regras específicas da stack
|
|
21
|
-
- Remover regras que não se aplicam
|
|
22
|
-
- Ajustar convenções ao projeto
|
|
23
|
-
|
|
24
|
-
=============================================================================
|
|
25
|
-
-->
|
|
26
|
-
|
|
27
|
-
## Regras Invioláveis
|
|
28
|
-
|
|
29
|
-
1. **Spec-first**: Nenhuma task pode ser executada sem PRD e/ou TRD aprovados (+ `specs/{nome}/` gerado)
|
|
30
|
-
2. **specs/ é a fonte do coder**: O coder lê APENAS `specs/{nome}/` + task — nunca consulta PRD/TRD ou PM diretamente
|
|
31
|
-
3. **Um commit por task**: Cada task gera exatamente 1 commit
|
|
32
|
-
4. **Sem invenção**: Se `specs/` não especifica, o coder NÃO assume — para e reporta
|
|
33
|
-
5. **Entregáveis contínuos**: Toda feature é faseada em entregáveis incrementais. Cada fase entrega valor ao usuário e pode ir para produção independentemente. Nunca "tudo ou nada" — sempre "pequeno e constante"
|
|
34
|
-
6. **Nunca na main**: Todo código é desenvolvido em branch própria. Merge apenas via PR aprovado pelo usuário
|
|
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
|
-
|
|
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
|
-
```
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
git
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
- [ ]
|
|
200
|
-
- [ ]
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
-
|
|
218
|
-
-
|
|
219
|
-
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
-
|
|
223
|
-
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
1
|
+
# Regras de Desenvolvimento
|
|
2
|
+
|
|
3
|
+
> Regras que todos os agentes de desenvolvimento devem seguir.
|
|
4
|
+
> Lido pelo Coder/Senior Coder e Reviewer antes de cada task.
|
|
5
|
+
> Aplicado globalmente a todas as features.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<!--
|
|
10
|
+
=============================================================================
|
|
11
|
+
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
12
|
+
=============================================================================
|
|
13
|
+
|
|
14
|
+
QUANDO LER: Toda vez que /sf-dev executar uma task. Obrigatório.
|
|
15
|
+
QUEM LÊ: Coder, Senior Coder e Reviewer.
|
|
16
|
+
COMO USAR: Regras aqui são LEI — não são sugestões. Violações reprovam a task no quality gate.
|
|
17
|
+
|
|
18
|
+
PERSONALIZAÇÃO: Este arquivo é editado manualmente pelo time.
|
|
19
|
+
As regras abaixo são o padrão do framework. O time pode:
|
|
20
|
+
- Adicionar regras específicas da stack
|
|
21
|
+
- Remover regras que não se aplicam
|
|
22
|
+
- Ajustar convenções ao projeto
|
|
23
|
+
|
|
24
|
+
=============================================================================
|
|
25
|
+
-->
|
|
26
|
+
|
|
27
|
+
## Regras Invioláveis
|
|
28
|
+
|
|
29
|
+
1. **Spec-first**: Nenhuma task pode ser executada sem PRD e/ou TRD aprovados (+ `specs/{nome}/` gerado)
|
|
30
|
+
2. **specs/ é a fonte do coder**: O coder lê APENAS `specs/{nome}/` + task — nunca consulta PRD/TRD ou PM diretamente
|
|
31
|
+
3. **Um commit por task**: Cada task gera exatamente 1 commit
|
|
32
|
+
4. **Sem invenção**: Se `specs/` não especifica, o coder NÃO assume — para e reporta
|
|
33
|
+
5. **Entregáveis contínuos**: Toda feature é faseada em entregáveis incrementais. Cada fase entrega valor ao usuário e pode ir para produção independentemente. Nunca "tudo ou nada" — sempre "pequeno e constante"
|
|
34
|
+
6. **Nunca na main**: Todo código é desenvolvido em branch própria. Merge apenas via PR aprovado pelo usuário
|
|
35
|
+
7. **Working directory é a raiz SFW**: O agente opera SEMPRE a partir da raiz do projeto SFW (onde estão `.github/`, `docs/`, `specs/`, `workspace/`, `projetos.yaml`). Repos em `projetos/<repo>/` são **alvo de trabalho**, NUNCA **ambiente de trabalho** (ver seção abaixo)
|
|
36
|
+
|
|
37
|
+
## Working Directory — raiz SFW é a casa do agente
|
|
38
|
+
|
|
39
|
+
> **Regra crítica em projetos com `/sfw-onboard` ou múltiplos repos**: o cwd
|
|
40
|
+
> da IA não muda. Tudo é referenciado a partir da raiz SFW.
|
|
41
|
+
|
|
42
|
+
### O que o agente FAZ
|
|
43
|
+
|
|
44
|
+
- ✅ Trabalha com cwd = raiz SFW (onde rodou `init`)
|
|
45
|
+
- ✅ Lê código com caminho relativo: `projetos/api/src/Controllers/UserController.cs`
|
|
46
|
+
- ✅ Escreve código com caminho relativo: idem
|
|
47
|
+
- ✅ Roda git **dentro** do repo target via `git -C projetos/api <comando>` (não com `cd`)
|
|
48
|
+
- ✅ Consulta `rules.md`, `docs/`, `specs/`, `.github/` SEMPRE da raiz SFW
|
|
49
|
+
- ✅ Em brownfield: consulta TRD §1.6 Padrões Observados (na raiz SFW) antes de implementar
|
|
50
|
+
|
|
51
|
+
### O que o agente NÃO FAZ
|
|
52
|
+
|
|
53
|
+
- ❌ NÃO troca cwd pra `projetos/<repo>/` (nem implícita nem explicitamente)
|
|
54
|
+
- ❌ NÃO lê `copilot-instructions.md` que exista DENTRO do repo legado em `projetos/<repo>/` (esse é do time do repo, não nosso)
|
|
55
|
+
- ❌ NÃO lê `.github/copilot-instructions.md` DENTRO do repo legado (idem)
|
|
56
|
+
- ❌ NÃO segue convenções/regras documentadas em `projetos/<repo>/.cursor/`, `projetos/<repo>/.github/`, `projetos/<repo>/AGENTS.md` ou similares
|
|
57
|
+
- ❌ NÃO carrega `.env`, `.cursorrules` ou config files do repo legado como "regras vivas"
|
|
58
|
+
|
|
59
|
+
### Por quê
|
|
60
|
+
|
|
61
|
+
- Repo legado pode ter próprio `copilot-instructions.md` / `.github/copilot-instructions.md` que **conflita** com SFW
|
|
62
|
+
- "Padrões observados" (TRD §1.6, descritivos) ≠ "regras invioláveis" (este arquivo, prescritivas) — se misturar, vira bagunça
|
|
63
|
+
- A "verdade operacional" do agente é sempre a raiz SFW; código nos `projetos/` é objeto de leitura/escrita
|
|
64
|
+
|
|
65
|
+
### Fronteira clara
|
|
66
|
+
|
|
67
|
+
| Camada | Localização | Quem manda |
|
|
68
|
+
|--------|-------------|------------|
|
|
69
|
+
| Operacional (como o agente trabalha) | Raiz SFW: `.github/`, `rules.md`, `docs/`, `specs/` | **SFW** |
|
|
70
|
+
| Descritiva (como o código existe) | `projetos/<repo>/` + TRD §1.6 (na raiz SFW) | Refletida no TRD pelo `/sfw-onboard` |
|
|
71
|
+
| Histórica do repo legado | `projetos/<repo>/README.md`, `CHANGELOG.md`, ADRs internos | Contexto opcional, não regra |
|
|
72
|
+
|
|
73
|
+
## Convenções de Código
|
|
74
|
+
|
|
75
|
+
### Padrão geral
|
|
76
|
+
- Todo código segue a stack e convenções de `docs/architecture.md` + `docs/conventions.md`
|
|
77
|
+
- Nomes em inglês (código) — documentação em português
|
|
78
|
+
- Sem código morto (comentado) — se não usa, apaga
|
|
79
|
+
- Sem secrets hardcoded — sempre variáveis de ambiente
|
|
80
|
+
|
|
81
|
+
### Backend
|
|
82
|
+
- Testes obrigatórios: mínimo happy path + 1 cenário de erro
|
|
83
|
+
- Validação de input na borda (controller/handler) — não no service
|
|
84
|
+
- Erros de negócio: usar códigos definidos em `docs/conventions.md` (seção Códigos de Erro do Domínio)
|
|
85
|
+
- Tipos explícitos (sem `any`, `object`, `dynamic` genéricos)
|
|
86
|
+
|
|
87
|
+
### Frontend
|
|
88
|
+
- Componentes tipados com props documentadas
|
|
89
|
+
- Estados explícitos: loading, empty, error, success
|
|
90
|
+
- Sem lógica de negócio no componente — delegar para hooks/services
|
|
91
|
+
|
|
92
|
+
### Banco de dados
|
|
93
|
+
- Toda migration tem rollback testado
|
|
94
|
+
- Execução sequencial — nunca pular migrations
|
|
95
|
+
- Seeds apenas para ambiente de desenvolvimento
|
|
96
|
+
|
|
97
|
+
## Convenções de Git
|
|
98
|
+
|
|
99
|
+
> **Escopo**: Estas regras se aplicam aos **repositórios em `projetos/`** (api, web, worker, etc.).
|
|
100
|
+
> O projeto-base em si é o orquestrador — specs e docs ficam aqui, código fica nos repos.
|
|
101
|
+
|
|
102
|
+
### Commits
|
|
103
|
+
```
|
|
104
|
+
tipo(TASK-ID): descrição curta
|
|
105
|
+
|
|
106
|
+
Corpo opcional com detalhes.
|
|
107
|
+
|
|
108
|
+
Refs: feat_cadastro_cliente
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
| Tipo | Quando usar |
|
|
112
|
+
|------|-------------|
|
|
113
|
+
| `feat` | Nova funcionalidade |
|
|
114
|
+
| `fix` | Correção de bug |
|
|
115
|
+
| `refactor` | Mudança sem alterar comportamento |
|
|
116
|
+
| `test` | Adição/alteração de testes |
|
|
117
|
+
| `docs` | Documentação |
|
|
118
|
+
| `chore` | Configuração, build, CI |
|
|
119
|
+
|
|
120
|
+
### Branches
|
|
121
|
+
```
|
|
122
|
+
feature/feat_cadastro_cliente
|
|
123
|
+
feature/feat_mvp_fase1
|
|
124
|
+
bugfix/bug_cpf_duplicado
|
|
125
|
+
task/task_otimizar_listagem
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
| Regra | Descrição |
|
|
129
|
+
|-------|-----------|
|
|
130
|
+
| Base | Sempre a partir de `main` atualizada (origin) |
|
|
131
|
+
| Merge | Via Pull Request aprovado pelo usuário — NUNCA merge automático |
|
|
132
|
+
| Conflitos | Resolver antes de mergear — nunca force push em branch compartilhada |
|
|
133
|
+
|
|
134
|
+
### Git Workflow (5 passos obrigatórios)
|
|
135
|
+
|
|
136
|
+
O /sf-dev DEVE seguir este fluxo para CADA fase de entrega:
|
|
137
|
+
|
|
138
|
+
#### Passo 1 — Antes de codar
|
|
139
|
+
```bash
|
|
140
|
+
# Verificar working tree limpo
|
|
141
|
+
git status
|
|
142
|
+
# Se há mudanças pendentes → sugerir commit ou stash antes de prosseguir
|
|
143
|
+
# NUNCA começar a codar com working tree sujo
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Passo 2 — Criar branch
|
|
147
|
+
```bash
|
|
148
|
+
# Atualizar main a partir do remote
|
|
149
|
+
git checkout main
|
|
150
|
+
git pull origin main
|
|
151
|
+
|
|
152
|
+
# Criar branch para a fase
|
|
153
|
+
git checkout -b feature/{nome}_fase{N}
|
|
154
|
+
# Ex: feature/feat_mvp_fase1
|
|
155
|
+
```
|
|
156
|
+
- Branch criada no **repo do serviço** (projetos/api, projetos/web, etc.)
|
|
157
|
+
- Se a fase afeta múltiplos repos → branch com mesmo nome em cada um
|
|
158
|
+
- NUNCA desenvolver direto na main
|
|
159
|
+
|
|
160
|
+
#### Passo 3 — Ao terminar a fase
|
|
161
|
+
```bash
|
|
162
|
+
# Atualizar Progresso.md com status da fase
|
|
163
|
+
# Push da branch
|
|
164
|
+
git push origin feature/{nome}_fase{N}
|
|
165
|
+
|
|
166
|
+
# Abrir PR com template detalhado (ver seção abaixo)
|
|
167
|
+
gh pr create --title "..." --body "..."
|
|
168
|
+
```
|
|
169
|
+
- Deixar ambiente local **rodando** (docker compose up + dotnet run + npm run dev)
|
|
170
|
+
- Informar ao usuário que o ambiente está ON para testes manuais
|
|
171
|
+
|
|
172
|
+
#### Passo 4 — Aguardar aprovação
|
|
173
|
+
```
|
|
174
|
+
⏸️ PARAR e aguardar.
|
|
175
|
+
- O usuário revisa o PR, testa manualmente o ambiente local
|
|
176
|
+
- Merge é MANUAL — o agente NUNCA faz merge
|
|
177
|
+
- Se o usuário pedir ajustes → corrigir na mesma branch, push, atualizar PR
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### Passo 5 — Após merge (quando usuário confirmar)
|
|
181
|
+
```bash
|
|
182
|
+
# Atualizar main local
|
|
183
|
+
git checkout main
|
|
184
|
+
git pull origin main
|
|
185
|
+
|
|
186
|
+
# Limpar branches mergeadas
|
|
187
|
+
git branch -d feature/{nome}_fase{N}
|
|
188
|
+
git remote prune origin
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Template de Pull Request
|
|
192
|
+
|
|
193
|
+
Todo PR aberto pelo /sf-dev DEVE seguir este formato:
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+
## Fase {N} — {Nome da fase}
|
|
197
|
+
|
|
198
|
+
### O que foi entregue
|
|
199
|
+
- [ ] {Entregável 1 da fase}
|
|
200
|
+
- [ ] {Entregável 2 da fase}
|
|
201
|
+
|
|
202
|
+
### Tasks concluídas
|
|
203
|
+
| Task | Descrição | Testes |
|
|
204
|
+
|------|-----------|--------|
|
|
205
|
+
| BACK-001 | Criar endpoint X | ✅ unit + integration |
|
|
206
|
+
| DB-001 | Migration tabela Y | ✅ rollback testado |
|
|
207
|
+
| FRONT-001 | Tela de cadastro | ✅ unit |
|
|
208
|
+
|
|
209
|
+
### Testes
|
|
210
|
+
- ✅ Unit tests passando ({N}/{N})
|
|
211
|
+
- ✅ Integration tests passando ({N}/{N})
|
|
212
|
+
- ✅ Security Review aprovado
|
|
213
|
+
- ⬜ E2E (aguardando teste manual do usuário)
|
|
214
|
+
|
|
215
|
+
### Como testar manualmente
|
|
216
|
+
1. Ambiente já está rodando em:
|
|
217
|
+
- API: http://localhost:8080
|
|
218
|
+
- Web: http://localhost:3000
|
|
219
|
+
- Banco: localhost:5432
|
|
220
|
+
2. Fluxo para testar:
|
|
221
|
+
- {Passo 1 do teste manual}
|
|
222
|
+
- {Passo 2 do teste manual}
|
|
223
|
+
- {Resultado esperado}
|
|
224
|
+
|
|
225
|
+
### Observações
|
|
226
|
+
- {Decisões tomadas, trade-offs, pontos de atenção}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Quality Gate (por task)
|
|
230
|
+
|
|
231
|
+
> Checklist obrigatório. O Reviewer valida TODOS os itens antes de aprovar.
|
|
232
|
+
|
|
233
|
+
- [ ] Código compila sem erros
|
|
234
|
+
- [ ] Testes passam (se aplicável à task)
|
|
235
|
+
- [ ] Lint limpo (sem warnings não justificados)
|
|
236
|
+
- [ ] Critérios de aceite da task atendidos (ref `specs/{nome}/scenarios.md`)
|
|
237
|
+
- [ ] Sem TODOs no código sem justificativa
|
|
238
|
+
- [ ] Sem secrets hardcoded
|
|
239
|
+
- [ ] Commit segue convenção: `tipo(TASK-ID): descrição`
|
|
240
|
+
- [ ] Arquivos listados na task foram os únicos modificados (sem side effects)
|
|
241
|
+
|
|
242
|
+
## Regras por Stack
|
|
243
|
+
|
|
244
|
+
> Seção opcional. Adicionar regras específicas da tecnologia escolhida.
|
|
245
|
+
> Exemplos abaixo — remover/ajustar conforme o projeto.
|
|
246
|
+
|
|
247
|
+
<!--
|
|
248
|
+
### Node.js / TypeScript
|
|
249
|
+
- ESLint + Prettier como formatador
|
|
250
|
+
- Strict mode no tsconfig
|
|
251
|
+
- Path aliases configurados (@/modules, @/shared)
|
|
252
|
+
|
|
253
|
+
### Python
|
|
254
|
+
- Ruff como linter/formatter
|
|
255
|
+
- Type hints obrigatórios (mypy strict)
|
|
256
|
+
- Virtual environment (venv ou poetry)
|
|
257
|
+
|
|
258
|
+
### React / Next.js
|
|
259
|
+
- Server Components por padrão, Client Components só quando necessário
|
|
260
|
+
- Zustand ou Context para estado global (não Redux)
|
|
261
|
+
- Tailwind CSS para estilos
|
|
262
|
+
-->
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
> **Atualização**: Editado manualmente pelo time. Aplicado globalmente a todas as features.
|
|
@@ -52,11 +52,77 @@ execução adiciona uma entry em `projetos.yaml` e merge aditivo no TRD.
|
|
|
52
52
|
| # | Validação | Se falhar |
|
|
53
53
|
|---|-----------|-----------|
|
|
54
54
|
| 1 | `<git-url>` informado | Parar → "Informe a URL do repositório. Ex: /sf-onboard https://github.com/org/app.git" |
|
|
55
|
-
| 2 | `git` instalado no PATH | Parar → "Git não encontrado no PATH" |
|
|
56
|
-
| 3 |
|
|
55
|
+
| 2 | `git` instalado no PATH (`git --version`) | Parar → "Git não encontrado no PATH" |
|
|
56
|
+
| 3 | **Auth git pré-verificada** (ver passo 0) | Parar com instrução específica conforme tipo de URL |
|
|
57
57
|
| 4 | `--branch` e `--tag` não usados juntos | Parar → "Use --branch OU --tag, não ambos" |
|
|
58
58
|
| 5 | Scope `onboard_<repo>` não está em `analyzing` | Se sim → "Onboarding anterior incompleto. Rode novamente pra retomar" |
|
|
59
59
|
|
|
60
|
+
### Passo 0 — Verificar autenticação ANTES de clonar
|
|
61
|
+
|
|
62
|
+
Detectar tipo de URL e testar auth proativamente. Falhar cedo com mensagem
|
|
63
|
+
clara é melhor que esperar o `git clone` quebrar sem contexto.
|
|
64
|
+
|
|
65
|
+
**Detectar tipo de URL**:
|
|
66
|
+
|
|
67
|
+
| Padrão | Tipo |
|
|
68
|
+
|--------|------|
|
|
69
|
+
| `git@<host>:<org>/<repo>.git` | SSH |
|
|
70
|
+
| `ssh://git@<host>/...` | SSH |
|
|
71
|
+
| `https://<host>/...` | HTTPS |
|
|
72
|
+
|
|
73
|
+
**Se SSH** — testar agente + conectividade:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 1. ssh-agent rodando com chave carregada?
|
|
77
|
+
ssh-add -l
|
|
78
|
+
# Saída esperada: linha(s) com fingerprint. Se "The agent has no identities",
|
|
79
|
+
# user precisa rodar `ssh-add ~/.ssh/id_ed25519` (ou similar).
|
|
80
|
+
# Se "Could not open a connection to your authentication agent",
|
|
81
|
+
# user precisa iniciar o ssh-agent.
|
|
82
|
+
|
|
83
|
+
# 2. Host autenticável? (extrair host da URL, ex: github.com)
|
|
84
|
+
ssh -T -o StrictHostKeyChecking=accept-new -o BatchMode=yes git@<host>
|
|
85
|
+
# GitHub retorna exit 1 com "Hi <user>! You've successfully authenticated"
|
|
86
|
+
# GitLab/Bitbucket têm mensagens análogas.
|
|
87
|
+
# Exit 255 ou "Permission denied (publickey)" → chave não autorizada.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Se HTTPS** — testar credential helper ou GH CLI:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# 1. Git credential helper configurado?
|
|
94
|
+
git config --get credential.helper
|
|
95
|
+
# Vazio → user usa GH CLI ou vai ser perguntado credencial no clone.
|
|
96
|
+
|
|
97
|
+
# 2. (Se host = github.com) GH CLI autenticado?
|
|
98
|
+
gh auth status --hostname github.com
|
|
99
|
+
# Exit 0 + "Logged in to github.com" → ok
|
|
100
|
+
# Exit 1 → não logado
|
|
101
|
+
|
|
102
|
+
# 3. Alternativa: tentar ls-remote sem clonar (mais leve que clone)
|
|
103
|
+
GIT_TERMINAL_PROMPT=0 git ls-remote --heads <git-url> HEAD
|
|
104
|
+
# Exit 0 → auth ok
|
|
105
|
+
# Exit ≠ 0 + "Authentication failed" → credencial ausente/inválida
|
|
106
|
+
# Exit ≠ 0 + "could not read Username" → terminal prompt bloqueado, sem credential helper
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Mensagens de erro específicas**:
|
|
110
|
+
|
|
111
|
+
| Cenário | Mensagem |
|
|
112
|
+
|---------|----------|
|
|
113
|
+
| SSH sem ssh-agent | "ssh-agent não está rodando. Inicie com `eval $(ssh-agent)` (Linux/Mac) ou `Start-Service ssh-agent` (Windows)" |
|
|
114
|
+
| SSH agent vazio | "Nenhuma chave SSH carregada. Rode `ssh-add ~/.ssh/id_ed25519` (ajuste o nome se diferente)" |
|
|
115
|
+
| SSH host nega | "Chave SSH não autorizada em `<host>`. Verifique se a chave pública está cadastrada em `<host>/settings/keys` (GitHub) ou equivalente" |
|
|
116
|
+
| HTTPS sem helper nem GH CLI | "Credencial HTTPS não configurada. Opções: (1) `gh auth login` se host=github.com; (2) configurar credential helper (`git config --global credential.helper manager`); (3) usar URL SSH (`git@<host>:...`)" |
|
|
117
|
+
| HTTPS GH CLI deslogado | "GH CLI não autenticado. Rode `gh auth login` e tente novamente" |
|
|
118
|
+
| `ls-remote` falha por motivo desconhecido | "Falha ao acessar o repo: `<stderr do ls-remote>`. Verifique a URL e suas credenciais" |
|
|
119
|
+
|
|
120
|
+
**Sucesso**: log breve "Auth OK ({tipo})" e prosseguir para o Passo 1.
|
|
121
|
+
|
|
122
|
+
> **Nota Windows/PowerShell**: comandos `ssh-add`, `ssh -T`, `gh`, `git`
|
|
123
|
+
> assumem disponíveis no PATH. Em ambientes sem ssh-agent nativo (Windows
|
|
124
|
+
> antigo), instruir uso do GH CLI ou HTTPS+PAT.
|
|
125
|
+
|
|
60
126
|
## Passos
|
|
61
127
|
|
|
62
128
|
### 1. Resolver nome do scope e path
|
|
@@ -95,6 +161,17 @@ git pull --ff-only
|
|
|
95
161
|
|
|
96
162
|
Capturar `commit_hash` resultante (`git rev-parse HEAD`) — vai pro snapshot.
|
|
97
163
|
|
|
164
|
+
> ⚠️ **Working directory NÃO muda**. O agente continua operando da raiz SFW.
|
|
165
|
+
> Use `git -C projetos/<repo-name> <comando>` em vez de `cd`. Comandos que
|
|
166
|
+
> precisam executar dentro do repo (linters, tree, etc.) usam path explícito
|
|
167
|
+
> ou flag `-C` equivalente.
|
|
168
|
+
>
|
|
169
|
+
> **NÃO carregar** `copilot-instructions.md`, `.github/copilot-instructions.md`, `.cursorrules`,
|
|
170
|
+
> `AGENTS.md` ou qualquer arquivo de instrução que exista DENTRO de
|
|
171
|
+
> `projetos/<repo-name>/` — esses pertencem ao time do repo legado e não fazem
|
|
172
|
+
> parte do contrato SFW. Padrões relevantes serão extraídos pelo Patterns Reader
|
|
173
|
+
> e documentados em TRD §1.6.
|
|
174
|
+
|
|
98
175
|
### 4. Criar `.context.md`
|
|
99
176
|
|
|
100
177
|
```yaml
|
|
@@ -343,7 +420,8 @@ Se `--name` diferentes → scopes separados (raro, mas suportado).
|
|
|
343
420
|
|
|
344
421
|
| Erro | Ação |
|
|
345
422
|
|------|------|
|
|
346
|
-
|
|
|
423
|
+
| Auth falha (capturado no Passo 0) | Parar com mensagem específica conforme cenário (ver tabela do Passo 0) |
|
|
424
|
+
| Clone falha mesmo com auth OK | Reportar `stderr` do git; verificar se a URL e branch existem |
|
|
347
425
|
| Repo vazio | Parar — "Nada a onboardar" |
|
|
348
426
|
| Nenhum reader produziu fragmento (stack desconhecida) | Parar — "Stack não reconhecida. Detalhe TRD manualmente ou peça suporte" |
|
|
349
427
|
| `projetos/<repo-name>/` já existe e NÃO é clone do mesmo URL | Parar — "Path já em uso por outro repo. Use --name pra dar outro nome" |
|