@spec-wave/cli 0.30.0 → 0.33.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 +80 -5
- package/src/commands/decompose.mjs +29 -3
- package/src/commands/doctor.mjs +102 -3
- 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 +104 -25
- package/src/config.mjs +15 -0
- package/src/lib/artifact-publish.mjs +5 -2
- package/src/lib/board.mjs +14 -0
- package/src/lib/dependency-map.mjs +300 -0
- package/src/lib/doc-paths.mjs +4 -0
- package/src/lib/git-retry.mjs +82 -0
- package/src/lib/net-cache.mjs +142 -0
- package/src/lib/qa-exec.mjs +23 -2
- package/src/lib/qa-lead-backend.mjs +213 -0
- package/src/lib/qa-lead.mjs +627 -0
- package/src/lib/qa-report.mjs +65 -9
- 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 +3 -1
- 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 +953 -298
- package/src/templates/skill/core.md +584 -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|qa|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.
|
|
@@ -256,9 +260,14 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
|
|
|
256
260
|
### `@spec-wave/cli order <feature>` — ordem de execução das Stories (comando LOCAL)
|
|
257
261
|
| Flag/Arg | Tipo | Descrição |
|
|
258
262
|
|----------|------|-----------|
|
|
259
|
-
| `<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. |
|
|
260
269
|
|
|
261
|
-
> **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.
|
|
262
271
|
|
|
263
272
|
### `@spec-wave/cli preflight --milestone <nome>` — confere tudo ANTES de gerar as specs (comando LOCAL)
|
|
264
273
|
| Flag/Arg | Tipo | Descrição |
|
|
@@ -297,6 +306,19 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
|
|
|
297
306
|
|
|
298
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).
|
|
299
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
|
+
|
|
300
322
|
### `@spec-wave/cli task <start|done> <n>` — transições de Task no board (comando LOCAL)
|
|
301
323
|
| Flag/Arg | Tipo | Descrição |
|
|
302
324
|
|----------|------|-----------|
|
|
@@ -472,186 +494,351 @@ O `validate` também recusa documento com sinal objetivo de corte (bloco de cód
|
|
|
472
494
|
|
|
473
495
|
## Sub-comandos
|
|
474
496
|
|
|
475
|
-
### `/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.
|
|
502
|
+
|
|
503
|
+
| Flag | Descrição |
|
|
504
|
+
|------|-----------|
|
|
505
|
+
| `--json` | Saída JSON (`{"initialized":bool, ..., "skill":{...}}`) para parsing programático. |
|
|
506
|
+
|
|
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.
|
|
476
519
|
|
|
477
|
-
|
|
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**)
|
|
478
523
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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}]}`.
|
|
486
531
|
|
|
487
532
|
---
|
|
488
533
|
|
|
489
|
-
### `/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. |
|
|
490
552
|
|
|
491
|
-
|
|
553
|
+
#### Passos
|
|
492
554
|
|
|
493
|
-
**
|
|
494
|
-
|
|
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.
|
|
556
|
+
|
|
557
|
+
2. **Descubra o repositório alvo:**
|
|
495
558
|
```bash
|
|
496
|
-
|
|
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 `!`):
|
|
497
566
|
```
|
|
498
|
-
|
|
499
|
-
|
|
567
|
+
!gh auth refresh --scopes project,repo,workflow
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
5. **(Opcional) Pré-visualize:**
|
|
500
571
|
```bash
|
|
501
|
-
npx @spec-wave/cli@latest
|
|
502
|
-
npx @spec-wave/cli@latest update --yes # commits diretos na branch default
|
|
572
|
+
npx @spec-wave/cli@latest init --repo <owner/repo> --dry-run
|
|
503
573
|
```
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
-
|
|
508
|
-
|
|
509
|
-
|
|
574
|
+
|
|
575
|
+
6. **Execute:**
|
|
576
|
+
```bash
|
|
577
|
+
npx @spec-wave/cli@latest init --repo <owner/repo> --project-title "<título>"
|
|
578
|
+
```
|
|
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.
|
|
510
592
|
|
|
511
593
|
---
|
|
512
594
|
|
|
513
|
-
### `/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.
|
|
514
600
|
|
|
515
|
-
|
|
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. |
|
|
516
612
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
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.
|
|
521
|
-
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ê).
|
|
522
|
-
5. **(Opcional) Pré-visualize** antes de aplicar: `npx @spec-wave/cli@latest init --repo <owner/repo> --dry-run`.
|
|
523
|
-
6. **Execute com os parâmetros coletados:**
|
|
613
|
+
#### Passos
|
|
614
|
+
|
|
615
|
+
1. **Sempre comece com `--dry-run`:**
|
|
524
616
|
```bash
|
|
525
|
-
npx @spec-wave/cli@latest
|
|
617
|
+
npx @spec-wave/cli@latest update --dry-run
|
|
618
|
+
```
|
|
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
|
|
526
626
|
```
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
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
|
+
```
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
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 `✗`.
|
|
679
|
+
|
|
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.
|
|
531
694
|
|
|
532
695
|
---
|
|
533
696
|
|
|
534
|
-
### `/spec-wave issue
|
|
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`. |
|
|
717
|
+
|
|
718
|
+
Atalhos: `initiative` (raiz, sem `--parent`) e `feature` — mesmas flags, `--type` fixo.
|
|
719
|
+
|
|
720
|
+
#### Hierarquia
|
|
535
721
|
|
|
536
|
-
|
|
722
|
+
`Initiative → Epic → Feature → Story → Task`. Use `--parent <n>` para pendurar no nível acima.
|
|
537
723
|
|
|
538
|
-
|
|
724
|
+
#### Passos
|
|
539
725
|
|
|
540
|
-
|
|
726
|
+
1. **Colete com o usuário:** tipo, título (sem prefixo), descrição e o número da issue **pai**, se houver.
|
|
541
727
|
|
|
542
|
-
**
|
|
543
|
-
|
|
544
|
-
2. Execute
|
|
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:
|
|
545
731
|
```bash
|
|
546
732
|
npx @spec-wave/cli@latest issue \
|
|
547
733
|
--type "<tipo>" \
|
|
548
734
|
--title "<título>" \
|
|
549
735
|
--body "<descrição>" \
|
|
550
|
-
--area "<área>" \ # opcional
|
|
551
|
-
--priority "<prioridade>" \ # opcional —
|
|
736
|
+
--area "<área>" \ # opcional
|
|
737
|
+
--priority "<prioridade>" \ # opcional — se o usuário não pediu, OMITA
|
|
552
738
|
--parent "<número-do-pai>" # opcional
|
|
553
739
|
```
|
|
554
|
-
Para Features,
|
|
555
|
-
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).
|
|
556
|
-
**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.
|
|
557
|
-
3. Informe o número criado e o vínculo com o pai (se houver).
|
|
558
|
-
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`.
|
|
559
741
|
|
|
560
|
-
|
|
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
|
|
561
747
|
|
|
562
|
-
|
|
748
|
+
⚠️ **A Etapa inicial é sempre 📥 Backlog, para qualquer `--type`.** Correto para Initiative, Epic, Feature, RFC, Bug e Spike.
|
|
563
749
|
|
|
564
|
-
|
|
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.
|
|
565
751
|
|
|
566
|
-
**
|
|
567
|
-
1. Confirme com o usuário que ele quer remover (a ação remove labels e faz commits removendo os workflows).
|
|
568
|
-
2. Mostre antes o que será removido com `npx @spec-wave/cli@latest uninstall --dry-run`.
|
|
569
|
-
3. Execute `npx @spec-wave/cli@latest uninstall` (a CLI pede confirmação; use `--yes` só se o usuário já confirmou).
|
|
570
|
-
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.
|
|
571
753
|
|
|
572
754
|
---
|
|
573
755
|
|
|
574
|
-
### `/spec-wave spec
|
|
756
|
+
### `/spec-wave spec` — especificação funcional (1º documento)
|
|
575
757
|
|
|
576
|
-
|
|
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.
|
|
577
759
|
|
|
578
|
-
> **
|
|
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).
|
|
579
761
|
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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:
|
|
583
790
|
```bash
|
|
584
791
|
gh issue edit <número> --add-label "spec-wave:spec"
|
|
585
792
|
```
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
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`).
|
|
589
804
|
|
|
590
805
|
---
|
|
591
806
|
|
|
592
|
-
### `/spec-wave plan
|
|
807
|
+
### `/spec-wave plan` — plano técnico (2º documento)
|
|
593
808
|
|
|
594
|
-
|
|
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.
|
|
595
810
|
|
|
596
|
-
|
|
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.
|
|
597
812
|
|
|
598
|
-
**
|
|
599
|
-
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>`.
|
|
600
|
-
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).
|
|
601
|
-
3. Adicione a label de gatilho:
|
|
602
|
-
```bash
|
|
603
|
-
gh issue edit <número> --add-label "spec-wave:plan"
|
|
604
|
-
```
|
|
605
|
-
4. Informe: "Label `spec-wave:plan` adicionada. O GitHub Action `generate-plan.yml` irá gerar o `plan.md` automaticamente. Acompanhe em: Actions → Generate Plan."
|
|
606
|
-
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`.
|
|
607
|
-
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.
|
|
608
814
|
|
|
609
|
-
|
|
815
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
610
816
|
|
|
611
|
-
|
|
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.
|
|
612
818
|
|
|
613
|
-
|
|
819
|
+
#### Passos
|
|
614
820
|
|
|
615
|
-
**
|
|
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**).
|
|
616
822
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
- `pom.xml` / `build.gradle` (Java), `requirements.txt` / `pyproject.toml` (Python), `go.mod` (Go).
|
|
621
|
-
- `prisma/schema.prisma` ou pasta `migrations/` → tabelas e colunas para `database_schemas`.
|
|
622
|
-
- `Dockerfile` / `docker-compose.yml` / charts Helm → `infra`.
|
|
623
|
-
- Procure papéis/roles (enum de RBAC) no código para `security.rbac_roles`.
|
|
624
|
-
3. **Rascunhe** o YAML seguindo EXATAMENTE este schema (preencha só o que conseguir confirmar; deixe `# TODO` no que faltar — não invente):
|
|
625
|
-
```yaml
|
|
626
|
-
system_info:
|
|
627
|
-
name: "<nome do sistema>"
|
|
628
|
-
stack:
|
|
629
|
-
backend: "<ex.: Node.js (NestJS v11)>"
|
|
630
|
-
frontend: "<ex.: Next.js 16 (React 19)>"
|
|
631
|
-
database: "<ex.: PostgreSQL (Prisma 5)>"
|
|
632
|
-
infra: "<ex.: Docker / Kubernetes>"
|
|
633
|
-
architecture: "<ex.: Monorepo Nx / Microservices>"
|
|
634
|
-
security:
|
|
635
|
-
auth_protocol: "<ex.: JWT>"
|
|
636
|
-
rbac_roles: ["ADMIN", "..."]
|
|
637
|
-
database_schemas:
|
|
638
|
-
- table: "<tabela>"
|
|
639
|
-
columns: "<col1, col2, ...>"
|
|
640
|
-
existing_services:
|
|
641
|
-
- name: "<serviço>"
|
|
642
|
-
endpoint: "<caminho>"
|
|
643
|
-
auth: "<ex.: JWT, mTLS>"
|
|
644
|
-
internal_libraries:
|
|
645
|
-
- "<lib interna>"
|
|
646
|
-
```
|
|
647
|
-
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).
|
|
648
|
-
5. **Grave** com Write em `.github/config/tech_context.yml`.
|
|
649
|
-
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:
|
|
650
826
|
```bash
|
|
651
|
-
|
|
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"
|
|
652
831
|
```
|
|
653
832
|
|
|
654
|
-
|
|
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`:
|
|
655
842
|
|
|
656
843
|
````markdown
|
|
657
844
|
## Tech Override
|
|
@@ -662,283 +849,742 @@ system_info:
|
|
|
662
849
|
```
|
|
663
850
|
````
|
|
664
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
|
+
|
|
665
869
|
---
|
|
666
870
|
|
|
667
|
-
### `/spec-wave ready
|
|
871
|
+
### `/spec-wave ready` — valida spec + plan
|
|
872
|
+
|
|
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.
|
|
874
|
+
|
|
875
|
+
Verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias e se não há sinal de truncamento.
|
|
668
876
|
|
|
669
|
-
|
|
877
|
+
**Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
|
|
670
878
|
|
|
671
|
-
|
|
672
|
-
|
|
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:
|
|
673
884
|
```bash
|
|
674
885
|
gh issue edit <número> --add-label "spec-wave:ready"
|
|
675
886
|
```
|
|
676
|
-
|
|
677
|
-
3.
|
|
678
|
-
|
|
679
|
-
|
|
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.
|
|
680
908
|
|
|
681
909
|
---
|
|
682
910
|
|
|
683
|
-
### `/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
|
+
```
|
|
684
937
|
|
|
685
|
-
|
|
686
|
-
- **Feature** → **Stories** (cada uma com suas **Tasks**), a partir de `spec.md` + `plan.md`.
|
|
687
|
-
- **RFC** → **Tasks diretamente** (sem Stories), a partir da descrição do RFC.
|
|
938
|
+
#### Passos
|
|
688
939
|
|
|
689
|
-
|
|
940
|
+
1. **Pré-requisito.** Feature: confirme que está em **✅ Ready** (spec e plan validados — skill **ready**). RFC: basta a descrição estar completa.
|
|
690
941
|
|
|
691
|
-
**
|
|
692
|
-
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).
|
|
693
|
-
2. **Etapa 1 — gerar o rascunho:**
|
|
942
|
+
2. **Etapa 1 — gerar o rascunho**, no modo que preferir (mesmo resultado; o modo é detectado pelo ambiente):
|
|
694
943
|
```bash
|
|
944
|
+
# local — resultado nesta sessão
|
|
945
|
+
npx @spec-wave/cli@latest decompose --issue-number <número>
|
|
946
|
+
# ou Action — assíncrono
|
|
695
947
|
gh issue edit <número> --add-label "spec-wave:decompose"
|
|
696
948
|
```
|
|
697
949
|
Informe: "Rascunho iniciado — vai abrir um Pull Request com o `decomposition.md` e passar pela crítica. **Nenhuma issue é criada nesta etapa.**"
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
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:
|
|
703
960
|
```bash
|
|
961
|
+
# local
|
|
962
|
+
npx @spec-wave/cli@latest decompose --issue-number <número> --apply
|
|
963
|
+
# ou Action
|
|
704
964
|
gh issue edit <número> --add-label "spec-wave:decompose-apply"
|
|
705
965
|
```
|
|
706
966
|
Aplicar essa label **é** a aprovação humana — não há nova crítica.
|
|
707
|
-
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.
|
|
708
|
-
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*.
|
|
709
967
|
|
|
710
|
-
|
|
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*).
|
|
711
1019
|
|
|
712
1020
|
---
|
|
713
1021
|
|
|
714
|
-
### `/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`.
|
|
715
1035
|
|
|
716
|
-
|
|
1036
|
+
#### Como o comando se comporta por tipo
|
|
717
1037
|
|
|
718
|
-
|
|
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. |
|
|
719
1043
|
|
|
720
|
-
**
|
|
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.
|
|
721
1045
|
|
|
722
|
-
**
|
|
723
|
-
|
|
724
|
-
|
|
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`:**
|
|
725
1055
|
```bash
|
|
726
1056
|
npx @spec-wave/cli@latest implement <número> --dry-run
|
|
727
1057
|
```
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
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`:
|
|
731
1063
|
```bash
|
|
732
1064
|
npx @spec-wave/cli@latest implement <número>
|
|
733
1065
|
```
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
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).
|
|
738
1207
|
|
|
739
1208
|
---
|
|
740
1209
|
|
|
741
|
-
### `/spec-wave
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
**
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
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:
|
|
758
1231
|
```bash
|
|
759
|
-
gh issue
|
|
1232
|
+
gh issue edit <número> --add-label "spec-wave:bug"
|
|
760
1233
|
```
|
|
761
1234
|
|
|
762
|
-
|
|
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."
|
|
763
1236
|
|
|
764
|
-
|
|
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`.
|
|
765
1238
|
|
|
766
|
-
|
|
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.
|
|
767
1240
|
|
|
768
|
-
|
|
1241
|
+
5. **Validar:** aplique `spec-wave:ready`. O Action confere as seis seções obrigatórias e aplica `spec-wave:bug-approved`.
|
|
769
1242
|
|
|
770
|
-
|
|
1243
|
+
#### Quando é obrigatório
|
|
771
1244
|
|
|
772
|
-
|
|
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). |
|
|
773
1250
|
|
|
774
|
-
|
|
775
|
-
2. `gh issue edit <n> --add-label "spec-wave:bug"`
|
|
776
|
-
3. Avise: o Action `generate-bug.yml` gera o arquivo e abre um Pull Request com ele.
|
|
777
|
-
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.
|
|
778
|
-
5. Validar: `spec-wave:ready` → confere as seis seções e aplica `spec-wave:bug-approved`.
|
|
1251
|
+
#### As seis seções
|
|
779
1252
|
|
|
780
|
-
**Seções obrigatórias** (o validador as compara byte a byte — não renomeie ao editar):
|
|
781
1253
|
`Reprodução` · `Esperado e Obtido` · `Impacto e Severidade` · `Causa Raiz` · `Escopo do Fix` · `Teste de Regressão`
|
|
782
1254
|
|
|
783
|
-
|
|
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.
|
|
784
1256
|
|
|
785
|
-
|
|
1257
|
+
#### Se falhar
|
|
786
1258
|
|
|
787
|
-
|
|
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`).
|
|
788
1263
|
|
|
789
1264
|
---
|
|
790
1265
|
|
|
791
|
-
### `/spec-wave triage
|
|
1266
|
+
### `/spec-wave triage` — o desfecho da triagem
|
|
792
1267
|
|
|
793
|
-
|
|
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.
|
|
794
1271
|
|
|
795
1272
|
```bash
|
|
796
1273
|
npx @spec-wave/cli@latest triage accept 42
|
|
797
|
-
npx @spec-wave/cli@latest triage accept 42 --severity P1
|
|
798
|
-
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"
|
|
799
1276
|
npx @spec-wave/cli@latest triage duplicate 42 --of 17
|
|
800
1277
|
```
|
|
801
1278
|
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
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.** |
|
|
805
1284
|
|
|
806
|
-
|
|
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.
|
|
807
1286
|
|
|
808
|
-
|
|
1287
|
+
#### O portão de aceite
|
|
809
1288
|
|
|
810
|
-
|
|
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. |
|
|
811
1293
|
|
|
812
|
-
|
|
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.
|
|
813
1295
|
|
|
814
|
-
|
|
1296
|
+
#### Se o aceite for recusado
|
|
815
1297
|
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
-
|
|
821
|
-
|
|
822
|
-
|
|
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
|
|
823
1305
|
|
|
824
|
-
**2. Revisar o plano e executar (sempre local, SEMPRE `--dry-run` primeiro):**
|
|
825
1306
|
```bash
|
|
826
|
-
npx @spec-wave/cli@latest
|
|
827
|
-
npx @spec-wave/cli@latest qa <issue> # executa e dá o veredito
|
|
1307
|
+
npx @spec-wave/cli@latest bug --title "Duplicidade de pedidos no PIX" --parent 17 --priority P2
|
|
828
1308
|
```
|
|
829
|
-
- A revisão do plano é o **portão humano** (D-QA4): sem `qa-ready` na Feature o comando recusa — porque o verde avança a Etapa **sozinho** (D-QA3).
|
|
830
|
-
- Regras de edição do plano: seções `## Cenário N — Story #X` (posição manda, não o número escrito), `**Critério:**`/`**Esperado:**` obrigatórios.
|
|
831
|
-
- Desfechos: **verde** → `qa-approved`, Story → 📋 Homologação, Bug → 🚀 Deploy (D-QA6), 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, milestone herdado) com `bug.md` **determinístico commitado pelo comando e `bug-approved` aplicada** — exceção explícita à Regra fundamental: reprodução, esperado/obtido e regressão são a execução observada, e regenerar por IA só alucina; **não** aplique `spec-wave:bug` nesses Bugs. **Inconclusivo** (`blocked` sem `fail`) → nada move, nenhum Bug, exit 1.
|
|
832
|
-
- Re-teste após o fix: `npx @spec-wave/cli@latest qa <story> --only <cenário>` — não duplica Bug (comenta no existente).
|
|
833
|
-
- **PROIBIDO corrigir código durante a execução** — QA não conserta; alterar o código invalida o veredito.
|
|
834
1309
|
|
|
835
|
-
|
|
1310
|
+
Nasce em **🐞 Triagem** — ou direto em **✅ Ready** se for **P0**.
|
|
836
1311
|
|
|
837
1312
|
---
|
|
838
1313
|
|
|
839
|
-
### `/spec-wave
|
|
1314
|
+
### `/spec-wave rfc` — documento de processo
|
|
840
1315
|
|
|
841
|
-
|
|
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).
|
|
842
1317
|
|
|
843
|
-
|
|
1318
|
+
RFCs são escritos em **português do Brasil** e vivem em `rfc/`.
|
|
844
1319
|
|
|
845
|
-
**
|
|
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.
|
|
846
1321
|
|
|
847
|
-
|
|
848
|
-
- Leia `.spec-wave.json` para obter `owner` e `repo`.
|
|
849
|
-
- Confirme o número do PR com o usuário se não vier como argumento.
|
|
1322
|
+
#### Passos
|
|
850
1323
|
|
|
851
|
-
|
|
852
|
-
```bash
|
|
853
|
-
gh pr view <número> --json number,title,headRefName,body,changedFiles
|
|
854
|
-
gh pr diff <número>
|
|
855
|
-
gh api repos/<owner>/<repo>/pulls/<número>/comments
|
|
856
|
-
gh api repos/<owner>/<repo>/pulls/<número>/reviews
|
|
857
|
-
```
|
|
858
|
-
- Liste todos os arquivos alterados.
|
|
859
|
-
- Colete todos os review comments (inline) e reviews gerais.
|
|
1324
|
+
1. **Entreviste o usuário** sobre: objetivo, problema atual, solução proposta, princípios, stakeholders afetados. Não invente contexto organizacional.
|
|
860
1325
|
|
|
861
|
-
|
|
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
|
|
1336
|
+
|
|
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):
|
|
862
1340
|
```bash
|
|
863
|
-
|
|
1341
|
+
npx @spec-wave/cli@latest issue --type rfc \
|
|
1342
|
+
--title "<título sem prefixo>" \
|
|
1343
|
+
--body "<resumo + link para rfc/rfc-<slug>.md>"
|
|
864
1344
|
```
|
|
1345
|
+
A issue nasce em **📥 Backlog**.
|
|
865
1346
|
|
|
866
|
-
|
|
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`.
|
|
867
1348
|
|
|
868
|
-
|
|
869
|
-
|-----------|----------------|
|
|
870
|
-
| **Segurança** | Credenciais hardcoded, secrets/API keys expostas, configs inseguras, injeção SQL/XSS |
|
|
871
|
-
| **Arquitetura** | Dependências circulares, exports faltando, wiring incompleto, violações de camada |
|
|
872
|
-
| **Infraestrutura** | OIDC mal configurado, IAM permissivo demais, Dockerfile sem usuário não-root, state remoto ausente |
|
|
873
|
-
| **Qualidade** | sync-over-async, validação ausente, operações não idempotentes, error handling ausente |
|
|
1349
|
+
#### Cuidados
|
|
874
1350
|
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
Agent(caveman:cavecrew-reviewer) → diff do PR + arquivos alterados
|
|
878
|
-
```
|
|
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.
|
|
879
1353
|
|
|
880
|
-
|
|
881
|
-
a. Leia o(s) arquivo(s) afetado(s) com Read
|
|
882
|
-
b. Aplique o fix com Edit
|
|
883
|
-
c. Faça commit separado:
|
|
884
|
-
```bash
|
|
885
|
-
git add <arquivo>
|
|
886
|
-
git commit -m "fix: <problema> (issue #<N>)
|
|
1354
|
+
---
|
|
887
1355
|
|
|
888
|
-
|
|
1356
|
+
### `/spec-wave fix-pr` — auditoria e correção de PR
|
|
889
1357
|
|
|
890
|
-
|
|
891
|
-
```
|
|
892
|
-
d. Push ao branch do PR:
|
|
893
|
-
```bash
|
|
894
|
-
git push
|
|
895
|
-
```
|
|
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'.
|
|
896
1359
|
|
|
897
|
-
|
|
898
|
-
```bash
|
|
899
|
-
gh api repos/<owner>/<repo>/pulls/<número>/comments/<comment-id>/replies \
|
|
900
|
-
-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**.
|
|
901
1361
|
|
|
902
|
-
|
|
903
|
-
<trecho corrigido>
|
|
904
|
-
\`\`\`
|
|
1362
|
+
**Pré-requisitos:** `.spec-wave.json` deve existir (para resolver `owner/repo`). Token com permissão de push no branch do PR.
|
|
905
1363
|
|
|
906
|
-
|
|
907
|
-
|
|
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.
|
|
908
1369
|
|
|
909
|
-
|
|
1370
|
+
##### 2. Coletar dados do PR
|
|
1371
|
+
|
|
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:**
|
|
910
1494
|
```bash
|
|
911
|
-
|
|
1495
|
+
npx @spec-wave/cli@latest uninstall --dry-run
|
|
912
1496
|
```
|
|
913
|
-
|
|
1497
|
+
|
|
1498
|
+
3. Execute:
|
|
1499
|
+
```bash
|
|
1500
|
+
npx @spec-wave/cli@latest uninstall
|
|
914
1501
|
```
|
|
915
|
-
|
|
1502
|
+
A CLI pede confirmação própria. Use `--yes` **apenas** se o usuário já confirmou explicitamente.
|
|
1503
|
+
|
|
1504
|
+
4. **Lembre o usuário** de excluir o **GitHub Project** manualmente, se desejar — a CLI não o apaga.
|
|
916
1505
|
|
|
917
|
-
|
|
1506
|
+
#### Observações
|
|
918
1507
|
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
| 2 | 🟡 Medium | Qualidade | Operação não idempotente em createOrder | def5678 |
|
|
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**.
|
|
923
1511
|
|
|
924
|
-
|
|
925
|
-
- `abc1234` fix: credencial hardcoded removida (issue #1)
|
|
926
|
-
- `def5678` fix: idempotency key adicionada em createOrder (issue #2)
|
|
1512
|
+
---
|
|
927
1513
|
|
|
928
|
-
|
|
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
|
|
929
1576
|
```
|
|
930
1577
|
|
|
931
|
-
**
|
|
932
|
-
- Lista de issues (severidade + impacto)
|
|
933
|
-
- Lista de commits criados (hash + mensagem)
|
|
934
|
-
- Confirmação de replies postadas nos review comments
|
|
935
|
-
- 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`:
|
|
936
1579
|
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
1580
|
+
````markdown
|
|
1581
|
+
## Tech Override
|
|
1582
|
+
```yaml
|
|
1583
|
+
system_info:
|
|
1584
|
+
stack:
|
|
1585
|
+
database: "DynamoDB"
|
|
1586
|
+
```
|
|
1587
|
+
````
|
|
942
1588
|
|
|
943
1589
|
---
|
|
944
1590
|
|
|
@@ -957,9 +1603,18 @@ docs/
|
|
|
957
1603
|
com a Feature já em 🧪 QA). Um cenário por critério de
|
|
958
1604
|
aceite, seções "## Cenário N — Story #X"; executado
|
|
959
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
|
|
960
1610
|
rfcs/
|
|
961
1611
|
<slug-do-rfc>/
|
|
962
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
|
|
963
1618
|
```
|
|
964
1619
|
|
|
965
1620
|
O slug é gerado a partir do título da issue: `[FEATURE] Cadastro de Pedidos com PIX` → `cadastro-de-pedidos-com-pix`
|