@spec-wave/cli 0.26.0 → 0.28.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.
Files changed (45) hide show
  1. package/package.json +1 -1
  2. package/src/api/github-rest.mjs +52 -0
  3. package/src/cli.mjs +12 -0
  4. package/src/commands/decompose.mjs +166 -39
  5. package/src/commands/doctor.mjs +214 -3
  6. package/src/commands/generate-bug.mjs +22 -16
  7. package/src/commands/generate-plan.mjs +72 -23
  8. package/src/commands/generate-spec.mjs +19 -15
  9. package/src/commands/implement.mjs +47 -22
  10. package/src/commands/install-skill.mjs +18 -8
  11. package/src/commands/preflight.mjs +322 -0
  12. package/src/commands/run.mjs +51 -30
  13. package/src/commands/update.mjs +143 -12
  14. package/src/commands/validate.mjs +84 -17
  15. package/src/config.mjs +18 -0
  16. package/src/lib/artifact-pr.mjs +272 -0
  17. package/src/lib/artifact-publish.mjs +169 -0
  18. package/src/lib/doc-availability.mjs +23 -1
  19. package/src/lib/doc-source.mjs +162 -0
  20. package/src/lib/flow-run.mjs +9 -218
  21. package/src/lib/next-step.mjs +27 -4
  22. package/src/lib/pr-branch.mjs +106 -7
  23. package/src/lib/repo-links.mjs +8 -2
  24. package/src/plugin/.claude-plugin/plugin.json +1 -1
  25. package/src/plugin/README.md +5 -0
  26. package/src/plugin/skills/bug/SKILL.md +2 -2
  27. package/src/plugin/skills/decompose/SKILL.md +4 -4
  28. package/src/plugin/skills/plan/SKILL.md +1 -1
  29. package/src/plugin/skills/preparar-feature/SKILL.md +245 -0
  30. package/src/plugin/skills/preparar-feature/reference/critica.md +88 -0
  31. package/src/plugin/skills/preparar-specs/SKILL.md +171 -0
  32. package/src/plugin/skills/preparar-specs/reference/armadilhas.md +209 -0
  33. package/src/plugin/skills/preparar-specs/reference/revisao.md +107 -0
  34. package/src/plugin/skills/run/SKILL.md +3 -1
  35. package/src/plugin/skills/spec/SKILL.md +4 -4
  36. package/src/plugin/skills/update/SKILL.md +10 -4
  37. package/src/plugin/skills/workflow/SKILL.md +8 -3
  38. package/src/templates/skill/SKILL.md +13 -10
  39. package/src/templates/workflows/code-review.yml +13 -2
  40. package/src/templates/workflows/critique.yml +1 -1
  41. package/src/templates/workflows/decompose.yml +13 -2
  42. package/src/templates/workflows/generate-bug.yml +17 -6
  43. package/src/templates/workflows/generate-plan.yml +20 -7
  44. package/src/templates/workflows/generate-spec.yml +20 -7
  45. package/src/templates/workflows/qa.yml +13 -0
@@ -5,12 +5,11 @@ on:
5
5
  types: [labeled]
6
6
 
7
7
  # Trava por ITEM, no mesmo namespace de generate-spec/plan/decompose e do job
8
- # `move` do code-review.yml. Este job GRAVA no repositório (commit + pull
9
- # --rebase + push na branch default) e escreve o relatório de uso no comentário
10
- # da issue com leitura-modificação-escrita; a trava impede que outro job do
11
- # spec-wave na MESMA issue faça as duas coisas ao mesmo tempo. Entre issues
12
- # diferentes a disputa é resolvida no laço de repetição de push do
13
- # lib/flow-run.mjs — serializar o repositório inteiro mataria a vazão.
8
+ # `move` do code-review.yml. Este job PUBLICA um documento (branch própria +
9
+ # Pull Request) e escreve o relatório de uso no comentário da issue com
10
+ # leitura-modificação-escrita; a trava impede que outro job do spec-wave na
11
+ # MESMA issue faça as duas coisas ao mesmo tempo. Entre issues diferentes não há
12
+ # mais disputa: cada documento tem a sua branch.
14
13
  concurrency:
15
14
  # Um run que NÃO vai fazer nada não pode disputar este grupo.
16
15
  #
@@ -42,6 +41,17 @@ jobs:
42
41
  permissions:
43
42
  issues: write
44
43
  contents: write
44
+ # `contents: write` continua necessário: o commit vai por Git Data API
45
+ # (createTree/createCommit/createRef), que é autorizada por ele. O que
46
+ # mudou foi o DESTINO — branch própria do documento, nunca a default.
47
+ #
48
+ # `pull-requests: write` é a permissão NOVA deste fluxo. Sem ela o commit
49
+ # é criado e o PR não, e o documento fica numa branch que ninguém vê.
50
+ #
51
+ # Atenção: o GITHUB_TOKEN só abre PR se "Allow GitHub Actions to create and
52
+ # approve pull requests" estiver ligado (Settings → Actions → General) —
53
+ # desligado por padrão em muitas organizações. `GH_PR_TOKEN` é a saída.
54
+ pull-requests: write
45
55
 
46
56
  steps:
47
57
  - uses: actions/checkout@v4
@@ -59,6 +69,7 @@ jobs:
59
69
  run: spec-wave generate-bug --issue-number ${{ github.event.issue.number }}
60
70
  env:
61
71
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
72
+ GH_PR_TOKEN: ${{ secrets.GH_PR_TOKEN }}
62
73
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
63
74
  CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
64
75
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
@@ -7,18 +7,19 @@ on:
7
7
  # Trava por ITEM, no mesmo namespace do decompose.yml e do job `move` do
8
8
  # code-review.yml. Duas razões:
9
9
  #
10
- # 1. spec, plan e decompose GRAVAM no repositório (commit + pull --rebase +
11
- # push na branch default). Em namespaces separados, aplicar `spec-wave:spec`
12
- # e `spec-wave:plan` juntos na mesma Feature põe os dois para rodar em
13
- # paralelo — e o plan lê o spec.md do checkout, então pode gerar o plano
14
- # sem a spec, em silêncio (generate-plan.mjs:160-169).
10
+ # 1. spec, plan e decompose PUBLICAM documentos (branch própria + Pull
11
+ # Request). Em namespaces separados, aplicar `spec-wave:spec` e
12
+ # `spec-wave:plan` juntos na mesma Feature põe os dois para rodar em
13
+ # paralelo — e o plan lê a spec, que ainda estaria num PR sem merge.
14
+ # Hoje isso é recusa explícita, não plano gerado sem spec; ainda assim,
15
+ # serializar evita queimar um run para descobrir isso.
15
16
  # 2. Os dois escrevem o relatório de uso no MESMO comentário da issue, com
16
17
  # leitura-modificação-escrita (usage-report.mjs:152-160). Em paralelo, um
17
18
  # sobrescreve o custo registrado pelo outro.
18
19
  #
19
20
  # Continua sendo por issue de propósito: serializar o repositório inteiro
20
- # mataria a vazão, e a disputa entre issues diferentes é resolvida onde ela
21
- # acontece no laço de repetição de push do lib/flow-run.mjs.
21
+ # mataria a vazão. A disputa ENTRE issues diferentes deixou de existir — cada
22
+ # documento tem branch própria, e o commit vai por API.
22
23
  concurrency:
23
24
  # Um run que NÃO vai fazer nada não pode disputar este grupo.
24
25
  #
@@ -50,6 +51,17 @@ jobs:
50
51
  permissions:
51
52
  issues: write
52
53
  contents: write
54
+ # `contents: write` continua necessário: o commit vai por Git Data API
55
+ # (createTree/createCommit/createRef), que é autorizada por ele. O que
56
+ # mudou foi o DESTINO — branch própria do documento, nunca a default.
57
+ #
58
+ # `pull-requests: write` é a permissão NOVA deste fluxo. Sem ela o commit
59
+ # é criado e o PR não, e o documento fica numa branch que ninguém vê.
60
+ #
61
+ # Atenção: o GITHUB_TOKEN só abre PR se "Allow GitHub Actions to create and
62
+ # approve pull requests" estiver ligado (Settings → Actions → General) —
63
+ # desligado por padrão em muitas organizações. `GH_PR_TOKEN` é a saída.
64
+ pull-requests: write
53
65
 
54
66
  steps:
55
67
  - uses: actions/checkout@v4
@@ -67,6 +79,7 @@ jobs:
67
79
  run: spec-wave generate-plan --issue-number ${{ github.event.issue.number }}
68
80
  env:
69
81
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
82
+ GH_PR_TOKEN: ${{ secrets.GH_PR_TOKEN }}
70
83
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
71
84
  CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
72
85
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
@@ -7,18 +7,19 @@ on:
7
7
  # Trava por ITEM, no mesmo namespace do decompose.yml e do job `move` do
8
8
  # code-review.yml. Duas razões:
9
9
  #
10
- # 1. spec, plan e decompose GRAVAM no repositório (commit + pull --rebase +
11
- # push na branch default). Em namespaces separados, aplicar `spec-wave:spec`
12
- # e `spec-wave:plan` juntos na mesma Feature põe os dois para rodar em
13
- # paralelo — e o plan lê o spec.md do checkout, então pode gerar o plano
14
- # sem a spec, em silêncio (generate-plan.mjs:160-169).
10
+ # 1. spec, plan e decompose PUBLICAM documentos (branch própria + Pull
11
+ # Request). Em namespaces separados, aplicar `spec-wave:spec` e
12
+ # `spec-wave:plan` juntos na mesma Feature põe os dois para rodar em
13
+ # paralelo — e o plan lê a spec, que ainda estaria num PR sem merge.
14
+ # Hoje isso é recusa explícita, não plano gerado sem spec; ainda assim,
15
+ # serializar evita queimar um run para descobrir isso.
15
16
  # 2. Os dois escrevem o relatório de uso no MESMO comentário da issue, com
16
17
  # leitura-modificação-escrita (usage-report.mjs:152-160). Em paralelo, um
17
18
  # sobrescreve o custo registrado pelo outro.
18
19
  #
19
20
  # Continua sendo por issue de propósito: serializar o repositório inteiro
20
- # mataria a vazão, e a disputa entre issues diferentes é resolvida onde ela
21
- # acontece no laço de repetição de push do lib/flow-run.mjs.
21
+ # mataria a vazão. A disputa ENTRE issues diferentes deixou de existir — cada
22
+ # documento tem branch própria, e o commit vai por API.
22
23
  concurrency:
23
24
  # Um run que NÃO vai fazer nada não pode disputar este grupo.
24
25
  #
@@ -50,6 +51,17 @@ jobs:
50
51
  permissions:
51
52
  issues: write
52
53
  contents: write
54
+ # `contents: write` continua necessário: o commit vai por Git Data API
55
+ # (createTree/createCommit/createRef), que é autorizada por ele. O que
56
+ # mudou foi o DESTINO — branch própria do documento, nunca a default.
57
+ #
58
+ # `pull-requests: write` é a permissão NOVA deste fluxo. Sem ela o commit
59
+ # é criado e o PR não, e o documento fica numa branch que ninguém vê.
60
+ #
61
+ # Atenção: o GITHUB_TOKEN só abre PR se "Allow GitHub Actions to create and
62
+ # approve pull requests" estiver ligado (Settings → Actions → General) —
63
+ # desligado por padrão em muitas organizações. `GH_PR_TOKEN` é a saída.
64
+ pull-requests: write
53
65
 
54
66
  steps:
55
67
  - uses: actions/checkout@v4
@@ -67,6 +79,7 @@ jobs:
67
79
  run: spec-wave generate-spec --issue-number ${{ github.event.issue.number }}
68
80
  env:
69
81
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
82
+ GH_PR_TOKEN: ${{ secrets.GH_PR_TOKEN }}
70
83
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
71
84
  CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
72
85
  OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
@@ -13,8 +13,21 @@ jobs:
13
13
  # Modo de execução: `spec-wave mode local` cria a variável de repositório
14
14
  # SPEC_WAVE_EXECUTION=local e este job passa a ser PULADO — run aparece como
15
15
  # skipped e job que não roda não é faturado. `mode actions` remove a variável.
16
+ # PR de DOCUMENTO não é PR de implementação. O fluxo publica spec.md,
17
+ # plan.md, bug.md e decomposition.md em branches `spec-wave/*`, e deixar este
18
+ # workflow rodar em cima delas move o board por um PR que não implementa
19
+ # nada. Nos Actions um PR aberto pelo GITHUB_TOKEN não dispara workflow, mas
20
+ # um aberto no modo local (ou via GH_PR_TOKEN) dispara.
21
+ #
22
+ # A guarda cobre também `spec-wave/update-v*`, do `update --branch` — que
23
+ # tampouco implementa uma Story.
24
+ #
25
+ # Aqui a guarda é INDISPENSÁVEL, não defensiva: `pull_request_review`
26
+ # dispara por uma aprovação HUMANA, independentemente de quem abriu o
27
+ # PR. Aprovar o PR da spec moveria a Feature para 🧪 QA.
16
28
  if: >
17
29
  vars.SPEC_WAVE_EXECUTION != 'local' &&
30
+ !startsWith(github.event.pull_request.head.ref, 'spec-wave/') &&
18
31
  github.event.review.state == 'approved'
19
32
  runs-on: ubuntu-latest
20
33
  permissions: