@spec-wave/cli 0.26.0 → 0.28.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/package.json +1 -1
- package/src/api/github-rest.mjs +52 -0
- package/src/cli.mjs +12 -0
- package/src/commands/decompose.mjs +166 -39
- package/src/commands/doctor.mjs +214 -3
- package/src/commands/generate-bug.mjs +22 -16
- package/src/commands/generate-plan.mjs +72 -23
- package/src/commands/generate-spec.mjs +19 -15
- package/src/commands/implement.mjs +47 -22
- package/src/commands/install-skill.mjs +18 -8
- package/src/commands/preflight.mjs +322 -0
- package/src/commands/run.mjs +51 -30
- package/src/commands/update.mjs +143 -12
- package/src/commands/validate.mjs +84 -17
- package/src/config.mjs +18 -0
- package/src/lib/artifact-pr.mjs +272 -0
- package/src/lib/artifact-publish.mjs +169 -0
- package/src/lib/doc-availability.mjs +23 -1
- package/src/lib/doc-source.mjs +162 -0
- package/src/lib/flow-run.mjs +9 -218
- package/src/lib/next-step.mjs +27 -4
- package/src/lib/pr-branch.mjs +106 -7
- package/src/lib/repo-links.mjs +8 -2
- package/src/plugin/.claude-plugin/plugin.json +1 -1
- package/src/plugin/README.md +5 -0
- package/src/plugin/skills/bug/SKILL.md +2 -2
- package/src/plugin/skills/decompose/SKILL.md +4 -4
- package/src/plugin/skills/plan/SKILL.md +1 -1
- package/src/plugin/skills/preparar-feature/SKILL.md +245 -0
- package/src/plugin/skills/preparar-feature/reference/critica.md +88 -0
- package/src/plugin/skills/preparar-specs/SKILL.md +171 -0
- package/src/plugin/skills/preparar-specs/reference/armadilhas.md +209 -0
- package/src/plugin/skills/preparar-specs/reference/revisao.md +107 -0
- package/src/plugin/skills/run/SKILL.md +3 -1
- package/src/plugin/skills/spec/SKILL.md +4 -4
- package/src/plugin/skills/update/SKILL.md +10 -4
- package/src/plugin/skills/workflow/SKILL.md +8 -3
- package/src/templates/skill/SKILL.md +13 -10
- package/src/templates/workflows/code-review.yml +13 -2
- package/src/templates/workflows/critique.yml +1 -1
- package/src/templates/workflows/decompose.yml +13 -2
- package/src/templates/workflows/generate-bug.yml +17 -6
- package/src/templates/workflows/generate-plan.yml +20 -7
- package/src/templates/workflows/generate-spec.yml +20 -7
- package/src/templates/workflows/qa.yml +13 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-wave-preparar-feature
|
|
3
|
+
description: "Use para conduzir uma Feature do spec-wave pelo trecho que vai da spec pronta até ✅ Ready com as Stories e Tasks criadas no board: gera o plan.md, trata a crítica adversarial, valida, move a etapa, decompõe e confere o resultado. Gatilhos: 'gerar o plano', 'preparar a feature 12', 'deixar pronta para o dev', 'levar até ready', 'decompor a feature', 'roda o plan da #12'. Use mesmo quando o usuário nomear só um passo — os passos têm armadilhas encadeadas que só fazem sentido tratadas juntas. Para as specs de uma milestone inteira use preparar-specs; para um passo isolado e sem supervisão, as skills plan, ready ou decompose."
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash(npx @spec-wave/cli@latest *)
|
|
6
|
+
- Bash(gh issue *)
|
|
7
|
+
- Bash(gh pr *)
|
|
8
|
+
- Bash(gh api *)
|
|
9
|
+
- Bash(git *)
|
|
10
|
+
- Read
|
|
11
|
+
- Edit
|
|
12
|
+
- Glob
|
|
13
|
+
- Grep
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Preparar Feature — de `spec.md` até ✅ Ready
|
|
17
|
+
|
|
18
|
+
Conduz uma issue `[FEATURE]` pelo trecho do fluxo que vai da spec pronta até as Stories e Tasks criadas e visíveis no board.
|
|
19
|
+
|
|
20
|
+
O valor desta skill não está em executar os passos — isso é fácil. Está em **saber o que verificar depois de cada um**. O fluxo tem pontos onde ele para em silêncio, e cada um já custou horas quando passou despercebido. Se você seguir só a sequência feliz, vai reportar sucesso sobre um estado quebrado.
|
|
21
|
+
|
|
22
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
23
|
+
|
|
24
|
+
## O ciclo, e por que ele não é uma sequência de comandos
|
|
25
|
+
|
|
26
|
+
Cada passo publica o documento num **Pull Request próprio** (`spec-wave/<issue>-<doc>`), e o passo seguinte **lê da branch base**. O merge não é arrumação — é pré-requisito:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
run --dry-run → run --yes → PR do documento → revisar → merge → git pull → próximo passo
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Pular o merge não dá erro confuso: o `run` para e explica (`⛔ pr-pending`). Mas se você tentar contornar com `--step`, aí sim regenera por cima da revisão em curso e paga o modelo de novo.
|
|
33
|
+
|
|
34
|
+
**Nada é gravado no seu checkout.** Não crie branch para "trabalhar nela", não commite documento à mão, não abra PR no fim — a CLI já faz tudo isso, uma vez por documento.
|
|
35
|
+
|
|
36
|
+
## Modos de supervisão
|
|
37
|
+
|
|
38
|
+
O padrão **para nos dois portões de julgamento** e pede aprovação: depois da crítica do plano, e antes do `decompose-apply`. Foi exatamente ali que a supervisão humana pegou defeitos reais — um plano que afirmava "esta feature não cria tabela" e trazia um `CREATE TABLE` logo abaixo, e uma task de E2E numa Story que não declarava depender do backend. A crítica automática passou pelos dois.
|
|
39
|
+
|
|
40
|
+
Se o usuário pedir para você analisar e corrigir sozinho, siga — mas **leia cada artefato mesmo assim**. Não parar não é o mesmo que não olhar: corrija, siga, e registre no relatório final o que mudou e por quê.
|
|
41
|
+
|
|
42
|
+
## Antes de começar
|
|
43
|
+
|
|
44
|
+
Verifique tudo isto e **pare com um diagnóstico** se algo falhar:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx @spec-wave/cli@latest --version # >= 0.27.0
|
|
48
|
+
npx @spec-wave/cli@latest mode # actions ou local?
|
|
49
|
+
gh issue view <n> --json labels,title -q '{t:.title,l:[.labels[].name]}'
|
|
50
|
+
npx @spec-wave/cli@latest doctor
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**O modo decide como você aciona cada passo**, e os dois são legítimos:
|
|
54
|
+
|
|
55
|
+
| Modo | Aciona com | Observação |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `actions` | a label (`spec-wave:plan`, `:ready`, `:decompose`…) | roda no CI |
|
|
58
|
+
| `local` | `npx @spec-wave/cli@latest run <n>` | **não aplique label**: dispararia o Action e o passo rodaria duas vezes |
|
|
59
|
+
|
|
60
|
+
Se o repositório está em `local`, aplicar uma label não gera nada — o job é pulado pelo `if: vars.SPEC_WAVE_EXECUTION != 'local'` e o run aparece verde e `skipped`, sem erro e sem documento. É o sintoma mais silencioso do fluxo. O caminho contrário também engana: em `actions`, o `run` não recusa, apenas avisa.
|
|
61
|
+
|
|
62
|
+
Pare também se houver `spec-wave:critique-failed` ou `spec-wave:needs-human` — são portões humanos abertos de uma rodada anterior, e avançar por cima deles descarta a razão pela qual alguém parou.
|
|
63
|
+
|
|
64
|
+
O slug vem do título da issue. Confirme olhando `docs/features/`, não deduza.
|
|
65
|
+
|
|
66
|
+
### Onde começar depende do que já existe
|
|
67
|
+
|
|
68
|
+
Não assuma que a Feature chega do zero — outra pessoa pode ter avançado antes de você. O `run --dry-run` responde isso sozinho, e é sempre o primeiro comando:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx @spec-wave/cli@latest run <n> --dry-run
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Ele diz o passo pendente e o motivo, olhando o disco, a branch base **e** as branches de artefato. **Se `plan.md` já existe, nunca force `--step plan`** — ele regera o documento do zero e descarta o que houver, inclusive revisão manual. Para corrigir um plano existente, `--step critique`.
|
|
75
|
+
|
|
76
|
+
Leia também o último comentário 🔎 da issue; o marcador `<!-- spec-wave:critique kind=plan verdict=limpa -->` no topo diz o veredito sem você ter que interpretar o texto:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
gh issue view <n> --comments --json comments -q '.comments[-1].body' | head -20
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Um caso que o marcador revela: um `plan.md` gerado por um backend sem suporte a saída estruturada sai completo, mas a crítica aborta — e o comentário registra que o documento **não foi auditado**. Plano nunca auditado indo para `ready` é o sucesso aparente sobre estado não verificado que esta skill existe para evitar.
|
|
83
|
+
|
|
84
|
+
### Os portões do `run`
|
|
85
|
+
|
|
86
|
+
O `run` explica e para, saindo com código 2. Não force sem entender:
|
|
87
|
+
|
|
88
|
+
| Portão | O que significa |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `trigger-pending` | label de gatilho na issue. Em modo local ela é resíduo: **remova-a** em vez de usar `--force`, para a issue não mentir sobre o estado |
|
|
91
|
+
| `pr-pending` | o documento está num PR aberto. Revise e mergeie — regerar descarta a revisão |
|
|
92
|
+
| `branch-without-pr` | o commit passou e o PR não nasceu. Rode `doctor`: quase sempre é a opção de organização ou o `GH_PR_TOKEN` |
|
|
93
|
+
| `stale-checkout` | o documento já está publicado na base e não no seu clone. `git pull` |
|
|
94
|
+
| `needs-confirmation` | o passo cria issues. Revise o rascunho e confirme com `--apply` |
|
|
95
|
+
| `inconsistent-state` | uma label afirma um documento que não existe — o título mudou depois de gerar? |
|
|
96
|
+
|
|
97
|
+
### O modelo
|
|
98
|
+
|
|
99
|
+
Para forçar um modelo num passo, aplique `spec-wave:model:<apelido>` — os apelidos válidos são os de `ai.modelAliases` no `.spec-wave.json`, e só esses. Um apelido que aponta para um modelo que o provider configurado não serve falha no passo, não na label.
|
|
100
|
+
|
|
101
|
+
Confirme no log que o override pegou: `modelo: ... (origem: label)`.
|
|
102
|
+
|
|
103
|
+
> **Uma lição que sobrevive à troca de provider:** quando um passo estoura o teto de turnos sem gerar nada, **troque o modelo antes de mexer no contexto**. Enxugar o `tech_context` em 14% não destravou nada, porque a entrada eram ~20k tokens; trocar o modelo entregou plano + crítica em minutos.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 1 · Gerar o plano
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npx @spec-wave/cli@latest run <n> --dry-run
|
|
111
|
+
npx @spec-wave/cli@latest run <n> --yes
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
O `generate-plan` já critica o resultado ao final, no mesmo passo. O documento sai num PR.
|
|
115
|
+
|
|
116
|
+
Antes deste passo, garanta que `.github/config/tech_context.yml` está **commitado e na base** — o passo lê o arquivo do repositório, não do seu disco.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 2 · Tratar a crítica adversarial
|
|
121
|
+
|
|
122
|
+
**Leia `reference/critica.md` antes de corrigir qualquer coisa.** Ele traz o que a crítica erra, como distinguir falso positivo de defeito real, e quando parar de iterar — é a parte desta skill que mais economiza tempo.
|
|
123
|
+
|
|
124
|
+
O essencial:
|
|
125
|
+
|
|
126
|
+
- **Confira o finding contra o arquivo antes de corrigir.** Cite o trecho que confirma ou refuta. É o que distingue "corrigi o que a IA mandou" de "verifiquei e o problema existe".
|
|
127
|
+
- **Reaplique a crítica depois de editar**, mesmo com veredito `limpa` — ela é não-determinística, e a segunda passada costuma pegar a correção incompleta.
|
|
128
|
+
- **Corrigir o documento à mão não é desvio** — é o que o fluxo pede quando a crítica reprova. Edite **no PR**, onde as edições são preservadas.
|
|
129
|
+
|
|
130
|
+
Para recriticar sem regerar:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
npx @spec-wave/cli@latest run <n> --yes --step critique
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**`--step critique`, nunca `--step plan`.** O segundo regera o plano do zero e joga fora a correção — é o erro que faz o ciclo não convergir.
|
|
137
|
+
|
|
138
|
+
Se aparecer `spec-wave:needs-human`, a crítica esgotou as tentativas. Pare e envolva o usuário — a label precisa sair à mão.
|
|
139
|
+
|
|
140
|
+
**Mergeie o PR do plano antes de seguir.** O `validate` lê da base.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 3 · Validar
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npx @spec-wave/cli@latest run <n> --yes # validate
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Roda em segundos e **não usa IA**. Confere as seções obrigatórias de `spec.md` e `plan.md` e aplica `spec-wave:plan-approved`.
|
|
151
|
+
|
|
152
|
+
### O validate NÃO move a etapa
|
|
153
|
+
|
|
154
|
+
Primeiro ponto de parada silenciosa: a Feature passa na validação e **continua na etapa em que estava** — invisível na fila do TL, que lê `✅ Ready`. Nada no fluxo a move; o selo `plan-approved` é uma label, não uma coluna.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npx @spec-wave/cli@latest move <n> "ready"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Confirme depois lendo o board — a etapa nunca retrocede, então é melhor ver o estado do que supor.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 4 · Decompor — o rascunho
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npx @spec-wave/cli@latest run <n> --yes # decompose
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Gera `docs/features/<slug>/decomposition.md` e o critica. **Nenhuma issue é criada nesta etapa** — é de propósito, para haver um artefato revisável antes do irreversível.
|
|
171
|
+
|
|
172
|
+
**Leia o rascunho e revise de verdade.** A crítica olha contradição com spec/plan; ela **não olha coerência do grafo de dependências**. O que vale conferir:
|
|
173
|
+
|
|
174
|
+
- as linhas `**Depende de:**` refletem o que cada Story realmente precisa;
|
|
175
|
+
- **nenhuma task de teste depende de coisa que a Story dela não declara** — já apareceu uma task pedindo E2E numa Story que declarava depender só da fundação; pelo grafo, ela rodaria antes de o backend existir e falharia;
|
|
176
|
+
- identificadores com a grafia do domínio e sem acento, se essa for a convenção do repositório;
|
|
177
|
+
- **nada contradiz as correções que você fez no `plan.md`** — isso precisa ser verificado, não presumido.
|
|
178
|
+
|
|
179
|
+
Ao apresentar, mostre o grafo de dependências e a contagem de Stories/Tasks — é o que permite ao usuário julgar em segundos.
|
|
180
|
+
|
|
181
|
+
Para corrigir, edite o `decomposition.md` **no PR** e reaplique `--step decompose`: o arquivo é criticado **como está**, não regerado. Recritique depois de editar mesmo que a passada anterior tenha vindo limpa.
|
|
182
|
+
|
|
183
|
+
Se reprovar aqui, a superfície a corrigir é o **`decomposition.md`** — os achados citam `Story N` / `Task N.M`, que são títulos daquele arquivo. Confundir com o `plan.md` trava o ciclo.
|
|
184
|
+
|
|
185
|
+
**Mas verifique se o defeito nasce no plano.** Já aconteceu de um achado apontar a `Task 4.1` com a causa no `plan.md`. Corrigir só o rascunho deixaria os dois divergentes, e a próxima geração traria o defeito de volta. Quando o achado descrever uma decisão técnica (e não um recorte de escopo), corrija nos dois.
|
|
186
|
+
|
|
187
|
+
**Pare aqui e peça aprovação**, salvo instrução explícita em contrário. E mergeie o PR do rascunho: o apply lê da base.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 5 · Aplicar
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
npx @spec-wave/cli@latest run <n> --yes --apply
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Isto é a aprovação humana** — não há nova crítica depois. É o passo mais caro de reverter: cria dezenas de issues, e desfazer exige fechar todas e remover `spec-wave:decomposed` à mão.
|
|
198
|
+
|
|
199
|
+
### Sempre rode o detector depois
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
npx @spec-wave/cli@latest order <n>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Se aparecer **`Etapa: —`** nas Stories, o apply falhou no board **e saiu com sucesso** — o passo fica verde. As issues nascem sem etapa nenhuma, que é pior que Backlog: invisíveis em toda tela que filtra por etapa. A causa conhecida é o `GH_PROJECT_TOKEN` sem permissão de Projects na organização; o log mostra `Could not resolve to a node with the global id of 'PVT_...'`.
|
|
206
|
+
|
|
207
|
+
O `order` só enxerga **Stories**. Confira as **Tasks por amostragem**, nas duas pontas da faixa de numeração criada.
|
|
208
|
+
|
|
209
|
+
**Reparo**, uma issue por vez (cobre Etapa + Status, não o Work Item Type):
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
npx @spec-wave/cli@latest move <numero> "ready"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Relatório final
|
|
218
|
+
|
|
219
|
+
Termine com o estado real, não com "concluído". O usuário precisa saber se pode mandar alguém pegar a Feature:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
## <Feature> (#N) — <etapa atual>
|
|
223
|
+
|
|
224
|
+
<grafo de dependências das Stories, com os números criados>
|
|
225
|
+
|
|
226
|
+
| | |
|
|
227
|
+
|---|---|
|
|
228
|
+
| Documentos | spec.md · plan.md · decomposition.md |
|
|
229
|
+
| Sub-issues | N Stories + M Tasks, todas em <etapa> |
|
|
230
|
+
| PRs | <os PRs de documento, e se foram mergeados> |
|
|
231
|
+
|
|
232
|
+
### Correções aplicadas
|
|
233
|
+
<o que você mudou no plan.md ou no decomposition.md, e por quê>
|
|
234
|
+
|
|
235
|
+
### O que ainda bloqueia a implementação
|
|
236
|
+
<ver abaixo>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Verifique antes de dizer "pronta para o dev"
|
|
240
|
+
|
|
241
|
+
Três coisas que o fluxo não checa e que já impediram a implementação de começar:
|
|
242
|
+
|
|
243
|
+
1. **`specKit.command` configurado** no `.spec-wave.json` (ou a env `SPEC_WAVE_IMPLEMENT_CMD`). Sem isso o `implement` monta o contexto e para, sem acionar agente nenhum — o agente lê `.spec-wave/implement-<n>.md` e implementa direto. O `spec-wave dev-agent` **exige** essa configuração. O `doctor` reporta.
|
|
244
|
+
2. **As dependências externas existem.** O `order` só enxerga as Stories filhas — ele não sabe que a spec declarou *outra Feature* como bloqueante. Leia a seção Dependências da `spec.md` e cheque se aquelas Features têm ao menos spec. Já aconteceu de duas bloqueantes não terem nem spec: as Stories de UI escreviam em arquivos de um wizard inexistente, enquanto as de backend podiam começar. Diga quais Stories dão para pegar hoje e quais não.
|
|
245
|
+
3. **O `GH_PROJECT_TOKEN` funciona**, senão `code-review.yml` e `qa.yml` também vão falhar em mover cards durante a implementação, provavelmente em silêncio. O `doctor` verifica a **presença** do secret, nunca a validade — um token presente e sem permissão passa despercebido.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# A crítica adversarial na prática
|
|
2
|
+
|
|
3
|
+
O que este arquivo acrescenta ao fluxo: a crítica **não é um veredito**, é uma amostra. Tratá-la
|
|
4
|
+
como veredito produz os dois erros caros — aceitar um documento defeituoso porque a passada veio
|
|
5
|
+
limpa, e reescrever lógica correta porque um finding disse para reescrever.
|
|
6
|
+
|
|
7
|
+
## A crítica é não-determinística
|
|
8
|
+
|
|
9
|
+
Passadas sucessivas sobre o **mesmo arquivo** dão vereditos diferentes. Três passadas medidas sobre
|
|
10
|
+
o mesmo `plan.md`, sem editar nada entre a primeira e a segunda além da correção que a primeira
|
|
11
|
+
pediu:
|
|
12
|
+
|
|
13
|
+
| Passada | Achados |
|
|
14
|
+
|---|---|
|
|
15
|
+
| 1 | 1 menor — um refetch disparado por posição quando o item já vinha no payload |
|
|
16
|
+
| 2 | 2 menores — a correção da passada 1 tinha ficado **pela metade** (uma seção corrigida, outra não, o plano contradizendo a si mesmo) + uma regra descrita de duas formas |
|
|
17
|
+
| 3 | 2 menores, ambos novos — do tipo "o plano não explica X", não mais contradição |
|
|
18
|
+
|
|
19
|
+
Em outra Feature, duas passadas sobre o mesmo arquivo e o mesmo modelo deram
|
|
20
|
+
`✅ Nenhuma contradição encontrada` e depois `1 GRAVE` — e o defeito já estava lá na primeira.
|
|
21
|
+
|
|
22
|
+
**Leia "nenhuma contradição encontrada" como *um revisor não achou nada nesta passada*.**
|
|
23
|
+
|
|
24
|
+
### Três consequências práticas
|
|
25
|
+
|
|
26
|
+
1. **Reaplique a crítica depois de editar**, mesmo com veredito `limpa`. Foi a segunda passada que
|
|
27
|
+
pegou a correção incompleta, e custa um minuto.
|
|
28
|
+
2. **Findings "menores" podem ser substantivos.** O primeiro do exemplo era um round-trip
|
|
29
|
+
desperdiçado no caso mais comum — não bloqueava o `ready`, mas era defeito real.
|
|
30
|
+
3. **Saiba parar.** Quando os achados viram "o plano não explica X" em vez de "o plano se
|
|
31
|
+
contradiz", o retorno virou marginal. Corrija o que você mesmo introduziu e siga.
|
|
32
|
+
|
|
33
|
+
## Antes de corrigir, confira o finding contra o arquivo
|
|
34
|
+
|
|
35
|
+
A crítica produz os dois tipos de erro, e eles pedem respostas opostas.
|
|
36
|
+
|
|
37
|
+
**Falso positivo.** O padrão já observado: o texto do finding termina em "não é contradição real" e
|
|
38
|
+
a severidade sai `grave` mesmo assim. Aí o ajuste é tornar o documento **mais explícito no ponto
|
|
39
|
+
citado**, não reescrever a lógica. Reescrever a lógica de um plano correto por causa de um finding
|
|
40
|
+
mal calibrado é o pior desfecho disponível: custa a revisão e introduz o defeito que não existia.
|
|
41
|
+
|
|
42
|
+
**Defeito real.** Também já observado: o plano dizia duas vezes "esta feature não cria tabela nem
|
|
43
|
+
coluna (RN15)" e trazia um `CREATE TABLE` com uma coluna de texto livre, violando de quebra uma
|
|
44
|
+
decisão registrada no `tech_context`. Nenhuma leitura superficial pegaria — as duas afirmações
|
|
45
|
+
estavam a páginas de distância.
|
|
46
|
+
|
|
47
|
+
**Cite o trecho do arquivo que confirma ou refuta o finding.** É o que distingue "corrigi o que a
|
|
48
|
+
IA mandou" de "verifiquei e o problema existe", e é o que o usuário precisa para julgar a sua
|
|
49
|
+
correção sem reler o documento inteiro.
|
|
50
|
+
|
|
51
|
+
## Qual superfície corrigir
|
|
52
|
+
|
|
53
|
+
O achado cita âncoras, e a âncora diz onde corrigir:
|
|
54
|
+
|
|
55
|
+
| O achado cita | Corrija |
|
|
56
|
+
|---|---|
|
|
57
|
+
| seções do plano técnico | `plan.md` |
|
|
58
|
+
| `Story N` / `Task N.M` | `decomposition.md` — são títulos daquele arquivo |
|
|
59
|
+
|
|
60
|
+
Confundir as duas trava o ciclo: você corrige o documento errado, recritica, e o mesmo achado volta.
|
|
61
|
+
|
|
62
|
+
**Mas verifique se o defeito nasce acima.** Um achado que aponta uma `Task` pode ter a causa no
|
|
63
|
+
`plan.md`. Corrigir só o rascunho deixa os dois divergentes, e a próxima geração traz o defeito de
|
|
64
|
+
volta. A regra: se o achado descreve uma **decisão técnica**, corrija nos dois; se descreve um
|
|
65
|
+
**recorte de escopo**, o rascunho basta.
|
|
66
|
+
|
|
67
|
+
## Recriticar sem regerar
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx @spec-wave/cli@latest run <n> --yes --step critique
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Nunca `--step plan` para isso.** Ele regera o documento do zero e descarta a correção — é o erro
|
|
74
|
+
que faz o ciclo não convergir, porque cada rodada recomeça do mesmo lugar.
|
|
75
|
+
|
|
76
|
+
Existe também `critique --file <caminho>`, que é **consulta**: não comenta na issue, não aplica
|
|
77
|
+
label e não consome tentativa. Útil para conferir uma correção antes de gastar o portão.
|
|
78
|
+
|
|
79
|
+
## Quando a crítica esgota
|
|
80
|
+
|
|
81
|
+
Depois de N reprovas seguidas (3, por padrão) o fluxo aplica `spec-wave:needs-human` e para.
|
|
82
|
+
|
|
83
|
+
Isso não é um erro a contornar — é o fluxo dizendo que a correção automática não está convergindo.
|
|
84
|
+
Pare e envolva o usuário. A label sai à mão, e sair dela sem resolver a causa só adia o mesmo
|
|
85
|
+
impasse para a próxima passada.
|
|
86
|
+
|
|
87
|
+
O mesmo vale para `spec-wave:critique-failed`: o caminho de retomada é **corrigir o documento e
|
|
88
|
+
recriticar**, nunca regerar.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-wave-preparar-specs
|
|
3
|
+
description: "Use para gerar o spec.md de TODAS as Features de uma milestone de uma vez: confere o ambiente antes de gastar modelo, gera, valida a estrutura, revisa o conjunto procurando contradições ENTRE as specs, mergeia os PRs e move as issues para 📋 Spec. Gatilhos: 'gera as specs da v06', 'roda os specs da milestone X', 'quero todas as features da v05.2 especificadas', 'gera as specs que faltam', 'quais features estão sem spec?', 'preciso das specs prontas antes de gerar os planos'. NÃO use para uma Feature isolada — aí é a skill spec (um passo) ou preparar-feature (a Feature inteira, até Ready)."
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash(npx @spec-wave/cli@latest *)
|
|
6
|
+
- Bash(gh issue *)
|
|
7
|
+
- Bash(gh pr *)
|
|
8
|
+
- Bash(gh run *)
|
|
9
|
+
- Bash(gh api *)
|
|
10
|
+
- Bash(git *)
|
|
11
|
+
- Read
|
|
12
|
+
- Glob
|
|
13
|
+
- Grep
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Specs de uma milestone inteira
|
|
17
|
+
|
|
18
|
+
Levar todas as Features de uma milestone de "sem spec" até "spec revisada e mergeada na base, issue em 📋 Spec". São seis fases e a ordem importa: cada uma existe para que a seguinte não desperdice trabalho caro.
|
|
19
|
+
|
|
20
|
+
O custo real aqui não é tempo — é que **cada geração paga um modelo**. Um erro de configuração descoberto na sétima Feature custa sete gerações. Por isso a Fase 0 existe, e por isso a Fase 1 para na primeira falha em vez de seguir em frente.
|
|
21
|
+
|
|
22
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
23
|
+
|
|
24
|
+
## Fase 0 — Preflight (nunca pule)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx @spec-wave/cli@latest preflight --milestone <nome>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Um comando reporta: token utilizável, modo de execução (config × variável do repositório), se a publicação por Pull Request funciona, as Features da milestone com o estado do `spec.md` de cada uma, e labels de gatilho grudadas. Sai com código 1 se houver bloqueio. `--json` devolve o mesmo relatório para você ramificar.
|
|
31
|
+
|
|
32
|
+
**Leia a coluna de estado de cada Feature antes de agir** — ela não é `existe`/`não existe`:
|
|
33
|
+
|
|
34
|
+
| Estado | O que significa | O que fazer |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `· gerar` | não existe em lugar nenhum | entra na rodada |
|
|
37
|
+
| `✓ na base` / `✓ no disco` | já mergeada | não gerar |
|
|
38
|
+
| `⏳ em PR aberto` | gerada, aguardando revisão/merge | **não gerar** — regerar descarta a revisão e paga o modelo de novo |
|
|
39
|
+
| `⚠ em branch sem PR` | commit passou, PR não nasceu | abrir o PR; ver `reference/armadilhas.md` |
|
|
40
|
+
| `? indeterminado` | a consulta falhou | confirmar antes, para não pagar duas vezes |
|
|
41
|
+
|
|
42
|
+
Se qualquer bloqueio aparecer, **resolva antes de gerar**. As causas estão em `reference/armadilhas.md`; leia esse arquivo agora se for a primeira vez que você roda esta skill neste repositório.
|
|
43
|
+
|
|
44
|
+
Confirme **duas** coisas com o usuário antes de começar — é a última chance barata de descobrir que a milestone errada foi escolhida, e a única de decidir onde a rodada roda:
|
|
45
|
+
|
|
46
|
+
1. **a lista de Features** que serão geradas;
|
|
47
|
+
2. **o modo de execução** — `actions` ou `local`. O preflight diz qual está configurado hoje; isso é o *default* da pergunta, não a resposta. Os custos dos dois são diferentes o bastante (Fase 1) para a escolha ser dele, não sua.
|
|
48
|
+
|
|
49
|
+
## Fase 1 — Gerar
|
|
50
|
+
|
|
51
|
+
**O modo de execução decide como acionar** — e ele é o que o usuário respondeu na Fase 0, não o que o preflight encontrou configurado:
|
|
52
|
+
|
|
53
|
+
| Modo | Como acionar | O que custa |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `actions` | aplicar a label `spec-wave:spec` | minutos de GitHub Actions; roda em paralelo e não prende a máquina |
|
|
56
|
+
| `local` | `npx @spec-wave/cli@latest run <issue>`, com `--dry-run` antes | nenhum minuto de CI; alguns minutos por Feature, mas a máquina fica ocupada |
|
|
57
|
+
|
|
58
|
+
**Se a resposta diferir do que está configurado, troque o modo antes de gerar** — não tente acionar "do outro jeito" por cima da configuração atual:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx @spec-wave/cli@latest mode <actions|local>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Três consequências que impedem essa troca de ser um detalhe desta rodada — diga-as ao usuário **antes** de executar, porque duas delas sobrevivem à rodada:
|
|
65
|
+
|
|
66
|
+
- **a escolha vale para todo mundo.** O `mode` escreve os dois lados do interruptor: o `.spec-wave.json` e a variável de repositório `SPEC_WAVE_EXECUTION`, que o `if:` de cada job avalia. Quem rodar o fluxo depois de você herda o modo que você deixou.
|
|
67
|
+
- **a variável exige permissão de administração.** Sem ela o comando grava só o config e diz o que faltou — e os dois lados passam a divergir: você acha que desarmou os workflows, e eles continuam disparando.
|
|
68
|
+
- **o `.spec-wave.json` fica modificado localmente.** Commite, senão quem clona o repositório (dev-agent, Actions) continua lendo o modo antigo.
|
|
69
|
+
|
|
70
|
+
**No modo `local`, NÃO aplique label de gatilho.** O `run` não aplica nenhuma, e aplicá-la à mão põe a label e o `run` no mesmo passo da mesma Feature — o modelo é pago duas vezes.
|
|
71
|
+
|
|
72
|
+
**Os dois modos fazem a mesma coisa:** geram o documento e o publicam **via API, em branch própria por Feature (`spec-wave/<issue>-spec`), abrindo um PR**. Nada é escrito no seu checkout — confirme com `git status` na primeira geração.
|
|
73
|
+
|
|
74
|
+
Cada `run` termina dizendo em qual PR o documento saiu, e avisando que *o próximo passo do fluxo lê o documento da branch base* — ou seja, o merge é pré-requisito do `plan`, não um detalhe de arrumação.
|
|
75
|
+
|
|
76
|
+
### Uma canária, depois em paralelo
|
|
77
|
+
|
|
78
|
+
Nem tudo de uma vez, nem tudo em série:
|
|
79
|
+
|
|
80
|
+
1. **Gere UMA sozinha e espere.** Ela custa uma geração e responde tudo que é sistêmico: credencial válida, permissão de publicar, modo correto, PR abrindo de fato. Um erro descoberto aqui custa 1 geração; descoberto na sétima, custa 7. **Se a canária falhar, não dispare mais nada.**
|
|
81
|
+
2. **Passando a canária, o resto sai em até 4 trilhas simultâneas.**
|
|
82
|
+
|
|
83
|
+
Paralelizar é seguro porque o lock da CLI é **por issue** (`.git/spec-wave/run-<n>.lock`) e a publicação é por API, em branch própria — issues diferentes nunca disputam nada.
|
|
84
|
+
|
|
85
|
+
O teto de 4 não vem da CLI, vem do backend: no modo `local` quem gera é o agente desta máquina, e outras sessões podem estar usando o mesmo. Vale conferir com `pgrep -af "spec-wave run"` antes. Em `actions` nada disso se aplica: o paralelismo é do próprio GitHub.
|
|
86
|
+
|
|
87
|
+
**Rode em background, nunca em primeiro plano.** Uma spec leva minutos; uma ferramenta com timeout curto mata o comando no meio — e o custo já foi pago.
|
|
88
|
+
|
|
89
|
+
**Ao falhar, a pergunta é sempre a mesma:** *isto é específico desta Feature, ou vai acontecer com todas?* Leia o log (`gh run view <id> --log-failed | tail -40`) ou o erro da CLI antes de qualquer outra coisa. Onde a falha aconteceu já indica a resposta:
|
|
90
|
+
|
|
91
|
+
- **Na canária** — trate como sistêmico até prova em contrário e **não dispare as trilhas**. Credencial, permissão, publicação e configuração falham assim.
|
|
92
|
+
- **Numa trilha, com a canária tendo passado** — quase sempre pontual. As outras trilhas seguem; não as interrompa para investigar uma.
|
|
93
|
+
|
|
94
|
+
**`error_max_turns` é o caso pontual mais comum** — o modelo gasta o teto de turnos explorando o repositório e não chega a escrever. A própria CLI classifica: se as chamadas de ferramenta são **distintas**, foi exploração (varia entre execuções) e **repetir no mesmo modelo costuma bastar**; se elas **se repetem**, é loop degenerado e repetir só paga a mesma perambulação de novo. Só nesse segundo caso entram trocar de modelo ou subir `maxTurns` — e essas são decisões do usuário, porque custam mais caro. O teto vive no frontmatter do prompt da CLI, não no `.spec-wave.json`.
|
|
95
|
+
|
|
96
|
+
Diga ao usuário o que encontrou e o que recomenda, em vez de tentar contornar sozinho: várias saídas possíveis (mudar o modo, mexer em proteção de branch, trocar credencial) são decisões dele.
|
|
97
|
+
|
|
98
|
+
## Fase 2 — Validar estrutura
|
|
99
|
+
|
|
100
|
+
Barato e determinístico, então roda em todas antes da revisão cara.
|
|
101
|
+
|
|
102
|
+
**Não use `spec-wave validate` aqui:** ele valida spec **e** plan juntos, e nesta altura o `plan.md` não existe — reprovaria toda Feature da milestone e ainda consumiria a label `spec-wave:ready`. A conferência desta fase é de leitura.
|
|
103
|
+
|
|
104
|
+
O que olhar em cada spec:
|
|
105
|
+
|
|
106
|
+
- as seções obrigatórias estão presentes e com o nome exato. O gerador escreve seis (`Visão Geral`, `Regras de Negócio`, `Fluxos`, `Critérios de Aceite`, `Dependências`, `Requisitos Não-Funcionais`) e o `validate` mais tarde vai exigir três delas **byte a byte** — `Visão Geral`, `Critérios de Aceite` e `Requisitos Não-Funcionais`. Título divergente ("encontrei X, esperava Y") se resolve renomeando, não regerando;
|
|
107
|
+
- nenhum sinal de corte: bloco de código não fechado, parêntese aberto na última linha. Um documento truncado passa na conferência de seções e vale menos que documento nenhum;
|
|
108
|
+
- conte os `[TODO: requer esclarecimento` de cada spec. O número não é defeito — é o mapa do que ficou em aberto, e vai para o relatório final.
|
|
109
|
+
|
|
110
|
+
Se uma spec estiver estruturalmente quebrada, **não reaplique `spec-wave:spec` por reflexo**: essa label **sobrescreve** o arquivo. Se o documento já foi revisado ou editado, regenerar joga fora a revisão.
|
|
111
|
+
|
|
112
|
+
## Fase 3 — Revisar conteúdo
|
|
113
|
+
|
|
114
|
+
Aqui está a maior parte do valor, e é o que distingue esta skill de rodar sete comandos em sequência. Leia `reference/revisao.md` — ele traz o método e as classes de problema que aparecem de verdade, com exemplos reais.
|
|
115
|
+
|
|
116
|
+
As specs ainda não estão na base neste ponto — cada uma vive na branch do seu PR. Leia direto de lá, sem checkout:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
git fetch origin
|
|
120
|
+
git show origin/spec-wave/<issue>-spec:docs/features/<slug>/spec.md
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Em resumo: leia as specs **como conjunto**, não uma a uma. Problemas de spec isolada o gerador já evita bem; o que ele não consegue ver é a relação entre documentos — regra que duas features contam de formas diferentes, dependência circular, feature que aponta para um lugar que não existe, e afirmações que a própria rodada tornou falsas.
|
|
124
|
+
|
|
125
|
+
Separe o que encontrar em duas classes, porque elas têm destinos diferentes:
|
|
126
|
+
|
|
127
|
+
- **Achado material** — muda o desenho de alguma feature, ou tem risco em produção. Vai como comentário na issue, com a regra que o originou e a decisão necessária.
|
|
128
|
+
- **Lacuna paramétrica** — falta um número, um prazo, um limiar. Não bloqueia; agrupe por tema no relatório final, porque doze delas costumam ser uma decisão só.
|
|
129
|
+
|
|
130
|
+
## Fase 4 — Mergear os PRs
|
|
131
|
+
|
|
132
|
+
A Fase 1 já abriu um PR por Feature; **não há nada a publicar**. O trabalho aqui é mergear os que a revisão aprovou.
|
|
133
|
+
|
|
134
|
+
Isso reordena as fases de propósito: a revisão da Fase 3 acontece **antes** do merge, lendo o conteúdo direto das branches, e o merge passa a ser o registro de que a revisão terminou.
|
|
135
|
+
|
|
136
|
+
Para cada PR: confira que o check obrigatório passou e mergeie. Um PR por Feature é bom para o histórico (cada spec rastreável à sua issue), então não tente consolidar num PR único — consolidar exigiria desfazer o que a ferramenta fez sozinha, sem ganho real.
|
|
137
|
+
|
|
138
|
+
Achado material **não** bloqueia o merge. A spec registra o que foi gerado a partir da fonte normativa; o achado é decisão do PO e vive na issue. Segurar o merge só deixa a spec invisível para quem precisa dela — inclusive para o `plan`, que lê da branch base.
|
|
139
|
+
|
|
140
|
+
Ao final, reconcilie o checkout com `git pull --rebase`.
|
|
141
|
+
|
|
142
|
+
## Fase 5 — Mover o board
|
|
143
|
+
|
|
144
|
+
Depois do merge, para cada Feature:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npx @spec-wave/cli@latest move <n> "📋 Spec"
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Use o comando, não mutação manual no board — ele embute as regras do fluxo. E note que **a Etapa nunca retrocede**: uma vez movida, não volta por comando. Por isso este passo vem *depois* do merge, quando as specs de fato existem na base, e não antes.
|
|
151
|
+
|
|
152
|
+
Confirme lendo o board de volta, não pela saída do comando.
|
|
153
|
+
|
|
154
|
+
## Fase 6 — Relatório
|
|
155
|
+
|
|
156
|
+
Entregue ao usuário, nesta ordem — do que exige decisão para o que é registro:
|
|
157
|
+
|
|
158
|
+
1. **Achados materiais**, se houver, com link do comentário em cada issue. É o que ele precisa decidir antes de gerar planos.
|
|
159
|
+
2. **Placar**: N/N specs na base, PRs mergeados, issues em 📋 Spec.
|
|
160
|
+
3. **Tabela** por Feature: issue, nome, linhas, TODOs.
|
|
161
|
+
4. **Lacunas paramétricas agrupadas por tema**, com a contagem.
|
|
162
|
+
5. **O que ficou aberto** — dependências de features sem spec, inversões de sequenciamento entre milestones, dívida operacional.
|
|
163
|
+
|
|
164
|
+
Um plano gerado sobre uma spec cuja regra vai mudar é retrabalho garantido. Se a Fase 3 produziu achados materiais, diga isso explicitamente ao recomendar o próximo passo.
|
|
165
|
+
|
|
166
|
+
## Referências
|
|
167
|
+
|
|
168
|
+
- `reference/armadilhas.md` — as armadilhas operacionais deste fluxo, cada uma com a causa e o sintoma. Leia antes da Fase 1 na primeira vez, e sempre que algo falhar de um jeito que não faz sentido.
|
|
169
|
+
- `reference/revisao.md` — o método da Fase 3 e as classes de problema que aparecem de verdade, com exemplos reais.
|
|
170
|
+
|
|
171
|
+
Depois desta skill, o passo natural de cada Feature é o plano técnico: skill **preparar-feature** (leva uma Feature de spec até ✅ Ready com Stories e Tasks) ou skill **plan** (só o `plan.md`).
|