@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.
Files changed (45) hide show
  1. package/package.json +1 -1
  2. package/src/api/github-rest.mjs +52 -0
  3. package/src/cli.mjs +12 -0
  4. package/src/commands/decompose.mjs +166 -39
  5. package/src/commands/doctor.mjs +214 -3
  6. package/src/commands/generate-bug.mjs +22 -16
  7. package/src/commands/generate-plan.mjs +72 -23
  8. package/src/commands/generate-spec.mjs +19 -15
  9. package/src/commands/implement.mjs +47 -22
  10. package/src/commands/install-skill.mjs +18 -8
  11. package/src/commands/preflight.mjs +322 -0
  12. package/src/commands/run.mjs +51 -30
  13. package/src/commands/update.mjs +143 -12
  14. package/src/commands/validate.mjs +84 -17
  15. package/src/config.mjs +18 -0
  16. package/src/lib/artifact-pr.mjs +272 -0
  17. package/src/lib/artifact-publish.mjs +169 -0
  18. package/src/lib/doc-availability.mjs +23 -1
  19. package/src/lib/doc-source.mjs +162 -0
  20. package/src/lib/flow-run.mjs +9 -218
  21. package/src/lib/next-step.mjs +27 -4
  22. package/src/lib/pr-branch.mjs +106 -7
  23. package/src/lib/repo-links.mjs +8 -2
  24. package/src/plugin/.claude-plugin/plugin.json +1 -1
  25. package/src/plugin/README.md +5 -0
  26. package/src/plugin/skills/bug/SKILL.md +2 -2
  27. package/src/plugin/skills/decompose/SKILL.md +4 -4
  28. package/src/plugin/skills/plan/SKILL.md +1 -1
  29. package/src/plugin/skills/preparar-feature/SKILL.md +245 -0
  30. package/src/plugin/skills/preparar-feature/reference/critica.md +88 -0
  31. package/src/plugin/skills/preparar-specs/SKILL.md +171 -0
  32. package/src/plugin/skills/preparar-specs/reference/armadilhas.md +209 -0
  33. package/src/plugin/skills/preparar-specs/reference/revisao.md +107 -0
  34. package/src/plugin/skills/run/SKILL.md +3 -1
  35. package/src/plugin/skills/spec/SKILL.md +4 -4
  36. package/src/plugin/skills/update/SKILL.md +10 -4
  37. package/src/plugin/skills/workflow/SKILL.md +8 -3
  38. package/src/templates/skill/SKILL.md +13 -10
  39. package/src/templates/workflows/code-review.yml +13 -2
  40. package/src/templates/workflows/critique.yml +1 -1
  41. package/src/templates/workflows/decompose.yml +13 -2
  42. package/src/templates/workflows/generate-bug.yml +17 -6
  43. package/src/templates/workflows/generate-plan.yml +20 -7
  44. package/src/templates/workflows/generate-spec.yml +20 -7
  45. 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`).