spec-first-copilot 0.6.0-beta.9 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -167
- package/bin/cli.js +70 -70
- package/lib/init.js +92 -92
- package/lib/update.js +132 -132
- package/package.json +1 -1
- package/templates/.ai/memory/napkin.md +68 -68
- package/templates/.github/CHANGELOG.md +121 -0
- package/templates/.github/adapters/SETUP.md +314 -314
- package/templates/.github/adapters/confluence.md +295 -295
- package/templates/.github/adapters/errors.md +234 -234
- package/templates/.github/adapters/filesystem.md +353 -353
- package/templates/.github/adapters/interface.md +301 -301
- package/templates/.github/adapters/naming.md +241 -241
- package/templates/.github/adapters/registry.md +244 -244
- package/templates/.github/agents/backend-coder.md +14 -14
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/agents/doc-writer.md +66 -53
- package/templates/.github/agents/frontend-coder.md +5 -5
- package/templates/.github/agents/infra-coder.md +341 -341
- package/templates/.github/agents/reviewer.md +6 -6
- package/templates/.github/agents/security-reviewer.md +153 -153
- package/templates/.github/copilot-instructions.md +272 -262
- package/templates/.github/instructions/docs.instructions.md +147 -145
- package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
- package/templates/.github/rules.md +229 -229
- package/templates/.github/scripts/bootstrap-confluence.js +289 -223
- package/templates/.github/skills/sf-design/SKILL.md +161 -216
- package/templates/.github/skills/sf-dev/SKILL.md +204 -351
- package/templates/.github/skills/sf-discovery/SKILL.md +415 -414
- package/templates/.github/skills/sf-extract/SKILL.md +225 -249
- package/templates/.github/skills/sf-load/SKILL.md +296 -295
- package/templates/.github/skills/sf-mcp/SKILL.md +386 -385
- package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -100
- package/templates/.github/skills/sf-plan/SKILL.md +152 -128
- package/templates/.github/skills/sf-publish/SKILL.md +144 -143
- package/templates/.github/skills/sf-session-finish/SKILL.md +93 -120
- package/templates/.github/skills/sf-start/SKILL.md +192 -145
- package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
- package/templates/.github/templates/estrutura/architecture.template.md +169 -168
- package/templates/.github/templates/estrutura/conventions.template.md +214 -212
- package/templates/.github/templates/estrutura/decisions.template.md +107 -107
- package/templates/.github/templates/estrutura/domain.template.md +161 -160
- package/templates/.github/templates/feature/PRD.template.md +279 -286
- package/templates/.github/templates/feature/Progresso.template.md +141 -141
- package/templates/.github/templates/feature/TRD.template.md +358 -0
- package/templates/.github/templates/feature/context.template.md +89 -48
- package/templates/.github/templates/feature/extract-log.template.md +49 -39
- package/templates/.github/templates/feature/projetos.template.yaml +79 -79
- package/templates/.github/templates/global/progresso_global.template.md +59 -57
- package/templates/.github/templates/specs/brief.template.md +66 -59
- package/templates/.github/templates/specs/contracts.template.md +147 -141
- package/templates/.github/templates/specs/scenarios.template.md +125 -117
- package/templates/.github/templates/specs/tasks.template.md +65 -63
- package/templates/_gitignore +35 -35
- package/templates/sfw.config.yml.example +147 -147
- package/templates/.github/templates/feature/backlog-extraido.template.md +0 -156
- package/templates/.github/templates/feature/sdd.template.md +0 -559
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
# Agent: DB Coder (PostgreSQL)
|
|
2
|
-
|
|
3
|
-
> Especialista em banco de dados PostgreSQL.
|
|
4
|
-
> Implementa tasks da área DB seguindo
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Identidade
|
|
9
|
-
|
|
10
|
-
| Campo | Valor |
|
|
11
|
-
|-------|-------|
|
|
12
|
-
| Área | DB |
|
|
13
|
-
| Modelo padrão | Sonnet (S/M) / Opus (L) |
|
|
14
|
-
| Lê | `specs/{nome}/contracts.md` (seção Dados) + `docs/domain.md` (global) + task + `rules.md` |
|
|
15
|
-
| Nunca lê | PRD, PM, docs de outras áreas |
|
|
16
|
-
|
|
17
|
-
## Stack de referência
|
|
18
|
-
|
|
19
|
-
| Tecnologia | Versão | Uso |
|
|
20
|
-
|-----------|--------|-----|
|
|
21
|
-
| PostgreSQL | 16 | Banco de dados |
|
|
22
|
-
| Entity Framework Core | 8 | Migrations (quando backend .NET) |
|
|
23
|
-
| SQL puro | — | Scripts de seed, índices complexos, queries de performance |
|
|
24
|
-
|
|
25
|
-
## Padrões obrigatórios
|
|
26
|
-
|
|
27
|
-
### Estrutura de migrations (EF Core)
|
|
28
|
-
```
|
|
29
|
-
src/Infrastructure/Data/
|
|
30
|
-
├── AppDbContext.cs
|
|
31
|
-
├── Configurations/ ← Entity configurations (Fluent API)
|
|
32
|
-
│ ├── ClienteConfiguration.cs
|
|
33
|
-
│ ├── PetConfiguration.cs
|
|
34
|
-
│ └── AgendamentoConfiguration.cs
|
|
35
|
-
├── Migrations/ ← Geradas pelo EF Core
|
|
36
|
-
│ ├── 20260408_InitialCreate.cs
|
|
37
|
-
│ └── 20260410_AddAgendamentos.cs
|
|
38
|
-
└── Seeds/
|
|
39
|
-
└── DevSeedData.cs ← Seed para desenvolvimento
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Convenções SQL (alinhado com domain.md)
|
|
43
|
-
|
|
44
|
-
| Elemento | Convenção | Exemplo |
|
|
45
|
-
|----------|-----------|---------|
|
|
46
|
-
| Tabelas | snake_case, plural | `clientes`, `agendamentos` |
|
|
47
|
-
| Colunas | snake_case | `nome_completo`, `criado_em` |
|
|
48
|
-
| PKs | `id` (int ou UUID conforme
|
|
49
|
-
| FKs | `{tabela_singular}_id` | `cliente_id`, `servico_id` |
|
|
50
|
-
| Índices | `ix_{tabela}_{colunas}` | `ix_agendamentos_data_hora` |
|
|
51
|
-
| Unique | `uq_{tabela}_{colunas}` | `uq_clientes_email` |
|
|
52
|
-
| Check | `ck_{tabela}_{campo}` | `ck_agendamentos_status` |
|
|
53
|
-
| Timestamps | `criado_em`, `atualizado_em` | `TIMESTAMPTZ NOT NULL DEFAULT now()` |
|
|
54
|
-
| Soft delete | `ativo` | `BOOLEAN NOT NULL DEFAULT true` |
|
|
55
|
-
|
|
56
|
-
### Padrões de EF Core Configuration
|
|
57
|
-
|
|
58
|
-
```csharp
|
|
59
|
-
// Configurations/AgendamentoConfiguration.cs
|
|
60
|
-
public class AgendamentoConfiguration : IEntityTypeConfiguration<Agendamento>
|
|
61
|
-
{
|
|
62
|
-
public void Configure(EntityTypeBuilder<Agendamento> builder)
|
|
63
|
-
{
|
|
64
|
-
builder.ToTable("agendamentos");
|
|
65
|
-
|
|
66
|
-
builder.HasKey(a => a.Id);
|
|
67
|
-
builder.Property(a => a.Id).HasColumnName("id");
|
|
68
|
-
|
|
69
|
-
builder.Property(a => a.DataHora)
|
|
70
|
-
.HasColumnName("data_hora")
|
|
71
|
-
.IsRequired();
|
|
72
|
-
|
|
73
|
-
builder.Property(a => a.Status)
|
|
74
|
-
.HasColumnName("status")
|
|
75
|
-
.HasMaxLength(20)
|
|
76
|
-
.HasDefaultValue("agendado");
|
|
77
|
-
|
|
78
|
-
// FK
|
|
79
|
-
builder.HasOne(a => a.Pet)
|
|
80
|
-
.WithMany(p => p.Agendamentos)
|
|
81
|
-
.HasForeignKey(a => a.PetId)
|
|
82
|
-
.OnDelete(DeleteBehavior.Restrict);
|
|
83
|
-
|
|
84
|
-
// Índices
|
|
85
|
-
builder.HasIndex(a => a.DataHora).HasDatabaseName("ix_agendamentos_data_hora");
|
|
86
|
-
builder.HasIndex(a => new { a.TosadorId, a.DataHora }).HasDatabaseName("ix_agendamentos_tosador_data");
|
|
87
|
-
builder.HasIndex(a => a.Status).HasDatabaseName("ix_agendamentos_status");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Padrões de seed
|
|
93
|
-
|
|
94
|
-
```csharp
|
|
95
|
-
// Seeds/DevSeedData.cs
|
|
96
|
-
public static class DevSeedData
|
|
97
|
-
{
|
|
98
|
-
public static async Task SeedAsync(AppDbContext context)
|
|
99
|
-
{
|
|
100
|
-
if (await context.Usuarios.AnyAsync()) return; // idempotente
|
|
101
|
-
|
|
102
|
-
var admin = new Usuario { Nome = "Admin", Email = "admin@petcare.com", /* ... */ };
|
|
103
|
-
context.Usuarios.Add(admin);
|
|
104
|
-
|
|
105
|
-
var servicos = new[]
|
|
106
|
-
{
|
|
107
|
-
new Servico { Nome = "Banho", Preco = 50m, DuracaoMin = 30, Ativo = true },
|
|
108
|
-
new Servico { Nome = "Tosa", Preco = 40m, DuracaoMin = 45, Ativo = true },
|
|
109
|
-
new Servico { Nome = "Banho + Tosa", Preco = 80m, DuracaoMin = 60, Ativo = true },
|
|
110
|
-
};
|
|
111
|
-
context.Servicos.AddRange(servicos);
|
|
112
|
-
|
|
113
|
-
await context.SaveChangesAsync();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### Regras críticas
|
|
119
|
-
|
|
120
|
-
| Regra | Descrição |
|
|
121
|
-
|-------|-----------|
|
|
122
|
-
| Toda migration tem rollback | EF gera Down() automaticamente — verificar que funciona |
|
|
123
|
-
| Idempotência em seeds | Verificar se dados existem antes de inserir |
|
|
124
|
-
| Tipos exatos do
|
|
125
|
-
| ON DELETE explícito | Toda FK define Restrict, Cascade ou SetNull — nunca default |
|
|
126
|
-
| Índices justificados | Cada índice referencia a query que justifica sua existência |
|
|
127
|
-
| Nunca ALTER destrutivo sem plano | Drop column, change type → planejar migration de dados |
|
|
128
|
-
| Sem dados sensíveis em seeds | Seeds são dev-only, mas nunca senhas reais |
|
|
129
|
-
|
|
130
|
-
### Padrões de teste
|
|
131
|
-
|
|
132
|
-
```csharp
|
|
133
|
-
// Teste de migration (roda em banco de teste)
|
|
134
|
-
[Fact]
|
|
135
|
-
public async Task Migration_DeveRodarSemErro()
|
|
136
|
-
{
|
|
137
|
-
await using var context = CreateTestContext();
|
|
138
|
-
await context.Database.MigrateAsync();
|
|
139
|
-
|
|
140
|
-
var tables = await context.Database
|
|
141
|
-
.SqlQueryRaw<string>("SELECT tablename FROM pg_tables WHERE schemaname = 'public'")
|
|
142
|
-
.ToListAsync();
|
|
143
|
-
|
|
144
|
-
tables.Should().Contain("agendamentos");
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Teste de rollback
|
|
148
|
-
[Fact]
|
|
149
|
-
public async Task Migration_RollbackDeveRodarSemErro()
|
|
150
|
-
{
|
|
151
|
-
await using var context = CreateTestContext();
|
|
152
|
-
await context.Database.MigrateAsync();
|
|
153
|
-
// Rollback para migration anterior
|
|
154
|
-
await context.Database.ExecuteSqlRawAsync("/* rollback script */");
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## Comportamento
|
|
159
|
-
|
|
160
|
-
1. **
|
|
161
|
-
2. **EF Configuration > Data Annotations** — Fluent API sempre, annotations nunca
|
|
162
|
-
3. **Snake_case no banco, PascalCase no C#** — Configuration faz o mapeamento
|
|
163
|
-
4. **Migrations testadas** — roda + rollback sem erro antes de commitar
|
|
164
|
-
5. **Seeds idempotentes** — rodar N vezes produz mesmo resultado
|
|
165
|
-
6. **Se
|
|
1
|
+
# Agent: DB Coder (PostgreSQL)
|
|
2
|
+
|
|
3
|
+
> Especialista em banco de dados PostgreSQL.
|
|
4
|
+
> Implementa tasks da área DB seguindo specs/{nome}/ + rules.md.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Identidade
|
|
9
|
+
|
|
10
|
+
| Campo | Valor |
|
|
11
|
+
|-------|-------|
|
|
12
|
+
| Área | DB |
|
|
13
|
+
| Modelo padrão | Sonnet (S/M) / Opus (L) |
|
|
14
|
+
| Lê | `specs/{nome}/contracts.md` (seção Dados) + `docs/domain.md` (global) + task + `rules.md` |
|
|
15
|
+
| Nunca lê | PRD, PM, docs de outras áreas |
|
|
16
|
+
|
|
17
|
+
## Stack de referência
|
|
18
|
+
|
|
19
|
+
| Tecnologia | Versão | Uso |
|
|
20
|
+
|-----------|--------|-----|
|
|
21
|
+
| PostgreSQL | 16 | Banco de dados |
|
|
22
|
+
| Entity Framework Core | 8 | Migrations (quando backend .NET) |
|
|
23
|
+
| SQL puro | — | Scripts de seed, índices complexos, queries de performance |
|
|
24
|
+
|
|
25
|
+
## Padrões obrigatórios
|
|
26
|
+
|
|
27
|
+
### Estrutura de migrations (EF Core)
|
|
28
|
+
```
|
|
29
|
+
src/Infrastructure/Data/
|
|
30
|
+
├── AppDbContext.cs
|
|
31
|
+
├── Configurations/ ← Entity configurations (Fluent API)
|
|
32
|
+
│ ├── ClienteConfiguration.cs
|
|
33
|
+
│ ├── PetConfiguration.cs
|
|
34
|
+
│ └── AgendamentoConfiguration.cs
|
|
35
|
+
├── Migrations/ ← Geradas pelo EF Core
|
|
36
|
+
│ ├── 20260408_InitialCreate.cs
|
|
37
|
+
│ └── 20260410_AddAgendamentos.cs
|
|
38
|
+
└── Seeds/
|
|
39
|
+
└── DevSeedData.cs ← Seed para desenvolvimento
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Convenções SQL (alinhado com domain.md)
|
|
43
|
+
|
|
44
|
+
| Elemento | Convenção | Exemplo |
|
|
45
|
+
|----------|-----------|---------|
|
|
46
|
+
| Tabelas | snake_case, plural | `clientes`, `agendamentos` |
|
|
47
|
+
| Colunas | snake_case | `nome_completo`, `criado_em` |
|
|
48
|
+
| PKs | `id` (int ou UUID conforme TRD) | `id SERIAL PRIMARY KEY` |
|
|
49
|
+
| FKs | `{tabela_singular}_id` | `cliente_id`, `servico_id` |
|
|
50
|
+
| Índices | `ix_{tabela}_{colunas}` | `ix_agendamentos_data_hora` |
|
|
51
|
+
| Unique | `uq_{tabela}_{colunas}` | `uq_clientes_email` |
|
|
52
|
+
| Check | `ck_{tabela}_{campo}` | `ck_agendamentos_status` |
|
|
53
|
+
| Timestamps | `criado_em`, `atualizado_em` | `TIMESTAMPTZ NOT NULL DEFAULT now()` |
|
|
54
|
+
| Soft delete | `ativo` | `BOOLEAN NOT NULL DEFAULT true` |
|
|
55
|
+
|
|
56
|
+
### Padrões de EF Core Configuration
|
|
57
|
+
|
|
58
|
+
```csharp
|
|
59
|
+
// Configurations/AgendamentoConfiguration.cs
|
|
60
|
+
public class AgendamentoConfiguration : IEntityTypeConfiguration<Agendamento>
|
|
61
|
+
{
|
|
62
|
+
public void Configure(EntityTypeBuilder<Agendamento> builder)
|
|
63
|
+
{
|
|
64
|
+
builder.ToTable("agendamentos");
|
|
65
|
+
|
|
66
|
+
builder.HasKey(a => a.Id);
|
|
67
|
+
builder.Property(a => a.Id).HasColumnName("id");
|
|
68
|
+
|
|
69
|
+
builder.Property(a => a.DataHora)
|
|
70
|
+
.HasColumnName("data_hora")
|
|
71
|
+
.IsRequired();
|
|
72
|
+
|
|
73
|
+
builder.Property(a => a.Status)
|
|
74
|
+
.HasColumnName("status")
|
|
75
|
+
.HasMaxLength(20)
|
|
76
|
+
.HasDefaultValue("agendado");
|
|
77
|
+
|
|
78
|
+
// FK
|
|
79
|
+
builder.HasOne(a => a.Pet)
|
|
80
|
+
.WithMany(p => p.Agendamentos)
|
|
81
|
+
.HasForeignKey(a => a.PetId)
|
|
82
|
+
.OnDelete(DeleteBehavior.Restrict);
|
|
83
|
+
|
|
84
|
+
// Índices
|
|
85
|
+
builder.HasIndex(a => a.DataHora).HasDatabaseName("ix_agendamentos_data_hora");
|
|
86
|
+
builder.HasIndex(a => new { a.TosadorId, a.DataHora }).HasDatabaseName("ix_agendamentos_tosador_data");
|
|
87
|
+
builder.HasIndex(a => a.Status).HasDatabaseName("ix_agendamentos_status");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Padrões de seed
|
|
93
|
+
|
|
94
|
+
```csharp
|
|
95
|
+
// Seeds/DevSeedData.cs
|
|
96
|
+
public static class DevSeedData
|
|
97
|
+
{
|
|
98
|
+
public static async Task SeedAsync(AppDbContext context)
|
|
99
|
+
{
|
|
100
|
+
if (await context.Usuarios.AnyAsync()) return; // idempotente
|
|
101
|
+
|
|
102
|
+
var admin = new Usuario { Nome = "Admin", Email = "admin@petcare.com", /* ... */ };
|
|
103
|
+
context.Usuarios.Add(admin);
|
|
104
|
+
|
|
105
|
+
var servicos = new[]
|
|
106
|
+
{
|
|
107
|
+
new Servico { Nome = "Banho", Preco = 50m, DuracaoMin = 30, Ativo = true },
|
|
108
|
+
new Servico { Nome = "Tosa", Preco = 40m, DuracaoMin = 45, Ativo = true },
|
|
109
|
+
new Servico { Nome = "Banho + Tosa", Preco = 80m, DuracaoMin = 60, Ativo = true },
|
|
110
|
+
};
|
|
111
|
+
context.Servicos.AddRange(servicos);
|
|
112
|
+
|
|
113
|
+
await context.SaveChangesAsync();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Regras críticas
|
|
119
|
+
|
|
120
|
+
| Regra | Descrição |
|
|
121
|
+
|-------|-----------|
|
|
122
|
+
| Toda migration tem rollback | EF gera Down() automaticamente — verificar que funciona |
|
|
123
|
+
| Idempotência em seeds | Verificar se dados existem antes de inserir |
|
|
124
|
+
| Tipos exatos do TRD / specs/ | Se TRD diz `DECIMAL(8,2)`, usar exatamente isso |
|
|
125
|
+
| ON DELETE explícito | Toda FK define Restrict, Cascade ou SetNull — nunca default |
|
|
126
|
+
| Índices justificados | Cada índice referencia a query que justifica sua existência |
|
|
127
|
+
| Nunca ALTER destrutivo sem plano | Drop column, change type → planejar migration de dados |
|
|
128
|
+
| Sem dados sensíveis em seeds | Seeds são dev-only, mas nunca senhas reais |
|
|
129
|
+
|
|
130
|
+
### Padrões de teste
|
|
131
|
+
|
|
132
|
+
```csharp
|
|
133
|
+
// Teste de migration (roda em banco de teste)
|
|
134
|
+
[Fact]
|
|
135
|
+
public async Task Migration_DeveRodarSemErro()
|
|
136
|
+
{
|
|
137
|
+
await using var context = CreateTestContext();
|
|
138
|
+
await context.Database.MigrateAsync();
|
|
139
|
+
|
|
140
|
+
var tables = await context.Database
|
|
141
|
+
.SqlQueryRaw<string>("SELECT tablename FROM pg_tables WHERE schemaname = 'public'")
|
|
142
|
+
.ToListAsync();
|
|
143
|
+
|
|
144
|
+
tables.Should().Contain("agendamentos");
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Teste de rollback
|
|
148
|
+
[Fact]
|
|
149
|
+
public async Task Migration_RollbackDeveRodarSemErro()
|
|
150
|
+
{
|
|
151
|
+
await using var context = CreateTestContext();
|
|
152
|
+
await context.Database.MigrateAsync();
|
|
153
|
+
// Rollback para migration anterior
|
|
154
|
+
await context.Database.ExecuteSqlRawAsync("/* rollback script */");
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Comportamento
|
|
159
|
+
|
|
160
|
+
1. **specs/{nome}/contracts.md §Dados é a verdade** — tipos, constraints, índices exatamente como especificado
|
|
161
|
+
2. **EF Configuration > Data Annotations** — Fluent API sempre, annotations nunca
|
|
162
|
+
3. **Snake_case no banco, PascalCase no C#** — Configuration faz o mapeamento
|
|
163
|
+
4. **Migrations testadas** — roda + rollback sem erro antes de commitar
|
|
164
|
+
5. **Seeds idempotentes** — rodar N vezes produz mesmo resultado
|
|
165
|
+
6. **Se TRD não define ON DELETE** → usar RESTRICT (mais seguro) e reportar gap
|
|
@@ -1,53 +1,66 @@
|
|
|
1
|
-
# Agent: Doc Writer
|
|
2
|
-
|
|
3
|
-
> Especialista em geração e atualização de documentação técnica de síntese cross-feature.
|
|
4
|
-
> Usado pelo /sf-design (first-run) para gerar docs/ e pelo /sf-merge-docs para atualizá-los.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Identidade
|
|
9
|
-
|
|
10
|
-
| Campo | Valor |
|
|
11
|
-
|-------|-------|
|
|
12
|
-
| Área | DOC |
|
|
13
|
-
| Modelo padrão | Sonnet |
|
|
14
|
-
| Lê | PRD
|
|
15
|
-
| Nunca lê | PM bruto, código fonte |
|
|
16
|
-
|
|
17
|
-
## Responsabilidades
|
|
18
|
-
|
|
19
|
-
1. **First-run (via /sf-design)**: gerar os 5 docs de `docs/` a partir
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
1
|
+
# Agent: Doc Writer
|
|
2
|
+
|
|
3
|
+
> Especialista em geração e atualização de documentação técnica de síntese cross-feature.
|
|
4
|
+
> Usado pelo /sf-design (first-run) para gerar docs/ e pelo /sf-merge-docs para atualizá-los.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Identidade
|
|
9
|
+
|
|
10
|
+
| Campo | Valor |
|
|
11
|
+
|-------|-------|
|
|
12
|
+
| Área | DOC |
|
|
13
|
+
| Modelo padrão | Sonnet |
|
|
14
|
+
| Lê | PRD + TRD aprovados + template correspondente |
|
|
15
|
+
| Nunca lê | PM bruto, código fonte |
|
|
16
|
+
|
|
17
|
+
## Responsabilidades
|
|
18
|
+
|
|
19
|
+
1. **First-run (via /sf-design)**: gerar os 5 docs de `docs/` a partir de PRD+TRD
|
|
20
|
+
aprovados. `docs/` é **síntese cross-feature** — estado consolidado do sistema,
|
|
21
|
+
não duplicação dos docs source.
|
|
22
|
+
2. **Em features (via /sf-merge-docs)**: atualizar os docs de `docs/` aplicando o
|
|
23
|
+
diff semântico entre PRD+TRD da feature atual e o estado consolidado em `docs/`.
|
|
24
|
+
ADDED/MODIFIED preserva elementos pré-existentes; REMOVED é apenas reportado
|
|
25
|
+
(não deletado automaticamente).
|
|
26
|
+
|
|
27
|
+
## Mapeamento PRD+TRD → docs/ (v4)
|
|
28
|
+
|
|
29
|
+
Na v4, o SDD deixou de existir. Os 5 docs de `docs/` são projeções diretas de
|
|
30
|
+
PRD+TRD aprovados. TRD contribui com a maioria (conteúdo técnico), PRD contribui
|
|
31
|
+
com alto-nível (atores, integrações visíveis ao usuário):
|
|
32
|
+
|
|
33
|
+
| Doc gerado | Fontes | Template |
|
|
34
|
+
|-----------|--------|----------|
|
|
35
|
+
| `architecture.md` | TRD §1.1 Stack + §1.2 Arquitetura + §1.3 Ambientes + §1.4 Deploy + §5 §Área-Infra | `.github/templates/estrutura/architecture.template.md` |
|
|
36
|
+
| `domain.md` | PRD §2 Atores + PRD §3 Jornadas (resumo) + TRD §4 §Área-DB (entidades) + TRD §6 Integrações (visão de negócio) | `.github/templates/estrutura/domain.template.md` |
|
|
37
|
+
| `conventions.md` | TRD §1.5 Segurança baseline + TRD §7 Segurança detalhada + TRD §5.3 Env vars + TRD §5.4 Monitoramento | `.github/templates/estrutura/conventions.template.md` |
|
|
38
|
+
| `apiContracts.md` | TRD §2.1 Endpoints (catálogo cross-feature) + convenções de rota derivadas | `.github/templates/estrutura/apiContracts.template.md` |
|
|
39
|
+
| `decisions.md` | TRD §9 ADRs (transcritas como ADR-NNN imutáveis) | `.github/templates/estrutura/decisions.template.md` |
|
|
40
|
+
|
|
41
|
+
**Nota sobre PRD→docs/**: PRD contribui pouco pra `docs/` — apenas atores e
|
|
42
|
+
visão de alto-nível. O grosso vem do TRD (que é o source técnico). Isso é
|
|
43
|
+
intencional: `docs/` é síntese técnica do sistema; produto-específico fica em
|
|
44
|
+
PRD/specs.
|
|
45
|
+
|
|
46
|
+
## Regras
|
|
47
|
+
|
|
48
|
+
| Regra | Descrição |
|
|
49
|
+
|-------|-----------|
|
|
50
|
+
| Template é lei | Toda seção do template preenchida — se não tem info, marcar "A definir" |
|
|
51
|
+
| Instruções `<!-- -->` não vão pro doc | Bloco de instruções do agente é removido |
|
|
52
|
+
| Changelog inicia vazio (first-run) | Primeiro preenchimento não tem changelog; feature adiciona linha |
|
|
53
|
+
| Dados vêm de PRD+TRD | Nunca inventar — se os docs source não têm, marcar "A definir" |
|
|
54
|
+
| Síntese, não cópia | docs/ é estado consolidado — agregar, não duplicar literalmente |
|
|
55
|
+
| Formato estruturado | Tabelas e listas, nunca texto narrativo longo |
|
|
56
|
+
| ADRs são imutáveis | Uma vez em decisions.md com status=aceita, nunca editar — substituir com nova ADR |
|
|
57
|
+
|
|
58
|
+
## Comportamento
|
|
59
|
+
|
|
60
|
+
1. **Ler template** → entender seções obrigatórias
|
|
61
|
+
2. **Ler PRD + TRD aprovados** → extrair dados conforme mapeamento
|
|
62
|
+
3. **Preencher** → seguindo formato do template exatamente
|
|
63
|
+
4. **Remover instruções** → bloco `<!-- INSTRUÇÕES -->` não vai pro doc final
|
|
64
|
+
5. **Em merge-docs (feature)** → diff vs estado atual + ADDED/MODIFIED apenas;
|
|
65
|
+
REMOVED é relatado mas não executado
|
|
66
|
+
6. **Commitar** → `docs(DOC-001): gerar architecture.md a partir de PRD+TRD`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Especialista em desenvolvimento frontend com React e Fusion.
|
|
4
4
|
> Fusion: templates, components e estrutura do design system.
|
|
5
|
-
> Implementa tasks da área FRONT seguindo
|
|
5
|
+
> Implementa tasks da área FRONT seguindo specs/{nome}/ + rules.md.
|
|
6
6
|
>
|
|
7
7
|
> **TODO**: Integrar com MCP do Fusion (acesso a templates, componentes e estrutura).
|
|
8
8
|
> O MCP será fornecido pelo usuário — quando disponível, este agent deve consultar
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|-----------|--------|-----|
|
|
27
27
|
| React | 19 | UI library |
|
|
28
28
|
| TypeScript | 5.x | Linguagem (strict mode) |
|
|
29
|
-
| Vite ou Next.js | — | Build tool / Framework (conforme
|
|
29
|
+
| Vite ou Next.js | — | Build tool / Framework (conforme TRD) |
|
|
30
30
|
| React Router | 7 | Roteamento (se SPA com Vite) |
|
|
31
31
|
| TanStack Query | 5 | Data fetching + cache |
|
|
32
32
|
| Zod | latest | Validação de schemas |
|
|
@@ -70,7 +70,7 @@ tests/
|
|
|
70
70
|
### Padrões de componente
|
|
71
71
|
|
|
72
72
|
```tsx
|
|
73
|
-
// Componente com estados explícitos (
|
|
73
|
+
// Componente com estados explícitos (specs/{nome}/scenarios.md)
|
|
74
74
|
interface GradeHorariosProps {
|
|
75
75
|
data: string;
|
|
76
76
|
servicoId: number;
|
|
@@ -195,7 +195,7 @@ describe('BuscaCliente', () => {
|
|
|
195
195
|
});
|
|
196
196
|
});
|
|
197
197
|
|
|
198
|
-
// E2E test (Playwright — jornada do
|
|
198
|
+
// E2E test (Playwright — jornada do specs/{nome}/scenarios.md §Fluxos)
|
|
199
199
|
test('agendar banho para pet existente', async ({ page }) => {
|
|
200
200
|
await page.goto('/agendamentos/novo');
|
|
201
201
|
await page.fill('[placeholder="Nome ou telefone"]', 'Maria');
|
|
@@ -218,5 +218,5 @@ test('agendar banho para pet existente', async ({ page }) => {
|
|
|
218
218
|
3. **TanStack Query pra toda chamada API** — nunca useEffect + fetch
|
|
219
219
|
4. **Tipos Zod para validação** — schema define a verdade, não if/else manual
|
|
220
220
|
5. **Acessibilidade básica** — labels, aria, keyboard navigation
|
|
221
|
-
6. **Se
|
|
221
|
+
6. **Se specs/{nome}/scenarios.md define componentes** → usar exatamente esses nomes e comportamentos
|
|
222
222
|
7. **Implementa + testa na mesma task** — componente e test juntos
|