@spec-wave/cli 0.21.0 → 0.24.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.
@@ -43,7 +43,7 @@ npx @spec-wave/cli@latest doctor
43
43
  - escopo faltando → o usuário roda `!gh auth refresh --scopes project,repo,workflow` (interativo, ele executa)
44
44
  - `.spec-wave.json` dessincronizado → `npx @spec-wave/cli@latest refresh --config`
45
45
  - workflows/labels divergentes → skill **update**
46
- - secret de IA ausente → Settings → Secrets → Actions (`ANTHROPIC_API_KEY` ou `OPENROUTER_API_KEY`)
46
+ - secret de IA ausente → Settings → Secrets → Actions (`ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN` ou `OPENROUTER_API_KEY`, conforme o provider)
47
47
  - `specKit.command` ausente → configure antes de usar a skill **implement**
48
48
  3. Trate `!` como "não deu para verificar", não como falha.
49
49
  4. Se tudo passar e o problema original persistir, aí sim investigue a superfície específica (Action, issue, board).
@@ -11,12 +11,15 @@ allowed-tools:
11
11
  Comando **local**:
12
12
 
13
13
  ```bash
14
- npx @spec-wave/cli@latest order <feature>
14
+ npx @spec-wave/cli@latest order <feature> # uma Feature
15
+ npx @spec-wave/cli@latest order # o mapa de todas as Features com trabalho
15
16
  ```
16
17
 
17
18
  | Arg | Descrição |
18
19
  |-----|-----------|
19
- | `<feature>` | Número da issue da **Feature**, ex.: `12` ou `#12`. Posicional, obrigatório. |
20
+ | `<feature>` | Número da issue da **Feature**, ex.: `12` ou `#12`. Posicional, **opcional**. |
21
+
22
+ **Sem argumento**, o conjunto vem do **board** (não dos arquivos): todas as Features abertas fora de 🎉 Done, com as Stories de todas num **grafo só** e a Feature de cada uma ao lado. É o modo para responder "por onde os devs pegam agora" quando o trabalho está espalhado por várias Features — nesse escopo, dependência entre Features deixa de ser "externa" e entra na ordenação.
20
23
 
21
24
  **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
22
25
 
@@ -25,11 +28,12 @@ npx @spec-wave/cli@latest order <feature>
25
28
  - As Stories da Feature em **ordem topológica** pelas dependências — a linha `Depende de: #N` no corpo **mesclada** com a relação nativa *blocked by* do GitHub
26
29
  - A **Etapa atual** de cada Story no board
27
30
  - Avisos de **ciclo de dependência** — essas Stories ficam **fora da ordem**; corrija as linhas `Depende de:`
28
- - Avisos de **dependência fora de ordem** — Story já em 🚧 Desenvolvimento ou além dependendo de outra que não está em 🎉 Done
31
+ - Avisos de **dependência fora de ordem** — Story já em 🚧 Desenvolvimento ou além dependendo de outra que não está em 🎉 Done (no modo de uma Feature, também quando a bloqueadora é de **outra** Feature e continua aberta)
32
+ - **Bloqueadas por fora desta Feature** (modo de uma Feature) — dependências `#N` que não entram na ordenação porque a Story bloqueadora não está no conjunto, com o estado de cada uma. No modo sem argumento essa seção lista só o que ficou fora do board (Story concluída, Feature em Done, outro board)
29
33
 
30
34
  ## Passos
31
35
 
32
- 1. Rode o comando para a Feature.
36
+ 1. Rode o comando para a Feature — ou **sem argumento** quando a pergunta for sobre a onda inteira, não sobre uma Feature.
33
37
  2. Apresente a ordem ao usuário, marcando o que já está concluído e o que está pendente.
34
38
  3. **Se houver ciclo**, isso é bloqueante para a skill **implement** no modo Feature (o comando aborta com exit 1). Ajude a quebrar o ciclo editando as linhas `Depende de:` nos corpos das Stories.
35
39
  4. **Se houver dependência fora de ordem**, aponte o risco ao usuário antes de seguir.
@@ -24,7 +24,7 @@ Verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias e se n
24
24
 
25
25
  3. Informe: "Validação iniciada. O workflow verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias."
26
26
 
27
- 4. **Se a validação falhar por conteúdo**, o workflow comenta os problemas na issue e adiciona automaticamente `spec-wave:spec`. Oriente o usuário a corrigir e tentar de novo.
27
+ 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 é 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.
28
28
 
29
29
  5. **Se passar:** "Feature validada! Mova o card para **✅ Ready** e use a skill **decompose** para gerar o **rascunho** das Stories — nada é criado ainda."
30
30
 
@@ -58,7 +58,7 @@ Você dirige o `init` **com flags**. Nunca rode `npx @spec-wave/cli@latest init`
58
58
 
59
59
  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 skill **plan** (`reference/tech-context.md`).
60
60
 
61
- 9. **Secret de IA:** instrua a adicionar em Settings → Secrets → Actions a chave do provider escolhido: `ANTHROPIC_API_KEY` (Anthropic) ou `OPENROUTER_API_KEY` (OpenRouter).
61
+ 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).
62
62
 
63
63
  10. **Próximo passo:** criar a primeira Feature — skill **issue**.
64
64
 
@@ -227,7 +227,7 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
227
227
  |----------|------|-----------|
228
228
  | `<feature>` | string (obrigatório) | Número da issue da **Feature**, ex.: `12` ou `#12`. Argumento posicional. |
229
229
 
230
- > Lista as Stories da Feature em **ordem topológica** pelas dependências (linha `Depende de: #N` no corpo + relação nativa *blocked by*, mescladas), com a Etapa atual de cada uma no board. Avisa sobre **ciclos de dependência** (essas Stories ficam fora da ordem — corrija as linhas `Depende de`) e sobre **dependências fora de ordem** (Story já em Desenvolvimento+ dependendo de outra que não está Done). Use antes de escolher qual Story implementar.
230
+ > **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` no corpo + relação nativa *blocked by*, mescladas), com a Etapa atual de cada uma no board. 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`) e sobre **dependências fora de ordem** (Story já em Desenvolvimento+ dependendo de outra que não está Done). Use antes de escolher qual Story implementar.
231
231
 
232
232
  ### `@spec-wave/cli task <start|done> <n>` — transições de Task no board (comando LOCAL)
233
233
  | Flag/Arg | Tipo | Descrição |
@@ -316,7 +316,7 @@ Corpo técnico.
316
316
 
317
317
  **Ao editar à mão:**
318
318
  - a **posição** manda, não o número escrito — inserir uma Story no meio sem renumerar funciona;
319
- - `**Depende de:**` usa referências **1-based** (`Story 1, Story 3`) ou `—`; apontar para si mesma ou para frente é **erro**, não filtro silencioso;
319
+ - `**Depende de:**` aceita **irmãs** (`Story 1, Story 3`, 1-based, 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;
320
320
  - o corpo aceita markdown livre (`## Backend`, cercas de código) — só `## Story N` e `### Task N.M` são estrutura;
321
321
  - **para gerar outro rascunho do zero:** apague o arquivo e reaplique `spec-wave:decompose`.
322
322
 
@@ -459,7 +459,7 @@ Configura o spec-wave no repositório. Você dirige o `init` com flags — **nun
459
459
  Use `--skip-project` / `--skip-labels` / `--skip-files` **apenas** para re-rodar uma fase específica que falhou antes.
460
460
  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 `.spec-wave.json`. Oriente o usuário a fazer `git pull` para trazer os arquivos ao checkout local.
461
461
  8. **Adapte o `tech_context.yml`**: o scaffold vem com dados de exemplo. Ofereça ajustá-lo à stack real do repo seguindo a seção **Tech Context** (perto do comando `/spec-wave plan`) — isso melhora muito a qualidade do `plan.md`.
462
- 9. Instrua o usuário a adicionar a chave de IA como secret no repositório (Settings → Secrets → Actions): `ANTHROPIC_API_KEY` (Anthropic) ou `OPENROUTER_API_KEY` (OpenRouter), conforme o provider escolhido no `init`.
462
+ 9. Instrua o usuário a adicionar a credencial de IA como secret no repositório (Settings → Secrets → Actions): `ANTHROPIC_API_KEY` (Anthropic), `CLAUDE_CODE_OAUTH_TOKEN` (assinatura Claude Pro/Max — gere com `claude setup-token`) ou `OPENROUTER_API_KEY` (OpenRouter), conforme o provider escolhido no `init`.
463
463
 
464
464
  ---
465
465
 
@@ -606,7 +606,7 @@ Valida que spec.md e plan.md estão completos e a Feature pode avançar.
606
606
  gh issue edit <número> --add-label "spec-wave:ready"
607
607
  ```
608
608
  2. Informe: "Validação iniciada. O workflow verificará se spec.md e plan.md contêm todas as seções obrigatórias."
609
- 3. Se a validação falhar, o workflow comentará os problemas na issue e adicionará automaticamente `spec-wave:spec`. Informe o usuário para corrigir e tentar novamente.
609
+ 3. Se a validação falhar, o workflow comentará os problemas na issue e **não aplicará label de gatilho nenhuma**. Informe o usuário para corrigir e reaplicar `spec-wave:ready`. Falha por título de seção vem com "encontrei X, esperava Y" — renomear resolve. `spec-wave:spec` só se o documento precisar ser REGERADO: ela **sobrescreve** o `spec.md` revisado.
610
610
  4. **Se a issue tiver `spec-wave:critique-failed` ou `spec-wave:needs-human`**, a validação falha de imediato — são portões humanos: a crítica apontou contradições graves (comentário 🔎 na issue) ou esgotou as tentativas. Nesses casos a Feature **não** é devolvida para a etapa de spec; siga o fluxo da seção *Crítica adversarial* (corrigir a superfície certa → remover a label → re-aplicar `spec-wave:ready`).
611
611
  5. Se passar, oriente: "Feature validada! Mova o card para **✅ Ready** e use `/spec-wave decompose <número>` para gerar o **rascunho** das Stories (nada é criado ainda)."
612
612
 
@@ -636,7 +636,7 @@ Para qualquer outro tipo (Spike, Bug, Story, Task, …) o Action **recusa** e co
636
636
  gh issue edit <número> --add-label "spec-wave:decompose-apply"
637
637
  ```
638
638
  Aplicar essa label **é** a aprovação humana — não há nova crítica.
639
- 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.
639
+ 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.
640
640
  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*.
641
641
 
642
642
  > **Nunca pule a etapa 1** aplicando `spec-wave:decompose-apply` direto: sem `decomposition.md` o Action falha pedindo o rascunho.
@@ -51,5 +51,6 @@ jobs:
51
51
  env:
52
52
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
53
53
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
54
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
54
55
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
55
56
  GITHUB_REPOSITORY: ${{ github.repository }}
@@ -76,5 +76,6 @@ jobs:
76
76
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
77
77
  PROJECT_TOKEN: ${{ secrets.GH_PROJECT_TOKEN }}
78
78
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
79
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
79
80
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
80
81
  GITHUB_REPOSITORY: ${{ github.repository }}
@@ -56,5 +56,6 @@ jobs:
56
56
  env:
57
57
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
58
58
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
59
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
59
60
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
60
61
  GITHUB_REPOSITORY: ${{ github.repository }}
@@ -64,5 +64,6 @@ jobs:
64
64
  env:
65
65
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
66
66
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
67
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
67
68
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
68
69
  GITHUB_REPOSITORY: ${{ github.repository }}
@@ -64,5 +64,6 @@ jobs:
64
64
  env:
65
65
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
66
66
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
67
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
67
68
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
68
69
  GITHUB_REPOSITORY: ${{ github.repository }}