@spec-wave/cli 0.28.0 → 0.29.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 +1 -1
- package/src/api/github-graphql.mjs +37 -0
- package/src/api/github-rest.mjs +21 -0
- package/src/cli.mjs +39 -2
- package/src/commands/audit.mjs +280 -0
- package/src/commands/implement.mjs +12 -0
- package/src/commands/merge.mjs +292 -0
- package/src/commands/move.mjs +26 -11
- package/src/commands/order.mjs +42 -0
- package/src/commands/run.mjs +4 -3
- package/src/lib/board.mjs +18 -2
- package/src/lib/critique.mjs +64 -8
- package/src/lib/pr-step.mjs +12 -7
- package/src/lib/spec-audit.mjs +372 -0
- package/src/lib/tech-context.mjs +20 -14
- package/src/plugin/.claude-plugin/plugin.json +1 -1
- package/src/plugin/skills/audit/SKILL.md +34 -0
- package/src/plugin/skills/audit/model-prompt.critique.md +34 -0
- package/src/plugin/skills/merge/SKILL.md +34 -0
- package/src/plugin/skills/order/SKILL.md +1 -0
- package/src/plugin/skills/plan/model-prompt.md +1 -0
- package/src/plugin/skills/plan/reference/tech-context.md +6 -0
- package/src/plugin/skills/preparar-feature/SKILL.md +3 -1
- package/src/plugin/skills/preparar-specs/SKILL.md +21 -1
- package/src/plugin/skills/preparar-specs/reference/revisao.md +5 -2
- package/src/templates/config/tech_context.yml +13 -0
- package/src/templates/skill/SKILL.md +30 -4
- package/src/templates/workflows/qa.yml +9 -1
|
@@ -40,3 +40,16 @@ existing_services:
|
|
|
40
40
|
internal_libraries:
|
|
41
41
|
- "shared-logger"
|
|
42
42
|
- "db-client (TypeORM)"
|
|
43
|
+
|
|
44
|
+
# Decisões de modelagem de recursos COMPARTILHADOS entre features (opcional).
|
|
45
|
+
#
|
|
46
|
+
# `criada_por:` é obrigatório em cada entrada: a Feature que cria o recurso
|
|
47
|
+
# (ex.: "FT-01.7" ou "#42"), ou o literal SEM DONO enquanto ninguém o criar.
|
|
48
|
+
# "Não existe feature para editar esses valores" escrito em prosa fica meses
|
|
49
|
+
# sem ninguém agir; SEM DONO aparece no `spec-wave audit` como pendência de
|
|
50
|
+
# checklist antes de planejar a milestone.
|
|
51
|
+
#
|
|
52
|
+
# decisoes_de_modelagem:
|
|
53
|
+
# - recurso: "custo_canal"
|
|
54
|
+
# decisao: "Tabela própria; valores editados por ADMIN, consumidos por 4 features"
|
|
55
|
+
# criada_por: "SEM DONO"
|
|
@@ -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|bug|triage|fix-pr] [target]"
|
|
4
|
+
argument-hint: "[info|setup|update|doctor|preflight|audit|issue|feature|spec|plan|ready|decompose|order|implement|merge|task|story|move|uninstall|rfc|bug|triage|fix-pr] [target]"
|
|
5
5
|
user-invocable: true
|
|
6
6
|
allowed-tools:
|
|
7
7
|
- Bash(npx @spec-wave/cli@latest *)
|
|
@@ -77,7 +77,7 @@ npx @spec-wave/cli@latest mode # estado atual dos dois lados do
|
|
|
77
77
|
npx @spec-wave/cli@latest mode local # desarma os workflows
|
|
78
78
|
npx @spec-wave/cli@latest run <issue> --dry-run # explica o próximo passo sem executar
|
|
79
79
|
npx @spec-wave/cli@latest run <issue> # executa
|
|
80
|
-
npx @spec-wave/cli@latest run --pr <n> # code-review (+ qa, se
|
|
80
|
+
npx @spec-wave/cli@latest run --pr <n> # code-review (+ qa, se aprovado OU mergeado)
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
O `run` decide o passo pelo estado da issue (documentos existentes + labels), respeita os portões humanos (`needs-human`, `critique-failed`), recusa rodar com uma label de gatilho pendente e **exige `--apply`** para o `decompose-apply`, que cria issues. Sempre mostre o `--dry-run` ao usuário antes de executar.
|
|
@@ -253,7 +253,33 @@ Sem flags. Roda um checklist de diagnóstico no repositório atual: token GitHub
|
|
|
253
253
|
|----------|------|-----------|
|
|
254
254
|
| `<feature>` | string (obrigatório) | Número da issue da **Feature**, ex.: `12` ou `#12`. Argumento posicional. |
|
|
255
255
|
|
|
256
|
-
> **Sem argumento**, monta o mapa de TODAS as Features abertas fora de 🎉 Done num grafo só (conjunto vindo do board), com a Feature de cada Story ao lado — nesse escopo a dependência entre Features entra na ordenação. Com `<feature>`, lista as Stories da Feature em **ordem topológica** pelas dependências (linha `Depende de: #N` 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`)
|
|
256
|
+
> **Sem argumento**, monta o mapa de TODAS as Features abertas fora de 🎉 Done num grafo só (conjunto vindo do board), com a Feature de cada Story ao lado — nesse escopo a dependência entre Features entra na ordenação. Com `<feature>`, lista as Stories da Feature em **ordem topológica** pelas dependências (linha `Depende de: #N` 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`), sobre **dependências fora de ordem** (Story já em Desenvolvimento+ dependendo de outra que não está Done) e sobre **milestone divergente** (Story sem milestone ou em milestone diferente do da Feature — órfã de toda visão de release; sem milestone na Feature, nada é comparado). Use antes de escolher qual Story implementar, e logo após o `decompose --apply` como detector do pós-apply.
|
|
257
|
+
|
|
258
|
+
### `@spec-wave/cli preflight --milestone <nome>` — confere tudo ANTES de gerar as specs (comando LOCAL)
|
|
259
|
+
| Flag/Arg | Tipo | Descrição |
|
|
260
|
+
|----------|------|-----------|
|
|
261
|
+
| `--milestone <nome>` | string (obrigatório) | Título da milestone a inventariar. |
|
|
262
|
+
| `--json` | boolean | O relatório em JSON, para ramificar. |
|
|
263
|
+
|
|
264
|
+
> Um comando reporta: token utilizável, modo de execução (config × variável do repositório), publicação por PR, e as Features da milestone com o **estado do `spec.md` de cada uma** (na base, no disco, em PR aberto, em branch sem PR, a gerar). Existe porque **cada geração paga um modelo**: um erro de configuração descoberto na sétima Feature custa sete gerações — e regenerar um documento que já vive num PR descarta a revisão em curso. Sai com código 1 quando há bloqueio. Rode SEMPRE antes de uma rodada de specs por milestone.
|
|
265
|
+
|
|
266
|
+
### `@spec-wave/cli audit --milestone <nome>` — cruza as specs da milestone como CONJUNTO (comando LOCAL)
|
|
267
|
+
| Flag/Arg | Tipo | Descrição |
|
|
268
|
+
|----------|------|-----------|
|
|
269
|
+
| `--milestone <nome>` | string (obrigatório) | Título da milestone a auditar. |
|
|
270
|
+
| `--critique` | boolean | Roda também a **crítica adversarial de conjunto** — UMA chamada de modelo sobre todas as specs juntas, procurando contradição ENTRE documentos. |
|
|
271
|
+
| `--json` | boolean | O relatório em JSON (com `critica.markdown` pronto para comentar nas issues). |
|
|
272
|
+
|
|
273
|
+
> A crítica normal audita cada documento contra os insumos da **mesma** Feature; este comando olha o que só existe **no par**: dependência circular entre Features, bloqueante em milestone **posterior** à de quem depende dela, referência a issue inexistente (materiais — exit 1), dependência que nenhuma Feature cria ("recurso sem dono"), sobreposição do slug com código existente e decisão de modelagem com `criada_por: SEM DONO` no `tech_context.yml` (avisos heurísticos — **confira antes de reportar**). Rode depois que as specs existirem (PR aberto também conta), antes de gerar os planos. Achado material é decisão de PO: comente nas issues **dos dois lados**.
|
|
274
|
+
|
|
275
|
+
### `@spec-wave/cli merge <feature>` — mergeia os PRs empilhados das Stories (comando LOCAL)
|
|
276
|
+
| Flag/Arg | Tipo | Descrição |
|
|
277
|
+
|----------|------|-----------|
|
|
278
|
+
| `<feature>` | string (obrigatório) | Número da issue da **Feature**, ex.: `12` ou `#12`. |
|
|
279
|
+
| `--yes` | boolean | Executa os merges. **Sem ela, só mostra o plano** (fila na ordem, retargets, avisos). |
|
|
280
|
+
| `--keep-branches` | boolean | Não apaga as branches das Stories após o merge. |
|
|
281
|
+
|
|
282
|
+
> O `implement` empilha os PRs (cada um baseado no anterior) e o merge da pilha é **ordem-dependente**: `--delete-branch` no primeiro PR fecha o segundo. Este comando encapsula a sequência segura — para cada PR na ordem topológica das Stories: reaponta a base para a default, mergeia com **merge commit**, atualiza o board (**merge move até 🧪 QA**) e **só no fim** apaga as branches. **PR em rascunho bloqueia o plano inteiro** (marcar pronto é a revisão humana — o comando não pula isso). Rodar de novo **retoma**: PR mergeado sai do plano. Use após a revisão, em vez de mergear à mão com `gh`.
|
|
257
283
|
|
|
258
284
|
### `@spec-wave/cli task <start|done> <n>` — transições de Task no board (comando LOCAL)
|
|
259
285
|
| Flag/Arg | Tipo | Descrição |
|
|
@@ -692,7 +718,7 @@ Aciona o spec-kit para implementar uma **Feature** (todas as Stories pendentes,
|
|
|
692
718
|
- 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}`).
|
|
693
719
|
- 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.
|
|
694
720
|
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`).
|
|
695
|
-
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.
|
|
721
|
+
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. **Avise que os PRs estão empilhados** e que o merge é ordem-dependente: depois da revisão (PRs marcados prontos), o caminho é `npx @spec-wave/cli@latest merge <feature>` — nunca `gh pr merge --delete-branch` à mão em PR de pilha.
|
|
696
722
|
|
|
697
723
|
---
|
|
698
724
|
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
name: QA
|
|
2
2
|
|
|
3
|
+
# Dois gatilhos, um destino: aprovação formal OU merge movem a Feature para
|
|
4
|
+
# 🧪 QA. O de merge existe porque o autor não consegue aprovar o próprio PR —
|
|
5
|
+
# num fluxo solo, QA por aprovação nunca aconteceria — e porque homologação de
|
|
6
|
+
# verdade começa com o código integrado. Espelha o `run --pr` do modo local.
|
|
3
7
|
on:
|
|
4
8
|
pull_request_review:
|
|
5
9
|
types: [submitted]
|
|
10
|
+
pull_request:
|
|
11
|
+
types: [closed]
|
|
6
12
|
|
|
7
13
|
concurrency:
|
|
8
14
|
group: spec-wave-qa-${{ github.event.pull_request.number }}
|
|
@@ -25,10 +31,12 @@ jobs:
|
|
|
25
31
|
# Aqui a guarda é INDISPENSÁVEL, não defensiva: `pull_request_review`
|
|
26
32
|
# dispara por uma aprovação HUMANA, independentemente de quem abriu o
|
|
27
33
|
# PR. Aprovar o PR da spec moveria a Feature para 🧪 QA.
|
|
34
|
+
# A última linha aceita os dois eventos: review aprovada (pull_request_review)
|
|
35
|
+
# ou PR fechado COM merge (pull_request closed — fechado sem merge não conta).
|
|
28
36
|
if: >
|
|
29
37
|
vars.SPEC_WAVE_EXECUTION != 'local' &&
|
|
30
38
|
!startsWith(github.event.pull_request.head.ref, 'spec-wave/') &&
|
|
31
|
-
github.event.review.state == 'approved'
|
|
39
|
+
(github.event.review.state == 'approved' || github.event.pull_request.merged == true)
|
|
32
40
|
runs-on: ubuntu-latest
|
|
33
41
|
permissions:
|
|
34
42
|
issues: write
|