spec-first-copilot 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.
@@ -1,152 +1,152 @@
1
-
2
- # /sf-merge-docs $ARGUMENTS
3
-
4
- Skill atômica pós-dev. Aplica as decisões de **PRD + TRD aprovados** em `docs/` pra manter a síntese cross-feature sincronizada com o estado do sistema.
5
- `$ARGUMENTS` = nome do scope (ex: `feat_cadastro_cliente`).
6
-
7
- Chamado automaticamente pelo `/sf-dev` ao final. Re-executável manualmente quando precisa.
8
-
9
- > **Mudança v3 → v4**: antes aplicava `SDD §11 Delta Specs` (mecanismo OpenSpec).
10
- > Agora lê **PRD + TRD aprovados diretamente** e infere o delta comparando com
11
- > o estado atual de `docs/` (diff semântico). SDD não existe mais em v4.
12
-
13
- ## Agente: Integrator (Opus)
14
-
15
- Em v4 promovido de Sonnet → Opus: diff semântico PRD/TRD ↔ docs/ exige reasoning
16
- de maior nível que o antigo "aplicar §11 explícito". Meticuloso com consistência.
17
- Merge idempotente — re-aplicar os mesmos docs source não duplica conteúdo.
18
-
19
- ## Pré-condições
20
-
21
- | # | Validação | Se falhar |
22
- |---|-----------|-----------|
23
- | 1 | `$ARGUMENTS` informado | Parar |
24
- | 2 | `.context.md` com status `dev_done` (uso auto no /sf-dev) OU `design_done` a mais (uso manual) | Se anterior → "Rode /sf-design primeiro" |
25
- | 3 | Pelo menos PRD.md OU TRD.md existe e está aprovado | Parar — "Nenhum doc source aprovado pra mergear" |
26
- | 4 | `docs/` populado (veio de first-run anterior) | Parar — "/sf-design com first_run=true é quem cria docs/" |
27
-
28
- > `/sf-merge-docs` **só se aplica a features**, não a first-run. Em first-run, é o
29
- > próprio `/sf-design` que cria `docs/` a partir de PRD+TRD — não há o que mergear.
30
-
31
- ## Passos
32
-
33
- ### 1. Snapshot do estado atual de docs/
34
-
35
- Ler `docs/{architecture,domain,conventions,apiContracts,decisions}.md`.
36
- Indexar por elementos (tabelas, endpoints, ADRs, papéis, env vars...) pra diff.
37
-
38
- ### 2. Extrair elementos-destino do PRD e TRD aprovados
39
-
40
- | Fonte (PRD/TRD) | Elemento | Destino em docs/ |
41
- |-----------------|----------|------------------|
42
- | TRD §1.1 Stack | Nova tecnologia / versão | `architecture.md` §Stack |
43
- | TRD §1.2 Arquitetura | Novo container / padrão | `architecture.md` §Containers/Padrões |
44
- | TRD §1.3 Ambientes | Novo ambiente / mudança | `architecture.md` §Ambientes |
45
- | TRD §1.4 Deploy | Mudança na estratégia | `architecture.md` §Deploy |
46
- | TRD §4 §Área-DB | Nova tabela / índice / FK | `domain.md` §Catálogo de Tabelas |
47
- | TRD §2.1 Endpoints | Novo endpoint | `apiContracts.md` §Catálogo |
48
- | TRD §7.1 Auth | Mudança em auth | `conventions.md` §Autenticação |
49
- | TRD §7.2 Autorização | Novo papel / permissão | `conventions.md` §Autorização |
50
- | TRD §7.3 LGPD | Novo dado pessoal | `conventions.md` §LGPD |
51
- | TRD §7.4 Rate limit | Nova categoria | `conventions.md` §Rate Limiting |
52
- | TRD §5.3 Env vars | Nova variável | `conventions.md` §Variáveis de Ambiente |
53
- | TRD §6 Integrações | Novo sistema externo | `domain.md` §Integrações Externas |
54
- | TRD §9 ADRs | Nova decisão | `decisions.md` (append-only, imutável) |
55
- | PRD §2 Atores | Novo papel/persona | `domain.md` §Usuários e Papéis |
56
- | PRD §5 RNs | Nova regra de negócio | (não vai pra docs/ — fica em specs/{nome}/contracts.md) |
57
-
58
- > **Regra**: PRD alimenta poucas seções de `docs/` (só atores e alto-nível).
59
- > O grosso vem do TRD — `docs/` é síntese técnica + negócio cross-feature.
60
-
61
- ### 3. Diff semântico: calcular ADDED / MODIFIED / REMOVED
62
-
63
- Pra cada elemento-destino extraído (passo 2), comparar com snapshot (passo 1):
64
-
65
- | Resultado | Condição | Ação |
66
- |-----------|----------|------|
67
- | ADDED | Elemento não existe em docs/ | Adicionar na seção apropriada |
68
- | MODIFIED | Elemento existe mas mudou (nome igual, valor diferente) | Atualizar campos |
69
- | UNCHANGED | Elemento existe e está igual | Skip (idempotente) |
70
- | REMOVED | Elemento estava em docs/ mas não aparece em PRD+TRD aprovados | **NÃO remover** — apenas registrar no output como "possivelmente orfão" |
71
-
72
- > **Conservadorismo em REMOVED**: PRD/TRD falam só da feature atual. Algo que
73
- > "não aparece" pode ser de outra feature (que continua válida). NUNCA deletar
74
- > automaticamente. Reportar e deixar remoção manual.
75
-
76
- ### 4. Aplicar ADDED e MODIFIED
77
-
78
- - Localizar seção apropriada no doc destino
79
- - Preservar estrutura do template (não quebrar tabelas)
80
- - ADRs em `decisions.md`: SEMPRE append; ADR com status=aceita é imutável
81
- - Registrar cada mudança em changelog do doc afetado
82
-
83
- ### 5. Changelog em cada doc afetado
84
-
85
- Adicionar linha no `## Changelog` do doc:
86
-
87
- ```markdown
88
- | Data | Feature | Tipo | Descrição |
89
- |------|---------|------|-----------|
90
- | {{ISO_DATE}} | $ARGUMENTS | ADDED | Endpoint POST /api/v1/users |
91
- | {{ISO_DATE}} | $ARGUMENTS | MODIFIED | Matriz de permissões: novo role `manager` |
92
- ```
93
-
94
- ### 6. Validar consistência cross-doc
95
-
96
- - Referências quebradas (endpoint do apiContracts referencia tabela que não existe em domain) → reportar
97
- - Papel novo em conventions mas não aparece em matriz de autorização → reportar
98
- - ADR substituída mas ainda referenciada → reportar
99
-
100
- Validação reporta, não bloqueia. Usuário decide se resolve manualmente.
101
-
102
- ### 7. Atualizar status
103
-
104
- ```yaml
105
- status: "done"
106
- ultima_skill: "/sf-merge-docs"
107
- atualizado_em: "{{ISO_DATETIME}}"
108
- ```
109
-
110
- ### 8. Saída obrigatória
111
-
112
- ```
113
- /sf-merge-docs $ARGUMENTS — completo
114
-
115
- docs/ sincronizado com PRD + TRD aprovados:
116
- - docs/architecture.md (2 ADDED, 0 MODIFIED)
117
- - docs/apiContracts.md (3 ADDED, 1 MODIFIED)
118
- - docs/conventions.md (0 ADDED, 1 MODIFIED — novo role)
119
- - docs/decisions.md (1 ADDED — ADR-007)
120
- - docs/domain.md (0 mudanças)
121
-
122
- Possivelmente órfãos (NÃO removidos — revisão manual):
123
- - docs/apiContracts.md: endpoint `/legacy/foo` não aparece em PRD+TRD novos
124
- (pode ser de outra feature; deletar manualmente se confirmado deprecated)
125
-
126
- Validação: passed / N issues
127
- ```
128
-
129
- ## Erros
130
-
131
- | Erro | Ação |
132
- |------|------|
133
- | Status != `dev_done` (auto) nem >= `design_done` (manual) | Parar — pedir rodar /sf-dev ou /sf-design primeiro |
134
- | `docs/` não existe | Parar — explicar que `/sf-design` em first-run cria docs/ (feature só atualiza) |
135
- | PRD+TRD sem nada novo vs docs/ | Marcar `done` (legítimo — feature sem impacto cross-feature) |
136
- | Elemento MODIFIED não encontrado no doc | Converter pra ADDED + reportar (doc estava desatualizado) |
137
- | Referências quebradas detectadas | Reportar, não bloqueia |
138
-
139
- ## Uso automático (pelo `/sf-dev`)
140
-
141
- `/sf-dev` chama `/sf-merge-docs` automaticamente ao final de feature (não first-run):
142
-
143
- - Condição: `status=dev_done` E `first_run=false` E (`prd_aprovado=true` OU `trd_aprovado=true`)
144
- - Rodado inline, sem nova interação
145
- - Falha em `/sf-merge-docs` não derruba `/sf-dev` — apenas reporta; user pode re-rodar manualmente
146
-
147
- ## Uso manual
148
-
149
- Rodar `/sf-merge-docs $ARGUMENTS` quando:
150
- - `/sf-dev` falhou e você quer sincronizar docs/ com o que já foi aprovado
151
- - Fez edição direta em PRD/TRD aprovados e quer propagar pra docs/
152
- - Quer forçar um re-merge (idempotente — não duplica)
1
+
2
+ # /sf-merge-docs $ARGUMENTS
3
+
4
+ Skill atômica pós-dev. Aplica as decisões de **PRD + TRD aprovados** em `docs/` pra manter a síntese cross-feature sincronizada com o estado do sistema.
5
+ `$ARGUMENTS` = nome do scope (ex: `feat_cadastro_cliente`).
6
+
7
+ Chamado automaticamente pelo `/sf-dev` ao final. Re-executável manualmente quando precisa.
8
+
9
+ > **Mudança v3 → v4**: antes aplicava `SDD §11 Delta Specs` (mecanismo OpenSpec).
10
+ > Agora lê **PRD + TRD aprovados diretamente** e infere o delta comparando com
11
+ > o estado atual de `docs/` (diff semântico). SDD não existe mais em v4.
12
+
13
+ ## Agente: Integrator (Opus)
14
+
15
+ Em v4 promovido de Sonnet → Opus: diff semântico PRD/TRD ↔ docs/ exige reasoning
16
+ de maior nível que o antigo "aplicar §11 explícito". Meticuloso com consistência.
17
+ Merge idempotente — re-aplicar os mesmos docs source não duplica conteúdo.
18
+
19
+ ## Pré-condições
20
+
21
+ | # | Validação | Se falhar |
22
+ |---|-----------|-----------|
23
+ | 1 | `$ARGUMENTS` informado | Parar |
24
+ | 2 | `.context.md` com status `dev_done` (uso auto no /sf-dev) OU `design_done` a mais (uso manual) | Se anterior → "Rode /sf-design primeiro" |
25
+ | 3 | Pelo menos PRD.md OU TRD.md existe e está aprovado | Parar — "Nenhum doc source aprovado pra mergear" |
26
+ | 4 | `docs/` populado (veio de first-run anterior) | Parar — "/sf-design com first_run=true é quem cria docs/" |
27
+
28
+ > `/sf-merge-docs` **só se aplica a features**, não a first-run. Em first-run, é o
29
+ > próprio `/sf-design` que cria `docs/` a partir de PRD+TRD — não há o que mergear.
30
+
31
+ ## Passos
32
+
33
+ ### 1. Snapshot do estado atual de docs/
34
+
35
+ Ler `docs/{architecture,domain,conventions,apiContracts,decisions}.md`.
36
+ Indexar por elementos (tabelas, endpoints, ADRs, papéis, env vars...) pra diff.
37
+
38
+ ### 2. Extrair elementos-destino do PRD e TRD aprovados
39
+
40
+ | Fonte (PRD/TRD) | Elemento | Destino em docs/ |
41
+ |-----------------|----------|------------------|
42
+ | TRD §1.1 Stack | Nova tecnologia / versão | `architecture.md` §Stack |
43
+ | TRD §1.2 Arquitetura | Novo container / padrão | `architecture.md` §Containers/Padrões |
44
+ | TRD §1.3 Ambientes | Novo ambiente / mudança | `architecture.md` §Ambientes |
45
+ | TRD §1.4 Deploy | Mudança na estratégia | `architecture.md` §Deploy |
46
+ | TRD §4 §Área-DB | Nova tabela / índice / FK | `domain.md` §Catálogo de Tabelas |
47
+ | TRD §2.1 Endpoints | Novo endpoint | `apiContracts.md` §Catálogo |
48
+ | TRD §7.1 Auth | Mudança em auth | `conventions.md` §Autenticação |
49
+ | TRD §7.2 Autorização | Novo papel / permissão | `conventions.md` §Autorização |
50
+ | TRD §7.3 LGPD | Novo dado pessoal | `conventions.md` §LGPD |
51
+ | TRD §7.4 Rate limit | Nova categoria | `conventions.md` §Rate Limiting |
52
+ | TRD §5.3 Env vars | Nova variável | `conventions.md` §Variáveis de Ambiente |
53
+ | TRD §6 Integrações | Novo sistema externo | `domain.md` §Integrações Externas |
54
+ | TRD §9 ADRs | Nova decisão | `decisions.md` (append-only, imutável) |
55
+ | PRD §2 Atores | Novo papel/persona | `domain.md` §Usuários e Papéis |
56
+ | PRD §5 RNs | Nova regra de negócio | (não vai pra docs/ — fica em specs/{nome}/contracts.md) |
57
+
58
+ > **Regra**: PRD alimenta poucas seções de `docs/` (só atores e alto-nível).
59
+ > O grosso vem do TRD — `docs/` é síntese técnica + negócio cross-feature.
60
+
61
+ ### 3. Diff semântico: calcular ADDED / MODIFIED / REMOVED
62
+
63
+ Pra cada elemento-destino extraído (passo 2), comparar com snapshot (passo 1):
64
+
65
+ | Resultado | Condição | Ação |
66
+ |-----------|----------|------|
67
+ | ADDED | Elemento não existe em docs/ | Adicionar na seção apropriada |
68
+ | MODIFIED | Elemento existe mas mudou (nome igual, valor diferente) | Atualizar campos |
69
+ | UNCHANGED | Elemento existe e está igual | Skip (idempotente) |
70
+ | REMOVED | Elemento estava em docs/ mas não aparece em PRD+TRD aprovados | **NÃO remover** — apenas registrar no output como "possivelmente orfão" |
71
+
72
+ > **Conservadorismo em REMOVED**: PRD/TRD falam só da feature atual. Algo que
73
+ > "não aparece" pode ser de outra feature (que continua válida). NUNCA deletar
74
+ > automaticamente. Reportar e deixar remoção manual.
75
+
76
+ ### 4. Aplicar ADDED e MODIFIED
77
+
78
+ - Localizar seção apropriada no doc destino
79
+ - Preservar estrutura do template (não quebrar tabelas)
80
+ - ADRs em `decisions.md`: SEMPRE append; ADR com status=aceita é imutável
81
+ - Registrar cada mudança em changelog do doc afetado
82
+
83
+ ### 5. Changelog em cada doc afetado
84
+
85
+ Adicionar linha no `## Changelog` do doc:
86
+
87
+ ```markdown
88
+ | Data | Feature | Tipo | Descrição |
89
+ |------|---------|------|-----------|
90
+ | {{ISO_DATE}} | $ARGUMENTS | ADDED | Endpoint POST /api/v1/users |
91
+ | {{ISO_DATE}} | $ARGUMENTS | MODIFIED | Matriz de permissões: novo role `manager` |
92
+ ```
93
+
94
+ ### 6. Validar consistência cross-doc
95
+
96
+ - Referências quebradas (endpoint do apiContracts referencia tabela que não existe em domain) → reportar
97
+ - Papel novo em conventions mas não aparece em matriz de autorização → reportar
98
+ - ADR substituída mas ainda referenciada → reportar
99
+
100
+ Validação reporta, não bloqueia. Usuário decide se resolve manualmente.
101
+
102
+ ### 7. Atualizar status
103
+
104
+ ```yaml
105
+ status: "done"
106
+ ultima_skill: "/sf-merge-docs"
107
+ atualizado_em: "{{ISO_DATETIME}}"
108
+ ```
109
+
110
+ ### 8. Saída obrigatória
111
+
112
+ ```
113
+ /sf-merge-docs $ARGUMENTS — completo
114
+
115
+ docs/ sincronizado com PRD + TRD aprovados:
116
+ - docs/architecture.md (2 ADDED, 0 MODIFIED)
117
+ - docs/apiContracts.md (3 ADDED, 1 MODIFIED)
118
+ - docs/conventions.md (0 ADDED, 1 MODIFIED — novo role)
119
+ - docs/decisions.md (1 ADDED — ADR-007)
120
+ - docs/domain.md (0 mudanças)
121
+
122
+ Possivelmente órfãos (NÃO removidos — revisão manual):
123
+ - docs/apiContracts.md: endpoint `/legacy/foo` não aparece em PRD+TRD novos
124
+ (pode ser de outra feature; deletar manualmente se confirmado deprecated)
125
+
126
+ Validação: passed / N issues
127
+ ```
128
+
129
+ ## Erros
130
+
131
+ | Erro | Ação |
132
+ |------|------|
133
+ | Status != `dev_done` (auto) nem >= `design_done` (manual) | Parar — pedir rodar /sf-dev ou /sf-design primeiro |
134
+ | `docs/` não existe | Parar — explicar que `/sf-design` em first-run cria docs/ (feature só atualiza) |
135
+ | PRD+TRD sem nada novo vs docs/ | Marcar `done` (legítimo — feature sem impacto cross-feature) |
136
+ | Elemento MODIFIED não encontrado no doc | Converter pra ADDED + reportar (doc estava desatualizado) |
137
+ | Referências quebradas detectadas | Reportar, não bloqueia |
138
+
139
+ ## Uso automático (pelo `/sf-dev`)
140
+
141
+ `/sf-dev` chama `/sf-merge-docs` automaticamente ao final de feature (não first-run):
142
+
143
+ - Condição: `status=dev_done` E `first_run=false` E (`prd_aprovado=true` OU `trd_aprovado=true`)
144
+ - Rodado inline, sem nova interação
145
+ - Falha em `/sf-merge-docs` não derruba `/sf-dev` — apenas reporta; user pode re-rodar manualmente
146
+
147
+ ## Uso manual
148
+
149
+ Rodar `/sf-merge-docs $ARGUMENTS` quando:
150
+ - `/sf-dev` falhou e você quer sincronizar docs/ com o que já foi aprovado
151
+ - Fez edição direta em PRD/TRD aprovados e quer propagar pra docs/
152
+ - Quer forçar um re-merge (idempotente — não duplica)
@@ -0,0 +1,370 @@
1
+ ---
2
+ name: sf-onboard
3
+ description: |
4
+ Brownfield onboarding. Clona repo existente em projetos/, lê o código e gera
5
+ TRD + docs/ + projetos.yaml sem PRD. Cartógrafo descritivo (não arquiteto).
6
+ Trigger: /sf-onboard <git-url> [--branch=X] [--tag=Y] [--name=Z]
7
+ author: GustavoMaritan
8
+ version: 1.0.0
9
+ date: 2026-05-11
10
+ ---
11
+
12
+ # /sf-onboard $ARGUMENTS
13
+
14
+ Skill atômica de **brownfield onboarding**. Clona um repositório existente em
15
+ `projetos/`, lê o código e gera **TRD + `docs/` + `projetos.yaml`** sem PRD.
16
+
17
+ **Filosofia**: cartógrafo, não arquiteto. Mapeia stack, padrões e uso sem julgar.
18
+ Coders futuros SEGUEM o que já existe — propostas de mudança entram como
19
+ features explícitas do dev.
20
+
21
+ ## Argumento
22
+
23
+ ```
24
+ /sf-onboard <git-url> [--branch=<branch>] [--tag=<tag>] [--name=<scope-name>]
25
+ ```
26
+
27
+ | Param | Default | Descrição |
28
+ |-------|---------|-----------|
29
+ | `<git-url>` | (obrigatório) | URL git clonável (https/ssh). Auth é pré-req do user (SSH key/PAT configurado) |
30
+ | `--branch` | `main` | Branch a clonar |
31
+ | `--tag` | — | Tag específica (mutuamente exclusivo com `--branch`) |
32
+ | `--name` | inferido do URL | Nome do scope. Default: `onboard_<repo-name>` |
33
+
34
+ **Multi-repo** (poly-repo): re-executar a skill N vezes, uma por repo. Cada
35
+ execução adiciona uma entry em `projetos.yaml` e merge aditivo no TRD.
36
+
37
+ ## Multi-agent
38
+
39
+ | Agente | Modelo | Papel |
40
+ |--------|--------|-------|
41
+ | **DB Reader** | Sonnet | Lê migrations, schemas, ORMs → fragmento §Área-DB |
42
+ | **Backend Reader** | Sonnet | Lê routes/controllers/services → fragmento §Área-Backend + §6 Integrações |
43
+ | **Frontend Reader** | Sonnet | Lê rotas, componentes, state → fragmento §Área-Frontend |
44
+ | **Infra Reader** | Sonnet | Lê Dockerfile, CI/CD, k8s, configs → fragmento §Área-Infra |
45
+ | **Dependency Reader** | Sonnet | Lê package.json / *.csproj / pom.xml / go.mod → fragmento §1.1 Stack |
46
+ | **Security Reader** | Sonnet | Lê auth/authz/secrets/headers → fragmento §7 Segurança |
47
+ | **Patterns Reader** | Sonnet | Identifica padrões observados (estrutura, naming, error handling, validação, testes, logging) → fragmento §1.6 |
48
+ | **Analyzer** | Opus | Consolida TODOS fragmentos → TRD completo + `docs/` + `projetos.yaml` |
49
+
50
+ ## Pré-condições
51
+
52
+ | # | Validação | Se falhar |
53
+ |---|-----------|-----------|
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 | URL acessível (auth do user) | Parar → "Falha ao clonar. Configure SSH/PAT antes de rodar /sf-onboard" |
57
+ | 4 | `--branch` e `--tag` não usados juntos | Parar → "Use --branch OU --tag, não ambos" |
58
+ | 5 | Scope `onboard_<repo>` não está em `analyzing` | Se sim → "Onboarding anterior incompleto. Rode novamente pra retomar" |
59
+
60
+ ## Passos
61
+
62
+ ### 1. Resolver nome do scope e path
63
+
64
+ - `<repo-name>` = último segmento da URL sem `.git`
65
+ - Ex: `https://github.com/org/app-legado.git` → `app-legado`
66
+ - `scope = --name || "onboard_<repo-name>"`
67
+ - `path = "projetos/<repo-name>"`
68
+
69
+ Se `--branch` ausente e `--tag` ausente → branch = `main`.
70
+
71
+ ### 2. Detectar re-onboard
72
+
73
+ | Condição | Comportamento |
74
+ |----------|---------------|
75
+ | `workspace/Output/<scope>/.context.md` não existe | **Primeira vez** — criar tudo do zero |
76
+ | `.context.md` existe com tipo=onboard | **Re-onboard** — pull no clone existente, merge aditivo |
77
+ | `.context.md` existe com tipo≠onboard | Parar → "Scope <scope> já é usado por pipeline normal. Use --name pra dar outro nome" |
78
+
79
+ ### 3. Clonar / atualizar o repositório
80
+
81
+ **Primeira vez**:
82
+ ```bash
83
+ git clone --branch <branch> <git-url> projetos/<repo-name>
84
+ # OU se --tag:
85
+ git clone --depth 1 --branch <tag> <git-url> projetos/<repo-name>
86
+ ```
87
+
88
+ **Re-onboard**:
89
+ ```bash
90
+ cd projetos/<repo-name>
91
+ git fetch
92
+ git checkout <branch-ou-tag>
93
+ git pull --ff-only
94
+ ```
95
+
96
+ Capturar `commit_hash` resultante (`git rev-parse HEAD`) — vai pro snapshot.
97
+
98
+ ### 4. Criar `.context.md`
99
+
100
+ ```yaml
101
+ ---
102
+ nome: "<scope>"
103
+ tipo: "onboard"
104
+ first_run: true
105
+ prd_existe: false
106
+ trd_existe: false
107
+ prd_aprovado: false
108
+ trd_aprovado: false
109
+ areas_tocadas: []
110
+ input_path: "workspace/Input/<scope>/"
111
+ repo_url: "<git-url>"
112
+ repo_branch: "<branch-ou-tag>"
113
+ repo_path: "projetos/<repo-name>"
114
+ status: "cloned"
115
+ ultima_skill: "/sf-onboard"
116
+ atualizado_em: "<ISO_DATETIME>"
117
+ ---
118
+ ```
119
+
120
+ ### 5. Gerar snapshot rastreável
121
+
122
+ Criar `workspace/Input/<scope>/code-snapshot.md`:
123
+
124
+ ```markdown
125
+ # Code Snapshot — <repo-name>
126
+
127
+ **Repo**: <git-url>
128
+ **Branch/Tag**: <branch-ou-tag>
129
+ **Commit**: <commit_hash>
130
+ **Onboard em**: <ISO_DATETIME>
131
+
132
+ ## Arquivos lidos
133
+
134
+ | Arquivo | Hash | Tipo | Classificação | Lido por |
135
+ |---------|------|------|---------------|----------|
136
+ | `package.json` | a3f29c1d | dependency | NOVO | Dependency Reader |
137
+ | `src/api/UserController.cs` | b8e221f0 | source | NOVO | Backend Reader, Patterns Reader |
138
+ | ... | | | | |
139
+ ```
140
+
141
+ **Regras**:
142
+ - Hash SHA-256 truncado em 8 chars
143
+ - Classificação: NOVO / MODIFICADO / INALTERADO (vs snapshot anterior)
144
+ - Re-onboard: append nova seção `## Snapshot N — <ISO_DATETIME>` (append-only)
145
+ - Ignorar: `node_modules/`, `bin/`, `obj/`, `dist/`, `build/`, `.git/`, `vendor/`, `target/`, lock files binários
146
+
147
+ ### 6. Atualizar status → analyzing
148
+
149
+ ```yaml
150
+ status: "analyzing"
151
+ atualizado_em: "<ISO_DATETIME>"
152
+ ```
153
+
154
+ ### 7. Disparar readers em paralelo
155
+
156
+ Cada Reader recebe:
157
+ - Path do clone: `projetos/<repo-name>/`
158
+ - Lista de arquivos relevantes pra área (pre-filtrado por glob)
159
+ - Snapshot anterior (se re-onboard) pra detectar MODIFICADO
160
+
161
+ | Reader | Globs (exemplos) | Output |
162
+ |--------|------------------|--------|
163
+ | **Dependency** | `package.json`, `*.csproj`, `pom.xml`, `go.mod`, `requirements.txt`, `Pipfile`, `Gemfile`, `composer.json` | Linguagem, framework, versões, libs principais |
164
+ | **DB** | `**/migrations/**`, `**/Migrations/**`, `**/*.sql`, `**/schema.prisma`, `**/models/**`, `**/Entities/**` | Tabelas, colunas, índices, FKs, ORM detectado |
165
+ | **Backend** | `**/Controllers/**`, `**/routes/**`, `**/api/**`, `**/handlers/**`, `**/services/**`, `**/usecases/**` | Endpoints (método+rota+auth), services, integrações |
166
+ | **Frontend** | `**/pages/**`, `**/routes/**`, `**/components/**`, `**/store/**`, `**/hooks/**` | Rotas, componentes, state lib, design system |
167
+ | **Infra** | `Dockerfile*`, `docker-compose*.yml`, `.github/workflows/**`, `.gitlab-ci.yml`, `**/*.tf`, `k8s/**`, `helm/**` | Containers, CI/CD, deploy, env vars esperadas |
168
+ | **Security** | `**/*auth*`, `**/*authz*`, `**/*middleware*`, `**/*.env.example`, `.env*` (só nomes de var, nunca valores), config files | Mecanismo de auth, papéis, CORS, secrets management |
169
+ | **Patterns** | Mesmos do Backend + Frontend, amostragem representativa | Estrutura, naming, error handling, validação, testes, logging — com snippets reais |
170
+
171
+ **Cada Reader produz** um fragmento estruturado seguindo as seções correspondentes
172
+ do `TRD.template.md`. Não interpreta — só cataloga. Se algo está ambíguo entre
173
+ 2 arquivos (ex: 2 padrões diferentes de error handling), Reader reporta **ambos
174
+ com contagem** ("X em 12 arquivos, Y em 3"). Analyzer decide o dominante depois.
175
+
176
+ ### 8. Analyzer consolida (Opus)
177
+
178
+ Recebe todos fragmentos. Gera:
179
+
180
+ #### 8.1 `workspace/Output/<scope>/TRD.md`
181
+
182
+ Seguindo `templates/feature/TRD.template.md`:
183
+
184
+ - **§1 §Sistema** (GATE=SIM sempre)
185
+ - §1.1 Stack (do Dependency Reader)
186
+ - §1.2 Arquitetura C4 (inferida da estrutura de pastas + dependências)
187
+ - §1.3 Ambientes (do Infra Reader)
188
+ - §1.4 Deploy (do Infra Reader)
189
+ - §1.5 Segurança baseline (do Security Reader)
190
+ - **§1.6 Padrões Observados** (do Patterns Reader — OBRIGATÓRIO em onboard)
191
+ - **§2-§5 §Áreas** — GATE=SIM para áreas que existem no código, GATE=NÃO pras ausentes
192
+ - **§6 Integrações Externas** (do Backend Reader)
193
+ - **§7 Segurança Detalhada** (do Security Reader)
194
+ - **§8 Estratégia de Testes** (do Patterns Reader)
195
+ - **§9 Decisões Técnicas (ADRs)** — gerar ADRs **inferidas** com flag `Inferido: true`
196
+ - **§10 Ambiguidades** — VAZIA em onboard (código resolve tudo)
197
+ - **§11 Rastreabilidade** — citar arquivo:linha por seção
198
+
199
+ **Regras absolutas do Analyzer em onboard**:
200
+ - ❌ **NUNCA** marcar ambiguidade. Se 2 padrões divergem, escolher o **mais frequente**
201
+ e documentar a divergência em §1.6.7 sem julgar.
202
+ - ❌ **NUNCA** sugerir mudanças, "melhorias" ou best practices.
203
+ - ❌ **NUNCA** usar linguagem prescritiva ("deveria", "recomendado"). Sempre descritiva ("usa", "implementa").
204
+ - ✅ Citar arquivo:linha em snippets de §1.6.
205
+
206
+ #### 8.2 `docs/` (5 arquivos cross-feature)
207
+
208
+ Gerar todos os 5 a partir do TRD recém-gerado, seguindo templates de `estrutura/`:
209
+
210
+ | Arquivo | Origem |
211
+ |---------|--------|
212
+ | `docs/architecture.md` | TRD §1.1 + §1.2 + §1.3 + §1.4 |
213
+ | `docs/domain.md` | TRD §Área-DB + visão de negócio inferida da nomenclatura |
214
+ | `docs/conventions.md` | TRD §1.6 + §7 + §8 |
215
+ | `docs/apiContracts.md` | TRD §2.1 + §6 |
216
+ | `docs/decisions.md` | TRD §9 (todas ADRs com flag `Inferido: true`) |
217
+
218
+ Cada arquivo gerado tem changelog inicial:
219
+ ```markdown
220
+ | <DATA> | onboard_<repo> | INICIAL | Gerado por /sf-onboard a partir do código existente |
221
+ ```
222
+
223
+ #### 8.3 `projetos.yaml`
224
+
225
+ Popular com o repo clonado:
226
+
227
+ ```yaml
228
+ org: "<org-inferida-do-url>"
229
+ project: "<nome-do-projeto>"
230
+
231
+ repos:
232
+ <nome-curto>:
233
+ repo: "<org>/<repo-name>"
234
+ path: "projetos/<repo-name>"
235
+ existing: true # SEMPRE true em onboard
236
+ areas: [<áreas-detectadas>] # do Analyzer baseado nos GATEs do TRD
237
+ stack: "<stack>" # do TRD §1.1
238
+ branch_prefix: "feature/" # ou detectar convenção do repo
239
+ ```
240
+
241
+ Se já existe `projetos.yaml` (re-onboard ou multi-repo) → **merge aditivo**:
242
+ adiciona novo repo, não sobrescreve outros.
243
+
244
+ ### 9. Detecção de monorepo (opcional)
245
+
246
+ Se o repo clonado contém múltiplos `package.json` / `pom.xml` / `*.csproj` em
247
+ subdirs (não na raiz), pode ser monorepo. Comportamento:
248
+
249
+ - Cada subprojeto identificado vira uma entry em `projetos.yaml`
250
+ - Mesma URL git, paths diferentes (`projetos/<repo>/services/api`, `projetos/<repo>/web`)
251
+ - TRD documenta arquitetura geral em §1.2
252
+
253
+ ### 10. Atualizar `.context.md` → done
254
+
255
+ ```yaml
256
+ status: "done"
257
+ prd_existe: false
258
+ trd_existe: true
259
+ prd_aprovado: false # n/a — sempre false em onboard
260
+ trd_aprovado: true # SEMPRE true em onboard (código é a verdade)
261
+ areas_tocadas: [<áreas-com-GATE=SIM>]
262
+ ultima_skill: "/sf-onboard"
263
+ atualizado_em: "<ISO_DATETIME>"
264
+ ```
265
+
266
+ ### 11. Auto-publish (se `sfw.config.yml` configurado)
267
+
268
+ Se `sfw.config.yml` existe:
269
+
270
+ ```
271
+ /sf-publish <scope> TRD
272
+ ```
273
+
274
+ (Não publica PRD — não existe. Não publica Progresso — não há /sf-plan em onboarding.)
275
+
276
+ > **Nota**: `docs/` é local-only por design (ver `.github/skills/sf-publish/SKILL.md`).
277
+ > Se quiser publicar no Confluence, copiar manualmente ou aguardar feature futura.
278
+
279
+ ### 12. Saída obrigatória
280
+
281
+ ```
282
+ /sf-onboard — completo
283
+
284
+ Repo: <git-url> (<branch-ou-tag> @ <commit-hash>)
285
+ Clone: projetos/<repo-name>
286
+
287
+ Artefatos gerados:
288
+ - workspace/Output/<scope>/TRD.md
289
+ - workspace/Output/<scope>/.context.md
290
+ - workspace/Input/<scope>/code-snapshot.md
291
+ - docs/architecture.md
292
+ - docs/domain.md
293
+ - docs/conventions.md
294
+ - docs/apiContracts.md
295
+ - docs/decisions.md (<N> ADRs inferidas)
296
+ - projetos.yaml (entry: <nome-curto>)
297
+
298
+ Áreas detectadas: BACK, FRONT, DB, INFRA (conforme TRD)
299
+ Padrões observados: ver TRD §1.6 (<N> categorias)
300
+ ADRs inferidas: <N> (revisar e remover flag `Inferido` ao confirmar)
301
+
302
+ Próximos passos:
303
+ 1. [dev] Revisar workspace/Output/<scope>/TRD.md
304
+ - Especialmente §1.6 Padrões Observados (coders vão seguir)
305
+ - §9 ADRs inferidas (confirmar ou ajustar; remover flag `Inferido` ao validar)
306
+ 2. [dev] Revisar docs/ (5 arquivos)
307
+ 3. Para onboardar outro repo do mesmo projeto: /sf-onboard <outra-url>
308
+ 4. Para começar feature nova: /sf-start feat_<nome>
309
+ ```
310
+
311
+ ## Re-onboard
312
+
313
+ Quando o código legado evolui e quer atualizar a base documental:
314
+
315
+ ```
316
+ /sf-onboard <mesma-url> [--branch=<outra>]
317
+ ```
318
+
319
+ Skill detecta `tipo=onboard` no `.context.md` existente e:
320
+ 1. `git pull` no clone
321
+ 2. Snapshot novo com classificação NOVO/MODIFICADO/INALTERADO
322
+ 3. Readers reprocessam **apenas arquivos MODIFICADOS ou NOVOS**
323
+ 4. Analyzer faz **merge aditivo** no TRD existente
324
+ 5. `docs/` atualizado com changelog `re-onboard <DATA>`
325
+ 6. `projetos.yaml` inalterado (mesmo repo)
326
+
327
+ ## Multi-repo
328
+
329
+ App = N repos (api, web, worker). Rodar a skill N vezes:
330
+
331
+ ```
332
+ /sf-onboard https://github.com/org/app-api.git --name=onboard_app
333
+ /sf-onboard https://github.com/org/app-web.git --name=onboard_app
334
+ /sf-onboard https://github.com/org/app-worker.git --name=onboard_app
335
+ ```
336
+
337
+ Mesmo `--name` → mesmo `.context.md`, mesmo TRD (merge aditivo), `projetos.yaml`
338
+ recebe 3 entries. Áreas distribuídas: api=[BACK,DB], web=[FRONT], worker=[BACK].
339
+
340
+ Se `--name` diferentes → scopes separados (raro, mas suportado).
341
+
342
+ ## Erros
343
+
344
+ | Erro | Ação |
345
+ |------|------|
346
+ | URL não acessível | Parar, sugerir checar SSH/PAT |
347
+ | Repo vazio | Parar — "Nada a onboardar" |
348
+ | Nenhum reader produziu fragmento (stack desconhecida) | Parar — "Stack não reconhecida. Detalhe TRD manualmente ou peça suporte" |
349
+ | `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" |
350
+ | `sfw.config.yml` aponta backend mas /sf-publish falhou | Reportar warning, manter artefatos locais |
351
+
352
+ ## Diferença vs `/sf-start`
353
+
354
+ | Aspecto | `/sf-start` | `/sf-onboard` |
355
+ |---------|--------------|----------------|
356
+ | Entrada | Insumos brutos do PM em `workspace/Input/` | URL git de código existente |
357
+ | Gera PRD? | Sim (se insumos têm produto) | Não |
358
+ | Gera TRD? | Sim (após aprovação) | Sim (auto-aprovado) |
359
+ | Gera `docs/`? | No `/sf-design` (first-run) | Diretamente |
360
+ | Gera `projetos.yaml`? | No `/sf-design` (first-run) | Diretamente |
361
+ | Ambiguidades? | Sim (PRD §12, TRD §10) | Não (código resolve) |
362
+ | Checkpoint humano? | Sim (PM + dev) | Não (one-shot) |
363
+ | Filosofia | Design upfront | Cartógrafo descritivo |
364
+
365
+ ## Notas
366
+
367
+ - `/sf-onboard` é **ortogonal** ao pipeline `/sf-start`. Não chama discovery/sf-extract/sf-design.
368
+ - Após `/sf-onboard`, qualquer feature nova entra pelo `/sf-start feat_<nome>` normal — `first_run` da feature será `false` porque `docs/` já existe.
369
+ - Coder de feature futura **DEVE** ler TRD §1.6 Padrões Observados antes de implementar.
370
+ - Re-onboard NÃO atualiza `specs/` de features já desenvolvidas (são imutáveis pós-`/sf-dev`).