spec-first-claude 0.7.0 → 0.8.0-beta.1
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 +45 -0
- package/bin/cli.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/CHANGELOG.md +44 -0
- package/templates/.claude/commands/sfw-onboard.md +359 -0
- package/templates/.claude/templates/estrutura/decisions.template.md +55 -22
- package/templates/.claude/templates/feature/TRD.template.md +92 -0
- package/templates/.claude/templates/feature/context.template.md +32 -3
- package/templates/CLAUDE.md +5 -3
package/README.md
CHANGED
|
@@ -20,6 +20,7 @@ agents especializados por área, security review e rastreabilidade ponta a ponta
|
|
|
20
20
|
- [Instalação](#instalação)
|
|
21
21
|
- [Estrutura gerada](#estrutura-gerada)
|
|
22
22
|
- [Pipeline passo a passo](#pipeline-passo-a-passo)
|
|
23
|
+
- [Brownfield: assumir aplicação existente](#brownfield-assumir-aplicação-existente)
|
|
23
24
|
- [Commands disponíveis](#commands-disponíveis)
|
|
24
25
|
- [Agents especializados](#agents-especializados)
|
|
25
26
|
- [Backends plugáveis (adapters)](#backends-plugáveis-adapters)
|
|
@@ -39,6 +40,7 @@ de código.
|
|
|
39
40
|
**Use-cases cobertos**:
|
|
40
41
|
- Bootstrap de projeto novo (define stack + arquitetura + primeiras features)
|
|
41
42
|
- Features novas em projeto existente (merge aditivo em docs cross-feature)
|
|
43
|
+
- **Brownfield**: assumir aplicação existente — `/sfw-onboard` lê o código e gera a base documental (ver [seção dedicada](#brownfield-assumir-aplicação-existente))
|
|
42
44
|
- Bugs e tasks técnicas (mesmo pipeline, escopo menor)
|
|
43
45
|
- Times multi-dev (contratos firmes via `specs/` + `projetos.yaml`)
|
|
44
46
|
|
|
@@ -175,6 +177,48 @@ ausência/presença de `docs/`.
|
|
|
175
177
|
[`apresentacao.html`](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
|
|
176
178
|
pra ver o fluxo completo com personas, artefatos e adapters.
|
|
177
179
|
|
|
180
|
+
## Brownfield: assumir aplicação existente
|
|
181
|
+
|
|
182
|
+
Para projetos que **já existem** e não nasceram com SFW. O `/sfw-onboard` lê o
|
|
183
|
+
código, identifica stack/padrões/decisões observadas, e popula a base documental
|
|
184
|
+
(TRD + `docs/` + `projetos.yaml`) sem PRD.
|
|
185
|
+
|
|
186
|
+
**Filosofia**: cartógrafo, não arquiteto. Descreve o que existe sem julgar.
|
|
187
|
+
Coders de features futuras **seguem** os padrões observados — mudanças entram
|
|
188
|
+
como features propostas pelo dev.
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# 1. Criar shell SFW vazio (mesma instalação)
|
|
192
|
+
spec-first-claude init --name=MeuProjeto
|
|
193
|
+
cd MeuProjeto
|
|
194
|
+
|
|
195
|
+
# 2. Onboardar repo existente (pré-req: SSH/PAT já configurado)
|
|
196
|
+
/sfw-onboard https://github.com/empresa/app-legado.git
|
|
197
|
+
|
|
198
|
+
# 3. (Multi-repo) Re-rodar pra cada repo do mesmo projeto
|
|
199
|
+
/sfw-onboard https://github.com/empresa/app-legado-web.git
|
|
200
|
+
/sfw-onboard https://github.com/empresa/app-legado-worker.git
|
|
201
|
+
|
|
202
|
+
# 4. Começar features novas com o pipeline normal
|
|
203
|
+
/sfw-start feat_nova_funcionalidade
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**O que é gerado**:
|
|
207
|
+
- `projetos/<repo>/` — clone(s) com `.git` próprio
|
|
208
|
+
- `workspace/Output/onboard_<repo>/TRD.md` — completo, com §1.6 Padrões Observados (snippets reais)
|
|
209
|
+
- `workspace/Input/onboard_<repo>/code-snapshot.md` — índice + hashes (re-onboard incremental)
|
|
210
|
+
- `docs/` — 5 arquivos cross-feature populados
|
|
211
|
+
- `projetos.yaml` — entries dos repos clonados
|
|
212
|
+
- `docs/decisions.md` — ADRs **inferidas** com flag `Inferido: true` (dev revisa e remove flag ao confirmar)
|
|
213
|
+
|
|
214
|
+
**Re-onboard** quando o código legado evolui: rodar de novo, hash detecta arquivos
|
|
215
|
+
modificados, merge aditivo no TRD.
|
|
216
|
+
|
|
217
|
+
**Diferença vs `/sfw-start`**: brownfield NÃO gera PRD nem ambiguidades (código é
|
|
218
|
+
a verdade), não tem checkpoint humano, e auto-aprova TRD. Após onboard, features
|
|
219
|
+
novas entram pelo `/sfw-start` normal — `first_run` da feature já será `false`
|
|
220
|
+
porque `docs/` existe.
|
|
221
|
+
|
|
178
222
|
## Commands disponíveis
|
|
179
223
|
|
|
180
224
|
| Command | Tipo | Função |
|
|
@@ -183,6 +227,7 @@ pra ver o fluxo completo com personas, artefatos e adapters.
|
|
|
183
227
|
| `/load <scope>` | Utilitária | Puxa Input do backend (incremental via hash) |
|
|
184
228
|
| `/publish <scope> <tipo>` | Utilitária | Publica PRD/TRD/Progresso nos targets. Auto-chamada por extract/plan |
|
|
185
229
|
| `/sfw-start <scope>` | Orquestrador | Entrada única. Cria `.context.md`, chama `/load` + `/discovery` + `/extract` |
|
|
230
|
+
| `/sfw-onboard <git-url>` | Atômica | **Brownfield**. Clona repo existente, gera TRD + docs/ + projetos.yaml (sem PRD) |
|
|
186
231
|
| `/discovery <path>` | Atômica | Análise profunda prévia dos insumos (obrigatório em v4) |
|
|
187
232
|
| `/extract <scope>` | Atômica | Gera PRD e/ou TRD conforme conteúdo dos insumos |
|
|
188
233
|
| `/design <scope>` | Atômica | PRD+TRD aprovados → `specs/`. First-run também cria `docs/` + `projetos.yaml` |
|
package/bin/cli.js
CHANGED
package/package.json
CHANGED
|
@@ -8,6 +8,50 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 0.8.0-beta.1 (2026-05-11) — Brownfield onboarding
|
|
12
|
+
|
|
13
|
+
Skill nova `/sfw-onboard` pra assumir aplicações **já existentes**. Lê o
|
|
14
|
+
código, gera TRD + `docs/` + `projetos.yaml` sem PRD. Cartógrafo descritivo —
|
|
15
|
+
mapeia stack, padrões e decisões observadas sem julgar.
|
|
16
|
+
|
|
17
|
+
### Adicionado
|
|
18
|
+
|
|
19
|
+
- **`/sfw-onboard <git-url> [--branch=X] [--tag=Y] [--name=Z]`** — skill atômica:
|
|
20
|
+
- Clone em `projetos/<repo>/` (auth via SSH/PAT do user)
|
|
21
|
+
- Snapshot rastreável em `workspace/Input/onboard_<repo>/code-snapshot.md` (hashes SHA-256)
|
|
22
|
+
- 7 readers paralelos: DB, Backend, Frontend, Infra, Dependency, Security, Patterns
|
|
23
|
+
- Analyzer (Opus) consolida → TRD + `docs/` 5-arquivos + `projetos.yaml`
|
|
24
|
+
- Multi-repo via re-execução com mesmo `--name`
|
|
25
|
+
- Re-onboard incremental (NOVO/MODIFICADO/INALTERADO via hash)
|
|
26
|
+
- Sem ambiguidades — código resolve tudo
|
|
27
|
+
- `trd_aprovado=true` automático
|
|
28
|
+
- **TRD §1.6 Padrões Observados** — nova seção obrigatória em onboard:
|
|
29
|
+
estrutura de pastas, naming, error handling, validação, testes, logging,
|
|
30
|
+
divergências internas. Com snippets reais do código (arquivo:linha).
|
|
31
|
+
Coders de features futuras leem antes de implementar.
|
|
32
|
+
- **ADRs inferidas** em `docs/decisions.md` — flag `Inferido: true` distingue
|
|
33
|
+
decisão observada (cartógrafo) de decisão tomada em discussão. Dev remove
|
|
34
|
+
flag ao confirmar.
|
|
35
|
+
- **`.context.md` campo `tipo`** — `scope` (pipeline normal) vs `onboard`
|
|
36
|
+
(brownfield). Campos novos: `repo_url`, `repo_branch`, `repo_path`.
|
|
37
|
+
- **Fluxo de status alternativo** para onboarding:
|
|
38
|
+
`not_started → cloned → analyzing → done`.
|
|
39
|
+
|
|
40
|
+
### Filosofia
|
|
41
|
+
|
|
42
|
+
- **Cartógrafo, não arquiteto**: descreve o que existe sem julgar.
|
|
43
|
+
- **Coders SEGUEM padrões observados** — propostas de mudança entram como
|
|
44
|
+
features explícitas do dev.
|
|
45
|
+
- **Não há checkpoint humano** em onboard — código é a verdade.
|
|
46
|
+
|
|
47
|
+
### Migração
|
|
48
|
+
|
|
49
|
+
Não-breaking. Projetos existentes em `0.7.0` continuam funcionando sem mudança.
|
|
50
|
+
Skill nova adicionada ao roster. Templates de `TRD.md`, `decisions.md` e
|
|
51
|
+
`.context.md` ganharam campos opcionais.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
11
55
|
## 0.7.0 (2026-04-14) — Redesign v4 estável
|
|
12
56
|
|
|
13
57
|
Promoção de `0.7.0-beta.1` para versão estável. Inclui fix crítico:
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# /sfw-onboard $ARGUMENTS
|
|
2
|
+
|
|
3
|
+
Skill atômica de **brownfield onboarding**. Clona um repositório existente em
|
|
4
|
+
`projetos/`, lê o código e gera **TRD + `docs/` + `projetos.yaml`** sem PRD.
|
|
5
|
+
|
|
6
|
+
**Filosofia**: cartógrafo, não arquiteto. Mapeia stack, padrões e uso sem julgar.
|
|
7
|
+
Coders futuros SEGUEM o que já existe — propostas de mudança entram como
|
|
8
|
+
features explícitas do dev.
|
|
9
|
+
|
|
10
|
+
## Argumento
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/sfw-onboard <git-url> [--branch=<branch>] [--tag=<tag>] [--name=<scope-name>]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
| Param | Default | Descrição |
|
|
17
|
+
|-------|---------|-----------|
|
|
18
|
+
| `<git-url>` | (obrigatório) | URL git clonável (https/ssh). Auth é pré-req do user (SSH key/PAT configurado) |
|
|
19
|
+
| `--branch` | `main` | Branch a clonar |
|
|
20
|
+
| `--tag` | — | Tag específica (mutuamente exclusivo com `--branch`) |
|
|
21
|
+
| `--name` | inferido do URL | Nome do scope. Default: `onboard_<repo-name>` |
|
|
22
|
+
|
|
23
|
+
**Multi-repo** (poly-repo): re-executar a skill N vezes, uma por repo. Cada
|
|
24
|
+
execução adiciona uma entry em `projetos.yaml` e merge aditivo no TRD.
|
|
25
|
+
|
|
26
|
+
## Multi-agent
|
|
27
|
+
|
|
28
|
+
| Agente | Modelo | Papel |
|
|
29
|
+
|--------|--------|-------|
|
|
30
|
+
| **DB Reader** | Sonnet | Lê migrations, schemas, ORMs → fragmento §Área-DB |
|
|
31
|
+
| **Backend Reader** | Sonnet | Lê routes/controllers/services → fragmento §Área-Backend + §6 Integrações |
|
|
32
|
+
| **Frontend Reader** | Sonnet | Lê rotas, componentes, state → fragmento §Área-Frontend |
|
|
33
|
+
| **Infra Reader** | Sonnet | Lê Dockerfile, CI/CD, k8s, configs → fragmento §Área-Infra |
|
|
34
|
+
| **Dependency Reader** | Sonnet | Lê package.json / *.csproj / pom.xml / go.mod → fragmento §1.1 Stack |
|
|
35
|
+
| **Security Reader** | Sonnet | Lê auth/authz/secrets/headers → fragmento §7 Segurança |
|
|
36
|
+
| **Patterns Reader** | Sonnet | Identifica padrões observados (estrutura, naming, error handling, validação, testes, logging) → fragmento §1.6 |
|
|
37
|
+
| **Analyzer** | Opus | Consolida TODOS fragmentos → TRD completo + `docs/` + `projetos.yaml` |
|
|
38
|
+
|
|
39
|
+
## Pré-condições
|
|
40
|
+
|
|
41
|
+
| # | Validação | Se falhar |
|
|
42
|
+
|---|-----------|-----------|
|
|
43
|
+
| 1 | `<git-url>` informado | Parar → "Informe a URL do repositório. Ex: /sfw-onboard https://github.com/org/app.git" |
|
|
44
|
+
| 2 | `git` instalado no PATH | Parar → "Git não encontrado no PATH" |
|
|
45
|
+
| 3 | URL acessível (auth do user) | Parar → "Falha ao clonar. Configure SSH/PAT antes de rodar /sfw-onboard" |
|
|
46
|
+
| 4 | `--branch` e `--tag` não usados juntos | Parar → "Use --branch OU --tag, não ambos" |
|
|
47
|
+
| 5 | Scope `onboard_<repo>` não está em `analyzing` | Se sim → "Onboarding anterior incompleto. Rode novamente pra retomar" |
|
|
48
|
+
|
|
49
|
+
## Passos
|
|
50
|
+
|
|
51
|
+
### 1. Resolver nome do scope e path
|
|
52
|
+
|
|
53
|
+
- `<repo-name>` = último segmento da URL sem `.git`
|
|
54
|
+
- Ex: `https://github.com/org/app-legado.git` → `app-legado`
|
|
55
|
+
- `scope = --name || "onboard_<repo-name>"`
|
|
56
|
+
- `path = "projetos/<repo-name>"`
|
|
57
|
+
|
|
58
|
+
Se `--branch` ausente e `--tag` ausente → branch = `main`.
|
|
59
|
+
|
|
60
|
+
### 2. Detectar re-onboard
|
|
61
|
+
|
|
62
|
+
| Condição | Comportamento |
|
|
63
|
+
|----------|---------------|
|
|
64
|
+
| `workspace/Output/<scope>/.context.md` não existe | **Primeira vez** — criar tudo do zero |
|
|
65
|
+
| `.context.md` existe com tipo=onboard | **Re-onboard** — pull no clone existente, merge aditivo |
|
|
66
|
+
| `.context.md` existe com tipo≠onboard | Parar → "Scope <scope> já é usado por pipeline normal. Use --name pra dar outro nome" |
|
|
67
|
+
|
|
68
|
+
### 3. Clonar / atualizar o repositório
|
|
69
|
+
|
|
70
|
+
**Primeira vez**:
|
|
71
|
+
```bash
|
|
72
|
+
git clone --branch <branch> <git-url> projetos/<repo-name>
|
|
73
|
+
# OU se --tag:
|
|
74
|
+
git clone --depth 1 --branch <tag> <git-url> projetos/<repo-name>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Re-onboard**:
|
|
78
|
+
```bash
|
|
79
|
+
cd projetos/<repo-name>
|
|
80
|
+
git fetch
|
|
81
|
+
git checkout <branch-ou-tag>
|
|
82
|
+
git pull --ff-only
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Capturar `commit_hash` resultante (`git rev-parse HEAD`) — vai pro snapshot.
|
|
86
|
+
|
|
87
|
+
### 4. Criar `.context.md`
|
|
88
|
+
|
|
89
|
+
```yaml
|
|
90
|
+
---
|
|
91
|
+
nome: "<scope>"
|
|
92
|
+
tipo: "onboard"
|
|
93
|
+
first_run: true
|
|
94
|
+
prd_existe: false
|
|
95
|
+
trd_existe: false
|
|
96
|
+
prd_aprovado: false
|
|
97
|
+
trd_aprovado: false
|
|
98
|
+
areas_tocadas: []
|
|
99
|
+
input_path: "workspace/Input/<scope>/"
|
|
100
|
+
repo_url: "<git-url>"
|
|
101
|
+
repo_branch: "<branch-ou-tag>"
|
|
102
|
+
repo_path: "projetos/<repo-name>"
|
|
103
|
+
status: "cloned"
|
|
104
|
+
ultima_skill: "/sfw-onboard"
|
|
105
|
+
atualizado_em: "<ISO_DATETIME>"
|
|
106
|
+
---
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 5. Gerar snapshot rastreável
|
|
110
|
+
|
|
111
|
+
Criar `workspace/Input/<scope>/code-snapshot.md`:
|
|
112
|
+
|
|
113
|
+
```markdown
|
|
114
|
+
# Code Snapshot — <repo-name>
|
|
115
|
+
|
|
116
|
+
**Repo**: <git-url>
|
|
117
|
+
**Branch/Tag**: <branch-ou-tag>
|
|
118
|
+
**Commit**: <commit_hash>
|
|
119
|
+
**Onboard em**: <ISO_DATETIME>
|
|
120
|
+
|
|
121
|
+
## Arquivos lidos
|
|
122
|
+
|
|
123
|
+
| Arquivo | Hash | Tipo | Classificação | Lido por |
|
|
124
|
+
|---------|------|------|---------------|----------|
|
|
125
|
+
| `package.json` | a3f29c1d | dependency | NOVO | Dependency Reader |
|
|
126
|
+
| `src/api/UserController.cs` | b8e221f0 | source | NOVO | Backend Reader, Patterns Reader |
|
|
127
|
+
| ... | | | | |
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Regras**:
|
|
131
|
+
- Hash SHA-256 truncado em 8 chars
|
|
132
|
+
- Classificação: NOVO / MODIFICADO / INALTERADO (vs snapshot anterior)
|
|
133
|
+
- Re-onboard: append nova seção `## Snapshot N — <ISO_DATETIME>` (append-only)
|
|
134
|
+
- Ignorar: `node_modules/`, `bin/`, `obj/`, `dist/`, `build/`, `.git/`, `vendor/`, `target/`, lock files binários
|
|
135
|
+
|
|
136
|
+
### 6. Atualizar status → analyzing
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
status: "analyzing"
|
|
140
|
+
atualizado_em: "<ISO_DATETIME>"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 7. Disparar readers em paralelo
|
|
144
|
+
|
|
145
|
+
Cada Reader recebe:
|
|
146
|
+
- Path do clone: `projetos/<repo-name>/`
|
|
147
|
+
- Lista de arquivos relevantes pra área (pre-filtrado por glob)
|
|
148
|
+
- Snapshot anterior (se re-onboard) pra detectar MODIFICADO
|
|
149
|
+
|
|
150
|
+
| Reader | Globs (exemplos) | Output |
|
|
151
|
+
|--------|------------------|--------|
|
|
152
|
+
| **Dependency** | `package.json`, `*.csproj`, `pom.xml`, `go.mod`, `requirements.txt`, `Pipfile`, `Gemfile`, `composer.json` | Linguagem, framework, versões, libs principais |
|
|
153
|
+
| **DB** | `**/migrations/**`, `**/Migrations/**`, `**/*.sql`, `**/schema.prisma`, `**/models/**`, `**/Entities/**` | Tabelas, colunas, índices, FKs, ORM detectado |
|
|
154
|
+
| **Backend** | `**/Controllers/**`, `**/routes/**`, `**/api/**`, `**/handlers/**`, `**/services/**`, `**/usecases/**` | Endpoints (método+rota+auth), services, integrações |
|
|
155
|
+
| **Frontend** | `**/pages/**`, `**/routes/**`, `**/components/**`, `**/store/**`, `**/hooks/**` | Rotas, componentes, state lib, design system |
|
|
156
|
+
| **Infra** | `Dockerfile*`, `docker-compose*.yml`, `.github/workflows/**`, `.gitlab-ci.yml`, `**/*.tf`, `k8s/**`, `helm/**` | Containers, CI/CD, deploy, env vars esperadas |
|
|
157
|
+
| **Security** | `**/*auth*`, `**/*authz*`, `**/*middleware*`, `**/*.env.example`, `.env*` (só nomes de var, nunca valores), config files | Mecanismo de auth, papéis, CORS, secrets management |
|
|
158
|
+
| **Patterns** | Mesmos do Backend + Frontend, amostragem representativa | Estrutura, naming, error handling, validação, testes, logging — com snippets reais |
|
|
159
|
+
|
|
160
|
+
**Cada Reader produz** um fragmento estruturado seguindo as seções correspondentes
|
|
161
|
+
do `TRD.template.md`. Não interpreta — só cataloga. Se algo está ambíguo entre
|
|
162
|
+
2 arquivos (ex: 2 padrões diferentes de error handling), Reader reporta **ambos
|
|
163
|
+
com contagem** ("X em 12 arquivos, Y em 3"). Analyzer decide o dominante depois.
|
|
164
|
+
|
|
165
|
+
### 8. Analyzer consolida (Opus)
|
|
166
|
+
|
|
167
|
+
Recebe todos fragmentos. Gera:
|
|
168
|
+
|
|
169
|
+
#### 8.1 `workspace/Output/<scope>/TRD.md`
|
|
170
|
+
|
|
171
|
+
Seguindo `templates/feature/TRD.template.md`:
|
|
172
|
+
|
|
173
|
+
- **§1 §Sistema** (GATE=SIM sempre)
|
|
174
|
+
- §1.1 Stack (do Dependency Reader)
|
|
175
|
+
- §1.2 Arquitetura C4 (inferida da estrutura de pastas + dependências)
|
|
176
|
+
- §1.3 Ambientes (do Infra Reader)
|
|
177
|
+
- §1.4 Deploy (do Infra Reader)
|
|
178
|
+
- §1.5 Segurança baseline (do Security Reader)
|
|
179
|
+
- **§1.6 Padrões Observados** (do Patterns Reader — OBRIGATÓRIO em onboard)
|
|
180
|
+
- **§2-§5 §Áreas** — GATE=SIM para áreas que existem no código, GATE=NÃO pras ausentes
|
|
181
|
+
- **§6 Integrações Externas** (do Backend Reader)
|
|
182
|
+
- **§7 Segurança Detalhada** (do Security Reader)
|
|
183
|
+
- **§8 Estratégia de Testes** (do Patterns Reader)
|
|
184
|
+
- **§9 Decisões Técnicas (ADRs)** — gerar ADRs **inferidas** com flag `Inferido: true`
|
|
185
|
+
- **§10 Ambiguidades** — VAZIA em onboard (código resolve tudo)
|
|
186
|
+
- **§11 Rastreabilidade** — citar arquivo:linha por seção
|
|
187
|
+
|
|
188
|
+
**Regras absolutas do Analyzer em onboard**:
|
|
189
|
+
- ❌ **NUNCA** marcar ambiguidade. Se 2 padrões divergem, escolher o **mais frequente**
|
|
190
|
+
e documentar a divergência em §1.6.7 sem julgar.
|
|
191
|
+
- ❌ **NUNCA** sugerir mudanças, "melhorias" ou best practices.
|
|
192
|
+
- ❌ **NUNCA** usar linguagem prescritiva ("deveria", "recomendado"). Sempre descritiva ("usa", "implementa").
|
|
193
|
+
- ✅ Citar arquivo:linha em snippets de §1.6.
|
|
194
|
+
|
|
195
|
+
#### 8.2 `docs/` (5 arquivos cross-feature)
|
|
196
|
+
|
|
197
|
+
Gerar todos os 5 a partir do TRD recém-gerado, seguindo templates de `estrutura/`:
|
|
198
|
+
|
|
199
|
+
| Arquivo | Origem |
|
|
200
|
+
|---------|--------|
|
|
201
|
+
| `docs/architecture.md` | TRD §1.1 + §1.2 + §1.3 + §1.4 |
|
|
202
|
+
| `docs/domain.md` | TRD §Área-DB + visão de negócio inferida da nomenclatura |
|
|
203
|
+
| `docs/conventions.md` | TRD §1.6 + §7 + §8 |
|
|
204
|
+
| `docs/apiContracts.md` | TRD §2.1 + §6 |
|
|
205
|
+
| `docs/decisions.md` | TRD §9 (todas ADRs com flag `Inferido: true`) |
|
|
206
|
+
|
|
207
|
+
Cada arquivo gerado tem changelog inicial:
|
|
208
|
+
```markdown
|
|
209
|
+
| <DATA> | onboard_<repo> | INICIAL | Gerado por /sfw-onboard a partir do código existente |
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
#### 8.3 `projetos.yaml`
|
|
213
|
+
|
|
214
|
+
Popular com o repo clonado:
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
org: "<org-inferida-do-url>"
|
|
218
|
+
project: "<nome-do-projeto>"
|
|
219
|
+
|
|
220
|
+
repos:
|
|
221
|
+
<nome-curto>:
|
|
222
|
+
repo: "<org>/<repo-name>"
|
|
223
|
+
path: "projetos/<repo-name>"
|
|
224
|
+
existing: true # SEMPRE true em onboard
|
|
225
|
+
areas: [<áreas-detectadas>] # do Analyzer baseado nos GATEs do TRD
|
|
226
|
+
stack: "<stack>" # do TRD §1.1
|
|
227
|
+
branch_prefix: "feature/" # ou detectar convenção do repo
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Se já existe `projetos.yaml` (re-onboard ou multi-repo) → **merge aditivo**:
|
|
231
|
+
adiciona novo repo, não sobrescreve outros.
|
|
232
|
+
|
|
233
|
+
### 9. Detecção de monorepo (opcional)
|
|
234
|
+
|
|
235
|
+
Se o repo clonado contém múltiplos `package.json` / `pom.xml` / `*.csproj` em
|
|
236
|
+
subdirs (não na raiz), pode ser monorepo. Comportamento:
|
|
237
|
+
|
|
238
|
+
- Cada subprojeto identificado vira uma entry em `projetos.yaml`
|
|
239
|
+
- Mesma URL git, paths diferentes (`projetos/<repo>/services/api`, `projetos/<repo>/web`)
|
|
240
|
+
- TRD documenta arquitetura geral em §1.2
|
|
241
|
+
|
|
242
|
+
### 10. Atualizar `.context.md` → done
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
status: "done"
|
|
246
|
+
prd_existe: false
|
|
247
|
+
trd_existe: true
|
|
248
|
+
prd_aprovado: false # n/a — sempre false em onboard
|
|
249
|
+
trd_aprovado: true # SEMPRE true em onboard (código é a verdade)
|
|
250
|
+
areas_tocadas: [<áreas-com-GATE=SIM>]
|
|
251
|
+
ultima_skill: "/sfw-onboard"
|
|
252
|
+
atualizado_em: "<ISO_DATETIME>"
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 11. Auto-publish (se `sfw.config.yml` configurado)
|
|
256
|
+
|
|
257
|
+
Se `sfw.config.yml` existe:
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
/publish <scope> TRD
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
(Não publica PRD — não existe. Não publica Progresso — não há /plan em onboarding.)
|
|
264
|
+
|
|
265
|
+
> **Nota**: `docs/` é local-only por design (ver `.claude/commands/publish.md`).
|
|
266
|
+
> Se quiser publicar no Confluence, copiar manualmente ou aguardar feature futura.
|
|
267
|
+
|
|
268
|
+
### 12. Saída obrigatória
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
/sfw-onboard — completo
|
|
272
|
+
|
|
273
|
+
Repo: <git-url> (<branch-ou-tag> @ <commit-hash>)
|
|
274
|
+
Clone: projetos/<repo-name>
|
|
275
|
+
|
|
276
|
+
Artefatos gerados:
|
|
277
|
+
- workspace/Output/<scope>/TRD.md
|
|
278
|
+
- workspace/Output/<scope>/.context.md
|
|
279
|
+
- workspace/Input/<scope>/code-snapshot.md
|
|
280
|
+
- docs/architecture.md
|
|
281
|
+
- docs/domain.md
|
|
282
|
+
- docs/conventions.md
|
|
283
|
+
- docs/apiContracts.md
|
|
284
|
+
- docs/decisions.md (<N> ADRs inferidas)
|
|
285
|
+
- projetos.yaml (entry: <nome-curto>)
|
|
286
|
+
|
|
287
|
+
Áreas detectadas: BACK, FRONT, DB, INFRA (conforme TRD)
|
|
288
|
+
Padrões observados: ver TRD §1.6 (<N> categorias)
|
|
289
|
+
ADRs inferidas: <N> (revisar e remover flag `Inferido` ao confirmar)
|
|
290
|
+
|
|
291
|
+
Próximos passos:
|
|
292
|
+
1. [dev] Revisar workspace/Output/<scope>/TRD.md
|
|
293
|
+
- Especialmente §1.6 Padrões Observados (coders vão seguir)
|
|
294
|
+
- §9 ADRs inferidas (confirmar ou ajustar; remover flag `Inferido` ao validar)
|
|
295
|
+
2. [dev] Revisar docs/ (5 arquivos)
|
|
296
|
+
3. Para onboardar outro repo do mesmo projeto: /sfw-onboard <outra-url>
|
|
297
|
+
4. Para começar feature nova: /sfw-start feat_<nome>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Re-onboard
|
|
301
|
+
|
|
302
|
+
Quando o código legado evolui e quer atualizar a base documental:
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
/sfw-onboard <mesma-url> [--branch=<outra>]
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Skill detecta `tipo=onboard` no `.context.md` existente e:
|
|
309
|
+
1. `git pull` no clone
|
|
310
|
+
2. Snapshot novo com classificação NOVO/MODIFICADO/INALTERADO
|
|
311
|
+
3. Readers reprocessam **apenas arquivos MODIFICADOS ou NOVOS**
|
|
312
|
+
4. Analyzer faz **merge aditivo** no TRD existente
|
|
313
|
+
5. `docs/` atualizado com changelog `re-onboard <DATA>`
|
|
314
|
+
6. `projetos.yaml` inalterado (mesmo repo)
|
|
315
|
+
|
|
316
|
+
## Multi-repo
|
|
317
|
+
|
|
318
|
+
App = N repos (api, web, worker). Rodar a skill N vezes:
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
/sfw-onboard https://github.com/org/app-api.git --name=onboard_app
|
|
322
|
+
/sfw-onboard https://github.com/org/app-web.git --name=onboard_app
|
|
323
|
+
/sfw-onboard https://github.com/org/app-worker.git --name=onboard_app
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Mesmo `--name` → mesmo `.context.md`, mesmo TRD (merge aditivo), `projetos.yaml`
|
|
327
|
+
recebe 3 entries. Áreas distribuídas: api=[BACK,DB], web=[FRONT], worker=[BACK].
|
|
328
|
+
|
|
329
|
+
Se `--name` diferentes → scopes separados (raro, mas suportado).
|
|
330
|
+
|
|
331
|
+
## Erros
|
|
332
|
+
|
|
333
|
+
| Erro | Ação |
|
|
334
|
+
|------|------|
|
|
335
|
+
| URL não acessível | Parar, sugerir checar SSH/PAT |
|
|
336
|
+
| Repo vazio | Parar — "Nada a onboardar" |
|
|
337
|
+
| Nenhum reader produziu fragmento (stack desconhecida) | Parar — "Stack não reconhecida. Detalhe TRD manualmente ou peça suporte" |
|
|
338
|
+
| `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" |
|
|
339
|
+
| `sfw.config.yml` aponta backend mas /publish falhou | Reportar warning, manter artefatos locais |
|
|
340
|
+
|
|
341
|
+
## Diferença vs `/sfw-start`
|
|
342
|
+
|
|
343
|
+
| Aspecto | `/sfw-start` | `/sfw-onboard` |
|
|
344
|
+
|---------|--------------|----------------|
|
|
345
|
+
| Entrada | Insumos brutos do PM em `workspace/Input/` | URL git de código existente |
|
|
346
|
+
| Gera PRD? | Sim (se insumos têm produto) | Não |
|
|
347
|
+
| Gera TRD? | Sim (após aprovação) | Sim (auto-aprovado) |
|
|
348
|
+
| Gera `docs/`? | No `/design` (first-run) | Diretamente |
|
|
349
|
+
| Gera `projetos.yaml`? | No `/design` (first-run) | Diretamente |
|
|
350
|
+
| Ambiguidades? | Sim (PRD §12, TRD §10) | Não (código resolve) |
|
|
351
|
+
| Checkpoint humano? | Sim (PM + dev) | Não (one-shot) |
|
|
352
|
+
| Filosofia | Design upfront | Cartógrafo descritivo |
|
|
353
|
+
|
|
354
|
+
## Notas
|
|
355
|
+
|
|
356
|
+
- `/sfw-onboard` é **ortogonal** ao pipeline `/sfw-start`. Não chama discovery/extract/design.
|
|
357
|
+
- Após `/sfw-onboard`, qualquer feature nova entra pelo `/sfw-start feat_<nome>` normal — `first_run` da feature será `false` porque `docs/` já existe.
|
|
358
|
+
- Coder de feature futura **DEVE** ler TRD §1.6 Padrões Observados antes de implementar.
|
|
359
|
+
- Re-onboard NÃO atualiza `specs/` de features já desenvolvidas (são imutáveis pós-`/dev`).
|
|
@@ -37,31 +37,22 @@ REGRAS:
|
|
|
37
37
|
- Toda mudança de stack, banco, framework DEVE ter registro aqui
|
|
38
38
|
- Decisões são APPEND-ONLY — histórico importa
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
- Refactor sem mudança de interface
|
|
40
|
+
ADRs INFERIDOS (origem /sfw-onboard de projeto brownfield):
|
|
41
|
+
- Quando o /sfw-onboard cria a documentação a partir de código existente, gera
|
|
42
|
+
ADRs descrevendo decisões OBSERVADAS no código (não tomadas em discussão).
|
|
43
|
+
- Cada ADR inferida tem flag `inferido: true` no início do bloco.
|
|
44
|
+
- Texto descritivo, NÃO prescritivo: "Projeto usa PostgreSQL com JSONB pra X"
|
|
45
|
+
(não "decidimos usar"). Cartógrafo, não arquiteto.
|
|
46
|
+
- Campo "Contexto" descreve o que o código revela. Campo "Alternativas" pode
|
|
47
|
+
ficar vazio ou listar "—" — não tem como saber o que foi descartado.
|
|
48
|
+
- Quando dev revisa e confirma/edita o ADR inferido, REMOVE a flag `inferido`.
|
|
49
|
+
- ADRs inferidos podem ser substituídos por novas ADRs (de features futuras)
|
|
50
|
+
como qualquer outro — flag não afeta imutabilidade.
|
|
52
51
|
|
|
53
52
|
=============================================================================
|
|
54
53
|
-->
|
|
55
54
|
|
|
56
|
-
##
|
|
57
|
-
|
|
58
|
-
| ADR | Título | Status | Data |
|
|
59
|
-
|-----|--------|--------|------|
|
|
60
|
-
| ADR-001 | {{Título}} | proposta / aceita / substituída / descartada | |
|
|
61
|
-
|
|
62
|
-
## Formato
|
|
63
|
-
|
|
64
|
-
Cada decisão segue este modelo:
|
|
55
|
+
## Formato — ADR normal
|
|
65
56
|
|
|
66
57
|
```markdown
|
|
67
58
|
### ADR-NNN: Título da Decisão
|
|
@@ -71,19 +62,61 @@ Cada decisão segue este modelo:
|
|
|
71
62
|
- **Decisão**: O que decidimos?
|
|
72
63
|
- **Alternativas consideradas**:
|
|
73
64
|
1. Alternativa A — rejeitada porque...
|
|
74
|
-
2. Alternativa B — rejeitada porque...
|
|
75
65
|
- **Consequências**:
|
|
76
66
|
- Positivas: ...
|
|
77
67
|
- Negativas: ...
|
|
78
68
|
- Riscos: ...
|
|
79
69
|
```
|
|
80
70
|
|
|
71
|
+
## Formato — ADR inferida (origem brownfield)
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
### ADR-NNN: Título descritivo do padrão observado
|
|
75
|
+
- **Status**: aceita
|
|
76
|
+
- **Inferido**: true <!-- remover este campo após dev revisar e confirmar -->
|
|
77
|
+
- **Data**: YYYY-MM-DD (data do onboarding)
|
|
78
|
+
- **Contexto**: O que o código revela sobre o cenário (não "decidimos" — "projeto usa")
|
|
79
|
+
- **Decisão**: Padrão observado no código + onde ver (arquivo:linha)
|
|
80
|
+
- **Alternativas consideradas**:
|
|
81
|
+
1. — (não inferível a partir do código)
|
|
82
|
+
- **Consequências**:
|
|
83
|
+
- Observadas: efeitos visíveis do padrão no código atual
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
<!--
|
|
87
|
+
=============================================================================
|
|
88
|
+
INSTRUÇÕES PARA O AGENTE — continuação
|
|
89
|
+
=============================================================================
|
|
90
|
+
|
|
91
|
+
QUANDO CRIAR:
|
|
92
|
+
- Escolha de tecnologia/framework (em first-run, alimenta a seção inicial)
|
|
93
|
+
- Mudança de padrão de design (feature que introduz)
|
|
94
|
+
- Decisão de infra (cloud provider, DB engine)
|
|
95
|
+
- Trade-off significativo (performance vs simplicidade, etc.)
|
|
96
|
+
- /merge-docs detecta §11 ADDED com impacto arquitetural
|
|
97
|
+
|
|
98
|
+
QUANDO NÃO CRIAR:
|
|
99
|
+
- Escolha de nome de variável
|
|
100
|
+
- Implementação seguindo padrão já definido
|
|
101
|
+
- Bug fix
|
|
102
|
+
- Refactor sem mudança de interface
|
|
103
|
+
|
|
104
|
+
=============================================================================
|
|
105
|
+
-->
|
|
106
|
+
|
|
107
|
+
## Índice
|
|
108
|
+
|
|
109
|
+
| ADR | Título | Status | Inferido | Data |
|
|
110
|
+
|-----|--------|--------|----------|------|
|
|
111
|
+
| ADR-001 | {{Título}} | proposta / aceita / substituída / descartada | sim/não | |
|
|
112
|
+
|
|
81
113
|
---
|
|
82
114
|
|
|
83
115
|
## Decisões
|
|
84
116
|
|
|
85
117
|
### ADR-001: {{Título}}
|
|
86
118
|
- **Status**: aceita
|
|
119
|
+
- **Inferido**: <!-- true se veio do /sfw-onboard; omitir após dev revisar -->
|
|
87
120
|
- **Data**:
|
|
88
121
|
- **Contexto**:
|
|
89
122
|
- **Decisão**:
|
|
@@ -126,6 +126,98 @@ RE-GERAÇÃO:
|
|
|
126
126
|
- TLS: <!-- versão mínima -->
|
|
127
127
|
- Secrets: <!-- onde e como -->
|
|
128
128
|
|
|
129
|
+
### 1.6 Padrões Observados
|
|
130
|
+
|
|
131
|
+
> **Obrigatório quando `tipo: onboard` em `.context.md`**. Em scopes normais é opcional
|
|
132
|
+
> — preenchido apenas se o time já tem convenções tribais não documentadas em `docs/conventions.md`.
|
|
133
|
+
> Coders de features futuras consultam ESTA seção antes de implementar — devem
|
|
134
|
+
> SEGUIR os padrões existentes, não propor mudanças.
|
|
135
|
+
>
|
|
136
|
+
> **Snippets reais do código** (não pseudo-código). Cite arquivo+linha quando aplicável.
|
|
137
|
+
> Quando padrões divergem internamente, documente o **mais frequente** como padrão
|
|
138
|
+
> e cite divergências sem julgar (ex: "3 controllers seguem X, 1 segue Y").
|
|
139
|
+
|
|
140
|
+
#### 1.6.1 Estrutura de pastas
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
<!-- snippet real do tree -->
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
| Camada | Onde mora | Convenção de nome |
|
|
147
|
+
|--------|-----------|-------------------|
|
|
148
|
+
| | | |
|
|
149
|
+
|
|
150
|
+
#### 1.6.2 Naming
|
|
151
|
+
|
|
152
|
+
| Tipo | Padrão observado | Exemplo do código |
|
|
153
|
+
|------|------------------|-------------------|
|
|
154
|
+
| Classe / módulo | | |
|
|
155
|
+
| Função / método | | |
|
|
156
|
+
| Arquivo | | |
|
|
157
|
+
| Variável | | |
|
|
158
|
+
| Constante | | |
|
|
159
|
+
|
|
160
|
+
#### 1.6.3 Error handling
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
<!-- snippet real mostrando como erros são tratados (try/catch, Result, exceptions, errors) -->
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
| Aspecto | Padrão | Onde ver |
|
|
167
|
+
|---------|--------|----------|
|
|
168
|
+
| Captura | | |
|
|
169
|
+
| Propagação | | |
|
|
170
|
+
| Resposta HTTP de erro | | |
|
|
171
|
+
| Logging do erro | | |
|
|
172
|
+
|
|
173
|
+
#### 1.6.4 Validação
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
<!-- snippet real de validação de input -->
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
| Camada | Como valida | Lib/framework |
|
|
180
|
+
|--------|-------------|---------------|
|
|
181
|
+
| HTTP | | |
|
|
182
|
+
| Domain | | |
|
|
183
|
+
| DB | | |
|
|
184
|
+
|
|
185
|
+
#### 1.6.5 Testes
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
<!-- snippet real de teste (nomenclatura, estrutura AAA/given-when-then) -->
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
| Aspecto | Padrão observado |
|
|
192
|
+
|---------|------------------|
|
|
193
|
+
| Framework | |
|
|
194
|
+
| Localização dos testes | |
|
|
195
|
+
| Naming dos arquivos de teste | |
|
|
196
|
+
| Naming dos métodos de teste | |
|
|
197
|
+
| Mock / stub | |
|
|
198
|
+
| Coverage observada | |
|
|
199
|
+
|
|
200
|
+
#### 1.6.6 Logging
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
<!-- snippet real de log estruturado -->
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| Aspecto | Padrão |
|
|
207
|
+
|---------|--------|
|
|
208
|
+
| Lib | |
|
|
209
|
+
| Níveis usados | |
|
|
210
|
+
| Formato (json/text) | |
|
|
211
|
+
| Campos padrão | |
|
|
212
|
+
|
|
213
|
+
#### 1.6.7 Divergências internas observadas
|
|
214
|
+
|
|
215
|
+
> Quando o código tem mais de um padrão pra mesma coisa. Sem julgar — apenas documentar.
|
|
216
|
+
|
|
217
|
+
| Tema | Padrão dominante | Divergência | Onde ver |
|
|
218
|
+
|------|------------------|-------------|----------|
|
|
219
|
+
| | | | |
|
|
220
|
+
|
|
129
221
|
---
|
|
130
222
|
|
|
131
223
|
## 2. §Área-Backend
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
nome: "{{NOME}}"
|
|
3
|
+
tipo: "{{scope|onboard}}"
|
|
3
4
|
first_run: {{true|false}}
|
|
4
5
|
prd_existe: {{true|false}}
|
|
5
6
|
trd_existe: {{true|false}}
|
|
@@ -7,6 +8,9 @@ prd_aprovado: {{true|false}}
|
|
|
7
8
|
trd_aprovado: {{true|false}}
|
|
8
9
|
areas_tocadas: []
|
|
9
10
|
input_path: "workspace/Input/{{NOME}}/"
|
|
11
|
+
repo_url: ""
|
|
12
|
+
repo_branch: ""
|
|
13
|
+
repo_path: ""
|
|
10
14
|
status: "not_started"
|
|
11
15
|
ultima_skill: ""
|
|
12
16
|
atualizado_em: ""
|
|
@@ -21,11 +25,16 @@ SCHEMA v4 (mudou de v3):
|
|
|
21
25
|
- prd_empty REMOVIDO (conceito obsoleto)
|
|
22
26
|
- prd_existe/trd_existe: bool reais (SEM aspas) indicando se /extract gerou cada doc
|
|
23
27
|
- prd_aprovado/trd_aprovado: bool reais (SEM aspas) controlando gate do /design
|
|
28
|
+
- tipo: discrimina scopes do pipeline normal vs onboarding (brownfield)
|
|
29
|
+
- repo_*: preenchidos só em scopes tipo "onboard"
|
|
24
30
|
|
|
25
31
|
CAMPOS:
|
|
26
|
-
- nome: identificador livre do scope (ex: app_barbearia, feat_login, infra_k8s
|
|
32
|
+
- nome: identificador livre do scope (ex: app_barbearia, feat_login, infra_k8s,
|
|
33
|
+
onboard_app_legado)
|
|
34
|
+
- tipo: "scope" (default — pipeline normal /sfw-start) ou "onboard" (brownfield
|
|
35
|
+
via /sfw-onboard — código já existe, ler e documentar sem PRD)
|
|
27
36
|
- first_run: bool — true se docs/ não existia quando /sfw-start foi chamado.
|
|
28
|
-
IMUTÁVEL após criação.
|
|
37
|
+
IMUTÁVEL após criação. Em onboard, sempre true.
|
|
29
38
|
- prd_existe: bool — true se /extract gerou PRD.md (insumos tinham produto).
|
|
30
39
|
false em scopes puro-técnicos.
|
|
31
40
|
- trd_existe: bool — true se /extract gerou TRD.md (insumos tinham técnica).
|
|
@@ -36,6 +45,9 @@ CAMPOS:
|
|
|
36
45
|
- areas_tocadas: lista de áreas do TRD que têm GATE=SIM. Preenchido pelo /design.
|
|
37
46
|
Possíveis: BACK, FRONT, DB, INFRA. Derivado dos GATEs do TRD §2-§5.
|
|
38
47
|
- input_path: caminho relativo da pasta de insumos
|
|
48
|
+
- repo_url: (só onboard) URL git do repositório onboardeado
|
|
49
|
+
- repo_branch: (só onboard) branch/tag clonada
|
|
50
|
+
- repo_path: (só onboard) caminho relativo do clone em projetos/
|
|
39
51
|
- status: estado atual da pipeline (ver fluxo abaixo)
|
|
40
52
|
- ultima_skill: qual skill alterou este arquivo por último
|
|
41
53
|
- atualizado_em: data/hora ISO da última atualização
|
|
@@ -64,8 +76,25 @@ FLUXO DE STATUS (v4):
|
|
|
64
76
|
Se prd_existe=false: status pula direto de extract_done → trd_approved (sem passar
|
|
65
77
|
por prd_approved). Mesmo vice-versa. Ordem das aprovações dentro do par é irrelevante.
|
|
66
78
|
|
|
79
|
+
FLUXO ALTERNATIVO — tipo=onboard (brownfield):
|
|
80
|
+
not_started
|
|
81
|
+
↓ /sfw-onboard cria .context.md, clona repo em projetos/<repo_path>/
|
|
82
|
+
cloned
|
|
83
|
+
↓ snapshot gerado em workspace/Input/onboard_<repo>/
|
|
84
|
+
analyzing
|
|
85
|
+
↓ readers paralelos + analyzer consolidam TRD + docs/ + projetos.yaml
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
Em onboard:
|
|
89
|
+
- prd_existe = false (sempre — código é técnico, sem PRD)
|
|
90
|
+
- trd_existe = true (sempre)
|
|
91
|
+
- trd_aprovado = true (sempre — código é a verdade, sem ambiguidades, dev valida lendo)
|
|
92
|
+
- areas_tocadas preenchidas a partir dos GATEs do TRD
|
|
93
|
+
- Re-onboard reentra em "analyzing" e refaz merge aditivo
|
|
94
|
+
|
|
67
95
|
QUEM ATUALIZA:
|
|
68
|
-
- /sfw-
|
|
96
|
+
- /sfw-onboard: cria arquivo com tipo=onboard, status=not_started → cloned → analyzing → done
|
|
97
|
+
- /sfw-start: cria arquivo com tipo=scope, status=not_started, first_run derivado de docs/
|
|
69
98
|
- /discovery: not_started → discovery_done
|
|
70
99
|
- /extract: discovery_done → extract_done, preenche prd_existe + trd_existe
|
|
71
100
|
- PM aprova: extract_done → prd_approved (atualiza prd_aprovado=true)
|
package/templates/CLAUDE.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
### 2. Validar acesso a todos commands
|
|
23
23
|
|
|
24
|
-
Verificar que TODOS os
|
|
24
|
+
Verificar que TODOS os 12 commands estão acessíveis:
|
|
25
25
|
|
|
26
26
|
| Command | Caminho |
|
|
27
27
|
|---------|---------|
|
|
@@ -29,6 +29,7 @@ Verificar que TODOS os 11 commands estão acessíveis:
|
|
|
29
29
|
| `/load` | `.claude/commands/load.md` |
|
|
30
30
|
| `/publish` | `.claude/commands/publish.md` |
|
|
31
31
|
| `/sfw-start` | `.claude/commands/sfw-start.md` |
|
|
32
|
+
| `/sfw-onboard` | `.claude/commands/sfw-onboard.md` |
|
|
32
33
|
| `/discovery` | `.claude/commands/discovery.md` |
|
|
33
34
|
| `/extract` | `.claude/commands/extract.md` |
|
|
34
35
|
| `/design` | `.claude/commands/design.md` |
|
|
@@ -108,6 +109,7 @@ ESTE REPO (projeto-base) = ORQUESTRADOR
|
|
|
108
109
|
| `/load <nome> \| --all` | Utilitária | Puxa Input + Output do backend. Incremental |
|
|
109
110
|
| `/publish <nome> <tipo>` | Utilitária | Publica artefato (PRD/TRD/Progresso) nos output.targets[]. Chamado auto por extract/design/plan |
|
|
110
111
|
| `/sfw-start <nome>` | Orquestrador | Entrada única do pipeline. Detecta first_run, cria .context.md, chama /load + /discovery + /extract, para no checkpoint de aprovação |
|
|
112
|
+
| `/sfw-onboard <git-url>` | Atômica | **Brownfield**. Clona repo existente em projetos/, lê código e gera TRD + docs/ + projetos.yaml (sem PRD). Cartógrafo descritivo |
|
|
111
113
|
| `/discovery <path>` | Utilitária | Análise profunda dos insumos (OBRIGATÓRIO no /sfw-start em v4) |
|
|
112
114
|
| `/extract <nome>` | Atômica | Lê workspace/Input/{nome}/ → gera PRD e/ou TRD conforme conteúdo. Re-executável |
|
|
113
115
|
| `/design <nome>` | Atômica | Requer PRD e/ou TRD aprovados → gera specs/. first_run cria docs/ + projetos.yaml |
|
|
@@ -173,7 +175,7 @@ Antes de executar qualquer command, verificar o status. Cada command só avança
|
|
|
173
175
|
│ ├── estrutura/ ← architecture, domain, conventions, apiContracts, decisions
|
|
174
176
|
│ └── global/ ← progresso_global
|
|
175
177
|
├── adapters/ ← SourceAdapter interface + ConfluenceAdapter + FilesystemAdapter
|
|
176
|
-
├── commands/ ←
|
|
178
|
+
├── commands/ ← 12 commands (mcp, load, publish, sfw-start, sfw-onboard, discovery, extract, design, plan, dev, merge-docs, session-finish)
|
|
177
179
|
└── agents/ ← 7 perfis de agents especializados
|
|
178
180
|
|
|
179
181
|
docs/ ← SÍNTESE CROSS-FEATURE (atualizada pelo /merge-docs)
|
|
@@ -211,7 +213,7 @@ sfw.config.yml ← Manifesto de adapters (input/output backends)
|
|
|
211
213
|
**Quem lê o quê:**
|
|
212
214
|
- **Humano (PM)**: `workspace/Output/{nome}/PRD.md` para aprovar
|
|
213
215
|
- **Humano (dev)**: `workspace/Output/{nome}/TRD.md` para aprovar + `docs/` (onboarding)
|
|
214
|
-
- **Coder agent**: `specs/{nome}/` (projeções estruturadas) — NUNCA lê PRD/TRD direto
|
|
216
|
+
- **Coder agent**: `specs/{nome}/` (projeções estruturadas) — NUNCA lê PRD/TRD direto. **Exceção brownfield**: lê TRD §1.6 Padrões Observados antes de implementar (segue padrões existentes)
|
|
215
217
|
- **Reviewer**: `specs/{nome}/scenarios.md` (CAs) + código
|
|
216
218
|
- **Security Reviewer**: `specs/{nome}/contracts.md` + `docs/conventions.md` + código
|
|
217
219
|
- **`/merge-docs`**: `workspace/Output/{nome}/PRD.md + TRD.md` (diff semântico pra atualizar docs/)
|