@spec-wave/cli 0.29.0 → 0.32.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 +5 -3
- package/protocol/qa-result.v1.json +62 -0
- package/protocol/qa-trail-report.v1.json +113 -0
- package/src/api/github-graphql.mjs +6 -1
- package/src/api/github-rest.mjs +21 -0
- package/src/cli.mjs +114 -9
- package/src/commands/decompose.mjs +29 -3
- package/src/commands/doctor.mjs +183 -3
- package/src/commands/generate-qa-plan.mjs +421 -0
- package/src/commands/implement.mjs +56 -44
- package/src/commands/merge.mjs +43 -14
- package/src/commands/order.mjs +350 -96
- package/src/commands/qa-lead.mjs +748 -0
- package/src/commands/qa-run.mjs +892 -0
- package/src/commands/run.mjs +5 -1
- package/src/config.mjs +32 -1
- package/src/lib/artifact-pr.mjs +2 -0
- package/src/lib/artifact-publish.mjs +5 -2
- package/src/lib/board.mjs +14 -0
- package/src/lib/critique.mjs +38 -9
- package/src/lib/decomposition-doc.mjs +5 -1
- package/src/lib/dependency-map.mjs +300 -0
- package/src/lib/doc-paths.mjs +9 -2
- package/src/lib/git-retry.mjs +82 -0
- package/src/lib/net-cache.mjs +142 -0
- package/src/lib/next-step.mjs +15 -3
- package/src/lib/qa-exec.mjs +335 -0
- package/src/lib/qa-lead-backend.mjs +213 -0
- package/src/lib/qa-lead.mjs +627 -0
- package/src/lib/qa-plan-doc.mjs +340 -0
- package/src/lib/qa-report.mjs +396 -0
- package/src/lib/skill-compose.mjs +234 -0
- package/src/lib/story-graph.mjs +256 -0
- package/src/plugin/.claude-plugin/plugin.json +1 -1
- package/src/plugin/skills/merge/SKILL.md +1 -0
- package/src/plugin/skills/order/SKILL.md +21 -5
- package/src/plugin/skills/qa/SKILL.md +107 -0
- package/src/plugin/skills/qa/model-prompt.critique.md +44 -0
- package/src/plugin/skills/qa/model-prompt.md +68 -0
- package/src/plugin/skills/qa-executor/SKILL.md +76 -0
- package/src/plugin/skills/qa-lead/SKILL.md +89 -0
- package/src/templates/skill/SKILL.md +981 -279
- package/src/templates/skill/core.md +584 -0
- package/src/templates/workflows/generate-qa-plan.yml +64 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-wave
|
|
3
3
|
description: "Use when the user wants to set up a spec-driven GitHub workflow, create a Feature issue, generate spec.md or plan.md, decompose a Feature into Stories/Tasks, write RFC documentation, or audit and fix a Pull Request. Implements the RFC-001 workflow with GitHub Projects v2, labels, and AI-powered GitHub Actions."
|
|
4
|
-
argument-hint: "[info|setup|update|doctor|preflight|audit|issue|feature|spec|plan|ready|decompose|order|implement|merge|task|story|move|uninstall|rfc|bug|triage|fix-pr] [target]"
|
|
4
|
+
argument-hint: "[info|setup|update|doctor|preflight|audit|issue|feature|spec|plan|ready|decompose|order|implement|merge|qa|qa-lead|task|story|move|uninstall|rfc|bug|triage|fix-pr] [target]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools:
|
|
7
7
|
- Bash(npx @spec-wave/cli@latest *)
|
|
@@ -22,6 +22,10 @@ allowed-tools:
|
|
|
22
22
|
- Agent
|
|
23
23
|
---
|
|
24
24
|
|
|
25
|
+
<!-- GERADO por scripts/generate-skill.mjs a partir de core.md + src/plugin/skills/*/SKILL.md.
|
|
26
|
+
NÃO edite este arquivo à mão: edite o core.md (visão de conjunto) ou a skill do
|
|
27
|
+
comando no plugin, e rode `npm run skill:gen`. -->
|
|
28
|
+
|
|
25
29
|
# spec-wave Skill
|
|
26
30
|
|
|
27
31
|
Este skill guia o usuário pelo fluxo spec-driven definido no RFC-001.
|
|
@@ -126,6 +130,7 @@ Labels de gatilho:
|
|
|
126
130
|
- `spec-wave:decompose` → dispara `decompose.yml` → gera (ou **re-critica**) o **rascunho** em `decomposition.md`. **Não cria issue nenhuma.**
|
|
127
131
|
- `spec-wave:decompose-apply` → dispara o mesmo workflow em modo aplicação → cria as Stories e Tasks **a partir do rascunho revisado**
|
|
128
132
|
- `spec-wave:bug` → dispara `generate-bug.yml` → gera `docs/bugs/<slug>/bug.md` (só para issues `[BUG]`)
|
|
133
|
+
- `spec-wave:qa` → dispara `generate-qa-plan.yml` → gera (ou **re-critica COMO ESTÁ**) o plano de QA em `docs/features/<slug>/qa-plan.md`. **Só em Feature** (o plano é por Feature; numa Story o Action aponta a Feature-pai). A **execução** é sempre local: `npx @spec-wave/cli@latest qa <issue>`.
|
|
129
134
|
|
|
130
135
|
Labels de **estado** (gravadas pelas automações — **não** são gatilhos, não as adicione por conta própria):
|
|
131
136
|
- `spec-wave:decompose-ready` → o rascunho da decomposição passou pela crítica e espera **revisão humana**; aplique `spec-wave:decompose-apply` para criar as issues
|
|
@@ -133,12 +138,16 @@ Labels de **estado** (gravadas pelas automações — **não** são gatilhos, n
|
|
|
133
138
|
- `spec-wave:needs-human` → a crítica reprovou N vezes seguidas (default 3); **para o fluxo** até uma pessoa revisar e remover a label
|
|
134
139
|
- `spec-wave:decomposed` → a Feature/RFC já foi decomposta; o `decompose` pula silenciosamente enquanto ela existir (veja *Guard de idempotência* abaixo)
|
|
135
140
|
- `spec-wave:bug-approved` → o `bug.md` passou na validação das seis seções obrigatórias
|
|
141
|
+
- `spec-wave:qa-ready` → o `qa-plan.md` passou na validação + crítica e espera **revisão humana** — é o pré-requisito de `qa <issue>` (o veredito verde avança a Etapa sozinho, então o portão humano é a revisão do plano). ⚠️ Não confunda com `spec-wave:ready` (gatilho da validação de spec/plan).
|
|
142
|
+
- `spec-wave:qa-approved` → a execução do QA passou. Aplicada na Story (e na Feature, quando todas as Stories passarem).
|
|
136
143
|
|
|
137
144
|
Label **modificadora** (esta você pode aplicar):
|
|
138
145
|
- `spec-wave:model:<apelido>` → força um modelo específico **naquela execução**, resolvido por `ai.modelAliases` no `.spec-wave.json`. Serve para reprocessar um caso difícil num modelo mais forte sem editar a configuração do repositório inteiro. Duas dessas labels na mesma issue = ambíguo, nenhuma vale.
|
|
139
146
|
|
|
140
147
|
A etapa **🚧 Desenvolvimento** é coberta pelo comando **local** `npx @spec-wave/cli@latest implement <número>` (não é uma label/Action): lê uma **Feature** (todas as Stories pendentes, em ordem de dependência), uma Story ou uma Task e aciona o spec-kit para implementar. Veja `/spec-wave implement`.
|
|
141
148
|
|
|
149
|
+
A etapa **🧪 QA** tem artefato e comando próprios: a label `spec-wave:qa` gera o `qa-plan.md` (validado + criticado → `spec-wave:qa-ready`), e a **execução é sempre local** — `npx @spec-wave/cli@latest qa <issue>` roda os cenários contra o checkout. Verde: `qa-approved` + Story → 📋 Homologação (Bug → 🚀 Deploy, sem Homologação). Vermelho: **um Bug por cenário reprovado**, já com `bug.md` commitado. Inconclusivo (`blocked` sem `fail`): nada move, nenhum Bug. Veja `/spec-wave qa`.
|
|
150
|
+
|
|
142
151
|
---
|
|
143
152
|
|
|
144
153
|
## Referência da CLI (conheça os parâmetros ANTES de executar)
|
|
@@ -251,9 +260,14 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
|
|
|
251
260
|
### `@spec-wave/cli order <feature>` — ordem de execução das Stories (comando LOCAL)
|
|
252
261
|
| Flag/Arg | Tipo | Descrição |
|
|
253
262
|
|----------|------|-----------|
|
|
254
|
-
| `<feature>` | string (
|
|
263
|
+
| `<feature>` | string (opcional) | Número da issue da **Feature**, ex.: `12` ou `#12`. Omitido: o mapa de todas as Features com trabalho. |
|
|
264
|
+
| `--milestone <ref>` | string | No mapa sem argumento: só as Features da milestone (número ou título). |
|
|
265
|
+
| `--json` | boolean | Saída JSON **estável** (sem ANSI) — o formato para agentes/scripts consumirem a ordem. |
|
|
266
|
+
| `--remote` | boolean | Une também o blocked_by da API (1 chamada por Story) — pega arestas criadas SÓ pela UI. |
|
|
267
|
+
| `--refresh` | boolean | Ignora o cache local e reconsulta a API. |
|
|
268
|
+
| `--sync` | boolean | Grava as dependências VIVAS (body + blocked_by) de volta no `decomposition.md` e regenera o `dependency-map.json`, com commit local escopado. |
|
|
255
269
|
|
|
256
|
-
> **Sem argumento**, monta o mapa de TODAS as Features abertas fora de 🎉 Done num grafo só (conjunto vindo do board), com a Feature de cada Story ao lado — nesse escopo a dependência entre Features entra na ordenação. Com `<feature>`, lista as Stories da Feature em **ordem topológica** pelas dependências (linha `Depende de: #N`
|
|
270
|
+
> **Sem argumento**, monta o mapa de TODAS as Features abertas fora de 🎉 Done num grafo só (conjunto vindo do board), com a Feature de cada Story ao lado — nesse escopo a dependência entre Features entra na ordenação. Com `<feature>`, lista as Stories da Feature em **ordem topológica** pelas dependências, com a Etapa atual de cada uma no board. As **arestas** vêm de fontes LOCAIS — `dependency-map.json` (escrito pelo `decompose --apply`), `decomposition.md` aplicado e linha `Depende de: #N` do corpo — **zero chamada de API por Story**; `--remote` acrescenta o *blocked by* nativo. A **Etapa** vem de um snapshot único do board, cacheado por `cache.ttlSec` do `.spec-wave.json` (default 600s; env `SPEC_WAVE_CACHE_TTL`; `0` desliga), com a idade impressa quando servido do cache. Dependências para **fora da Feature** não entram na ordenação (não há como saber onde a Story de outra Feature entra nesta sequência), mas aparecem em **"Bloqueadas por fora desta Feature"**, com o estado de cada bloqueadora. Avisa sobre **ciclos de dependência** (essas Stories ficam fora da ordem — corrija as linhas `Depende de`), sobre **dependências fora de ordem** (Story já em Desenvolvimento+ dependendo de outra que não está Done) e sobre **milestone divergente** (Story sem milestone ou em milestone diferente do da Feature — órfã de toda visão de release; sem milestone na Feature, nada é comparado). Use antes de escolher qual Story implementar, e logo após o `decompose --apply` como detector do pós-apply.
|
|
257
271
|
|
|
258
272
|
### `@spec-wave/cli preflight --milestone <nome>` — confere tudo ANTES de gerar as specs (comando LOCAL)
|
|
259
273
|
| Flag/Arg | Tipo | Descrição |
|
|
@@ -281,6 +295,30 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
|
|
|
281
295
|
|
|
282
296
|
> O `implement` empilha os PRs (cada um baseado no anterior) e o merge da pilha é **ordem-dependente**: `--delete-branch` no primeiro PR fecha o segundo. Este comando encapsula a sequência segura — para cada PR na ordem topológica das Stories: reaponta a base para a default, mergeia com **merge commit**, atualiza o board (**merge move até 🧪 QA**) e **só no fim** apaga as branches. **PR em rascunho bloqueia o plano inteiro** (marcar pronto é a revisão humana — o comando não pula isso). Rodar de novo **retoma**: PR mergeado sai do plano. Use após a revisão, em vez de mergear à mão com `gh`.
|
|
283
297
|
|
|
298
|
+
### `@spec-wave/cli qa <issue>` — executa o plano de QA localmente (e `qa --pr-number <n>` no Action)
|
|
299
|
+
| Flag/Arg | Tipo | Descrição |
|
|
300
|
+
|----------|------|-----------|
|
|
301
|
+
| `<issue>` | string | Número da **Feature** (todos os cenários das Stories ainda sem `qa-approved`), **Story** (os cenários dela) ou **Bug** (a seção `Teste de Regressão` do `bug.md`). |
|
|
302
|
+
| `--only <n[,m]>` | string | Só o(s) cenário(s) indicado(s) — número **posicional** no plano. O restante herda o veredito do último relatório. |
|
|
303
|
+
| `--severity <p>` | string | Severidade dos Bugs abertos na reprova: `P0`–`P3` (default: `qa.defaultBugPriority` ou `P2`). |
|
|
304
|
+
| `--dry-run` | boolean | Monta o contexto e imprime cenários + comando. **Zero escrita no GitHub.** |
|
|
305
|
+
| `--pr-number <n>` | string | Modo Action (mutuamente exclusivo com `<issue>`): move a Feature/Bug do PR aprovado/mergeado para 🧪 QA. |
|
|
306
|
+
|
|
307
|
+
> **Pré-requisitos:** Feature dona do plano com `spec-wave:qa-ready` (portão humano — D-QA4), item já em 🧪 QA (o comando **não promove**; Etapa posterior = informa e sai 0), executor em `qa.command` no `.spec-wave.json` (ou `SPEC_WAVE_QA_CMD`) — sem ele, só monta o contexto. **Sempre `--dry-run` primeiro.** Desfechos: verde → `qa-approved` + Story para 📋 Homologação (Bug → 🚀 Deploy; Feature quando TODAS as Stories liberarem; **Bug filho aberto segura a Story mesmo verde**); vermelho → 1 Bug por cenário reprovado (filho da Story, ✅ Ready, `bug.md` determinístico commitado — exceção documentada à regra do `spec-wave:bug`), exit 1; `blocked` sem `fail` → inconclusivo: nada move, nenhum Bug, exit 1. Re-teste após o fix: `qa <story> --only <cenário>` (não duplica Bug — comenta no existente).
|
|
308
|
+
|
|
309
|
+
### `@spec-wave/cli qa-lead <plan|run|report> <milestone>` — orquestra o QA de uma TRILHA (comando LOCAL)
|
|
310
|
+
| Flag/Arg | Tipo | Descrição |
|
|
311
|
+
|----------|------|-----------|
|
|
312
|
+
| `<acao>` | string (obrigatório) | `plan` (prepara os planos e PARA no portão humano), `run` (executa o ciclo em containers paralelos) ou `report` (reimprime um ciclo já gravado). |
|
|
313
|
+
| `<milestone>` | string (obrigatório) | Milestone da trilha, por **número ou título** — trilha = milestone (D-QAL1). |
|
|
314
|
+
| `--watch` | boolean | No `plan`: acompanha os planos disparados até resolverem (teto `qa.lead.planWaitTimeoutMin`; estourar relata as pendentes e sai 1). |
|
|
315
|
+
| `--only <features>` | string | No `run`: sub-trilha explícita, ex.: `--only 318,320` (decisão humana declarada, não relaxamento do portão). |
|
|
316
|
+
| `--max-cycles <n>` | string | No `run`: teto de ciclos (default: `qa.lead.maxCycles`, 3). |
|
|
317
|
+
| `--cycle <n>` | string | No `report`: qual ciclo imprimir (default: o último). |
|
|
318
|
+
| `--dry-run` | boolean | Classifica/planeja e imprime — **nenhuma label, zero container, zero escrita**. |
|
|
319
|
+
|
|
320
|
+
> Duas fases separadas (D-QAL2): o `plan` aplica `spec-wave:qa` nas Features sem plano e **para** — o humano revisa os `qa-plan.md`; o `run` só inicia com a trilha inteira em `qa-ready` (recusa listando as pendentes). O `run` faz preflight global, despacha até `qa.lead.maxParallel` containers (um ambiente isolado por Feature — `qa.lead.container.image` obrigatória), coleta os comentários de veredito e grava `docs/qa/<slug-milestone>/cycle-<n>/{report.md,report.json}` + um **bloco delimitado** na descrição do milestone (substituído a cada ciclo, preservando as Release Notes). Ciclo N+1 só se um Bug fechou ou um bloqueio caiu (D-QAL7); teto de 3 ciclos. O Lead **não** aplica label de estado, **não** move card e **não** abre issue — toda mutação de board é do `qa` dentro dos containers.
|
|
321
|
+
|
|
284
322
|
### `@spec-wave/cli task <start|done> <n>` — transições de Task no board (comando LOCAL)
|
|
285
323
|
| Flag/Arg | Tipo | Descrição |
|
|
286
324
|
|----------|------|-----------|
|
|
@@ -456,186 +494,351 @@ O `validate` também recusa documento com sinal objetivo de corte (bloco de cód
|
|
|
456
494
|
|
|
457
495
|
## Sub-comandos
|
|
458
496
|
|
|
459
|
-
### `/spec-wave info`
|
|
497
|
+
### `/spec-wave info` — status de configuração
|
|
498
|
+
|
|
499
|
+
> **Quando usar:** Use quando o usuário perguntar se o repositório atual já está configurado com spec-wave, qual GitHub Project está vinculado, qual versão da CLI foi usada no init, ou se a skill instalada está atualizada. Gatilhos: 'o spec-wave está configurado aqui?', 'qual o board deste repo?', 'status do spec-wave'. Para um diagnóstico completo de auth e workflows use a skill doctor.
|
|
500
|
+
|
|
501
|
+
Mostra se o repositório atual foi configurado e valida a skill instalada.
|
|
460
502
|
|
|
461
|
-
|
|
503
|
+
| Flag | Descrição |
|
|
504
|
+
|------|-----------|
|
|
505
|
+
| `--json` | Saída JSON (`{"initialized":bool, ..., "skill":{...}}`) para parsing programático. |
|
|
462
506
|
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
507
|
+
#### Passos
|
|
508
|
+
|
|
509
|
+
1. Execute:
|
|
510
|
+
```bash
|
|
511
|
+
npx @spec-wave/cli@latest info
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
2. **Se inicializado**, apresente ao usuário os dados do `.spec-wave.json`: `owner/repo`, `project.title` + `project.url`, `version` da CLI e `initializedAt`.
|
|
515
|
+
|
|
516
|
+
3. **Se NÃO inicializado**, pergunte: "Este repositório ainda não foi configurado com o spec-wave. Quer rodar o `init` agora?"
|
|
517
|
+
- Sim → use a skill **setup**.
|
|
518
|
+
- Não → encerre sem alterar nada.
|
|
519
|
+
|
|
520
|
+
4. **Se a saída indicar skill pendente** (aviso "Skill pendente de instalação/atualização" ou, no `--json`, `skill.installNeeded: true`), ofereça resolver:
|
|
521
|
+
- skill `ausente` → `npx @spec-wave/cli@latest install-skill`
|
|
522
|
+
- skill `desatualizada` → `npx @spec-wave/cli@latest update` (skill **update**)
|
|
523
|
+
|
|
524
|
+
Lembre de recarregar o agente depois.
|
|
525
|
+
|
|
526
|
+
5. Se a `version` do arquivo divergir de `npx @spec-wave/cli@latest --version`, sugira `npx @spec-wave/cli@latest refresh --config` (reescreve o `.spec-wave.json` com os dados atuais do Project) ou a skill **update**.
|
|
527
|
+
|
|
528
|
+
#### O que o comando valida além do arquivo
|
|
529
|
+
|
|
530
|
+
Para cada agente de código detectado no diretório, compara a cópia instalada da skill com a versão empacotada na CLI — uma cópia **global** atualizada também conta. No `--json`, o campo `skill` traz `{agentsDetected, installNeeded, pending:[{agent, reason, path}]}`.
|
|
470
531
|
|
|
471
532
|
---
|
|
472
533
|
|
|
473
|
-
### `/spec-wave
|
|
534
|
+
### `/spec-wave setup` — configura o repositório
|
|
535
|
+
|
|
536
|
+
> **Quando usar:** Use quando o usuário quiser configurar o spec-wave num repositório GitHub pela primeira vez — criar o GitHub Project (Projects v2), as labels de gatilho, os workflows de Action, os issue templates e o .spec-wave.json. Gatilhos: 'configurar spec-wave', 'inicializar spec-wave', 'rodar o init', 'setup do board'. Não use para atualizar uma instalação existente (skill update) nem para diagnosticar (skill doctor).
|
|
537
|
+
|
|
538
|
+
Você dirige o `init` **com flags**. Nunca rode `npx @spec-wave/cli@latest init` sem `--repo`: sem ele a CLI abre um wizard interativo (`@clack/prompts`) que você **não consegue dirigir**.
|
|
539
|
+
|
|
540
|
+
#### Flags do `init`
|
|
541
|
+
|
|
542
|
+
| Flag | Tipo | Descrição |
|
|
543
|
+
|------|------|-----------|
|
|
544
|
+
| `--repo <owner/repo>` | string | Repositório alvo. **Passe SEMPRE.** |
|
|
545
|
+
| `--project-title <title>` | string | Nome do Project. Default: `<repo> — Spec Wave`. |
|
|
546
|
+
| `--provider <provider>` | string | `anthropic` ou `openrouter`. |
|
|
547
|
+
| `--model <model>` | string | Modelo dos workflows (ex.: `anthropic/claude-3.7-sonnet`). |
|
|
548
|
+
| `--skip-project` | flag | Pula a criação do Project (re-rodar quando já existe). |
|
|
549
|
+
| `--skip-labels` | flag | Pula as labels. |
|
|
550
|
+
| `--skip-files` | flag | Pula workflows + issue templates. |
|
|
551
|
+
| `--dry-run` | flag | Simula sem alterar nada. |
|
|
552
|
+
|
|
553
|
+
#### Passos
|
|
474
554
|
|
|
475
|
-
|
|
555
|
+
1. **Já configurado?** Leia `.spec-wave.json` (Read) ou rode `npx @spec-wave/cli@latest info`. Se existir, mostre `project.url` e `version` e **confirme com o usuário** antes de reconfigurar.
|
|
476
556
|
|
|
477
|
-
**
|
|
478
|
-
1. **Sempre comece com `--dry-run`** para inspecionar o que está desatualizado sem alterar nada:
|
|
557
|
+
2. **Descubra o repositório alvo:**
|
|
479
558
|
```bash
|
|
480
|
-
|
|
559
|
+
gh repo view --json nameWithOwner -q .nameWithOwner
|
|
560
|
+
```
|
|
561
|
+
Confirme com o usuário. Sem remote, pergunte o `owner/repo`.
|
|
562
|
+
|
|
563
|
+
3. **Título do Project:** ofereça o default `<repo> — Spec Wave` e aceite-o se não houver preferência.
|
|
564
|
+
|
|
565
|
+
4. **Cheque o auth:** `gh auth status`. Faltando os escopos `project,repo,workflow`, oriente o usuário a rodar **ele mesmo** (comando interativo — sugira o prefixo `!`):
|
|
566
|
+
```
|
|
567
|
+
!gh auth refresh --scopes project,repo,workflow
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
5. **(Opcional) Pré-visualize:**
|
|
571
|
+
```bash
|
|
572
|
+
npx @spec-wave/cli@latest init --repo <owner/repo> --dry-run
|
|
481
573
|
```
|
|
482
|
-
|
|
483
|
-
|
|
574
|
+
|
|
575
|
+
6. **Execute:**
|
|
484
576
|
```bash
|
|
485
|
-
npx @spec-wave/cli@latest
|
|
486
|
-
npx @spec-wave/cli@latest update --yes # commits diretos na branch default
|
|
577
|
+
npx @spec-wave/cli@latest init --repo <owner/repo> --project-title "<título>"
|
|
487
578
|
```
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
579
|
+
Use `--skip-project` / `--skip-labels` / `--skip-files` **apenas** para re-rodar uma fase que falhou antes.
|
|
580
|
+
|
|
581
|
+
7. O `init` cria o Project, as labels, os workflows, um **scaffold de `.github/config/tech_context.yml`** (só se ainda não existir) e grava o `.spec-wave.json`. Oriente o usuário a fazer `git pull` para trazer os arquivos ao checkout local.
|
|
582
|
+
|
|
583
|
+
8. **Adapte o `tech_context.yml`** — o scaffold vem com dados de exemplo e a qualidade do `plan.md` depende dele. Ofereça ajustá-lo agora; o passo a passo está na seção **Tech Context** deste documento.
|
|
584
|
+
|
|
585
|
+
9. **Secret de IA:** instrua a adicionar em Settings → Secrets → Actions a credencial do provider escolhido: `ANTHROPIC_API_KEY` (Anthropic), `CLAUDE_CODE_OAUTH_TOKEN` (assinatura Claude Pro/Max — gere com `claude setup-token`) ou `OPENROUTER_API_KEY` (OpenRouter).
|
|
586
|
+
|
|
587
|
+
10. **Próximo passo:** criar a primeira Feature — skill **issue**.
|
|
588
|
+
|
|
589
|
+
#### Depois
|
|
590
|
+
|
|
591
|
+
Rode a skill **doctor** para confirmar auth, escopos, config de IA e workflows antes de começar a trabalhar.
|
|
494
592
|
|
|
495
593
|
---
|
|
496
594
|
|
|
497
|
-
### `/spec-wave
|
|
595
|
+
### `/spec-wave update` — traz tudo para a versão atual
|
|
596
|
+
|
|
597
|
+
> **Quando usar:** Use depois de atualizar a CLI @spec-wave/cli, ou quando a skill instalada, o .spec-wave.json e os workflows/labels do repositório ficaram para trás da versão atual. Detecta e atualiza SÓ o que divergiu. Gatilhos: 'atualizar spec-wave', 'a skill está desatualizada', 'os workflows estão velhos', 'update do spec-wave'. Para configurar do zero use a skill setup; para remover, uninstall.
|
|
598
|
+
|
|
599
|
+
Atualiza **somente o que divergiu** da versão da CLI: a **skill** instalada (por agente), o **`.spec-wave.json`** local e os **workflows/labels** do repositório.
|
|
498
600
|
|
|
499
|
-
|
|
601
|
+
| Flag | Descrição |
|
|
602
|
+
|------|-----------|
|
|
603
|
+
| `--global` | Verifica a skill no escopo do usuário (padrão: projeto). |
|
|
604
|
+
| `--skip-skill` | Não verifica/atualiza a skill instalada. |
|
|
605
|
+
| `--skip-config` | Não verifica/atualiza o `.spec-wave.json`. |
|
|
606
|
+
| `--skip-repo` | Não verifica/atualiza workflows e labels do repo. |
|
|
607
|
+
| `--branch [nome]` | Envia os arquivos do repo como **Pull Request** numa branch, em um único commit (sem valor: `spec-wave/update-v<versão>`). |
|
|
608
|
+
| `--config-in-pr` / `--no-config-in-pr` | Força incluir/excluir o `.spec-wave.json` do PR. |
|
|
609
|
+
| `--skill-in-pr` / `--no-skill-in-pr` | Força incluir/excluir a skill dos agentes do PR. |
|
|
610
|
+
| `--dry-run` | Mostra o que seria atualizado sem alterar nada. |
|
|
611
|
+
| `--yes` | Aplica sem pedir confirmação. |
|
|
500
612
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
3. **Pergunte o título do Project** (parâmetro `--project-title`). Ofereça o default `<repo> — Spec Wave` e aceite-o se o usuário não tiver preferência.
|
|
505
|
-
4. **Cheque o auth:** `gh auth status`. Se faltarem os escopos `project,repo,workflow`, oriente o usuário a rodar ele mesmo `gh auth refresh --scopes project,repo,workflow` (comando interativo — o usuário executa, não você).
|
|
506
|
-
5. **(Opcional) Pré-visualize** antes de aplicar: `npx @spec-wave/cli@latest init --repo <owner/repo> --dry-run`.
|
|
507
|
-
6. **Execute com os parâmetros coletados:**
|
|
613
|
+
#### Passos
|
|
614
|
+
|
|
615
|
+
1. **Sempre comece com `--dry-run`:**
|
|
508
616
|
```bash
|
|
509
|
-
npx @spec-wave/cli@latest
|
|
617
|
+
npx @spec-wave/cli@latest update --dry-run
|
|
510
618
|
```
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
619
|
+
|
|
620
|
+
2. Mostre ao usuário o resumo por categoria (skill / config / arquivos do repo / labels). Se **nada** divergiu, informe que já está tudo na versão atual e encerre.
|
|
621
|
+
|
|
622
|
+
3. Com a aprovação, aplique — e **prefira o Pull Request**:
|
|
623
|
+
```bash
|
|
624
|
+
npx @spec-wave/cli@latest update --yes --branch # 1 commit atômico + PR (recomendado)
|
|
625
|
+
npx @spec-wave/cli@latest update --yes # commits diretos na branch default
|
|
626
|
+
```
|
|
627
|
+
Limite o escopo com `--skip-skill`, `--skip-config` ou `--skip-repo` se o usuário só quiser parte.
|
|
628
|
+
|
|
629
|
+
4. **Onde cada coisa aterrissa:**
|
|
630
|
+
- **workflows e templates de issue** → no PR (com `--branch`) ou commitados direto na branch default
|
|
631
|
+
- **labels** → sempre direto na base: são metadado do repositório, não há como versioná-las
|
|
632
|
+
- **`.spec-wave.json` e a skill** → o comando **consulta a base** e vai pelo mesmo caminho do arquivo: se o repositório já versiona aquele caminho, a atualização entra no PR; se não versiona, fica só local e o usuário precisa commitá-la. Force com `--config-in-pr` / `--skill-in-pr` se o projeto quiser passar a versionar.
|
|
633
|
+
- a skill é gravada em disco nos dois casos — é a cópia que o agente carrega
|
|
634
|
+
|
|
635
|
+
5. Se a skill foi atualizada, oriente a **recarregar/reiniciar o agente** para pegar a nova versão.
|
|
636
|
+
|
|
637
|
+
#### Por que isso é necessário
|
|
638
|
+
|
|
639
|
+
A skill instalada é uma **cópia estática** — ela não acompanha o `npx @spec-wave/cli@latest` sozinha. Se o banner de versão no topo do arquivo instalado for menor que `npx @spec-wave/cli@latest --version` (ou estiver ausente), está desatualizada.
|
|
640
|
+
|
|
641
|
+
Para atualizar **só a skill**, sem tocar em config e repo:
|
|
642
|
+
|
|
643
|
+
```bash
|
|
644
|
+
npx @spec-wave/cli@latest install-skill --force
|
|
645
|
+
```
|
|
515
646
|
|
|
516
647
|
---
|
|
517
648
|
|
|
518
|
-
### `/spec-wave
|
|
649
|
+
### `/spec-wave doctor` — preflight de auth e configuração
|
|
650
|
+
|
|
651
|
+
> **Quando usar:** Use como PRIMEIRO passo de troubleshooting do spec-wave: erro 404 ao criar issues, comando falhando sem motivo claro, board com colunas estranhas, Action que não roda, dúvida sobre token/escopos ou sobre qual modelo de IA está configurado. Também no início de uma sessão de trabalho. Gatilhos: 'spec-wave está com erro', 'não consigo criar issue', 'diagnosticar spec-wave', 'rodar o doctor'. Prefira esta skill a depurar gh api na mão.
|
|
652
|
+
|
|
653
|
+
Comando **local**, sem flags:
|
|
654
|
+
|
|
655
|
+
```bash
|
|
656
|
+
npx @spec-wave/cli@latest doctor
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
#### O que ele checa
|
|
660
|
+
|
|
661
|
+
- **Token GitHub** e a fonte dele; **escopos** (`repo`, `project`, `workflow`), com degradação para checks funcionais em fine-grained PATs
|
|
662
|
+
- **Conta ativa do `gh`** vs. o owner do repositório
|
|
663
|
+
- **`.spec-wave.json`**: campos presentes e sincronia com o Project real
|
|
664
|
+
- **Acesso ao repositório**
|
|
665
|
+
- **Configuração de IA**: provider, modelo, `ai.models`, escalada da crítica, apelidos de modelo, teto de saída e os secrets do Actions
|
|
666
|
+
- **Higiene do board e das labels**: colunas fora do fluxo canônico, labels `spec-wave:*` descontinuadas ou ausentes
|
|
667
|
+
- **spec-kit**: `specKit.command` / env `SPEC_WAVE_IMPLEMENT_CMD` — se ausente, sugere exemplos por agente (Claude Code, opencode, Codex, Copilot CLI, Kiro CLI, Qwen Code)
|
|
668
|
+
- **Workflows**: presença + **versão da CLI fixada** (não `@latest`)
|
|
669
|
+
|
|
670
|
+
#### Como ler a saída
|
|
671
|
+
|
|
672
|
+
| Símbolo | Significado |
|
|
673
|
+
|---------|-------------|
|
|
674
|
+
| `✓` | ok |
|
|
675
|
+
| `✗` | problema confirmado |
|
|
676
|
+
| `!` | não verificável (best-effort — falha de rede nunca derruba o doctor) |
|
|
677
|
+
|
|
678
|
+
**Exit 1** se houver algum `✗`.
|
|
519
679
|
|
|
520
|
-
|
|
680
|
+
#### Passos
|
|
681
|
+
|
|
682
|
+
1. Rode o comando.
|
|
683
|
+
2. Para cada `✗`, explique a causa ao usuário e proponha a correção concreta:
|
|
684
|
+
- escopo faltando → o usuário roda `!gh auth refresh --scopes project,repo,workflow` (interativo, ele executa)
|
|
685
|
+
- `.spec-wave.json` dessincronizado → `npx @spec-wave/cli@latest refresh --config`
|
|
686
|
+
- workflows/labels divergentes → skill **update**
|
|
687
|
+
- secret de IA ausente → Settings → Secrets → Actions (`ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN` ou `OPENROUTER_API_KEY`, conforme o provider)
|
|
688
|
+
- modo de execução divergente (config diz `local` e a variável `SPEC_WAVE_EXECUTION` não está setada, ou vice-versa) → `npx @spec-wave/cli@latest mode local|actions` — veja a skill **run**
|
|
689
|
+
- `specKit.command` ausente → configure antes de usar a skill **implement**
|
|
690
|
+
3. Trate `!` como "não deu para verificar", não como falha.
|
|
691
|
+
4. Se tudo passar e o problema original persistir, aí sim investigue a superfície específica (Action, issue, board).
|
|
692
|
+
|
|
693
|
+
> **404 ao criar issues** é o caso clássico: quase sempre token sem acesso ao repo/org — e o doctor aponta exatamente isso.
|
|
694
|
+
|
|
695
|
+
---
|
|
696
|
+
|
|
697
|
+
### `/spec-wave issue` — cria um work item no board
|
|
698
|
+
|
|
699
|
+
> **Quando usar:** Use para criar um work item tipado no spec-wave — Initiative, Epic, Feature, Bug, Spike ou RFC — já adicionado ao GitHub Project com Etapa, Work Item Type e Area. Gatilhos: 'criar uma feature', 'nova initiative', 'abrir um epic', 'registrar um bug no board', 'criar issue do spec-wave'. NÃO use para Story ou Task (nascem do decompose — skill decompose) e nunca use gh issue create.
|
|
700
|
+
|
|
701
|
+
Faz tudo de uma vez: cria a issue com a label de tipo, vincula ao parent como **sub-issue** nativa do GitHub, adiciona ao Project e define os campos **Etapa**, **Work Item Type**, **Area** e — só se informada — **Priority**. Grava `Parent: #N` no corpo.
|
|
702
|
+
|
|
703
|
+
> **Nunca use `gh issue create`.** Ele não adiciona ao board nem vincula o parent: a issue fica sem Etapa e some de todas as telas da UI.
|
|
704
|
+
|
|
705
|
+
**Contexto:** leia `.spec-wave.json` (Read) para confirmar que o repo está configurado. Ausente → skill **setup**.
|
|
706
|
+
|
|
707
|
+
#### Flags
|
|
708
|
+
|
|
709
|
+
| Flag | Tipo | Descrição |
|
|
710
|
+
|------|------|-----------|
|
|
711
|
+
| `--title <title>` | **obrigatório** | Título **sem** o prefixo de tipo — a CLI adiciona (`[FEATURE]`, `[STORY]`…). |
|
|
712
|
+
| `--type <type>` | string | `initiative`, `epic`, `feature`, `story`, `task`, `bug`, `spike`, `rfc`. Default: `feature`. |
|
|
713
|
+
| `--parent <n>` | string | Número da issue pai — cria como sub-issue dela. |
|
|
714
|
+
| `--body <text>` | string | Descrição. |
|
|
715
|
+
| `--priority <p>` | string | **Opcional.** `P0`–`P3`. **Omita** se o usuário não pediu. |
|
|
716
|
+
| `--area <area>` | string | `Frontend`, `Backend`, `Mobile`, `Infra`, `DevOps`, `Data`. |
|
|
521
717
|
|
|
522
|
-
|
|
718
|
+
Atalhos: `initiative` (raiz, sem `--parent`) e `feature` — mesmas flags, `--type` fixo.
|
|
523
719
|
|
|
524
|
-
|
|
720
|
+
#### Hierarquia
|
|
525
721
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
722
|
+
`Initiative → Epic → Feature → Story → Task`. Use `--parent <n>` para pendurar no nível acima.
|
|
723
|
+
|
|
724
|
+
#### Passos
|
|
725
|
+
|
|
726
|
+
1. **Colete com o usuário:** tipo, título (sem prefixo), descrição e o número da issue **pai**, se houver.
|
|
727
|
+
|
|
728
|
+
> **Prioridade e área são opcionais.** Só inclua se o usuário pedir explicitamente. **Nunca atribua uma prioridade por conta própria** — omitindo `--priority`, a prioridade fica `null` (sem prioridade) no board.
|
|
729
|
+
|
|
730
|
+
2. **Execute** com **apenas** as flags que o usuário forneceu:
|
|
529
731
|
```bash
|
|
530
732
|
npx @spec-wave/cli@latest issue \
|
|
531
733
|
--type "<tipo>" \
|
|
532
734
|
--title "<título>" \
|
|
533
735
|
--body "<descrição>" \
|
|
534
|
-
--area "<área>" \ # opcional
|
|
535
|
-
--priority "<prioridade>" \ # opcional —
|
|
736
|
+
--area "<área>" \ # opcional
|
|
737
|
+
--priority "<prioridade>" \ # opcional — se o usuário não pediu, OMITA
|
|
536
738
|
--parent "<número-do-pai>" # opcional
|
|
537
739
|
```
|
|
538
|
-
Para Features,
|
|
539
|
-
A CLI cria a issue (label de tipo — e de prioridade **apenas se `--priority` for informado**), vincula como sub-issue do parent, adiciona ao Project e define Etapa = 📥 Backlog + Work Item Type + Area (+ Priority só se informada). **Não use `gh issue create`** (não adiciona ao board nem vincula o parent).
|
|
540
|
-
**Se o tipo for `story` ou `task`**, avise o usuário que o caminho normal é o `decompose` e, se ele confirmar mesmo assim, avance a Etapa para ✅ Ready depois de criar — senão o item fica invisível na UI.
|
|
541
|
-
3. Informe o número criado e o vínculo com o pai (se houver).
|
|
542
|
-
4. Para Features: "Quando quiser iniciar, mova para **📋 Spec** e use `/spec-wave spec <número>` para gerar a especificação funcional (o plano técnico vem depois)".
|
|
740
|
+
Para Features, o atalho `npx @spec-wave/cli@latest feature --title ...` equivale a `--type feature`.
|
|
543
741
|
|
|
544
|
-
|
|
742
|
+
3. Informe o número criado e o vínculo com o pai.
|
|
743
|
+
|
|
744
|
+
4. Para Features, aponte o próximo passo: mover para **📋 Spec** e usar a skill **spec** para gerar a especificação funcional (o plano técnico vem depois).
|
|
745
|
+
|
|
746
|
+
#### Cuidados por tipo
|
|
545
747
|
|
|
546
|
-
|
|
748
|
+
⚠️ **A Etapa inicial é sempre 📥 Backlog, para qualquer `--type`.** Correto para Initiative, Epic, Feature, RFC, Bug e Spike.
|
|
547
749
|
|
|
548
|
-
|
|
750
|
+
**Story e Task:** está errado para elas — pertencem a ✅ Ready. O caminho normal é a skill **decompose**. Se o usuário insistir numa Story/Task avulsa: crie **com `--parent <n>`** e, logo em seguida, avance para ✅ Ready (skill **move**), explicando por que o passo extra é necessário — senão o item fica invisível na UI.
|
|
549
751
|
|
|
550
|
-
**
|
|
551
|
-
1. Confirme com o usuário que ele quer remover (a ação remove labels e faz commits removendo os workflows).
|
|
552
|
-
2. Mostre antes o que será removido com `npx @spec-wave/cli@latest uninstall --dry-run`.
|
|
553
|
-
3. Execute `npx @spec-wave/cli@latest uninstall` (a CLI pede confirmação; use `--yes` só se o usuário já confirmou).
|
|
554
|
-
4. Lembre o usuário de excluir o **GitHub Project** manualmente, se desejar — a CLI não o apaga de propósito.
|
|
752
|
+
**Spike:** entra em 📥 Backlog e o **usuário** o move à mão pelas etapas. Nunca avance a Etapa de um Spike por conta própria.
|
|
555
753
|
|
|
556
754
|
---
|
|
557
755
|
|
|
558
|
-
### `/spec-wave spec
|
|
756
|
+
### `/spec-wave spec` — especificação funcional (1º documento)
|
|
559
757
|
|
|
560
|
-
|
|
758
|
+
> **Quando usar:** Use para iniciar a geração da especificação funcional (spec.md) de uma Feature do spec-wave — o PRIMEIRO documento do ciclo, antes do plano técnico. Aplica a label spec-wave:spec e deixa o GitHub Action gerar o arquivo e abrir um Pull Request. Gatilhos: 'gerar a spec da feature 12', 'criar especificação funcional', 'rodar o spec-wave:spec'. Só vale para Features — Spike, RFC e Bug não usam spec.
|
|
561
759
|
|
|
562
|
-
> **
|
|
760
|
+
> **Regra fundamental: nunca escreva o `spec.md` à mão.** Quem gera é o spec-wave — pelo Action ou pela CLI local. É isso que garante que o arquivo chegue à main por Pull Request e seja referenciado na issue. Exceção: revisar/melhorar um `spec.md` já gerado (aí sim use Edit).
|
|
563
761
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
762
|
+
#### Dois modos, mesmo resultado
|
|
763
|
+
|
|
764
|
+
| Modo | Como acionar | Quando |
|
|
765
|
+
|------|--------------|--------|
|
|
766
|
+
| **Action** | aplicar a label `spec-wave:spec` | fluxo assíncrono; roda no CI, você acompanha pela issue |
|
|
767
|
+
| **Local** | `npx @spec-wave/cli@latest generate-spec --issue-number <n>` | você quer o documento **agora**, nesta sessão, e iterar em cima dele |
|
|
768
|
+
|
|
769
|
+
O modo é detectado pelo ambiente — fora do Actions, a CLI roda em modo local automaticamente. Os dois geram o arquivo, abrem um **Pull Request** com ele, comentam na issue e removem a label de gatilho. **Pergunte ao usuário qual ele quer** se não estiver claro; na dúvida numa sessão interativa, prefira o local (o resultado aparece em segundos, em vez de exigir acompanhar o Action).
|
|
770
|
+
|
|
771
|
+
> Local exige a credencial de IA no seu ambiente (`OPENROUTER_API_KEY`, `ANTHROPIC_API_KEY` ou o login do Claude Code, se o provider for `claude-oauth`) e um `.spec-wave.json` no repositório. Para conduzir o fluxo inteiro sem gastar minutos de Actions, veja a skill **run**.
|
|
772
|
+
|
|
773
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
774
|
+
|
|
775
|
+
#### Passos
|
|
776
|
+
|
|
777
|
+
1. **Confirme que a issue é uma Feature.**
|
|
778
|
+
|
|
779
|
+
> **Apenas Features.** Para **Spike, RFC e Bug** o Action **pula** a geração, remove a label e comenta. Não use esta skill nesses tipos.
|
|
780
|
+
|
|
781
|
+
2. **Escolha o modo** (veja a tabela acima) e acione:
|
|
782
|
+
|
|
783
|
+
**Local** — resultado nesta sessão:
|
|
784
|
+
```bash
|
|
785
|
+
npx @spec-wave/cli@latest generate-spec --issue-number <número>
|
|
786
|
+
```
|
|
787
|
+
O comando imprime `Modo de execução: local`, gera e abre o Pull Request. Nada é gravado no seu clone — o documento vive no PR até o merge.
|
|
788
|
+
|
|
789
|
+
**Action** — assíncrono:
|
|
567
790
|
```bash
|
|
568
791
|
gh issue edit <número> --add-label "spec-wave:spec"
|
|
569
792
|
```
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
793
|
+
Informe: "Label `spec-wave:spec` adicionada. O Action `generate-spec.yml` vai gerar o `spec.md`. Acompanhe em Actions → Generate Spec."
|
|
794
|
+
|
|
795
|
+
4. Quando concluir, ofereça revisar o arquivo em `docs/features/<slug>/spec.md`. O slug vem do título: `[FEATURE] Cadastro de Pedidos com PIX` → `cadastro-de-pedidos-com-pix`.
|
|
796
|
+
|
|
797
|
+
5. **Próximo passo:** o plano técnico — mova para **📋 Plan** e use a skill **plan**.
|
|
798
|
+
|
|
799
|
+
#### Se falhar
|
|
800
|
+
|
|
801
|
+
- **Comentário 🔎 de crítica com `spec-wave:critique-failed`** → corrija o `spec.md` (ou o corpo da issue que o embasa), commite, remova a label e reaplique o gatilho.
|
|
802
|
+
- **Erro de teto de tokens** → a geração **falha e nada é gravado** (um documento cortado no meio valeria menos que documento nenhum). Aumente `ai.maxTokens` no `.spec-wave.json` ou reduza o corpo da issue; depois re-aplique a label.
|
|
803
|
+
- Para reprocessar num modelo mais forte só nesta issue, aplique também `spec-wave:model:<apelido>` (o apelido precisa existir em `ai.modelAliases`).
|
|
573
804
|
|
|
574
805
|
---
|
|
575
806
|
|
|
576
|
-
### `/spec-wave plan
|
|
807
|
+
### `/spec-wave plan` — plano técnico (2º documento)
|
|
577
808
|
|
|
578
|
-
|
|
809
|
+
> **Quando usar:** Use para iniciar a geração do plano técnico (plan.md) de uma Feature do spec-wave — o SEGUNDO documento, derivado da spec.md. Aplica a label spec-wave:plan e deixa o GitHub Action gerar. Também cobre a criação e manutenção do .github/config/tech_context.yml, de que a qualidade do plano depende. Gatilhos: 'gerar o plano técnico', 'criar o plan.md da feature 12', 'configurar o tech_context'. Só vale para Features.
|
|
579
810
|
|
|
580
|
-
|
|
811
|
+
> **Regra fundamental: nunca escreva o `plan.md` à mão.** Quem gera é o spec-wave — pelo Action ou pela CLI local. Exceção: revisar/melhorar um plano já gerado.
|
|
581
812
|
|
|
582
|
-
**
|
|
583
|
-
1. Verifique se `spec.md` já existe em `docs/features/<slug>/` (o plano usa a especificação funcional como contexto). Se não existir, gere a spec primeiro com `/spec-wave spec <número>`.
|
|
584
|
-
2. **Garanta o `tech_context`** (a qualidade do plano depende disso). Verifique se `.github/config/tech_context.yml` existe no repo (use Read). **Se não existir, ajude a criar AGORA** seguindo a seção **Tech Context** abaixo (logo após este comando) — e garanta que esteja **commitado e pushado** antes de adicionar a label (o Action lê o arquivo do repositório, não do seu disco local).
|
|
585
|
-
3. Adicione a label de gatilho:
|
|
586
|
-
```bash
|
|
587
|
-
gh issue edit <número> --add-label "spec-wave:plan"
|
|
588
|
-
```
|
|
589
|
-
4. Informe: "Label `spec-wave:plan` adicionada. O GitHub Action `generate-plan.yml` irá gerar o `plan.md` automaticamente. Acompanhe em: Actions → Generate Plan."
|
|
590
|
-
5. Após a conclusão (cheque comentários na issue ou aguarde confirmação do usuário), ofereça revisar o plan.md gerado em `docs/features/<slug>/plan.md`.
|
|
591
|
-
6. Próximo passo: validar a Feature — mova para **✅ Ready** e use `/spec-wave ready <número>`.
|
|
813
|
+
**Dois modos, mesmo resultado.** `npx @spec-wave/cli@latest generate-plan --issue-number <n>` roda **agora**, nesta sessão; a label `spec-wave:plan` roda no Action. O modo é detectado pelo ambiente. Ambos geram, abrem um **Pull Request**, criticam e comentam na issue. Local exige a chave de IA no seu ambiente. Veja a skill **spec** para a tabela completa.
|
|
592
814
|
|
|
593
|
-
|
|
815
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
594
816
|
|
|
595
|
-
|
|
817
|
+
O plano segue o schema do **RFC-002 §3.2**: **Estratégia Técnica** (com Matriz de Rastreabilidade), **Detalhamento da Implementação**, **Segurança e Conformidade**, **Estratégia de Testes** e **Rollback e Monitoramento**. O agente usa o `tech_context` do repositório (`.github/config/tech_context.yml` + versões de pacote e migrations recentes) para embasar o plano e usar **APENAS** as tecnologias declaradas.
|
|
596
818
|
|
|
597
|
-
|
|
819
|
+
#### Passos
|
|
598
820
|
|
|
599
|
-
**
|
|
821
|
+
1. **A spec existe?** Verifique `docs/features/<slug>/spec.md` — o plano usa a especificação funcional como contexto. Se não existir, gere a spec primeiro (skill **spec**).
|
|
600
822
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
- `pom.xml` / `build.gradle` (Java), `requirements.txt` / `pyproject.toml` (Python), `go.mod` (Go).
|
|
605
|
-
- `prisma/schema.prisma` ou pasta `migrations/` → tabelas e colunas para `database_schemas`.
|
|
606
|
-
- `Dockerfile` / `docker-compose.yml` / charts Helm → `infra`.
|
|
607
|
-
- Procure papéis/roles (enum de RBAC) no código para `security.rbac_roles`.
|
|
608
|
-
3. **Rascunhe** o YAML seguindo EXATAMENTE este schema (preencha só o que conseguir confirmar; deixe `# TODO` no que faltar — não invente):
|
|
609
|
-
```yaml
|
|
610
|
-
system_info:
|
|
611
|
-
name: "<nome do sistema>"
|
|
612
|
-
stack:
|
|
613
|
-
backend: "<ex.: Node.js (NestJS v11)>"
|
|
614
|
-
frontend: "<ex.: Next.js 16 (React 19)>"
|
|
615
|
-
database: "<ex.: PostgreSQL (Prisma 5)>"
|
|
616
|
-
infra: "<ex.: Docker / Kubernetes>"
|
|
617
|
-
architecture: "<ex.: Monorepo Nx / Microservices>"
|
|
618
|
-
security:
|
|
619
|
-
auth_protocol: "<ex.: JWT>"
|
|
620
|
-
rbac_roles: ["ADMIN", "..."]
|
|
621
|
-
database_schemas:
|
|
622
|
-
- table: "<tabela>"
|
|
623
|
-
columns: "<col1, col2, ...>"
|
|
624
|
-
existing_services:
|
|
625
|
-
- name: "<serviço>"
|
|
626
|
-
endpoint: "<caminho>"
|
|
627
|
-
auth: "<ex.: JWT, mTLS>"
|
|
628
|
-
internal_libraries:
|
|
629
|
-
- "<lib interna>"
|
|
630
|
-
```
|
|
631
|
-
4. **Mostre o rascunho ao usuário e peça confirmação/ajustes** antes de gravar (ele conhece serviços internos e roles que o código pode não revelar).
|
|
632
|
-
5. **Grave** com Write em `.github/config/tech_context.yml`.
|
|
633
|
-
6. **Oriente a commitar e pushar** antes de seguir (o Action lê do repo). Sugira ao usuário rodar, via prefixo `!`:
|
|
823
|
+
2. **Garanta o `tech_context`.** Verifique se `.github/config/tech_context.yml` existe (Read). **Se não existir, ajude a criar AGORA** — o passo a passo está na seção **Tech Context** deste documento. Garanta que esteja **commitado e pushado** antes de aplicar a label: o Action lê o arquivo do repositório, não do seu disco local.
|
|
824
|
+
|
|
825
|
+
3. **Acione**, no modo escolhido:
|
|
634
826
|
```bash
|
|
635
|
-
|
|
827
|
+
# local — resultado nesta sessão
|
|
828
|
+
npx @spec-wave/cli@latest generate-plan --issue-number <número>
|
|
829
|
+
# ou Action — assíncrono
|
|
830
|
+
gh issue edit <número> --add-label "spec-wave:plan"
|
|
636
831
|
```
|
|
637
832
|
|
|
638
|
-
|
|
833
|
+
4. Informe: "Label `spec-wave:plan` adicionada. O Action `generate-plan.yml` vai gerar o `plan.md`. Acompanhe em Actions → Generate Plan."
|
|
834
|
+
|
|
835
|
+
5. Quando concluir, ofereça revisar `docs/features/<slug>/plan.md`.
|
|
836
|
+
|
|
837
|
+
6. **Próximo passo:** validar a Feature — mova para **✅ Ready** e use a skill **ready**.
|
|
838
|
+
|
|
839
|
+
#### Desvios pontuais (`## Tech Override`)
|
|
840
|
+
|
|
841
|
+
Para uma Feature específica usar algo fora do padrão, oriente a adicionar no **corpo da issue** uma seção com um bloco YAML que será mesclado (deep-merge) sobre o `tech_context.yml`:
|
|
639
842
|
|
|
640
843
|
````markdown
|
|
641
844
|
## Tech Override
|
|
@@ -646,256 +849,742 @@ system_info:
|
|
|
646
849
|
```
|
|
647
850
|
````
|
|
648
851
|
|
|
852
|
+
#### Se falhar
|
|
853
|
+
|
|
854
|
+
Depois do `generate-plan` roda a **crítica adversarial**, que vira um comentário 🔎 na issue. Se ela apontar findings **graves**, a issue recebe `spec-wave:critique-failed` — corrija o **`plan.md`** (ou a `spec.md` que o embasa), commite, remova a label e reaplique `spec-wave:ready`. Detalhes na skill **workflow**.
|
|
855
|
+
|
|
856
|
+
#### Criticar sem regerar
|
|
857
|
+
|
|
858
|
+
Corrigir o documento à mão **não é desvio** — é o que o fluxo pede quando a crítica reprova. Para rodar a crítica de novo sobre o texto corrigido, **nunca** reaplique `spec-wave:plan`: ele regenera o `plan.md` do zero e descarta a correção.
|
|
859
|
+
|
|
860
|
+
| Situação | Comando |
|
|
861
|
+
|----------|---------|
|
|
862
|
+
| Quero a crítica oficial de novo, na issue | label `spec-wave:critique` (ou `critique --issue-number <n>`) |
|
|
863
|
+
| Quero só saber como está, enquanto edito | `npx @spec-wave/cli@latest critique --file docs/features/<slug>/plan.md` |
|
|
864
|
+
|
|
865
|
+
O `--file` **não** comenta na issue, **não** aplica label e **não** consome tentativa da crítica — é consulta, não portão. Aceita `spec.md`, `plan.md`, `decomposition.md` e `bug.md` (o tipo sai do nome do arquivo; use `--kind` para forçar). Com `--fail-on-grave` ele sai com código 1, para usar em script.
|
|
866
|
+
|
|
867
|
+
Um finding **grave** só bloqueia se vier com citação literal do trecho e não se auto-refutar; os que não passam nesse teste aparecem como **↘️ Rebaixados** no comentário, com o motivo — visíveis, mas sem travar o fluxo.
|
|
868
|
+
|
|
649
869
|
---
|
|
650
870
|
|
|
651
|
-
### `/spec-wave ready
|
|
871
|
+
### `/spec-wave ready` — valida spec + plan
|
|
652
872
|
|
|
653
|
-
|
|
873
|
+
> **Quando usar:** Use para validar que spec.md e plan.md de uma Feature do spec-wave estão completos e ela pode avançar para ✅ Ready. Aplica a label spec-wave:ready, que dispara o Action validate.yml. Gatilhos: 'validar a feature 12', 'a spec e o plano estão prontos?', 'mover para Ready'. Também explica os portões humanos critique-failed e needs-human, que bloqueiam a validação.
|
|
654
874
|
|
|
655
|
-
|
|
656
|
-
|
|
875
|
+
Verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias e se não há sinal de truncamento.
|
|
876
|
+
|
|
877
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
878
|
+
|
|
879
|
+
#### Passos
|
|
880
|
+
|
|
881
|
+
1. **Cheque os portões humanos ANTES de aplicar a label.** Se a issue tiver `spec-wave:critique-failed` ou `spec-wave:needs-human`, a validação **falha de imediato** — veja *Portões humanos* abaixo e resolva primeiro.
|
|
882
|
+
|
|
883
|
+
2. Adicione a label:
|
|
657
884
|
```bash
|
|
658
885
|
gh issue edit <número> --add-label "spec-wave:ready"
|
|
659
886
|
```
|
|
660
|
-
|
|
661
|
-
3.
|
|
662
|
-
|
|
663
|
-
|
|
887
|
+
|
|
888
|
+
3. Informe: "Validação iniciada. O workflow verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias."
|
|
889
|
+
|
|
890
|
+
4. **Se a validação falhar por conteúdo**, o workflow comenta os problemas na issue e **não aplica nenhuma label de gatilho**. Oriente o usuário a corrigir e reaplicar `spec-wave:ready`. Quando o problema é só o título de uma seção, o comentário já diz qual título encontrou e qual esperava — renomear resolve. Só sugira `spec-wave:spec` se o documento precisar mesmo ser REGERADO: essa label **sobrescreve** o `spec.md`, inclusive o que foi revisado à mão.
|
|
891
|
+
|
|
892
|
+
5. **Se passar:** "Feature validada! Mova o card para **✅ Ready** e use a skill **decompose** para gerar o **rascunho** das Stories — nada é criado ainda."
|
|
893
|
+
|
|
894
|
+
#### Portões humanos
|
|
895
|
+
|
|
896
|
+
Estas labels **bloqueiam** a validação e **não** devolvem a Feature para a etapa de spec:
|
|
897
|
+
|
|
898
|
+
| Label | O que aconteceu | Como sair |
|
|
899
|
+
|-------|-----------------|-----------|
|
|
900
|
+
| `spec-wave:critique-failed` | A crítica adversarial apontou contradições **graves** (comentário 🔎 na issue) | Corrija a superfície certa, commite, remova a label, reaplique `spec-wave:ready` |
|
|
901
|
+
| `spec-wave:needs-human` | A crítica reprovou N vezes seguidas (default 3) e o fluxo parou | Uma pessoa revisa e remove **as duas** labels à mão |
|
|
902
|
+
|
|
903
|
+
> **Qual superfície corrigir?** Se a crítica reprovou depois do `generate-plan`, corrija o **`plan.md`** (ou a `spec.md` que o embasa). Se reprovou no `decompose`, corrija o **`decomposition.md`** — os achados citam `Story N` / `Task N.M`, que são títulos daquele arquivo. Detalhes na skill **workflow**.
|
|
904
|
+
|
|
905
|
+
#### Rede de segurança contra truncamento
|
|
906
|
+
|
|
907
|
+
O `validate` também recusa documento com sinal objetivo de corte — bloco de código não fechado, parêntese aberto na última linha. Vale para documento editado à mão ou gerado por versão antiga da CLI.
|
|
664
908
|
|
|
665
909
|
---
|
|
666
910
|
|
|
667
|
-
### `/spec-wave decompose
|
|
911
|
+
### `/spec-wave decompose` — decomposição em duas etapas
|
|
912
|
+
|
|
913
|
+
> **Quando usar:** Use para quebrar uma Feature em Stories+Tasks, ou um RFC em Tasks, no spec-wave. São DUAS etapas com um rascunho revisável no meio: spec-wave:decompose gera/critica o decomposition.md sem criar nada, e spec-wave:decompose-apply cria as issues a partir do rascunho aprovado. Gatilhos: 'decompor a feature 12', 'gerar as stories', 'quebrar em tasks', 'aplicar a decomposição', 'o decompose falhou na crítica'. Também cobre re-decompose e o guard de idempotência.
|
|
914
|
+
|
|
915
|
+
Aplica-se a **dois tipos**:
|
|
916
|
+
|
|
917
|
+
- **Feature** → **Stories** (cada uma com suas **Tasks**), a partir de `spec.md` + `plan.md`
|
|
918
|
+
- **RFC** → **Tasks diretamente** (sem Stories), a partir da descrição
|
|
919
|
+
|
|
920
|
+
Para qualquer outro tipo (Spike, Bug, Story, Task…) o Action **recusa** e comenta.
|
|
921
|
+
|
|
922
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
923
|
+
|
|
924
|
+
#### O modelo mental
|
|
925
|
+
|
|
926
|
+
```
|
|
927
|
+
spec-wave:decompose
|
|
928
|
+
├─ decomposition.md ausente → gera via IA → abre Pull Request → critica
|
|
929
|
+
└─ decomposition.md presente → critica o arquivo COMO ESTÁ (preserva suas edições)
|
|
930
|
+
├─ grave → +critique-failed, comentário citando Story N / Task N.M, exit 1
|
|
931
|
+
└─ limpo → +decompose-ready, comentário "revise e aplique"
|
|
932
|
+
|
|
933
|
+
spec-wave:decompose-apply
|
|
934
|
+
└─ lê decomposition.md → cria Stories/Tasks → board → +decomposed
|
|
935
|
+
(sem nova crítica: aplicar a label É a aprovação humana)
|
|
936
|
+
```
|
|
668
937
|
|
|
669
|
-
|
|
670
|
-
- **Feature** → **Stories** (cada uma com suas **Tasks**), a partir de `spec.md` + `plan.md`.
|
|
671
|
-
- **RFC** → **Tasks diretamente** (sem Stories), a partir da descrição do RFC.
|
|
938
|
+
#### Passos
|
|
672
939
|
|
|
673
|
-
|
|
940
|
+
1. **Pré-requisito.** Feature: confirme que está em **✅ Ready** (spec e plan validados — skill **ready**). RFC: basta a descrição estar completa.
|
|
674
941
|
|
|
675
|
-
**
|
|
676
|
-
1. Para **Feature**: confirme que está em **✅ Ready** (spec.md e plan.md validados). Para **RFC**: basta a descrição estar completa (RFC não usa spec/plan).
|
|
677
|
-
2. **Etapa 1 — gerar o rascunho:**
|
|
942
|
+
2. **Etapa 1 — gerar o rascunho**, no modo que preferir (mesmo resultado; o modo é detectado pelo ambiente):
|
|
678
943
|
```bash
|
|
944
|
+
# local — resultado nesta sessão
|
|
945
|
+
npx @spec-wave/cli@latest decompose --issue-number <número>
|
|
946
|
+
# ou Action — assíncrono
|
|
679
947
|
gh issue edit <número> --add-label "spec-wave:decompose"
|
|
680
948
|
```
|
|
681
949
|
Informe: "Rascunho iniciado — vai abrir um Pull Request com o `decomposition.md` e passar pela crítica. **Nenhuma issue é criada nesta etapa.**"
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
950
|
+
|
|
951
|
+
3. **Leia o resultado** quando o Action terminar:
|
|
952
|
+
|
|
953
|
+
| Label resultante | O que fazer |
|
|
954
|
+
|------------------|-------------|
|
|
955
|
+
| `spec-wave:decompose-ready` | Passou na crítica. **Leia o `decomposition.md`** e mostre ao usuário o que será criado (Stories, Tasks, dependências). Ofereça editar antes de aplicar. |
|
|
956
|
+
| `spec-wave:critique-failed` | O Action **falhou (exit 1)** e nada foi criado. Os achados citam `Story N` / `Task N.M`. **Corrija o `decomposition.md`** — não o `plan.md` — **no Pull Request** e reaplique `spec-wave:decompose` (o arquivo é criticado como está, sem ser regerado, venha ele do PR ou da base). |
|
|
957
|
+
| `spec-wave:needs-human` | A crítica esgotou as tentativas. **Pare** e envolva o usuário: as duas labels precisam sair à mão. |
|
|
958
|
+
|
|
959
|
+
4. **Etapa 2 — aplicar o rascunho aprovado**, só depois da revisão:
|
|
687
960
|
```bash
|
|
961
|
+
# local
|
|
962
|
+
npx @spec-wave/cli@latest decompose --issue-number <número> --apply
|
|
963
|
+
# ou Action
|
|
688
964
|
gh issue edit <número> --add-label "spec-wave:decompose-apply"
|
|
689
965
|
```
|
|
690
966
|
Aplicar essa label **é** a aprovação humana — não há nova crítica.
|
|
691
|
-
5. Após a aplicação, as issues filhas aparecem como comentário na issue pai. A issue pai e as Stories/Tasks criadas entram no board na Etapa **✅ Ready** (Status Todo; a Etapa nunca retrocede — itens já adiante não são tocados). As Stories trazem a linha `Depende de: #N` (+ relação *blocked by*) — use `npx @spec-wave/cli@latest order <número>` para ver a ordem de execução. Se a issue pai tiver **milestone**, as filhas nascem nele; sem milestone no pai, nascem sem.
|
|
692
|
-
6. A issue recebe a label `spec-wave:decomposed` (guard de idempotência): rodar de novo **não** duplica as issues. Para forçar um re-decompose, siga a seção *Guard de idempotência*.
|
|
693
967
|
|
|
694
|
-
|
|
968
|
+
5. Após a aplicação, as issues filhas aparecem como comentário na issue pai. Pai e filhas entram no board em **✅ Ready** (Status Todo; a Etapa nunca retrocede — itens já adiante não são tocados). As Stories trazem `Depende de: #N` — use a skill **order** para ver a ordem de execução. Se a issue pai tiver **milestone**, as filhas nascem nele (a entrega da Story pertence à release da Feature); sem milestone no pai, nascem sem.
|
|
969
|
+
|
|
970
|
+
6. A issue recebe `spec-wave:decomposed` (guard de idempotência): rodar de novo **não** duplica as issues.
|
|
971
|
+
|
|
972
|
+
> **Nunca pule a etapa 1** aplicando `spec-wave:decompose-apply` direto — sem `decomposition.md` o Action falha pedindo o rascunho.
|
|
973
|
+
|
|
974
|
+
#### O arquivo `decomposition.md`
|
|
975
|
+
|
|
976
|
+
Fica em `docs/features/<slug>/decomposition.md` (Feature) ou `docs/rfcs/<slug>/decomposition.md` (RFC):
|
|
977
|
+
|
|
978
|
+
```markdown
|
|
979
|
+
# Decomposição — [FEATURE] Cadastro de Pedidos
|
|
980
|
+
<!-- spec-wave:decomposition v1 issue=360 kind=stories -->
|
|
981
|
+
|
|
982
|
+
## Story 1 — visualizar meus pedidos
|
|
983
|
+
|
|
984
|
+
**User story:** Como cliente, quero visualizar meus pedidos, para acompanhar entregas
|
|
985
|
+
**Depende de:** —
|
|
986
|
+
|
|
987
|
+
Descrição complementar (contexto, critérios de aceite).
|
|
988
|
+
|
|
989
|
+
### Task 1.1 — criar endpoint GET /pedidos
|
|
990
|
+
|
|
991
|
+
Corpo técnico.
|
|
992
|
+
```
|
|
993
|
+
|
|
994
|
+
**Ao editar à mão:**
|
|
995
|
+
|
|
996
|
+
- a **posição** manda, não o número escrito — inserir uma Story no meio sem renumerar funciona
|
|
997
|
+
- `**Depende de:**` aceita **irmãs** (`Story 1, Story 3`, 1-based, só para trás — apontar para si mesma ou para frente é **erro**, não filtro silencioso) e **issues de outras Features** (`#412`, que precisam JÁ existir); as duas formas convivem na mesma linha (`Story 1, #412`), e `—` significa nenhuma
|
|
998
|
+
- o corpo aceita markdown livre (`## Backend`, cercas de código) — só `## Story N` e `### Task N.M` são estrutura
|
|
999
|
+
- **para gerar outro rascunho do zero:** feche o Pull Request e apague a branch `spec-wave/<n>-decompose` (ou apague o arquivo, se já foi mergeado) e reaplique `spec-wave:decompose`
|
|
1000
|
+
|
|
1001
|
+
> ⚠️ O slug vem do **título**. Renomear a Feature entre o rascunho e o apply muda o diretório e órfã o `decomposition.md` — o apply reclama que não achou o rascunho.
|
|
1002
|
+
|
|
1003
|
+
#### Guard de idempotência (`spec-wave:decomposed`)
|
|
1004
|
+
|
|
1005
|
+
O evento `labeled` pode redisparar (re-add da label, retry de runner). Para não duplicar issues, o `decompose` **pula** quando a issue já tem `spec-wave:decomposed` **ou** já tem sub-issues do tipo-alvo (`[STORY]` para Feature, `[TASK]` para RFC). A label é gravada ao **aplicar**. Os workflows ainda usam `concurrency` por issue.
|
|
1006
|
+
|
|
1007
|
+
A `spec-wave:decompose-ready` **não** entra nesse guard — é estado de rascunho pendente, não de decomposição feita.
|
|
1008
|
+
|
|
1009
|
+
**Para forçar um re-decompose:**
|
|
1010
|
+
|
|
1011
|
+
```bash
|
|
1012
|
+
gh issue edit <n> --remove-label "spec-wave:decomposed"
|
|
1013
|
+
```
|
|
1014
|
+
Depois **apague/feche as sub-issues antigas** (senão a detecção por sub-issues pula de novo), apague o `decomposition.md` se quiser um rascunho novo, e re-adicione `spec-wave:decompose`.
|
|
1015
|
+
|
|
1016
|
+
#### Dependências entre Stories
|
|
1017
|
+
|
|
1018
|
+
O `decompose` grava `Depende de: #N, #M` no corpo das Stories e cria a relação nativa *blocked by* — para irmãs e para as issues de outras Features referenciadas com `#N` no rascunho (a issue precisa existir: o apply reprova o rascunho ANTES de criar qualquer coisa se não conseguir lê-la). Isso alimenta as skills **order** e **implement**. **Não apague essa linha** ao editar o corpo de uma Story; para mudar dependências, edite a linha (e/ou a relação *blocked by*).
|
|
695
1019
|
|
|
696
1020
|
---
|
|
697
1021
|
|
|
698
|
-
### `/spec-wave implement
|
|
1022
|
+
### `/spec-wave implement` — etapa 🚧 Desenvolvimento
|
|
1023
|
+
|
|
1024
|
+
> **Quando usar:** Use para implementar trabalho do spec-wave na etapa 🚧 Desenvolvimento — uma Feature inteira (todas as Stories pendentes, em ordem de dependência), uma Story (todas as suas Tasks) ou uma Task isolada. Monta o contexto e aciona o spec-kit; se não houver spec-kit configurado, você mesmo implementa seguindo o contexto. Gatilhos: 'implementar a feature 12', 'começar a story 34', 'fazer a task 56', 'rodar o implement'. Comando LOCAL — não usa label nem Action.
|
|
1025
|
+
|
|
1026
|
+
Comando **local** (lê o `.spec-wave.json`, como o `issue`), **não** disparado por label/Action.
|
|
1027
|
+
|
|
1028
|
+
| Flag/Arg | Descrição |
|
|
1029
|
+
|----------|-----------|
|
|
1030
|
+
| `<issue>` | **Obrigatório**, posicional. Número da Feature, Story ou Task (`12` ou `#12`). |
|
|
1031
|
+
| `--feature-dir <path>` | Caminho `docs/features/<slug>` para anexar `spec.md`/`plan.md` (sobrescreve a resolução automática). |
|
|
1032
|
+
| `--dry-run` | Monta o contexto e imprime o comando **sem executar** e **sem escrever nada no GitHub**. |
|
|
1033
|
+
|
|
1034
|
+
**Pré-requisitos:** `.spec-wave.json` presente (senão → skill **setup**) e a issue ser Feature, Story ou Task. Para executar de fato, o spec-kit precisa estar configurado em `specKit.command` (no `.spec-wave.json`) ou na env `SPEC_WAVE_IMPLEMENT_CMD`.
|
|
699
1035
|
|
|
700
|
-
|
|
1036
|
+
#### Como o comando se comporta por tipo
|
|
701
1037
|
|
|
702
|
-
|
|
1038
|
+
| Tipo | Comportamento |
|
|
1039
|
+
|------|---------------|
|
|
1040
|
+
| **Feature** | Lista as Stories (sub-issues), **ordena topologicamente** pelas dependências, **pula as já em 👀 Code Review ou além** (listadas no contexto como "não tocar") e monta **um único** contexto com todas as pendentes, cada uma com suas Tasks. Aciona o spec-kit **uma vez**. |
|
|
1041
|
+
| **Story** | Coleta todas as Tasks (sub-issues) e aciona o spec-kit uma única vez. |
|
|
1042
|
+
| **Task** | Só aquela task. |
|
|
703
1043
|
|
|
704
|
-
**
|
|
1044
|
+
**Abortos no modo Feature:** ciclo de dependências entre Stories pendentes → **exit 1** (corrija as linhas `Depende de:`; veja a skill **order**). Story pendente **sem Tasks** → aborta pedindo decomposição. Todas implementadas → encerra sem acionar o spec-kit.
|
|
705
1045
|
|
|
706
|
-
**
|
|
707
|
-
|
|
708
|
-
|
|
1046
|
+
**Bug** → modo próprio (RFC-004): sem tasks e sem spec/plan, o contexto impõe quatro fases — reproduzir → causa raiz → fix mínimo → teste de regressão. O `bug.md`, quando existe, entra como **hipótese a confirmar** (foi escrito por IA sem executar código), não como fato. O Bug vai sozinho para 👀 Code Review ao abrir o PR: não arrasta a Feature-pai.
|
|
1047
|
+
|
|
1048
|
+
Outros tipos (Spike, Epic) → o comando **recusa**.
|
|
1049
|
+
|
|
1050
|
+
#### Passos
|
|
1051
|
+
|
|
1052
|
+
1. Confirme que há `.spec-wave.json` no repo.
|
|
1053
|
+
|
|
1054
|
+
2. **Sempre comece com `--dry-run`:**
|
|
709
1055
|
```bash
|
|
710
1056
|
npx @spec-wave/cli@latest implement <número> --dry-run
|
|
711
1057
|
```
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
1058
|
+
Inspecione: detecção do tipo, Tasks coletadas (Story) ou ordem/puladas/ciclos (Feature), e o comando do spec-kit que seria executado.
|
|
1059
|
+
|
|
1060
|
+
3. Mostre ao usuário o contexto montado em `.spec-wave/implement-<número>.md`. Ele inclui os comentários da issue, um **digest do código recente**, um **aviso de dependências pendentes** quando aplicável, e as instruções de execução sequencial.
|
|
1061
|
+
|
|
1062
|
+
4. **Se o spec-kit estiver configurado** e o usuário aprovar, rode sem `--dry-run`:
|
|
715
1063
|
```bash
|
|
716
1064
|
npx @spec-wave/cli@latest implement <número>
|
|
717
1065
|
```
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
1066
|
+
Se **não** estiver configurado, o comando só monta o contexto e mostra como configurar. Ajude a definir o template — placeholders disponíveis: `{tasksFile} {specFile} {planFile} {issue} {type} {title}`.
|
|
1067
|
+
|
|
1068
|
+
Use `--feature-dir docs/features/<slug>` se a resolução automática falhar e você quiser anexar `spec.md`/`plan.md`.
|
|
1069
|
+
|
|
1070
|
+
5. **Se você (agente) for implementar diretamente**, siga o protocolo abaixo.
|
|
1071
|
+
|
|
1072
|
+
6. Ao final, confirme o resultado com o usuário e oriente a revisão dos PRs.
|
|
1073
|
+
|
|
1074
|
+
#### Protocolo de execução (obrigatório)
|
|
1075
|
+
|
|
1076
|
+
**Uma Task por vez.** Nunca deixe duas Tasks com Status "In Progress" ao mesmo tempo.
|
|
1077
|
+
|
|
1078
|
+
Para cada Task, **prefira os comandos da CLI a mutações GraphQL/`gh` manuais** — eles embutem as regras do board (Etapa nunca retrocede; uma Task In Progress por vez):
|
|
1079
|
+
|
|
1080
|
+
```bash
|
|
1081
|
+
npx @spec-wave/cli@latest task start <n> # Etapa 🚧 Desenvolvimento + Status In Progress
|
|
1082
|
+
# ... implementa ...
|
|
1083
|
+
npx @spec-wave/cli@latest task done <n> # Etapa 🎉 Done + Status Done
|
|
1084
|
+
```
|
|
1085
|
+
|
|
1086
|
+
**Ao concluir toda a Story:** faça o commit, abra o PR e mova a Story:
|
|
1087
|
+
|
|
1088
|
+
```bash
|
|
1089
|
+
npx @spec-wave/cli@latest story review <n> # Etapa 👀 Code Review, Status Todo
|
|
1090
|
+
```
|
|
1091
|
+
|
|
1092
|
+
**A Feature só avança** para 👀 Code Review quando **TODAS** as suas Stories já estiverem lá. Enquanto houver Story pendente, deixe a Feature em 🚧 Desenvolvimento. No modo Feature isso acontece dentro da mesma execução.
|
|
1093
|
+
|
|
1094
|
+
**No modo Feature**, siga o contexto Story a Story, **na ordem listada**: implemente as Tasks, depois commit + PR + `story review`; só então passe à próxima Story.
|
|
1095
|
+
|
|
1096
|
+
> **Aviso de dependência pendente** no contexto (a issue depende de outra não concluída, via `Depende de: #N` ou *blocked by*) → **confirme com o usuário** antes de seguir fora de ordem.
|
|
1097
|
+
|
|
1098
|
+
Lembre: a **Etapa só avança**, nunca volta; o **Status** mede o progresso dentro da etapa.
|
|
1099
|
+
|
|
1100
|
+
#### Quando não dá para implementar
|
|
1101
|
+
|
|
1102
|
+
| Situação | Saída |
|
|
1103
|
+
|----------|-------|
|
|
1104
|
+
| Feature **sem Stories** | Rode a skill **decompose** primeiro |
|
|
1105
|
+
| **Ciclo de dependências** | Corrija as linhas `Depende de:` — veja a skill **order** |
|
|
1106
|
+
| Issue é Spike/Epic | O comando recusa; use a skill **move** para mexer no board |
|
|
1107
|
+
| Bug sem `bug.md` | Segue assim mesmo, com aviso — a investigação inteira fica com o executor. Para gerar o documento antes, use a skill **bug**. |
|
|
1108
|
+
|
|
1109
|
+
---
|
|
1110
|
+
|
|
1111
|
+
### `/spec-wave qa` — etapa 🧪 QA
|
|
1112
|
+
|
|
1113
|
+
> **Quando usar:** Use para a etapa 🧪 QA do spec-wave — gerar o plano de QA de uma Feature (label spec-wave:qa → qa-plan.md), revisá-lo, e EXECUTAR os cenários localmente com `spec-wave qa <issue>` (Feature, Story ou Bug). Verde move o board sozinho; vermelho abre um Bug por cenário reprovado. Gatilhos: 'rodar o QA', 'validar a feature 12', 'gerar o plano de QA', 'testar a story 34', 're-testar o cenário 2'.
|
|
1114
|
+
|
|
1115
|
+
Duas metades, em ordem obrigatória:
|
|
1116
|
+
|
|
1117
|
+
1. **Gerar o plano** (label + Action): `spec-wave:qa` na **Feature** → o Action gera `docs/features/<slug>/qa-plan.md`, valida, critica e aplica `spec-wave:qa-ready`.
|
|
1118
|
+
2. **Executar** (sempre local): `npx @spec-wave/cli@latest qa <issue>` roda os cenários contra o checkout e emite o veredito.
|
|
1119
|
+
|
|
1120
|
+
**Nunca rode o `qa` sem a `spec-wave:qa-ready` na Feature** — o comando recusa, e o motivo é de desenho (D-QA3/D-QA4): o veredito **verde avança a Etapa sozinho, sem confirmação humana**, então o portão humano é a **revisão do plano**, antes de executar.
|
|
1121
|
+
|
|
1122
|
+
#### 0. Detecção de configuração (antes de qualquer coisa)
|
|
1123
|
+
|
|
1124
|
+
Confirme que existe `.spec-wave.json` no repositório (senão → skill **setup**). Para executar de fato, o comando do executor precisa estar em `qa.command` no `.spec-wave.json` (ou na env `SPEC_WAVE_QA_CMD`, que tem precedência):
|
|
1125
|
+
|
|
1126
|
+
```json
|
|
1127
|
+
{
|
|
1128
|
+
"qa": {
|
|
1129
|
+
"command": "claude -p \"Execute o QA descrito em {contextFile}\"",
|
|
1130
|
+
"setup": "npm ci && npm run build",
|
|
1131
|
+
"env": { "BASE_URL": "http://localhost:3000" },
|
|
1132
|
+
"defaultBugPriority": "P2"
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
```
|
|
1136
|
+
|
|
1137
|
+
Placeholders: `{contextFile} {qaPlanFile} {specFile} {issue} {type} {title}`. Sem `qa.command`, o comando monta o contexto, imprime como configurar e **não executa** — não é erro.
|
|
1138
|
+
|
|
1139
|
+
#### 1. Gerar o plano (Feature)
|
|
1140
|
+
|
|
1141
|
+
```bash
|
|
1142
|
+
gh issue edit <feature> --add-label "spec-wave:qa"
|
|
1143
|
+
```
|
|
1144
|
+
|
|
1145
|
+
- **Só em Feature** (D-QA1: o plano é por Feature, arquivo único, seções `## Cenário N — Story #X`). Numa Story o Action comenta apontando a Feature-pai; num Bug, não se aplica (ver §5).
|
|
1146
|
+
- Arquivo **ausente** → gera via IA e publica em Pull Request. Arquivo **presente** → valida + critica **COMO ESTÁ** (edições manuais são preservadas — mesma semântica do decompose). Para regerar do zero: apague o arquivo e reaplique a label.
|
|
1147
|
+
- Requer `spec.md` e `plan.md` já na base.
|
|
1148
|
+
- Desfechos: limpo → `spec-wave:qa-ready` + comentário com o resumo; grave → `spec-wave:critique-failed`; reprovas repetidas → `spec-wave:needs-human`.
|
|
1149
|
+
|
|
1150
|
+
#### 2. Revisar e editar o qa-plan.md (o portão humano)
|
|
1151
|
+
|
|
1152
|
+
Leia o plano com o usuário ANTES de executar. Regras do arquivo:
|
|
1153
|
+
|
|
1154
|
+
- A estrutura é só `## Cenário N — Story #X`; o corpo aceita markdown livre.
|
|
1155
|
+
- **A posição manda, não o número escrito** — inserir um cenário no meio sem renumerar funciona.
|
|
1156
|
+
- `Story #X` é obrigatório e precisa ser sub-issue da Feature.
|
|
1157
|
+
- `**Critério:**` e `**Esperado:**` são obrigatórios; `**Pré-condições:**` e `**Passos:**` opcionais.
|
|
1158
|
+
- Depois de editar, reaplique `spec-wave:qa` para uma nova crítica (o arquivo NÃO é regerado).
|
|
1159
|
+
|
|
1160
|
+
> ⚠️ O slug vem do **título** da Feature. Renomeá-la depois da geração órfã o arquivo — o comando falha citando o slug órfão.
|
|
1161
|
+
|
|
1162
|
+
#### 3. Executar — SEMPRE `--dry-run` primeiro
|
|
1163
|
+
|
|
1164
|
+
```bash
|
|
1165
|
+
npx @spec-wave/cli@latest qa <issue> --dry-run # mostra cenários-alvo e o comando; ZERO escrita no GitHub
|
|
1166
|
+
npx @spec-wave/cli@latest qa <issue> # executa de fato
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
Mostre ao usuário o contexto montado em `.spec-wave/qa-<n>.md` antes de rodar sem `--dry-run`.
|
|
1170
|
+
|
|
1171
|
+
Alvos: `qa <feature>` roda todos os cenários das Stories ainda sem `qa-approved`; `qa <story>` só os daquela Story; `qa <bug>` o Teste de Regressão do `bug.md`; `--only <n[,m]>` filtra por número posicional.
|
|
1172
|
+
|
|
1173
|
+
**PROIBIDO corrigir código durante a execução.** QA não conserta: cenário reprovado vira Bug, e alterar o código no meio invalida o veredito. Se você for o executor (via `qa.command`), siga a skill **qa-executor** e as instruções do contexto à risca — um cenário por vez, evidência bruta, `blocked` (nunca `fail`) com o `blockedReason` do enum para o que não pôde rodar.
|
|
1174
|
+
|
|
1175
|
+
Para validar uma **trilha inteira** (todas as Features de um milestone, em containers paralelos), use a skill **qa-lead** — o `qa` continua sendo a unidade que ela orquestra.
|
|
1176
|
+
|
|
1177
|
+
#### 4. Os três desfechos
|
|
1178
|
+
|
|
1179
|
+
| Veredito | O que aconteceu | O que fazer |
|
|
1180
|
+
|---|---|---|
|
|
1181
|
+
| ✅ **verde** (todos pass) | `qa-approved` aplicada; Story → 📋 Homologação; Feature move quando TODAS as Stories liberarem; Bug → 🚀 Deploy | Nada — o board já andou. Se a Story tinha **Bug filho aberto**, ela NÃO avança (guarda dura): feche o Bug primeiro. |
|
|
1182
|
+
| ❌ **vermelho** (algum fail) | 1 Bug por cenário reprovado (filho da Story dona, ✅ Ready, `bug.md` commitado, `bug-approved` aplicada); item fica em 🧪 QA; exit 1 | Corrija os Bugs (skill **implement**) e re-teste (§6). |
|
|
1183
|
+
| ⚪ **inconclusivo** (blocked, sem fail) | Ambiente quebrado não é defeito: nada move, nenhum Bug; exit 1 | Destrave o ambiente (seed, serviço fora do ar) e rode de novo. |
|
|
1184
|
+
|
|
1185
|
+
#### 5. Bug — exceção documentada (§2.1 da spec)
|
|
1186
|
+
|
|
1187
|
+
O QA de um **Bug** usa a seção `Teste de Regressão` do próprio `bug.md` (não há qa-plan). Verde move o Bug para **🚀 Deploy** (D-QA6 — Bug não passa por Homologação).
|
|
1188
|
+
|
|
1189
|
+
E quando um cenário reprova, o `bug.md` do Bug novo **é escrito pelo comando, sem IA e sem a label `spec-wave:bug`** — exceção explícita à regra "nunca escreva o bug.md à mão": a reprodução, o esperado/obtido e o teste de regressão já existem e são determinísticos (são o cenário + a saída real). O arquivo é commitado e a `spec-wave:bug-approved` aplicada pelo próprio comando. **Não** aplique `spec-wave:bug` nesses Bugs — regeraria por IA um documento que registra uma execução observada.
|
|
1190
|
+
|
|
1191
|
+
#### 6. Ciclo de re-teste
|
|
1192
|
+
|
|
1193
|
+
1. Fix do Bug (skill **implement**, PR, merge).
|
|
1194
|
+
2. Re-teste só o cenário: `npx @spec-wave/cli@latest qa <story> --only <cenário>`.
|
|
1195
|
+
3. O comando NÃO duplica Bug: se o cenário reprovar de novo, ele comenta no Bug existente (marcador `spec-wave:qa-origin`).
|
|
1196
|
+
4. Verde com o Bug ainda aberto não avança a Story — feche o Bug (o fix mergeado + regressão verde justificam) e rode o `qa` de novo.
|
|
1197
|
+
|
|
1198
|
+
#### Recusas que você vai encontrar (e o que significam)
|
|
1199
|
+
|
|
1200
|
+
- Sem `.spec-wave.json` → rode a skill **setup**.
|
|
1201
|
+
- `spec-wave:qa` ainda na issue → geração em voo; aguarde o Action.
|
|
1202
|
+
- `critique-failed`/`needs-human` → portão humano da crítica; corrija o documento apontado.
|
|
1203
|
+
- Feature sem `qa-ready` → gere/critique o plano primeiro (§1).
|
|
1204
|
+
- Etapa **anterior** a 🧪 QA → o `qa` não promove item; quem move até QA é o merge (`spec-wave merge` / `run --pr`).
|
|
1205
|
+
- Etapa **posterior** → informa e sai 0 (a Etapa nunca retrocede).
|
|
1206
|
+
- Nenhum cenário casando com a Story → plano desatualizado (re-decompose criou Stories novas) ou Feature renomeada (slug órfão).
|
|
722
1207
|
|
|
723
1208
|
---
|
|
724
1209
|
|
|
725
|
-
### `/spec-wave
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
**
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
1210
|
+
### `/spec-wave bug` — o documento do defeito
|
|
1211
|
+
|
|
1212
|
+
> **Quando usar:** Use para gerar o bug.md de um defeito do spec-wave — reprodução, causa raiz, escopo do fix e teste de regressão. Aplica a label spec-wave:bug e deixa o GitHub Action gerar o arquivo em docs/bugs/<slug>/ e abrir um Pull Request. Gatilhos: 'gerar o bug.md da issue 42', 'documentar a causa raiz do bug', 'rodar o spec-wave:bug'. Só vale para issues do tipo Bug — Feature usa spec/plan.
|
|
1213
|
+
|
|
1214
|
+
> **Regra fundamental: nunca escreva o `bug.md` você mesmo.** Aplique a label e deixe o Action gerar — é isso que garante que o arquivo chegue à main por Pull Request e seja referenciado na issue. Exceção: revisar/melhorar um `bug.md` já gerado (aí sim use Edit no arquivo local).
|
|
1215
|
+
|
|
1216
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
1217
|
+
|
|
1218
|
+
#### Por que existe
|
|
1219
|
+
|
|
1220
|
+
Um Bug **não** gera `spec.md` + `plan.md`. Esses documentos pedem visão geral funcional, critérios de aceite, requisitos não-funcionais e plano de rollback — peso desproporcional para um defeito.
|
|
1221
|
+
|
|
1222
|
+
O `bug.md` tem seis seções e uma finalidade: permitir que outra pessoa (ou o dev-agent) **reproduza, entenda e corrija** o defeito, com prova de que corrigiu.
|
|
1223
|
+
|
|
1224
|
+
#### Passos
|
|
1225
|
+
|
|
1226
|
+
1. **Confirme que a issue é do tipo Bug.**
|
|
1227
|
+
|
|
1228
|
+
> **Apenas Bug.** Para qualquer outro tipo o Action **pula** a geração, remove a label e comenta.
|
|
1229
|
+
|
|
1230
|
+
2. Adicione a label de gatilho:
|
|
742
1231
|
```bash
|
|
743
|
-
gh issue
|
|
1232
|
+
gh issue edit <número> --add-label "spec-wave:bug"
|
|
744
1233
|
```
|
|
745
1234
|
|
|
746
|
-
|
|
1235
|
+
3. Informe ao usuário: "Label `spec-wave:bug` adicionada. O Action `generate-bug.yml` vai gerar o `bug.md` automaticamente. Acompanhe em Actions → Generate Bug."
|
|
747
1236
|
|
|
748
|
-
|
|
1237
|
+
4. Quando concluir, ofereça revisar `docs/bugs/<slug>/bug.md`. O slug vem do título: `[BUG] Duplicidade de pedidos no PIX` → `duplicidade-de-pedidos-no-pix`.
|
|
749
1238
|
|
|
750
|
-
|
|
1239
|
+
Concentre a revisão em **duas seções**: **Causa Raiz** e **Teste de Regressão**. São elas que decidem se a correção ataca o defeito ou o sintoma — o resto do documento é contexto.
|
|
751
1240
|
|
|
752
|
-
|
|
1241
|
+
5. **Validar:** aplique `spec-wave:ready`. O Action confere as seis seções obrigatórias e aplica `spec-wave:bug-approved`.
|
|
753
1242
|
|
|
754
|
-
|
|
1243
|
+
#### Quando é obrigatório
|
|
755
1244
|
|
|
756
|
-
|
|
1245
|
+
| Severidade | `bug.md` |
|
|
1246
|
+
|---|---|
|
|
1247
|
+
| **P0** | Opcional — o fix não espera documento. Documente depois, se valer. |
|
|
1248
|
+
| **P1** | Recomendado. |
|
|
1249
|
+
| **P2 / P3** | **Obrigatório** antes de o bug entrar na fila técnica (✅ Ready). |
|
|
757
1250
|
|
|
758
|
-
|
|
759
|
-
2. `gh issue edit <n> --add-label "spec-wave:bug"`
|
|
760
|
-
3. Avise: o Action `generate-bug.yml` gera o arquivo e abre um Pull Request com ele.
|
|
761
|
-
4. Ofereça revisar **duas seções**: **Causa Raiz** e **Teste de Regressão**. São elas que decidem se a correção ataca o defeito ou o sintoma.
|
|
762
|
-
5. Validar: `spec-wave:ready` → confere as seis seções e aplica `spec-wave:bug-approved`.
|
|
1251
|
+
#### As seis seções
|
|
763
1252
|
|
|
764
|
-
**Seções obrigatórias** (o validador as compara byte a byte — não renomeie ao editar):
|
|
765
1253
|
`Reprodução` · `Esperado e Obtido` · `Impacto e Severidade` · `Causa Raiz` · `Escopo do Fix` · `Teste de Regressão`
|
|
766
1254
|
|
|
767
|
-
|
|
1255
|
+
O validador procura estes títulos byte a byte — se alguém renomear uma seção ao editar o arquivo, o `spec-wave:ready` reprova.
|
|
768
1256
|
|
|
769
|
-
|
|
1257
|
+
#### Se falhar
|
|
770
1258
|
|
|
771
|
-
|
|
1259
|
+
- **Comentário 🔎 de crítica com `spec-wave:critique-failed`** → a crítica adversarial achou problema grave. Os três alvos mais comuns: a causa raiz não explica todos os sintomas relatados; o escopo do fix é maior que a causa (refatoração pegando carona); o teste de regressão passaria mesmo sem o fix. Corrija o `bug.md`, commite, remova a label e reaplique `spec-wave:bug`.
|
|
1260
|
+
- **`spec-wave:needs-human`** → a crítica reprovou N vezes seguidas e o fluxo está **parado**. Uma pessoa precisa revisar e remover a label.
|
|
1261
|
+
- **Relato insuficiente** → o `bug.md` sai com "Causa raiz não determinada" e uma lista de hipóteses. Isso é comportamento correto, não falha: leve as perguntas a quem reportou, acrescente as respostas como comentário na issue e reaplique `spec-wave:bug` — os comentários entram no próximo payload.
|
|
1262
|
+
- Para reprocessar num modelo mais forte só nesta issue, aplique também `spec-wave:model:<apelido>` (o apelido precisa existir em `ai.modelAliases`).
|
|
772
1263
|
|
|
773
1264
|
---
|
|
774
1265
|
|
|
775
|
-
### `/spec-wave triage
|
|
1266
|
+
### `/spec-wave triage` — o desfecho da triagem
|
|
776
1267
|
|
|
777
|
-
|
|
1268
|
+
> **Quando usar:** Use para dar o desfecho da triagem de um Bug do spec-wave: aceitar para a fila técnica, rejeitar, ou marcar como duplicata. Gatilhos: 'aceitar o bug 42', 'rejeitar esse bug', 'marcar como duplicata da 17', 'triar os bugs'. Só vale para issues do tipo Bug.
|
|
1269
|
+
|
|
1270
|
+
A triagem decide **uma** coisa: isto vira trabalho, e com que urgência? Daí as três saídas — e nenhuma delas ser "editar". Corrigir o relato é conversa na issue.
|
|
778
1271
|
|
|
779
1272
|
```bash
|
|
780
1273
|
npx @spec-wave/cli@latest triage accept 42
|
|
781
|
-
npx @spec-wave/cli@latest triage accept 42 --severity P1
|
|
782
|
-
npx @spec-wave/cli@latest triage reject 42 --reason "comportamento esperado"
|
|
1274
|
+
npx @spec-wave/cli@latest triage accept 42 --severity P1
|
|
1275
|
+
npx @spec-wave/cli@latest triage reject 42 --reason "comportamento esperado, documentado em X"
|
|
783
1276
|
npx @spec-wave/cli@latest triage duplicate 42 --of 17
|
|
784
1277
|
```
|
|
785
1278
|
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
1279
|
+
| Ação | Efeito |
|
|
1280
|
+
|---|---|
|
|
1281
|
+
| `accept` | → **✅ Ready** (fila técnica), label `spec-wave:triaged`. `--severity` reclassifica **trocando** a label, nunca acumulando. |
|
|
1282
|
+
| `reject` | Fecha a issue com `spec-wave:wont-fix`. **`--reason` é obrigatório.** |
|
|
1283
|
+
| `duplicate` | Fecha com `spec-wave:duplicate` e comenta **nas duas** issues. **`--of` é obrigatório.** |
|
|
1284
|
+
|
|
1285
|
+
> `reject` e `duplicate` **não mexem na Etapa**. Ela nunca retrocede, e um bug rejeitado não avançou para lugar nenhum — quem o tira das filas é o estado `closed` da issue.
|
|
1286
|
+
|
|
1287
|
+
#### O portão de aceite
|
|
1288
|
+
|
|
1289
|
+
| Severidade | Exige `bug.md` validado? |
|
|
1290
|
+
|---|---|
|
|
1291
|
+
| **P0 / P1** | Não — esperar o documento custa mais que investigar durante a correção. |
|
|
1292
|
+
| **P2 / P3** | **Sim** (`spec-wave:bug-approved`). Um bug sem causa raiz investigada empurra a investigação para o dev, e é aí que "corrigir o sintoma" acontece. |
|
|
1293
|
+
|
|
1294
|
+
`spec-wave:critique-failed` e `spec-wave:needs-human` bloqueiam **qualquer** severidade, P0 inclusive: aceitar um bug cujo documento foi reprovado é exatamente o que o portão existe para evitar.
|
|
789
1295
|
|
|
790
|
-
|
|
1296
|
+
#### Se o aceite for recusado
|
|
791
1297
|
|
|
792
|
-
|
|
1298
|
+
O comando diz qual portão barrou. Os caminhos:
|
|
1299
|
+
|
|
1300
|
+
- **Falta o `bug.md`** → skill **bug** (aplica `spec-wave:bug`), depois `spec-wave:ready` para validar. Ou `--severity P1`, se for de fato urgente — mas isso é reclassificar o defeito, não contornar o portão.
|
|
1301
|
+
- **`spec-wave:critique-failed`** → corrija o `bug.md`, commite, remova a label.
|
|
1302
|
+
- **`spec-wave:needs-human`** → uma pessoa precisa revisar antes de remover.
|
|
1303
|
+
|
|
1304
|
+
#### Criar um Bug
|
|
1305
|
+
|
|
1306
|
+
```bash
|
|
1307
|
+
npx @spec-wave/cli@latest bug --title "Duplicidade de pedidos no PIX" --parent 17 --priority P2
|
|
1308
|
+
```
|
|
1309
|
+
|
|
1310
|
+
Nasce em **🐞 Triagem** — ou direto em **✅ Ready** se for **P0**.
|
|
793
1311
|
|
|
794
1312
|
---
|
|
795
1313
|
|
|
796
|
-
### `/spec-wave
|
|
1314
|
+
### `/spec-wave rfc` — documento de processo
|
|
797
1315
|
|
|
798
|
-
|
|
1316
|
+
> **Quando usar:** Use para escrever um documento RFC de processo seguindo a estrutura do RFC-001 do spec-wave e registrá-lo como issue no board. Gatilhos: 'escrever um RFC', 'documentar esse processo como RFC', 'criar um RFC sobre X'. RFC não usa spec nem plan — depois de escrito, ele decompõe direto em Tasks (skill decompose).
|
|
799
1317
|
|
|
800
|
-
|
|
1318
|
+
RFCs são escritos em **português do Brasil** e vivem em `rfc/`.
|
|
801
1319
|
|
|
802
|
-
**
|
|
1320
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**. Se já existirem RFCs em `rfc/`, leia um deles antes de escrever — o estilo da equipe vence este template.
|
|
803
1321
|
|
|
804
|
-
|
|
805
|
-
- Leia `.spec-wave.json` para obter `owner` e `repo`.
|
|
806
|
-
- Confirme o número do PR com o usuário se não vier como argumento.
|
|
1322
|
+
#### Passos
|
|
807
1323
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
1324
|
+
1. **Entreviste o usuário** sobre: objetivo, problema atual, solução proposta, princípios, stakeholders afetados. Não invente contexto organizacional.
|
|
1325
|
+
|
|
1326
|
+
2. **Escreva o RFC** com estas seções:
|
|
1327
|
+
|
|
1328
|
+
1. Objetivo
|
|
1329
|
+
2. Princípios
|
|
1330
|
+
3. Papéis e Responsabilidades
|
|
1331
|
+
4. Estrutura de Trabalho
|
|
1332
|
+
5. Fluxo de Trabalho
|
|
1333
|
+
6. Automação
|
|
1334
|
+
7. Métricas
|
|
1335
|
+
8. Riscos e Mitigações
|
|
817
1336
|
|
|
818
|
-
3. **
|
|
1337
|
+
3. **Salve** com Write em `rfc/rfc-<slug-do-tópico>.md`.
|
|
1338
|
+
|
|
1339
|
+
4. **Crie a issue de RFC no board** — use a CLI, não `gh issue create` (que não adiciona ao Project):
|
|
819
1340
|
```bash
|
|
820
|
-
|
|
1341
|
+
npx @spec-wave/cli@latest issue --type rfc \
|
|
1342
|
+
--title "<título sem prefixo>" \
|
|
1343
|
+
--body "<resumo + link para rfc/rfc-<slug>.md>"
|
|
821
1344
|
```
|
|
1345
|
+
A issue nasce em **📥 Backlog**.
|
|
822
1346
|
|
|
823
|
-
|
|
1347
|
+
5. **Próximo passo:** um RFC **não** usa `spec.md` nem `plan.md`. Quando a descrição estiver completa, ele decompõe **direto em Tasks** — use a skill **decompose**, que grava o rascunho em `docs/rfcs/<slug>/decomposition.md`.
|
|
824
1348
|
|
|
825
|
-
|
|
826
|
-
|-----------|----------------|
|
|
827
|
-
| **Segurança** | Credenciais hardcoded, secrets/API keys expostas, configs inseguras, injeção SQL/XSS |
|
|
828
|
-
| **Arquitetura** | Dependências circulares, exports faltando, wiring incompleto, violações de camada |
|
|
829
|
-
| **Infraestrutura** | OIDC mal configurado, IAM permissivo demais, Dockerfile sem usuário não-root, state remoto ausente |
|
|
830
|
-
| **Qualidade** | sync-over-async, validação ausente, operações não idempotentes, error handling ausente |
|
|
1349
|
+
#### Cuidados
|
|
831
1350
|
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
Agent(caveman:cavecrew-reviewer) → diff do PR + arquivos alterados
|
|
835
|
-
```
|
|
1351
|
+
- Peça confirmação do rascunho antes de gravar: o usuário conhece papéis, times e restrições que o repositório não revela.
|
|
1352
|
+
- Se o repositório já tiver um RFC sobre o mesmo assunto, proponha **emendar** o existente em vez de criar um concorrente.
|
|
836
1353
|
|
|
837
|
-
|
|
838
|
-
a. Leia o(s) arquivo(s) afetado(s) com Read
|
|
839
|
-
b. Aplique o fix com Edit
|
|
840
|
-
c. Faça commit separado:
|
|
841
|
-
```bash
|
|
842
|
-
git add <arquivo>
|
|
843
|
-
git commit -m "fix: <problema> (issue #<N>)
|
|
1354
|
+
---
|
|
844
1355
|
|
|
845
|
-
|
|
1356
|
+
### `/spec-wave fix-pr` — auditoria e correção de PR
|
|
846
1357
|
|
|
847
|
-
|
|
848
|
-
```
|
|
849
|
-
d. Push ao branch do PR:
|
|
850
|
-
```bash
|
|
851
|
-
git push
|
|
852
|
-
```
|
|
1358
|
+
> **Quando usar:** Use para auditar um Pull Request e corrigir os problemas encontrados — segurança, arquitetura, infraestrutura e qualidade — gerando um commit separado por fix, respondendo cada review comment com o hash do commit e postando um sumário no PR. Gatilhos: 'auditar o PR 42', 'corrigir os comentários de review', 'fix-pr 42', 'resolver os apontamentos do PR'.
|
|
853
1359
|
|
|
854
|
-
|
|
855
|
-
```bash
|
|
856
|
-
gh api repos/<owner>/<repo>/pulls/<número>/comments/<comment-id>/replies \
|
|
857
|
-
-f body="✅ **FIXED** — commit **<HASH>**
|
|
1360
|
+
Cada fix vira um **commit separado** no branch do PR. Cada review comment recebe uma **resposta com o hash do commit**.
|
|
858
1361
|
|
|
859
|
-
|
|
860
|
-
<trecho corrigido>
|
|
861
|
-
\`\`\`
|
|
1362
|
+
**Pré-requisitos:** `.spec-wave.json` deve existir (para resolver `owner/repo`). Token com permissão de push no branch do PR.
|
|
862
1363
|
|
|
863
|
-
|
|
864
|
-
|
|
1364
|
+
#### Passos
|
|
1365
|
+
|
|
1366
|
+
##### 1. Resolver contexto
|
|
1367
|
+
|
|
1368
|
+
Leia `.spec-wave.json` para obter `owner` e `repo`. Confirme o número do PR com o usuário se não vier como argumento.
|
|
1369
|
+
|
|
1370
|
+
##### 2. Coletar dados do PR
|
|
865
1371
|
|
|
866
|
-
|
|
1372
|
+
```bash
|
|
1373
|
+
gh pr view <número> --json number,title,headRefName,body,changedFiles
|
|
1374
|
+
gh pr diff <número>
|
|
1375
|
+
gh api repos/<owner>/<repo>/pulls/<número>/comments
|
|
1376
|
+
gh api repos/<owner>/<repo>/pulls/<número>/reviews
|
|
1377
|
+
```
|
|
1378
|
+
|
|
1379
|
+
Liste todos os arquivos alterados e colete os review comments (inline) e reviews gerais.
|
|
1380
|
+
|
|
1381
|
+
##### 3. Checkout do branch
|
|
1382
|
+
|
|
1383
|
+
```bash
|
|
1384
|
+
gh pr checkout <número>
|
|
1385
|
+
```
|
|
1386
|
+
|
|
1387
|
+
##### 4. Varredura de problemas
|
|
1388
|
+
|
|
1389
|
+
Para cada categoria, leia os arquivos alterados e identifique issues:
|
|
1390
|
+
|
|
1391
|
+
| Categoria | O que procurar |
|
|
1392
|
+
|-----------|----------------|
|
|
1393
|
+
| **Segurança** | Credenciais hardcoded, secrets/API keys expostas, configs inseguras, injeção SQL/XSS |
|
|
1394
|
+
| **Arquitetura** | Dependências circulares, exports faltando, wiring incompleto, violações de camada |
|
|
1395
|
+
| **Infraestrutura** | OIDC mal configurado, IAM permissivo demais, Dockerfile sem usuário não-root, state remoto ausente |
|
|
1396
|
+
| **Qualidade** | sync-over-async, validação ausente, operações não idempotentes, error handling ausente |
|
|
1397
|
+
|
|
1398
|
+
Se não houver review comments manuais, use um agente de review para detecção automatizada sobre o diff + arquivos alterados.
|
|
1399
|
+
|
|
1400
|
+
##### 5. Corrigir, um commit por problema
|
|
1401
|
+
|
|
1402
|
+
Para cada problema: leia o arquivo (Read), aplique o fix (Edit), e commite isoladamente:
|
|
1403
|
+
|
|
1404
|
+
```bash
|
|
1405
|
+
git add <arquivo>
|
|
1406
|
+
git commit -m "fix: <problema> (issue #<N>)
|
|
1407
|
+
|
|
1408
|
+
<causa raiz>
|
|
1409
|
+
|
|
1410
|
+
Solution: <descrição do fix>"
|
|
1411
|
+
git push
|
|
1412
|
+
```
|
|
1413
|
+
|
|
1414
|
+
##### 6. Responder aos review comments
|
|
1415
|
+
|
|
1416
|
+
Para cada comment inline:
|
|
1417
|
+
|
|
1418
|
+
```bash
|
|
1419
|
+
gh api repos/<owner>/<repo>/pulls/<número>/comments/<comment-id>/replies \
|
|
1420
|
+
-f body="✅ **FIXED** — commit **<HASH>**
|
|
1421
|
+
|
|
1422
|
+
\`\`\`<linguagem>
|
|
1423
|
+
<trecho corrigido>
|
|
1424
|
+
\`\`\`
|
|
1425
|
+
|
|
1426
|
+
<explicação do fix>"
|
|
1427
|
+
```
|
|
1428
|
+
|
|
1429
|
+
##### 7. Sumário no PR
|
|
1430
|
+
|
|
1431
|
+
```bash
|
|
1432
|
+
gh pr comment <número> --body "<sumário>"
|
|
1433
|
+
```
|
|
1434
|
+
|
|
1435
|
+
Formato:
|
|
1436
|
+
|
|
1437
|
+
```markdown
|
|
1438
|
+
## 🔍 PR Audit — Spec Wave
|
|
1439
|
+
|
|
1440
|
+
### Problemas encontrados e corrigidos
|
|
1441
|
+
|
|
1442
|
+
| # | Severidade | Categoria | Problema | Commit |
|
|
1443
|
+
|---|-----------|-----------|---------|--------|
|
|
1444
|
+
| 1 | 🔴 Critical | Segurança | Credencial hardcoded em config.js | abc1234 |
|
|
1445
|
+
| 2 | 🟡 Medium | Qualidade | Operação não idempotente em createOrder | def5678 |
|
|
1446
|
+
|
|
1447
|
+
### Commits criados
|
|
1448
|
+
- `abc1234` fix: credencial hardcoded removida (issue #1)
|
|
1449
|
+
- `def5678` fix: idempotency key adicionada em createOrder (issue #2)
|
|
1450
|
+
|
|
1451
|
+
**Total:** <N> problema(s) encontrado(s) e corrigido(s).
|
|
1452
|
+
```
|
|
1453
|
+
|
|
1454
|
+
#### Severidade
|
|
1455
|
+
|
|
1456
|
+
| Nível | Critério |
|
|
1457
|
+
|-------|----------|
|
|
1458
|
+
| 🔴 Critical | Segurança, dados expostos, falha em produção |
|
|
1459
|
+
| 🟠 High | Bug que afeta usuários, arquitetura quebrada |
|
|
1460
|
+
| 🟡 Medium | Qualidade, manutenibilidade, performance |
|
|
1461
|
+
| 🔵 Low | Estilo, naming, comentários |
|
|
1462
|
+
|
|
1463
|
+
#### Output esperado
|
|
1464
|
+
|
|
1465
|
+
- Lista de issues (severidade + impacto)
|
|
1466
|
+
- Lista de commits criados (hash + mensagem)
|
|
1467
|
+
- Confirmação das replies postadas nos review comments
|
|
1468
|
+
- Estado final do PR
|
|
1469
|
+
|
|
1470
|
+
> Reporte fielmente: se um problema foi encontrado mas **não** corrigido (fora de escopo, exige decisão do usuário), diga isso explicitamente no sumário em vez de omitir.
|
|
1471
|
+
|
|
1472
|
+
---
|
|
1473
|
+
|
|
1474
|
+
### `/spec-wave uninstall` — remove a configuração
|
|
1475
|
+
|
|
1476
|
+
> **Quando usar:** Use quando o usuário quiser remover a configuração do spec-wave de um repositório: labels, arquivos .github (workflows e issue templates) e o .spec-wave.json. Gatilhos: 'remover o spec-wave', 'desinstalar spec-wave deste repo', 'limpar as labels do spec-wave'. O GitHub Project NUNCA é apagado — o usuário decide isso à mão.
|
|
1477
|
+
|
|
1478
|
+
Remove labels + arquivos `.github` + `.spec-wave.json`. **NUNCA apaga o GitHub Project** — isso preserva o histórico do board de propósito.
|
|
1479
|
+
|
|
1480
|
+
| Flag | Descrição |
|
|
1481
|
+
|------|-----------|
|
|
1482
|
+
| `--repo <owner/repo>` | Repositório. Default: lê do `.spec-wave.json`. |
|
|
1483
|
+
| `--skip-labels` | Não remove as labels. |
|
|
1484
|
+
| `--skip-files` | Não remove os arquivos `.github`. |
|
|
1485
|
+
| `--keep-config` | Mantém o `.spec-wave.json` local. |
|
|
1486
|
+
| `--dry-run` | Mostra o que seria removido sem alterar nada. |
|
|
1487
|
+
| `--yes` | Não pede confirmação. |
|
|
1488
|
+
|
|
1489
|
+
#### Passos
|
|
1490
|
+
|
|
1491
|
+
1. **Confirme com o usuário.** A ação remove labels e faz **commits removendo os workflows** do repositório remoto. Deixe claro que issues e o Project permanecem.
|
|
1492
|
+
|
|
1493
|
+
2. **Mostre antes o que será removido:**
|
|
867
1494
|
```bash
|
|
868
|
-
|
|
1495
|
+
npx @spec-wave/cli@latest uninstall --dry-run
|
|
869
1496
|
```
|
|
870
|
-
|
|
1497
|
+
|
|
1498
|
+
3. Execute:
|
|
1499
|
+
```bash
|
|
1500
|
+
npx @spec-wave/cli@latest uninstall
|
|
871
1501
|
```
|
|
872
|
-
|
|
1502
|
+
A CLI pede confirmação própria. Use `--yes` **apenas** se o usuário já confirmou explicitamente.
|
|
873
1503
|
|
|
874
|
-
|
|
1504
|
+
4. **Lembre o usuário** de excluir o **GitHub Project** manualmente, se desejar — a CLI não o apaga.
|
|
875
1505
|
|
|
876
|
-
|
|
877
|
-
|---|-----------|-----------|---------|--------|
|
|
878
|
-
| 1 | 🔴 Critical | Segurança | Credencial hardcoded em config.js | abc1234 |
|
|
879
|
-
| 2 | 🟡 Medium | Qualidade | Operação não idempotente em createOrder | def5678 |
|
|
1506
|
+
#### Observações
|
|
880
1507
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
1508
|
+
- Remover as labels não desfaz o histórico das issues; elas continuam no board com suas Etapas.
|
|
1509
|
+
- Os documentos gerados em `docs/features/` e `docs/rfcs/` **não** são removidos.
|
|
1510
|
+
- Para apenas atualizar uma instalação existente (em vez de removê-la), use a skill **update**.
|
|
884
1511
|
|
|
885
|
-
|
|
1512
|
+
---
|
|
1513
|
+
|
|
1514
|
+
### Outras skills (fluxos e utilitários)
|
|
1515
|
+
|
|
1516
|
+
Cada uma existe como skill dedicada do plugin (`/spec-wave:<nome>`) — e os
|
|
1517
|
+
utilitários de board estão flag a flag na *Referência da CLI* acima. Rode
|
|
1518
|
+
`npx @spec-wave/cli@latest <comando> --help` para os parâmetros.
|
|
1519
|
+
|
|
1520
|
+
- **`workflow`** — Use quando a pergunta for sobre o fluxo spec-wave como um todo — qual é a próxima etapa de uma issue, o que cada coluna do Kanban significa, quais labels disparam quais Actions, como funciona a crítica adversarial, ou quando o usuário pedir spec-wave sem dizer qual comando. É o mapa do processo RFC-001; para executar uma ação específica, use a skill do comando correspondente (setup, issue, spec, plan, ready, decompose, run, bug, triage, implement, order, task, story, move, doctor, update, info, uninstall, rfc, fix-pr); para conduzir um trecho inteiro do fluxo de uma vez, preparar-feature (uma Feature até Ready) ou preparar-specs (as specs de uma milestone).
|
|
1521
|
+
- **`preparar-feature`** — 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.
|
|
1522
|
+
- **`preparar-specs`** — 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).
|
|
1523
|
+
- **`audit`** — Use para auditar as specs de uma milestone COMO CONJUNTO, depois de geradas: dependência que ninguém cria, bloqueante em milestone posterior, ciclo entre Features, sobreposição com código já existente — e, com --critique, contradições semânticas entre as specs. Gatilhos: 'audita as specs da v06', 'as dependências da milestone fecham?', 'tem contradição entre as specs?', 'roda a auditoria antes dos planos'. NÃO use para criticar um documento de uma Feature — isso é o passo critique do fluxo normal.
|
|
1524
|
+
- **`order`** — Use para descobrir em que ordem as Stories de uma Feature do spec-wave devem ser implementadas, segundo as dependências declaradas (Depende de: #N e a relação nativa blocked by). Também detecta ciclos de dependência e Stories fora de ordem. Gatilhos: 'qual story implementar primeiro', 'ordem das stories da feature 12', 'tem ciclo de dependência?'. Use antes da skill implement.
|
|
1525
|
+
- **`merge`** — Use para mergear os PRs empilhados das Stories de uma Feature do spec-wave, na ordem das dependências, movendo o board até 🧪 QA. Gatilhos: 'mergeia os PRs da feature 12', 'integra as stories', 'os PRs estão revisados, pode mergear', 'qual a ordem de merge?'. Use DEPOIS da revisão humana (PRs marcados como prontos). NÃO mergeie PRs de pilha à mão com --delete-branch — é o que fecha o PR dependente.
|
|
1526
|
+
- **`run`** — Use para conduzir o fluxo do spec-wave LOCALMENTE, sem gastar minutos de GitHub Actions: `spec-wave run <issue>` executa nesta máquina o passo que a label dispararia (spec, plan, crítica, validate, decompose, apply) e `spec-wave mode local|actions` alterna entre os dois mundos. Gatilhos: 'rodar o spec-wave local', 'qual o próximo passo da issue 12', 'sem gastar Actions', 'desligar os workflows', 'trocar para execução local'.
|
|
1527
|
+
- **`qa-lead`** — Use para orquestrar o QA de uma TRILHA inteira (milestone) do spec-wave — preparar os planos de todas as Features (`qa-lead plan`), executar o ciclo com containers paralelos (`qa-lead run`) e consultar relatórios de ciclo (`qa-lead report`). Gatilhos: 'rodar o QA do milestone', 'QA da release', 'trilha de QA', 'relatório de QA do ciclo'.
|
|
1528
|
+
- **`qa-executor`** — Use quando você for o agente EXECUTOR de QA do spec-wave — acionado via `qa.command` com um contexto `.spec-wave/qa-<n>.md`. Executa os cenários um a um, registra evidência bruta e grava o veredito em `.spec-wave/qa-result-<n>.json`. NUNCA corrige código nem escreve no GitHub. Gatilhos: 'execute o QA descrito em', contexto de QA do spec-wave, arquivo qa-<n>.md.
|
|
1529
|
+
- **`task`** — Use para iniciar ou concluir uma Task do spec-wave no board: task start move para 🚧 Desenvolvimento com Status In Progress, task done move para 🎉 Done. Gatilhos: 'comecei a task 56', 'terminei a task 56', 'marcar task como feita'. Prefira sempre este comando a mexer no board via GraphQL ou gh — ele embute a regra de uma única Task In Progress por Story.
|
|
1530
|
+
- **`story`** — Use para mandar uma Story do spec-wave para 👀 Code Review depois de implementar todas as suas Tasks e abrir o PR. Gatilhos: 'terminei a story 34', 'mandar a story para review', 'story pronta para code review'. Prefira este comando a mutações GraphQL manuais no board.
|
|
1531
|
+
- **`move`** — Use para mover qualquer item do board spec-wave — Feature, Story, Task, Bug ou RFC — para uma Etapa, quando task start|done e story review não cobrem o movimento (ex.: mover uma Feature para Homologação ou Deploy). Gatilhos: 'mover a feature 12 para homologação', 'passar para deploy', 'avançar o card'. Prefira este comando a gh api graphql manual: a Etapa nunca retrocede, e isso é regra do fluxo, não limitação.
|
|
1532
|
+
|
|
1533
|
+
---
|
|
1534
|
+
|
|
1535
|
+
## Tech Context (`.github/config/tech_context.yml`)
|
|
1536
|
+
|
|
1537
|
+
Fonte de verdade estática da stack do sistema (RFC-002 §4). O `generate-plan` lê este arquivo para embasar o plano técnico e usar **APENAS** as tecnologias/serviços nele declarados — sem ele, o plano fica genérico e pode inventar APIs inexistentes. O `npx @spec-wave/cli@latest init` gera um **scaffold de exemplo** que **deve ser adaptado** à stack real. Use este fluxo quando o arquivo estiver ausente ou desatualizado.
|
|
1538
|
+
|
|
1539
|
+
**Como ajudar a criar (quando não existir):**
|
|
1540
|
+
|
|
1541
|
+
1. **Confirme a ausência:** tente `Read .github/config/tech_context.yml`. Se já existir, apenas confirme com o usuário se reflete a stack atual e pule para o fim.
|
|
1542
|
+
2. **Detecte a stack** lendo os arquivos do repositório (use Read; não invente):
|
|
1543
|
+
- `package.json` → backend/frontend e libs (ex.: `@nestjs/core`, `next`, `react`, `@prisma/client`, `express`).
|
|
1544
|
+
- `pom.xml` / `build.gradle` (Java), `requirements.txt` / `pyproject.toml` (Python), `go.mod` (Go).
|
|
1545
|
+
- `prisma/schema.prisma` ou pasta `migrations/` → tabelas e colunas para `database_schemas`.
|
|
1546
|
+
- `Dockerfile` / `docker-compose.yml` / charts Helm → `infra`.
|
|
1547
|
+
- Procure papéis/roles (enum de RBAC) no código para `security.rbac_roles`.
|
|
1548
|
+
3. **Rascunhe** o YAML seguindo EXATAMENTE este schema (preencha só o que conseguir confirmar; deixe `# TODO` no que faltar — não invente):
|
|
1549
|
+
```yaml
|
|
1550
|
+
system_info:
|
|
1551
|
+
name: "<nome do sistema>"
|
|
1552
|
+
stack:
|
|
1553
|
+
backend: "<ex.: Node.js (NestJS v11)>"
|
|
1554
|
+
frontend: "<ex.: Next.js 16 (React 19)>"
|
|
1555
|
+
database: "<ex.: PostgreSQL (Prisma 5)>"
|
|
1556
|
+
infra: "<ex.: Docker / Kubernetes>"
|
|
1557
|
+
architecture: "<ex.: Monorepo Nx / Microservices>"
|
|
1558
|
+
security:
|
|
1559
|
+
auth_protocol: "<ex.: JWT>"
|
|
1560
|
+
rbac_roles: ["ADMIN", "..."]
|
|
1561
|
+
database_schemas:
|
|
1562
|
+
- table: "<tabela>"
|
|
1563
|
+
columns: "<col1, col2, ...>"
|
|
1564
|
+
existing_services:
|
|
1565
|
+
- name: "<serviço>"
|
|
1566
|
+
endpoint: "<caminho>"
|
|
1567
|
+
auth: "<ex.: JWT, mTLS>"
|
|
1568
|
+
internal_libraries:
|
|
1569
|
+
- "<lib interna>"
|
|
1570
|
+
```
|
|
1571
|
+
4. **Mostre o rascunho ao usuário e peça confirmação/ajustes** antes de gravar (ele conhece serviços internos e roles que o código pode não revelar).
|
|
1572
|
+
5. **Grave** com Write em `.github/config/tech_context.yml`.
|
|
1573
|
+
6. **Oriente a commitar e pushar** antes de seguir (o Action lê do repo). Sugira ao usuário rodar, via prefixo `!`:
|
|
1574
|
+
```bash
|
|
1575
|
+
!git add .github/config/tech_context.yml && git commit -m "chore: tech_context.yml [spec-wave]" && git push
|
|
886
1576
|
```
|
|
887
1577
|
|
|
888
|
-
**
|
|
889
|
-
- Lista de issues (severidade + impacto)
|
|
890
|
-
- Lista de commits criados (hash + mensagem)
|
|
891
|
-
- Confirmação de replies postadas nos review comments
|
|
892
|
-
- Estado final do PR
|
|
1578
|
+
**Desvios pontuais:** para uma Feature específica usar algo fora do padrão (ex.: "usar DynamoDB só aqui"), oriente a adicionar uma seção `## Tech Override` no corpo da issue, com um bloco YAML que será mesclado (deep-merge) sobre o `tech_context.yml`:
|
|
893
1579
|
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
1580
|
+
````markdown
|
|
1581
|
+
## Tech Override
|
|
1582
|
+
```yaml
|
|
1583
|
+
system_info:
|
|
1584
|
+
stack:
|
|
1585
|
+
database: "DynamoDB"
|
|
1586
|
+
```
|
|
1587
|
+
````
|
|
899
1588
|
|
|
900
1589
|
---
|
|
901
1590
|
|
|
@@ -910,9 +1599,22 @@ docs/
|
|
|
910
1599
|
decomposition.md ← rascunho gerado quando spec-wave:decompose é adicionado (3º).
|
|
911
1600
|
REVISÁVEL e EDITÁVEL à mão; as issues só nascem com
|
|
912
1601
|
spec-wave:decompose-apply
|
|
1602
|
+
qa-plan.md ← plano de QA gerado quando spec-wave:qa é adicionado (4º,
|
|
1603
|
+
com a Feature já em 🧪 QA). Um cenário por critério de
|
|
1604
|
+
aceite, seções "## Cenário N — Story #X"; executado
|
|
1605
|
+
localmente por `spec-wave qa <issue>`
|
|
1606
|
+
dependency-map.json ← grafo de dependências das Stories PRÉ-COMPUTADO,
|
|
1607
|
+
escrito pelo decompose --apply e atualizado por
|
|
1608
|
+
`order --sync`. É o que deixa order/implement/merge
|
|
1609
|
+
consultarem a ordem sem pagar a API por Story
|
|
913
1610
|
rfcs/
|
|
914
1611
|
<slug-do-rfc>/
|
|
915
1612
|
decomposition.md ← mesmo papel, com "## Task N" (RFC não usa spec/plan)
|
|
1613
|
+
qa/
|
|
1614
|
+
<slug-da-milestone>/
|
|
1615
|
+
cycle-<n>/
|
|
1616
|
+
report.md ← relatório do ciclo N da trilha de QA (qa-lead run)
|
|
1617
|
+
report.json ← o mesmo ciclo, no schema protocol/qa-trail-report.v1.json
|
|
916
1618
|
```
|
|
917
1619
|
|
|
918
1620
|
O slug é gerado a partir do título da issue: `[FEATURE] Cadastro de Pedidos com PIX` → `cadastro-de-pedidos-com-pix`
|