spec-first-copilot 0.5.0-beta.2 → 0.5.0-beta.4
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/lib/init.js +2 -2
- package/package.json +1 -1
- package/templates/.github/adapters/confluence.md +273 -0
- package/templates/.github/adapters/errors.md +234 -0
- package/templates/.github/adapters/filesystem.md +353 -0
- package/templates/.github/adapters/interface.md +301 -0
- package/templates/.github/adapters/naming.md +241 -0
- package/templates/.github/adapters/registry.md +244 -0
- package/templates/.github/copilot-instructions.md +4 -5
- package/templates/.github/skills/sf-new-project/SKILL.md +128 -0
- package/templates/sfw.config.yml.example +131 -0
- package/templates/.github/skills/sf-setup-projeto/SKILL.md +0 -123
- package/templates/workspace/Input/setup_projeto/.gitkeep +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# sfw.config.yml — Manifesto do projeto SFW
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# Este arquivo define COMO o pipeline SFW fala com o mundo externo:
|
|
5
|
+
# - De onde vêm os insumos do PM/PO (input)
|
|
6
|
+
# - Pra onde vão os artefatos gerados (output.targets[])
|
|
7
|
+
# - Como os nomes dos itens são formados (naming)
|
|
8
|
+
#
|
|
9
|
+
# É commitável (zero segredos). Credenciais ficam em .mcp.json gitignored
|
|
10
|
+
# ou variáveis de ambiente exportadas ANTES de abrir o Claude Code.
|
|
11
|
+
#
|
|
12
|
+
# Gerado pelo CLI: `spec-first-claude init --name=X`
|
|
13
|
+
#
|
|
14
|
+
# Referências:
|
|
15
|
+
# - Interface do adapter: .github/adapters/interface.md
|
|
16
|
+
# - Adapters disponíveis: .github/adapters/registry.md
|
|
17
|
+
# - Templating de nomes: .github/adapters/naming.md
|
|
18
|
+
# - Erros: .github/adapters/errors.md
|
|
19
|
+
# ============================================================================
|
|
20
|
+
|
|
21
|
+
# ----------------------------------------------------------------------------
|
|
22
|
+
# project — identidade do projeto
|
|
23
|
+
# ----------------------------------------------------------------------------
|
|
24
|
+
project:
|
|
25
|
+
name: "Meu Projeto"
|
|
26
|
+
|
|
27
|
+
# ----------------------------------------------------------------------------
|
|
28
|
+
# naming — templates de nome (aplicados pela engine em .github/adapters/naming.md)
|
|
29
|
+
# ----------------------------------------------------------------------------
|
|
30
|
+
# Placeholders suportados: {scope}, {type}
|
|
31
|
+
# {scope} = nome do item no Input (ex: "app_barbearia", "feat_login")
|
|
32
|
+
# {type} = tipo do artefato (ex: "TRD", "SDD", "PRD", "Progresso")
|
|
33
|
+
# Qualquer outro placeholder → ValidationError no load do manifest.
|
|
34
|
+
#
|
|
35
|
+
# O usuário nomeia livremente os items no Input — o agent NÃO impõe naming.
|
|
36
|
+
# Estes templates controlam apenas o que o agent GERA no Output.
|
|
37
|
+
naming:
|
|
38
|
+
# Subpasta (ou page-mãe) criada no Output por scope
|
|
39
|
+
# Ex: "out_app_barbearia", "out_feat_login"
|
|
40
|
+
output_container: "out_{scope}"
|
|
41
|
+
|
|
42
|
+
# Nome do artefato DENTRO do container
|
|
43
|
+
# No Confluence: {scope} no nome evita colisão de títulos no space
|
|
44
|
+
# No filesystem: pode simplificar pra "{type}" (sem redundância de scope)
|
|
45
|
+
output_artifact: "{scope} - {type}"
|
|
46
|
+
|
|
47
|
+
# ----------------------------------------------------------------------------
|
|
48
|
+
# input — de onde vêm os insumos do PM/PO (single source no MVP)
|
|
49
|
+
# ----------------------------------------------------------------------------
|
|
50
|
+
# /load {scope} usa esta seção pra puxar o conteúdo pro filesystem local.
|
|
51
|
+
# Dev nunca edita o backend de input — só lê. PM owns este espaço.
|
|
52
|
+
#
|
|
53
|
+
# O agent faz listChildren(parent_page_id) e busca o scope pelo nome.
|
|
54
|
+
# Se o scope não existir no backend, /load falha com erro explícito.
|
|
55
|
+
input:
|
|
56
|
+
# Chave do adapter no registry. MVP: "confluence" | "filesystem"
|
|
57
|
+
adapter: confluence
|
|
58
|
+
|
|
59
|
+
# Config passada pro adapter.validateConfig(). Campos obrigatórios/opcionais
|
|
60
|
+
# são documentados no arquivo do adapter (ex: .github/adapters/confluence.md).
|
|
61
|
+
config:
|
|
62
|
+
space_key: ST
|
|
63
|
+
parent_page_id: "360668" # page-mãe que contém os scopes no Input
|
|
64
|
+
recursive: true # desce na árvore de scopes
|
|
65
|
+
include_attachments: true # baixa PNGs, PDFs, planilhas
|
|
66
|
+
|
|
67
|
+
# Cache local onde /load materializa os insumos
|
|
68
|
+
cache:
|
|
69
|
+
local_dir: "workspace/Input/"
|
|
70
|
+
log: ".ai/load-log.md" # append-only: id, version, sha256, timestamp
|
|
71
|
+
incremental: true # hash-based re-load (NOVO/MODIFICADO/INALTERADO)
|
|
72
|
+
|
|
73
|
+
# ----------------------------------------------------------------------------
|
|
74
|
+
# output — pra onde os artefatos vão (MVP: 1 target, multi-target em P2)
|
|
75
|
+
# ----------------------------------------------------------------------------
|
|
76
|
+
# Cada target recebe um subset de artefatos via `publishes`.
|
|
77
|
+
# Auto-publish é disparado pelas skills (/extract, /design, /plan).
|
|
78
|
+
# Agent owns este espaço. PM só aplica label `sfw-approved` pra aprovar.
|
|
79
|
+
#
|
|
80
|
+
# Premissa: 1 space = 1 projeto (no Confluence). Multi-projeto no mesmo
|
|
81
|
+
# space causa colisão de títulos — constraint do Confluence, não do SFW.
|
|
82
|
+
# Se necessário, o user diferencia no Input (nomes únicos) e o Output
|
|
83
|
+
# herda a unicidade via {scope} no naming.
|
|
84
|
+
output:
|
|
85
|
+
targets:
|
|
86
|
+
|
|
87
|
+
# --- Target 1: Confluence (espelho de aprovação pro time) ---------------
|
|
88
|
+
- name: confluence-mirror
|
|
89
|
+
|
|
90
|
+
adapter: confluence
|
|
91
|
+
|
|
92
|
+
config:
|
|
93
|
+
space_key: ST
|
|
94
|
+
parent_page_id: "294931" # page-mãe do Output no Confluence
|
|
95
|
+
|
|
96
|
+
# Whitelist de tipos que este target recebe.
|
|
97
|
+
# Tipos válidos: PRD, TRD, SDD, Progresso
|
|
98
|
+
# (tasks.md, docs/, projetos.yaml, specs/ ficam LOCAL ONLY —
|
|
99
|
+
# ver §9.9 "Boundary publish vs local")
|
|
100
|
+
publishes: [PRD, TRD, SDD, Progresso]
|
|
101
|
+
|
|
102
|
+
# auto — skill dispara publish automaticamente no fim
|
|
103
|
+
# manual — skill gera artefato local e pergunta se quer publicar
|
|
104
|
+
# off — target ignorado (offline-first natural)
|
|
105
|
+
mode: auto
|
|
106
|
+
|
|
107
|
+
# Estratégia de conflict detection:
|
|
108
|
+
# version — compara version do backend com publish-log antes de update
|
|
109
|
+
# hash — compara sha256 do conteúdo remoto com snapshot local
|
|
110
|
+
# none — sobrescreve cego (NÃO recomendado; perde drift humano)
|
|
111
|
+
conflict_detection: version
|
|
112
|
+
|
|
113
|
+
# Mecanismo de aprovação do artefato publicado:
|
|
114
|
+
# label — PM aplica label na página Confluence pra marcar aprovado
|
|
115
|
+
# none — sem aprovação formal (pipeline segue sem checar)
|
|
116
|
+
approval_mechanism: label
|
|
117
|
+
approval_label: "sfw-approved"
|
|
118
|
+
|
|
119
|
+
# --- Target 2: Filesystem mirror (opcional — time offline/backup) -------
|
|
120
|
+
# Descomente pra ativar. Útil pra testes E2E com FilesystemAdapter como
|
|
121
|
+
# mock natural — zero lib de mock, zero stub.
|
|
122
|
+
#
|
|
123
|
+
# - name: local-mirror
|
|
124
|
+
# adapter: filesystem
|
|
125
|
+
# config:
|
|
126
|
+
# root_path: "./mirror"
|
|
127
|
+
# glob: "**/*.md"
|
|
128
|
+
# publishes: [PRD, TRD, SDD, Progresso]
|
|
129
|
+
# mode: auto
|
|
130
|
+
# conflict_detection: hash
|
|
131
|
+
# approval_mechanism: none
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sf-setup-projeto
|
|
3
|
-
description: |
|
|
4
|
-
Bootstrap do projeto. Cria contexto TRD, chama /sf-extract, para no checkpoint.
|
|
5
|
-
Trigger: /sf-setup-projeto
|
|
6
|
-
author: GustavoMaritan
|
|
7
|
-
version: 1.0.0
|
|
8
|
-
date: 2026-04-08
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Skill: /sf-setup-projeto
|
|
12
|
-
|
|
13
|
-
> Orquestrador de bootstrap do projeto. Executa uma única vez.
|
|
14
|
-
> Cria contexto TRD, chama `/extract` e para no checkpoint de aprovação.
|
|
15
|
-
|
|
16
|
-
## Tipo
|
|
17
|
-
Orquestrador (primeira etapa do pipeline)
|
|
18
|
-
|
|
19
|
-
## Uso
|
|
20
|
-
```
|
|
21
|
-
/sf-setup-projeto
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Pré-condições
|
|
25
|
-
|
|
26
|
-
| # | Validação | Se falhar |
|
|
27
|
-
|---|-----------|-----------|
|
|
28
|
-
| 1 | `workspace/Input/setup_projeto/` existe | Parar → "Crie a pasta workspace/Input/setup_projeto/ e adicione seus insumos" |
|
|
29
|
-
| 2 | Pasta contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Adicione insumos na pasta (aceitos: .md, .txt, .sql, .xml, .html, .json, .csv, .png, .jpg, .pdf — qualquer formato)" |
|
|
30
|
-
| 3 | `docs/` está vazio ou contém apenas templates vazios | Parar → "Setup já foi executado. Use /sf-feature para novas funcionalidades" |
|
|
31
|
-
| 4 | `workspace/Output/setup_projeto/.context.md` não existe ou status é `not_started` | Parar → "Setup já está em andamento. Verifique o status em .context.md" |
|
|
32
|
-
|
|
33
|
-
## Passos
|
|
34
|
-
|
|
35
|
-
### 1. Criar estrutura
|
|
36
|
-
```
|
|
37
|
-
workspace/Output/setup_projeto/
|
|
38
|
-
├── .context.md ← criado agora
|
|
39
|
-
└── (TRD.md será criado pelo /extract)
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### 2. Criar `.context.md`
|
|
43
|
-
```yaml
|
|
44
|
-
---
|
|
45
|
-
nome: "setup_projeto"
|
|
46
|
-
tipo: "setup"
|
|
47
|
-
documento: "TRD"
|
|
48
|
-
pm_path: "workspace/Input/setup_projeto/"
|
|
49
|
-
status: "not_started"
|
|
50
|
-
ultima_skill: "/sf-setup-projeto"
|
|
51
|
-
atualizado_em: "{{ISO_DATETIME}}"
|
|
52
|
-
---
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 3. Sugerir /sf-discovery (RECOMENDADO)
|
|
56
|
-
|
|
57
|
-
Antes de extrair, perguntar ao usuário:
|
|
58
|
-
```
|
|
59
|
-
📋 Insumos encontrados em workspace/Input/setup_projeto/.
|
|
60
|
-
|
|
61
|
-
Recomendo rodar /sf-discovery antes da extração para:
|
|
62
|
-
- Análise profunda dos insumos (parseia drawio, XML, SQL completo)
|
|
63
|
-
- Identificar gaps e contradições antes de estruturar
|
|
64
|
-
- Validar entendimento com você (mapa do sistema)
|
|
65
|
-
|
|
66
|
-
Quer rodar /sf-discovery workspace/Input/setup_projeto/ agora? (s/n)
|
|
67
|
-
Se SIM → rodar discovery, salvar discovery.md, depois continuar com extract
|
|
68
|
-
Se NÃO → pular direto para /sf-extract (ok para insumos simples)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Se o usuário aceitar:
|
|
72
|
-
- Rodar `/sf-discovery workspace/Input/setup_projeto/`
|
|
73
|
-
- Aguardar conclusão — discovery.md salvo em `workspace/Output/setup_projeto/`
|
|
74
|
-
- Continuar para o passo 4
|
|
75
|
-
|
|
76
|
-
### 4. Chamar `/sf-extract setup_projeto`
|
|
77
|
-
O `/sf-extract` lê os insumos + discovery.md (se existir), gera o TRD e atualiza status para `extract_done`.
|
|
78
|
-
|
|
79
|
-
### 5. CHECKPOINT — Parar e informar o usuário
|
|
80
|
-
Mensagem ao usuário:
|
|
81
|
-
```
|
|
82
|
-
✅ TRD gerado em workspace/Output/setup_projeto/TRD.md
|
|
83
|
-
|
|
84
|
-
Revise o documento. Quando estiver satisfeito, execute:
|
|
85
|
-
/sf-design setup_projeto
|
|
86
|
-
|
|
87
|
-
Se precisar adicionar mais insumos, coloque na pasta workspace/Input/setup_projeto/
|
|
88
|
-
e execute:
|
|
89
|
-
/sf-extract setup_projeto
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**O orquestrador encerra aqui.** O restante do pipeline é responsabilidade do usuário chamar as skills atômicas na ordem:
|
|
93
|
-
1. `/sf-design setup_projeto` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
|
|
94
|
-
2. `/sf-plan setup_projeto` (gera tasks com campo Repo por task)
|
|
95
|
-
3. `/sf-dev setup_projeto` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
|
|
96
|
-
|
|
97
|
-
## Saídas diretas desta skill
|
|
98
|
-
- `workspace/Output/setup_projeto/.context.md`
|
|
99
|
-
- `workspace/Output/setup_projeto/TRD.md` (via /extract)
|
|
100
|
-
- `workspace/Output/setup_projeto/.extract-log.md` (via /extract)
|
|
101
|
-
|
|
102
|
-
## Saídas indiretas (skills subsequentes)
|
|
103
|
-
- `sdd.md` (via /design)
|
|
104
|
-
- `projetos.yaml` (via /sf-design — manifesto de repos)
|
|
105
|
-
- `docs/` populado (via /design)
|
|
106
|
-
- `specs/{nome}/tasks.md` + `Progresso.md` (via /plan)
|
|
107
|
-
- `projetos/` com repos criados/clonados (via /sf-dev INFRA-001)
|
|
108
|
-
|
|
109
|
-
## Erros
|
|
110
|
-
|
|
111
|
-
| Erro | Ação |
|
|
112
|
-
|------|------|
|
|
113
|
-
| workspace/Input/setup_projeto/ não existe | Parar, instruir criação |
|
|
114
|
-
| workspace/Input/setup_projeto/ vazio | Parar, listar formatos aceitos |
|
|
115
|
-
| docs/ já populado | Parar, sugerir /sf-feature |
|
|
116
|
-
| Pipeline já iniciado | Parar, mostrar status atual do .context.md |
|
|
117
|
-
|
|
118
|
-
## Notas
|
|
119
|
-
- Esta skill roda **uma única vez** por projeto
|
|
120
|
-
- docs/ é gerado pelo /sf-design (passo 3), não por tasks DOC
|
|
121
|
-
- `projetos.yaml` é gerado pelo /sf-design (passo 3b) — mapeia serviços para repos
|
|
122
|
-
- Repos são criados/clonados pelo /sf-dev (INFRA-001) dentro de `projetos/`
|
|
123
|
-
- O `/merge-delta` NÃO se aplica ao setup (é criação, não atualização)
|
|
File without changes
|