@spec-wave/cli 0.15.0 → 0.16.1
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/README.md +1 -0
- package/bin/spec-wave.mjs +44 -5
- package/package.json +8 -2
- package/src/agent/anthropic-agent.mjs +337 -0
- package/src/agent/errors.mjs +33 -0
- package/src/agent/index.mjs +108 -0
- package/src/agent/openrouter-agent.mjs +378 -0
- package/src/agent/run-types.mjs +59 -0
- package/src/agent/telemetry.mjs +54 -0
- package/src/agent/tools.mjs +452 -0
- package/src/agent/tracing.mjs +106 -0
- package/src/api/github-graphql.mjs +23 -1
- package/src/api/github-rest.mjs +8 -0
- package/src/commands/bug.mjs +8 -0
- package/src/commands/code-review.mjs +45 -4
- package/src/commands/decompose.mjs +22 -72
- package/src/commands/dev-agent.mjs +3 -3
- package/src/commands/doctor.mjs +77 -6
- package/src/commands/generate-bug.mjs +195 -0
- package/src/commands/generate-plan.mjs +19 -44
- package/src/commands/generate-spec.mjs +18 -46
- package/src/commands/implement.mjs +105 -2
- package/src/commands/init.mjs +3 -3
- package/src/commands/install-skill.mjs +72 -16
- package/src/commands/issue.mjs +9 -7
- package/src/commands/move.mjs +11 -1
- package/src/commands/qa.mjs +23 -2
- package/src/commands/refresh.mjs +171 -5
- package/src/commands/triage.mjs +174 -0
- package/src/commands/update.mjs +16 -3
- package/src/commands/validate.mjs +82 -10
- package/src/config.mjs +159 -1
- package/src/lib/bug-context.mjs +160 -0
- package/src/lib/bug-doc.mjs +51 -0
- package/src/lib/bug-triage.mjs +81 -0
- package/src/lib/claude.mjs +71 -254
- package/src/lib/critique.mjs +43 -30
- package/src/lib/flow-run.mjs +145 -0
- package/src/lib/implement-board.mjs +12 -1
- package/src/lib/plugin-skills.mjs +122 -0
- package/src/lib/project-root.mjs +9 -2
- package/src/lib/prompt-loader.mjs +257 -0
- package/src/lib/skill-file.mjs +35 -0
- package/src/plugin/.claude-plugin/plugin.json +20 -0
- package/src/plugin/README.md +73 -0
- package/src/plugin/skills/bug/SKILL.md +60 -0
- package/src/plugin/skills/bug/model-prompt.critique.md +48 -0
- package/src/plugin/skills/bug/model-prompt.md +74 -0
- package/src/plugin/skills/decompose/SKILL.md +117 -0
- package/src/plugin/skills/decompose/model-prompt.critique.md +46 -0
- package/src/plugin/skills/decompose/model-prompt.feature.md +69 -0
- package/src/plugin/skills/decompose/model-prompt.rfc.md +52 -0
- package/src/plugin/skills/doctor/SKILL.md +51 -0
- package/src/plugin/skills/fix-pr/SKILL.md +130 -0
- package/src/plugin/skills/implement/SKILL.md +102 -0
- package/src/plugin/skills/info/SKILL.md +40 -0
- package/src/plugin/skills/issue/SKILL.md +63 -0
- package/src/plugin/skills/move/SKILL.md +52 -0
- package/src/plugin/skills/order/SKILL.md +36 -0
- package/src/plugin/skills/plan/SKILL.md +58 -0
- package/src/plugin/skills/plan/model-prompt.critique.md +44 -0
- package/src/plugin/skills/plan/model-prompt.md +59 -0
- package/src/plugin/skills/plan/reference/tech-context.md +56 -0
- package/src/plugin/skills/ready/SKILL.md +44 -0
- package/src/plugin/skills/rfc/SKILL.md +47 -0
- package/src/plugin/skills/setup/SKILL.md +67 -0
- package/src/plugin/skills/spec/SKILL.md +55 -0
- package/src/plugin/skills/spec/model-prompt.md +61 -0
- package/src/plugin/skills/story/SKILL.md +49 -0
- package/src/plugin/skills/task/SKILL.md +41 -0
- package/src/plugin/skills/triage/SKILL.md +52 -0
- package/src/plugin/skills/uninstall/SKILL.md +43 -0
- package/src/plugin/skills/update/SKILL.md +51 -0
- package/src/plugin/skills/workflow/SKILL.md +158 -0
- package/src/templates/skill/SKILL.md +54 -4
- package/src/templates/workflows/generate-bug.yml +36 -0
- package/src/templates/workflows/validate.yml +2 -1
- package/src/ui/wizard.mjs +5 -2
|
@@ -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|issue|feature|spec|plan|ready|decompose|order|implement|task|story|move|uninstall|rfc|fix-pr] [target]"
|
|
4
|
+
argument-hint: "[info|setup|update|doctor|issue|feature|spec|plan|ready|decompose|order|implement|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 *)
|
|
@@ -76,7 +76,7 @@ Exceção: se o usuário pedir explicitamente para revisar ou melhorar um docume
|
|
|
76
76
|
## Fluxo Kanban
|
|
77
77
|
|
|
78
78
|
```
|
|
79
|
-
📥 Backlog → 🎯 Priorizado → 📋 Spec → 📋 Plan → ✅ Ready
|
|
79
|
+
📥 Backlog → 🐞 Triagem → 🎯 Priorizado → 📋 Spec → 📋 Plan → ✅ Ready
|
|
80
80
|
→ 🚧 Desenvolvimento → 👀 Code Review
|
|
81
81
|
→ 🧪 QA → 📋 Homologação → 🚀 Deploy → 🎉 Done
|
|
82
82
|
```
|
|
@@ -90,7 +90,7 @@ Essa é a sequência completa, mas **cada tipo de artefato percorre só um trech
|
|
|
90
90
|
| **Story** | **✅ Ready** (criada pelo `decompose-apply`) | 🚧 Desenvolvimento → 👀 Code Review → 🧪 QA → 📋 Homologação → 🎉 Done | **Nunca nasce em 📥 Backlog.** |
|
|
91
91
|
| **Task** | **✅ Ready** (criada pelo `decompose-apply`) | 🚧 Desenvolvimento → 🎉 Done | **Não** passa por Code Review, QA nem Homologação — só `task start` e `task done`. |
|
|
92
92
|
| **RFC** | 📥 Backlog | decompõe direto em **Tasks** (que nascem em ✅ Ready) | Não usa spec/plan. |
|
|
93
|
-
| **Bug** |
|
|
93
|
+
| **Bug** | **🐞 Triagem** (reportado) ou **✅ Ready** (achado em QA/Homologação/review) | ✅ Ready → 🚧 Desenvolvimento → 👀 Code Review → 🧪 QA → 🚀 Deploy → 🎉 Done | Não passa por 🎯 Priorizado, 📋 Spec, 📋 Plan nem 📋 Homologação. Bug **P0** nasce direto em ✅ Ready — a triagem é confirmada depois. |
|
|
94
94
|
| **Spike** | 📥 Backlog | **movido só à mão pelo usuário** | Nunca avance a Etapa de um Spike por conta própria. |
|
|
95
95
|
|
|
96
96
|
**Regra da Etapa:** a Etapa **só avança, nunca retrocede**. O campo **Status** (Todo / In Progress / Done) mede o progresso *dentro* da Etapa e reinicia a cada avanço. Prefira sempre os comandos da CLI (`move`, `task start|done`, `story review`) a mutações manuais no board — eles embutem essas regras.
|
|
@@ -101,12 +101,14 @@ Labels de gatilho:
|
|
|
101
101
|
- `spec-wave:ready` → dispara `validate.yml` → valida ambos os arquivos
|
|
102
102
|
- `spec-wave:decompose` → dispara `decompose.yml` → gera (ou **re-critica**) o **rascunho** em `decomposition.md`. **Não cria issue nenhuma.**
|
|
103
103
|
- `spec-wave:decompose-apply` → dispara o mesmo workflow em modo aplicação → cria as Stories e Tasks **a partir do rascunho revisado**
|
|
104
|
+
- `spec-wave:bug` → dispara `generate-bug.yml` → gera `docs/bugs/<slug>/bug.md` (só para issues `[BUG]`)
|
|
104
105
|
|
|
105
106
|
Labels de **estado** (gravadas pelas automações — **não** são gatilhos, não as adicione por conta própria):
|
|
106
107
|
- `spec-wave:decompose-ready` → o rascunho da decomposição passou pela crítica e espera **revisão humana**; aplique `spec-wave:decompose-apply` para criar as issues
|
|
107
108
|
- `spec-wave:critique-failed` → a crítica adversarial apontou contradições **graves**; **bloqueia** o `spec-wave:ready` até ser removida (veja *Crítica adversarial* abaixo)
|
|
108
109
|
- `spec-wave:needs-human` → a crítica reprovou N vezes seguidas (default 3); **para o fluxo** até uma pessoa revisar e remover a label
|
|
109
110
|
- `spec-wave:decomposed` → a Feature/RFC já foi decomposta; o `decompose` pula silenciosamente enquanto ela existir (veja *Guard de idempotência* abaixo)
|
|
111
|
+
- `spec-wave:bug-approved` → o `bug.md` passou na validação das seis seções obrigatórias
|
|
110
112
|
|
|
111
113
|
Label **modificadora** (esta você pode aplicar):
|
|
112
114
|
- `spec-wave:model:<apelido>` → força um modelo específico **naquela execução**, resolvido por `ai.modelAliases` no `.spec-wave.json`. Serve para reprocessar um caso difícil num modelo mais forte sem editar a configuração do repositório inteiro. Duas dessas labels na mesma issue = ambíguo, nenhuma vale.
|
|
@@ -662,7 +664,7 @@ Aciona o spec-kit para implementar uma **Feature** (todas as Stories pendentes,
|
|
|
662
664
|
```
|
|
663
665
|
- Se o spec-kit **não** estiver configurado, o comando só monta o contexto e mostra como configurar (`specKit.command` / `SPEC_WAVE_IMPLEMENT_CMD`). Ajude o usuário a definir o template (placeholders: `{tasksFile} {specFile} {planFile} {issue} {type} {title}`).
|
|
664
666
|
- Use `--feature-dir docs/features/<slug>` se a resolução automática da Feature falhar (a skill avisa com warning) e você quiser anexar `spec.md`/`plan.md` como contexto.
|
|
665
|
-
6. **No modo Feature**, siga o contexto Story a Story, na ordem listada: para cada Story pendente, implemente as Tasks com `task start`/`task done`, depois commit + PR + `npx @spec-wave/cli@latest story review <n>`; só então passe à próxima Story. Se a issue
|
|
667
|
+
6. **No modo Feature**, siga o contexto Story a Story, na ordem listada: para cada Story pendente, implemente as Tasks com `task start`/`task done`, depois commit + PR + `npx @spec-wave/cli@latest story review <n>`; só então passe à próxima Story. **Bug** tem modo próprio (RFC-004): sem tasks e sem spec/plan, com quatro fases — reproduzir → causa raiz → fix mínimo → teste de regressão — e o `bug.md` entrando como hipótese a confirmar. Se a issue não for Feature, Story, Task nem Bug (ex.: Spike, Epic), o comando recusa. Feature **sem Stories** → rode `/spec-wave decompose` primeiro. **Ciclo de dependências** → corrija as linhas `Depende de:` (veja `spec-wave order`).
|
|
666
668
|
7. Ao final (Tasks em **🎉 Done**, Story em **👀 Code Review**; a Feature só vai para Code Review quando a última Story concluir — no modo Feature, isso acontece dentro da mesma execução): confirme o resultado com o usuário e oriente a revisão dos PRs.
|
|
667
669
|
|
|
668
670
|
---
|
|
@@ -690,6 +692,54 @@ Crie um documento RFC seguindo a estrutura do RFC-001.
|
|
|
690
692
|
|
|
691
693
|
---
|
|
692
694
|
|
|
695
|
+
### `/spec-wave bug <número-da-issue>`
|
|
696
|
+
|
|
697
|
+
Gera o **`bug.md`** de um defeito: `docs/bugs/<slug>/bug.md`, com reprodução, causa raiz, escopo do fix e teste de regressão.
|
|
698
|
+
|
|
699
|
+
> **Nunca escreva o `bug.md` à mão.** Aplique a label e deixe o Action gerar — é isso que garante o arquivo commitado e referenciado na issue.
|
|
700
|
+
|
|
701
|
+
**Por que não spec/plan:** um Bug não gera especificação funcional nem plano técnico. Esses documentos pedem critérios de aceite, requisitos não-funcionais e plano de rollback — peso desproporcional para um defeito. O `bug.md` tem seis seções e uma finalidade: permitir que outra pessoa (ou o dev-agent) reproduza, entenda e corrija, com prova de que corrigiu.
|
|
702
|
+
|
|
703
|
+
**Passos:**
|
|
704
|
+
|
|
705
|
+
1. Confirme que a issue é do tipo **Bug** (para outros tipos o Action pula, remove a label e comenta).
|
|
706
|
+
2. `gh issue edit <n> --add-label "spec-wave:bug"`
|
|
707
|
+
3. Avise: o Action `generate-bug.yml` gera e commita o arquivo.
|
|
708
|
+
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.
|
|
709
|
+
5. Validar: `spec-wave:ready` → confere as seis seções e aplica `spec-wave:bug-approved`.
|
|
710
|
+
|
|
711
|
+
**Seções obrigatórias** (o validador as compara byte a byte — não renomeie ao editar):
|
|
712
|
+
`Reprodução` · `Esperado e Obtido` · `Impacto e Severidade` · `Causa Raiz` · `Escopo do Fix` · `Teste de Regressão`
|
|
713
|
+
|
|
714
|
+
**Quando é obrigatório:** **P0** dispensa (o fix não espera documento); **P1** recomendado; **P2/P3** obrigatório antes de o bug entrar na fila técnica (✅ Ready).
|
|
715
|
+
|
|
716
|
+
**Se a crítica reprovar** (`spec-wave:critique-failed`), os três alvos mais comuns são: 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.
|
|
717
|
+
|
|
718
|
+
**Relato insuficiente** produz "Causa raiz não determinada" com hipóteses — isso é o 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.
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
722
|
+
### `/spec-wave triage <accept|reject|duplicate> <número>`
|
|
723
|
+
|
|
724
|
+
Desfecho da triagem de um Bug (RFC-004 §4.1) — o mesmo que a tela de Bugs do PM oferece, pelo terminal.
|
|
725
|
+
|
|
726
|
+
```bash
|
|
727
|
+
npx @spec-wave/cli@latest triage accept 42
|
|
728
|
+
npx @spec-wave/cli@latest triage accept 42 --severity P1 # reclassifica ao aceitar
|
|
729
|
+
npx @spec-wave/cli@latest triage reject 42 --reason "comportamento esperado"
|
|
730
|
+
npx @spec-wave/cli@latest triage duplicate 42 --of 17
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
- **accept** → ✅ Ready, com a label `spec-wave:triaged`.
|
|
734
|
+
- **reject** e **duplicate** → **fecham** a issue e **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`.
|
|
735
|
+
- `duplicate` comenta **nas duas** issues — sem isso, quem acompanha a original não fica sabendo que há outro relato.
|
|
736
|
+
|
|
737
|
+
**Portão de aceite:** **P2/P3** exigem o `bug.md` validado (`spec-wave:bug-approved`) antes da fila. **P0/P1** dispensam — esperar o documento custa mais que investigar durante a correção. E `spec-wave:critique-failed` ou `spec-wave:needs-human` bloqueiam **qualquer** severidade: aceitar um bug cujo documento foi reprovado é justamente o que o portão existe para evitar.
|
|
738
|
+
|
|
739
|
+
Para criar um Bug: `npx @spec-wave/cli@latest bug --title "..." [--parent <n>] [--priority P2]`. Ele nasce em **🐞 Triagem** — ou direto em **✅ Ready** se for **P0**.
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
693
743
|
### `/spec-wave fix-pr <número-do-pr>`
|
|
694
744
|
|
|
695
745
|
Audita um Pull Request e corrige automaticamente os problemas encontrados — segurança, arquitetura, infraestrutura e qualidade de código. Cada fix vira um commit separado no branch do PR. Cada review comment recebe uma resposta com o hash do commit.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: Generate Bug
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [labeled]
|
|
6
|
+
|
|
7
|
+
concurrency:
|
|
8
|
+
group: spec-wave-generate-bug-${{ github.event.issue.number }}
|
|
9
|
+
cancel-in-progress: false
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
generate-bug:
|
|
13
|
+
if: >
|
|
14
|
+
github.event.label.name == 'spec-wave:bug' &&
|
|
15
|
+
contains(github.event.issue.title, '[BUG]')
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
issues: write
|
|
19
|
+
contents: write
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
25
|
+
|
|
26
|
+
- uses: actions/setup-node@v4
|
|
27
|
+
with:
|
|
28
|
+
node-version: '24'
|
|
29
|
+
|
|
30
|
+
- name: Generate bug.md
|
|
31
|
+
run: npx @spec-wave/cli@{{CLI_VERSION}} generate-bug --issue-number ${{ github.event.issue.number }}
|
|
32
|
+
env:
|
|
33
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
34
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
35
|
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
|
36
|
+
GITHUB_REPOSITORY: ${{ github.repository }}
|
|
@@ -12,7 +12,8 @@ jobs:
|
|
|
12
12
|
validate:
|
|
13
13
|
if: >
|
|
14
14
|
github.event.label.name == 'spec-wave:ready' &&
|
|
15
|
-
contains(github.event.issue.title, '[FEATURE]')
|
|
15
|
+
(contains(github.event.issue.title, '[FEATURE]') ||
|
|
16
|
+
contains(github.event.issue.title, '[BUG]'))
|
|
16
17
|
runs-on: ubuntu-latest
|
|
17
18
|
permissions:
|
|
18
19
|
issues: write
|
package/src/ui/wizard.mjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import { execSync } from 'node:child_process';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
AI_PROVIDERS, getProvider, DEFAULT_PROVIDER, WORKFLOW_FILES, ISSUE_TEMPLATE_FILES,
|
|
5
|
+
STATUS_OPTIONS, CUSTOM_FIELDS, ALL_LABELS,
|
|
6
|
+
} from '../config.mjs';
|
|
4
7
|
|
|
5
8
|
export async function runWizard() {
|
|
6
9
|
p.intro('spec-wave — configuração do fluxo spec-driven');
|
|
@@ -62,7 +65,7 @@ export async function runWizard() {
|
|
|
62
65
|
|
|
63
66
|
confirm: ({ results }) =>
|
|
64
67
|
p.confirm({
|
|
65
|
-
message: `Configurar ${results.repo} com GitHub Project "${results.projectTitle}"?\n -
|
|
68
|
+
message: `Configurar ${results.repo} com GitHub Project "${results.projectTitle}"?\n - ${STATUS_OPTIONS.length} colunas kanban\n - ${CUSTOM_FIELDS.length} campos customizados\n - ${ALL_LABELS.length} labels\n - ${WORKFLOW_FILES.length} workflows + ${ISSUE_TEMPLATE_FILES.length} issue templates`,
|
|
66
69
|
initialValue: true,
|
|
67
70
|
}),
|
|
68
71
|
},
|