@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.
Files changed (78) hide show
  1. package/README.md +1 -0
  2. package/bin/spec-wave.mjs +44 -5
  3. package/package.json +8 -2
  4. package/src/agent/anthropic-agent.mjs +337 -0
  5. package/src/agent/errors.mjs +33 -0
  6. package/src/agent/index.mjs +108 -0
  7. package/src/agent/openrouter-agent.mjs +378 -0
  8. package/src/agent/run-types.mjs +59 -0
  9. package/src/agent/telemetry.mjs +54 -0
  10. package/src/agent/tools.mjs +452 -0
  11. package/src/agent/tracing.mjs +106 -0
  12. package/src/api/github-graphql.mjs +23 -1
  13. package/src/api/github-rest.mjs +8 -0
  14. package/src/commands/bug.mjs +8 -0
  15. package/src/commands/code-review.mjs +45 -4
  16. package/src/commands/decompose.mjs +22 -72
  17. package/src/commands/dev-agent.mjs +3 -3
  18. package/src/commands/doctor.mjs +77 -6
  19. package/src/commands/generate-bug.mjs +195 -0
  20. package/src/commands/generate-plan.mjs +19 -44
  21. package/src/commands/generate-spec.mjs +18 -46
  22. package/src/commands/implement.mjs +105 -2
  23. package/src/commands/init.mjs +3 -3
  24. package/src/commands/install-skill.mjs +72 -16
  25. package/src/commands/issue.mjs +9 -7
  26. package/src/commands/move.mjs +11 -1
  27. package/src/commands/qa.mjs +23 -2
  28. package/src/commands/refresh.mjs +171 -5
  29. package/src/commands/triage.mjs +174 -0
  30. package/src/commands/update.mjs +16 -3
  31. package/src/commands/validate.mjs +82 -10
  32. package/src/config.mjs +159 -1
  33. package/src/lib/bug-context.mjs +160 -0
  34. package/src/lib/bug-doc.mjs +51 -0
  35. package/src/lib/bug-triage.mjs +81 -0
  36. package/src/lib/claude.mjs +71 -254
  37. package/src/lib/critique.mjs +43 -30
  38. package/src/lib/flow-run.mjs +145 -0
  39. package/src/lib/implement-board.mjs +12 -1
  40. package/src/lib/plugin-skills.mjs +122 -0
  41. package/src/lib/project-root.mjs +9 -2
  42. package/src/lib/prompt-loader.mjs +257 -0
  43. package/src/lib/skill-file.mjs +35 -0
  44. package/src/plugin/.claude-plugin/plugin.json +20 -0
  45. package/src/plugin/README.md +73 -0
  46. package/src/plugin/skills/bug/SKILL.md +60 -0
  47. package/src/plugin/skills/bug/model-prompt.critique.md +48 -0
  48. package/src/plugin/skills/bug/model-prompt.md +74 -0
  49. package/src/plugin/skills/decompose/SKILL.md +117 -0
  50. package/src/plugin/skills/decompose/model-prompt.critique.md +46 -0
  51. package/src/plugin/skills/decompose/model-prompt.feature.md +69 -0
  52. package/src/plugin/skills/decompose/model-prompt.rfc.md +52 -0
  53. package/src/plugin/skills/doctor/SKILL.md +51 -0
  54. package/src/plugin/skills/fix-pr/SKILL.md +130 -0
  55. package/src/plugin/skills/implement/SKILL.md +102 -0
  56. package/src/plugin/skills/info/SKILL.md +40 -0
  57. package/src/plugin/skills/issue/SKILL.md +63 -0
  58. package/src/plugin/skills/move/SKILL.md +52 -0
  59. package/src/plugin/skills/order/SKILL.md +36 -0
  60. package/src/plugin/skills/plan/SKILL.md +58 -0
  61. package/src/plugin/skills/plan/model-prompt.critique.md +44 -0
  62. package/src/plugin/skills/plan/model-prompt.md +59 -0
  63. package/src/plugin/skills/plan/reference/tech-context.md +56 -0
  64. package/src/plugin/skills/ready/SKILL.md +44 -0
  65. package/src/plugin/skills/rfc/SKILL.md +47 -0
  66. package/src/plugin/skills/setup/SKILL.md +67 -0
  67. package/src/plugin/skills/spec/SKILL.md +55 -0
  68. package/src/plugin/skills/spec/model-prompt.md +61 -0
  69. package/src/plugin/skills/story/SKILL.md +49 -0
  70. package/src/plugin/skills/task/SKILL.md +41 -0
  71. package/src/plugin/skills/triage/SKILL.md +52 -0
  72. package/src/plugin/skills/uninstall/SKILL.md +43 -0
  73. package/src/plugin/skills/update/SKILL.md +51 -0
  74. package/src/plugin/skills/workflow/SKILL.md +158 -0
  75. package/src/templates/skill/SKILL.md +54 -4
  76. package/src/templates/workflows/generate-bug.yml +36 -0
  77. package/src/templates/workflows/validate.yml +2 -1
  78. package/src/ui/wizard.mjs +5 -2
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: spec-wave-implement
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Bash(gh issue *)
7
+ - Bash(gh pr *)
8
+ - Bash(git add *)
9
+ - Bash(git commit *)
10
+ - Bash(git push *)
11
+ - Bash(git checkout *)
12
+ - Read
13
+ - Edit
14
+ - Write
15
+ - Glob
16
+ - Grep
17
+ ---
18
+
19
+ # spec-wave implement — etapa 🚧 Desenvolvimento
20
+
21
+ Comando **local** (lê o `.spec-wave.json`, como o `issue`), **não** disparado por label/Action.
22
+
23
+ | Flag/Arg | Descrição |
24
+ |----------|-----------|
25
+ | `<issue>` | **Obrigatório**, posicional. Número da Feature, Story ou Task (`12` ou `#12`). |
26
+ | `--feature-dir <path>` | Caminho `docs/features/<slug>` para anexar `spec.md`/`plan.md` (sobrescreve a resolução automática). |
27
+ | `--dry-run` | Monta o contexto e imprime o comando **sem executar** e **sem escrever nada no GitHub**. |
28
+
29
+ **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`.
30
+
31
+ ## Como o comando se comporta por tipo
32
+
33
+ | Tipo | Comportamento |
34
+ |------|---------------|
35
+ | **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**. |
36
+ | **Story** | Coleta todas as Tasks (sub-issues) e aciona o spec-kit uma única vez. |
37
+ | **Task** | Só aquela task. |
38
+
39
+ **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.
40
+
41
+ **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.
42
+
43
+ Outros tipos (Spike, Epic) → o comando **recusa**.
44
+
45
+ ## Passos
46
+
47
+ 1. Confirme que há `.spec-wave.json` no repo.
48
+
49
+ 2. **Sempre comece com `--dry-run`:**
50
+ ```bash
51
+ npx @spec-wave/cli@latest implement <número> --dry-run
52
+ ```
53
+ Inspecione: detecção do tipo, Tasks coletadas (Story) ou ordem/puladas/ciclos (Feature), e o comando do spec-kit que seria executado.
54
+
55
+ 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.
56
+
57
+ 4. **Se o spec-kit estiver configurado** e o usuário aprovar, rode sem `--dry-run`:
58
+ ```bash
59
+ npx @spec-wave/cli@latest implement <número>
60
+ ```
61
+ 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}`.
62
+
63
+ Use `--feature-dir docs/features/<slug>` se a resolução automática falhar e você quiser anexar `spec.md`/`plan.md`.
64
+
65
+ 5. **Se você (agente) for implementar diretamente**, siga o protocolo abaixo.
66
+
67
+ 6. Ao final, confirme o resultado com o usuário e oriente a revisão dos PRs.
68
+
69
+ ## Protocolo de execução (obrigatório)
70
+
71
+ **Uma Task por vez.** Nunca deixe duas Tasks com Status "In Progress" ao mesmo tempo.
72
+
73
+ 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):
74
+
75
+ ```bash
76
+ npx @spec-wave/cli@latest task start <n> # Etapa 🚧 Desenvolvimento + Status In Progress
77
+ # ... implementa ...
78
+ npx @spec-wave/cli@latest task done <n> # Etapa 🎉 Done + Status Done
79
+ ```
80
+
81
+ **Ao concluir toda a Story:** faça o commit, abra o PR e mova a Story:
82
+
83
+ ```bash
84
+ npx @spec-wave/cli@latest story review <n> # Etapa 👀 Code Review, Status Todo
85
+ ```
86
+
87
+ **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.
88
+
89
+ **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.
90
+
91
+ > **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.
92
+
93
+ Lembre: a **Etapa só avança**, nunca volta; o **Status** mede o progresso dentro da etapa.
94
+
95
+ ## Quando não dá para implementar
96
+
97
+ | Situação | Saída |
98
+ |----------|-------|
99
+ | Feature **sem Stories** | Rode a skill **decompose** primeiro |
100
+ | **Ciclo de dependências** | Corrija as linhas `Depende de:` — veja a skill **order** |
101
+ | Issue é Spike/Epic | O comando recusa; use a skill **move** para mexer no board |
102
+ | 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**. |
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: spec-wave-info
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Read
7
+ ---
8
+
9
+ # spec-wave info — status de configuração
10
+
11
+ Mostra se o repositório atual foi configurado e valida a skill instalada.
12
+
13
+ | Flag | Descrição |
14
+ |------|-----------|
15
+ | `--json` | Saída JSON (`{"initialized":bool, ..., "skill":{...}}`) para parsing programático. |
16
+
17
+ ## Passos
18
+
19
+ 1. Execute:
20
+ ```bash
21
+ npx @spec-wave/cli@latest info
22
+ ```
23
+
24
+ 2. **Se inicializado**, apresente ao usuário os dados do `.spec-wave.json`: `owner/repo`, `project.title` + `project.url`, `version` da CLI e `initializedAt`.
25
+
26
+ 3. **Se NÃO inicializado**, pergunte: "Este repositório ainda não foi configurado com o spec-wave. Quer rodar o `init` agora?"
27
+ - Sim → use a skill **setup**.
28
+ - Não → encerre sem alterar nada.
29
+
30
+ 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:
31
+ - skill `ausente` → `npx @spec-wave/cli@latest install-skill`
32
+ - skill `desatualizada` → `npx @spec-wave/cli@latest update` (skill **update**)
33
+
34
+ Lembre de recarregar o agente depois.
35
+
36
+ 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**.
37
+
38
+ ## O que o comando valida além do arquivo
39
+
40
+ 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}]}`.
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: spec-wave-issue
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Bash(gh issue *)
7
+ - Read
8
+ ---
9
+
10
+ # spec-wave issue — cria um work item no board
11
+
12
+ 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.
13
+
14
+ > **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.
15
+
16
+ **Contexto:** leia `.spec-wave.json` (Read) para confirmar que o repo está configurado. Ausente → skill **setup**.
17
+
18
+ ## Flags
19
+
20
+ | Flag | Tipo | Descrição |
21
+ |------|------|-----------|
22
+ | `--title <title>` | **obrigatório** | Título **sem** o prefixo de tipo — a CLI adiciona (`[FEATURE]`, `[STORY]`…). |
23
+ | `--type <type>` | string | `initiative`, `epic`, `feature`, `story`, `task`, `bug`, `spike`, `rfc`. Default: `feature`. |
24
+ | `--parent <n>` | string | Número da issue pai — cria como sub-issue dela. |
25
+ | `--body <text>` | string | Descrição. |
26
+ | `--priority <p>` | string | **Opcional.** `P0`–`P3`. **Omita** se o usuário não pediu. |
27
+ | `--area <area>` | string | `Frontend`, `Backend`, `Mobile`, `Infra`, `DevOps`, `Data`. |
28
+
29
+ Atalhos: `initiative` (raiz, sem `--parent`) e `feature` — mesmas flags, `--type` fixo.
30
+
31
+ ## Hierarquia
32
+
33
+ `Initiative → Epic → Feature → Story → Task`. Use `--parent <n>` para pendurar no nível acima.
34
+
35
+ ## Passos
36
+
37
+ 1. **Colete com o usuário:** tipo, título (sem prefixo), descrição e o número da issue **pai**, se houver.
38
+
39
+ > **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.
40
+
41
+ 2. **Execute** com **apenas** as flags que o usuário forneceu:
42
+ ```bash
43
+ npx @spec-wave/cli@latest issue \
44
+ --type "<tipo>" \
45
+ --title "<título>" \
46
+ --body "<descrição>" \
47
+ --area "<área>" \ # opcional
48
+ --priority "<prioridade>" \ # opcional — se o usuário não pediu, OMITA
49
+ --parent "<número-do-pai>" # opcional
50
+ ```
51
+ Para Features, o atalho `npx @spec-wave/cli@latest feature --title ...` equivale a `--type feature`.
52
+
53
+ 3. Informe o número criado e o vínculo com o pai.
54
+
55
+ 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).
56
+
57
+ ## Cuidados por tipo
58
+
59
+ ⚠️ **A Etapa inicial é sempre 📥 Backlog, para qualquer `--type`.** Correto para Initiative, Epic, Feature, RFC, Bug e Spike.
60
+
61
+ **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.
62
+
63
+ **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.
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: spec-wave-move
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Read
7
+ ---
8
+
9
+ # spec-wave move — move qualquer item do board
10
+
11
+ Comando **local**:
12
+
13
+ ```bash
14
+ npx @spec-wave/cli@latest move <n> <etapa> [--status <valor>]
15
+ ```
16
+
17
+ | Flag/Arg | Descrição |
18
+ |----------|-----------|
19
+ | `<n>` | **Obrigatório.** Número da issue, ex.: `8` ou `#8`. |
20
+ | `<etapa>` | **Obrigatório.** Etapa de destino — com ou sem emoji, sem acento, em qualquer caixa: `"code review"`, `"Homologação"`, `"🎉 Done"`. |
21
+ | `--status <valor>` | Status no destino: `Todo`, `In Progress` ou `Done`. Default: `Todo`. |
22
+
23
+ **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
24
+
25
+ ## Etapas válidas
26
+
27
+ ```
28
+ 📥 Backlog → 🐞 Triagem → 🎯 Priorizado → 📋 Spec → 📋 Plan → ✅ Ready
29
+ → 🚧 Desenvolvimento → 👀 Code Review
30
+ → 🧪 QA → 📋 Homologação → 🚀 Deploy → 🎉 Done
31
+ ```
32
+
33
+ ## Guardas embutidas
34
+
35
+ - **A Etapa nunca retrocede.** Se o item já estiver adiante, o comando informa a Etapa atual e **não faz nada**. **Não existe escape hatch** para retroceder — é a regra do fluxo.
36
+ - **Spike é recusado** — a Etapa de um Spike é movida à mão pelo usuário. Nunca a avance por conta própria.
37
+ - **Nome ambíguo é recusado** listando as candidatas (`"p"` casa com Priorizado e Plan). Seja específico.
38
+
39
+ ## Passos
40
+
41
+ 1. Confirme o número da issue e a Etapa de destino com o usuário.
42
+ 2. Rode o comando. Passe `--status` se o item já deve entrar na etapa em andamento ou concluído.
43
+ 3. Se o comando recusar por Etapa já adiante, apenas informe a Etapa atual — não tente contornar via `gh api graphql`.
44
+ 4. Se recusar por ambiguidade, escolha entre as candidatas listadas e rode de novo.
45
+
46
+ ## Quando preferir outra skill
47
+
48
+ | Caso | Skill |
49
+ |------|-------|
50
+ | Task iniciando ou concluindo | **task** (`start` / `done`) |
51
+ | Story indo para Code Review | **story** (`review`) |
52
+ | Feature avançando após todas as Stories em review, ou indo para QA/Homologação/Deploy | **move** (esta) |
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: spec-wave-order
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Read
7
+ ---
8
+
9
+ # spec-wave order — ordem topológica das Stories
10
+
11
+ Comando **local**:
12
+
13
+ ```bash
14
+ npx @spec-wave/cli@latest order <feature>
15
+ ```
16
+
17
+ | Arg | Descrição |
18
+ |-----|-----------|
19
+ | `<feature>` | Número da issue da **Feature**, ex.: `12` ou `#12`. Posicional, obrigatório. |
20
+
21
+ **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
22
+
23
+ ## O que a saída traz
24
+
25
+ - 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
+ - A **Etapa atual** de cada Story no board
27
+ - 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
29
+
30
+ ## Passos
31
+
32
+ 1. Rode o comando para a Feature.
33
+ 2. Apresente a ordem ao usuário, marcando o que já está concluído e o que está pendente.
34
+ 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
+ 4. **Se houver dependência fora de ordem**, aponte o risco ao usuário antes de seguir.
36
+ 5. Com a ordem clara, siga para a skill **implement**.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: spec-wave-plan
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(gh issue *)
6
+ - Bash(npx @spec-wave/cli@latest *)
7
+ - Read
8
+ - Write
9
+ - Glob
10
+ - Grep
11
+ ---
12
+
13
+ # spec-wave plan — plano técnico (2º documento)
14
+
15
+ > **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.
16
+
17
+ **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, commitam, fazem push, criticam e comentam na issue. Local exige a chave de IA no seu ambiente. Veja a skill **spec** para a tabela completa.
18
+
19
+ **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
20
+
21
+ 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.
22
+
23
+ ## Passos
24
+
25
+ 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**).
26
+
27
+ 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á em `reference/tech-context.md`, ao lado deste arquivo. 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.
28
+
29
+ 3. **Acione**, no modo escolhido:
30
+ ```bash
31
+ # local — resultado nesta sessão
32
+ npx @spec-wave/cli@latest generate-plan --issue-number <número>
33
+ # ou Action — assíncrono
34
+ gh issue edit <número> --add-label "spec-wave:plan"
35
+ ```
36
+
37
+ 4. Informe: "Label `spec-wave:plan` adicionada. O Action `generate-plan.yml` vai gerar o `plan.md`. Acompanhe em Actions → Generate Plan."
38
+
39
+ 5. Quando concluir, ofereça revisar `docs/features/<slug>/plan.md`.
40
+
41
+ 6. **Próximo passo:** validar a Feature — mova para **✅ Ready** e use a skill **ready**.
42
+
43
+ ## Desvios pontuais (`## Tech Override`)
44
+
45
+ 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`:
46
+
47
+ ````markdown
48
+ ## Tech Override
49
+ ```yaml
50
+ system_info:
51
+ stack:
52
+ database: "DynamoDB"
53
+ ```
54
+ ````
55
+
56
+ ## Se falhar
57
+
58
+ 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**.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: critique-plan
3
+ action: critique
4
+ description: Critério da crítica adversarial do plan.md contra o spec.md, as regras de negócio e o tech_context.
5
+ tools: [Read, Glob, Grep]
6
+ maxTurns: 20
7
+ verifiers: 3
8
+ lenses:
9
+ - "contradição — o plano decide algo que a spec proíbe, inverte ou já decidiu de outro jeito?"
10
+ - "fronteira técnica — o plano usa alguma tecnologia, serviço ou API fora do tech_context declarado?"
11
+ - "rastreabilidade — existe mudança de banco, endpoint ou componente de UI que não referencia nenhum Critério de Aceite?"
12
+ ---
13
+
14
+ # Crítica adversarial do plan.md
15
+
16
+ Você audita o `plan.md` contra o `spec.md`, as regras de negócio e o `tech_context` fornecidos. Seu papel é encontrar problemas, não elogiar.
17
+
18
+ Procure decisões técnicas que contradizem ou ignoram requisitos da spec, e tecnologias/serviços fora do tech_context.
19
+
20
+ ## O que caracteriza um achado
21
+
22
+ - **Contradições diretas** entre os documentos.
23
+ - **Inversões de requisito** — ex.: a spec exige consentimento ANTES de persistir e o plano persiste antes de pedir consentimento.
24
+ - **Violações de restrição explícita** — minimização de dados (LGPD), limites de retenção, campos proibidos.
25
+ - **Itens que contradizem ou ignoram a spec**.
26
+ - **Rastreabilidade quebrada** — mudança de banco, endpoint de API ou componente de UI que não referencia nenhum Critério de Aceite.
27
+ - **Tecnologia fora da fronteira** — qualquer serviço, biblioteca ou API que não esteja no tech_context nem seja definido no próprio plano.
28
+
29
+ <!-- requires-tools -->
30
+ ## Como verificar
31
+
32
+ Você tem `Read`, `Glob` e `Grep`. Não confie na descrição que o plano faz do repositório — abra os arquivos que ele cita. Um plano que afirma estender `PedidoService` quando esse arquivo não existe tem um achado, e só a leitura revela isso.
33
+ <!-- /requires-tools -->
34
+ ## Barra de rigor
35
+
36
+ NÃO invente problemas. Se os documentos estiverem consistentes, diga isso — uma auditoria limpa é um resultado legítimo e frequente.
37
+
38
+ O inverso também vale: "não consegui confirmar" é uma refutação, não uma aprovação. Se você não conseguiu verificar uma afirmação que importa, trate-a como refutada e diga o que faltou.
39
+
40
+ ## Consequência
41
+
42
+ Um achado marcado como **grave** aplica a label `spec-wave:critique-failed`, que bloqueia o `spec-wave:ready` até correção. Um achado **menor** é reportado na issue sem bloquear.
43
+
44
+ Calibre com isso em mente: um achado grave custa o tempo de um humano. Reserve-o para contradição real com a spec, o tech_context ou uma regra explícita — não para preferência de estilo.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: plan
3
+ action: plan
4
+ description: Gera o plano técnico (plan.md) de uma Feature a partir do spec.md e do tech_context.
5
+ tools: [Read, Glob, Grep]
6
+ maxTurns: 30
7
+ ---
8
+
9
+ # Geração de plan.md
10
+
11
+ Você é um Tech Lead experiente. Gere um plano técnico (plan.md) completo e detalhado, baseado ESTRITAMENTE no spec.md fornecido.
12
+
13
+ ## Entrada
14
+
15
+ Você recebe um payload JSON com:
16
+
17
+ - `spec_content` — o spec.md já gerado (ou um aviso de que ainda não existe)
18
+ - `feature_title` / `feature_description` — título e corpo da issue
19
+ - `tech_context.static` — o stack declarado em `.github/config/tech_context.yml`
20
+ - `tech_context.dynamic` — o que foi detectado no repositório
21
+ - `tech_context.overrides` — ajustes declarados no corpo da issue
22
+
23
+ <!-- requires-tools -->
24
+ ## Exploração antes de escrever
25
+
26
+ Você tem `Read`, `Glob` e `Grep` no repositório de destino. Use-os: localize os módulos, endpoints, migrations e componentes que esta Feature vai tocar, e ancore o plano nos **caminhos e nomes reais** que encontrar. Um plano que cita `src/services/pedido.ts` porque leu o arquivo vale muito mais que um que inventa `PedidoService`.
27
+
28
+ O `tech_context` continua sendo a fronteira do que você pode propor — explorar o repositório serve para ser preciso dentro dela, não para ampliá-la.
29
+ <!-- /requires-tools -->
30
+ ## Estrutura obrigatória
31
+
32
+ O plano deve conter EXATAMENTE estas seções em português, nesta ordem:
33
+
34
+ ```
35
+ # Estratégia Técnica
36
+ - Abordagem Arquitetural, Decisões-Chave e uma Matriz de Rastreabilidade (tabela)
37
+ ligando cada Critério de Aceite do spec a um componente técnico.
38
+ # Detalhamento da Implementação
39
+ - Abra a seção com um diagrama de sequência Mermaid (bloco ```mermaid iniciado com
40
+ sequenceDiagram) do fluxo principal ponta a ponta, com os componentes técnicos
41
+ reais como participants (frontend, endpoints/controllers, services, banco de
42
+ dados, filas). Use APENAS componentes do tech_context ou definidos neste plano;
43
+ rotule as mensagens com os caminhos de endpoint e nomes de método reais, em
44
+ português.
45
+ - Subseções: ## Backend, ## Banco de Dados, ## Frontend, ## Infraestrutura.
46
+ # Segurança e Conformidade
47
+ # Estratégia de Testes
48
+ - Unitários, Integração e E2E.
49
+ # Rollback e Monitoramento
50
+ - Plano de Rollback, Métricas Observadas e Alertas.
51
+ ```
52
+
53
+ ## Regras OBRIGATÓRIAS
54
+
55
+ - TODA mudança de banco, endpoint de API ou componente de UI DEVE referenciar um Critério de Aceite específico do spec.md (rastreabilidade).
56
+ - Use APENAS as tecnologias e serviços listados no tech_context fornecido. Não invente APIs ou serviços inexistentes.
57
+ - Forneça detalhes acionáveis: caminhos exatos de endpoints, nomes de DTOs, constraints de banco.
58
+ - Escreva em português (pt-BR). Não use caracteres de outros alfabetos (CJK, cirílico, árabe, tailandês).
59
+ - O arquivo deve conter APENAS o conteúdo do plan.md — nada de preâmbulo, comentário sobre o processo ou resumo do que você fez.
@@ -0,0 +1,56 @@
1
+ # Tech Context (`.github/config/tech_context.yml`)
2
+
3
+ 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 e serviços nele declarados — sem ele, o plano fica genérico e pode inventar APIs inexistentes.
4
+
5
+ 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.
6
+
7
+ ## Como ajudar a criar
8
+
9
+ 1. **Confirme a ausência:** tente `Read .github/config/tech_context.yml`. Se já existir, confirme com o usuário se reflete a stack atual e pule para o fim.
10
+
11
+ 2. **Detecte a stack lendo os arquivos do repositório** (use Read — **não invente**):
12
+
13
+ | Arquivo | O que extrair |
14
+ |---------|---------------|
15
+ | `package.json` | backend/frontend e libs (`@nestjs/core`, `next`, `react`, `@prisma/client`, `express`) |
16
+ | `pom.xml` / `build.gradle` | stack Java |
17
+ | `requirements.txt` / `pyproject.toml` | stack Python |
18
+ | `go.mod` | stack Go |
19
+ | `prisma/schema.prisma` ou `migrations/` | tabelas e colunas para `database_schemas` |
20
+ | `Dockerfile` / `docker-compose.yml` / charts Helm | `infra` |
21
+ | enums de RBAC no código | `security.rbac_roles` |
22
+
23
+ 3. **Rascunhe** o YAML seguindo EXATAMENTE este schema. Preencha só o que conseguir confirmar; deixe `# TODO` no que faltar:
24
+
25
+ ```yaml
26
+ system_info:
27
+ name: "<nome do sistema>"
28
+ stack:
29
+ backend: "<ex.: Node.js (NestJS v11)>"
30
+ frontend: "<ex.: Next.js 16 (React 19)>"
31
+ database: "<ex.: PostgreSQL (Prisma 5)>"
32
+ infra: "<ex.: Docker / Kubernetes>"
33
+ architecture: "<ex.: Monorepo Nx / Microservices>"
34
+ security:
35
+ auth_protocol: "<ex.: JWT>"
36
+ rbac_roles: ["ADMIN", "..."]
37
+ database_schemas:
38
+ - table: "<tabela>"
39
+ columns: "<col1, col2, ...>"
40
+ existing_services:
41
+ - name: "<serviço>"
42
+ endpoint: "<caminho>"
43
+ auth: "<ex.: JWT, mTLS>"
44
+ internal_libraries:
45
+ - "<lib interna>"
46
+ ```
47
+
48
+ 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.
49
+
50
+ 5. **Grave** com Write em `.github/config/tech_context.yml`.
51
+
52
+ 6. **Oriente a commitar e pushar antes de seguir** — o Action lê do repositório, não do disco local. Sugira ao usuário rodar, via prefixo `!`:
53
+
54
+ ```
55
+ !git add .github/config/tech_context.yml && git commit -m "chore: tech_context.yml [spec-wave]" && git push
56
+ ```
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: spec-wave-ready
3
+ description: "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."
4
+ allowed-tools:
5
+ - Bash(gh issue *)
6
+ - Bash(npx @spec-wave/cli@latest *)
7
+ - Read
8
+ ---
9
+
10
+ # spec-wave ready — valida spec + plan
11
+
12
+ Verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias e se não há sinal de truncamento.
13
+
14
+ **Contexto:** leia `.spec-wave.json` (Read). Ausente → skill **setup**.
15
+
16
+ ## Passos
17
+
18
+ 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.
19
+
20
+ 2. Adicione a label:
21
+ ```bash
22
+ gh issue edit <número> --add-label "spec-wave:ready"
23
+ ```
24
+
25
+ 3. Informe: "Validação iniciada. O workflow verifica se `spec.md` e `plan.md` contêm todas as seções obrigatórias."
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.
28
+
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
+
31
+ ## Portões humanos
32
+
33
+ Estas labels **bloqueiam** a validação e **não** devolvem a Feature para a etapa de spec:
34
+
35
+ | Label | O que aconteceu | Como sair |
36
+ |-------|-----------------|-----------|
37
+ | `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` |
38
+ | `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 |
39
+
40
+ > **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**.
41
+
42
+ ## Rede de segurança contra truncamento
43
+
44
+ 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.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: spec-wave-rfc
3
+ description: "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)."
4
+ allowed-tools:
5
+ - Bash(npx @spec-wave/cli@latest *)
6
+ - Read
7
+ - Write
8
+ - Glob
9
+ ---
10
+
11
+ # spec-wave rfc — documento de processo
12
+
13
+ RFCs são escritos em **português do Brasil** e vivem em `rfc/`.
14
+
15
+ **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.
16
+
17
+ ## Passos
18
+
19
+ 1. **Entreviste o usuário** sobre: objetivo, problema atual, solução proposta, princípios, stakeholders afetados. Não invente contexto organizacional.
20
+
21
+ 2. **Escreva o RFC** com estas seções:
22
+
23
+ 1. Objetivo
24
+ 2. Princípios
25
+ 3. Papéis e Responsabilidades
26
+ 4. Estrutura de Trabalho
27
+ 5. Fluxo de Trabalho
28
+ 6. Automação
29
+ 7. Métricas
30
+ 8. Riscos e Mitigações
31
+
32
+ 3. **Salve** com Write em `rfc/rfc-<slug-do-tópico>.md`.
33
+
34
+ 4. **Crie a issue de RFC no board** — use a CLI, não `gh issue create` (que não adiciona ao Project):
35
+ ```bash
36
+ npx @spec-wave/cli@latest issue --type rfc \
37
+ --title "<título sem prefixo>" \
38
+ --body "<resumo + link para rfc/rfc-<slug>.md>"
39
+ ```
40
+ A issue nasce em **📥 Backlog**.
41
+
42
+ 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`.
43
+
44
+ ## Cuidados
45
+
46
+ - 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.
47
+ - Se o repositório já tiver um RFC sobre o mesmo assunto, proponha **emendar** o existente em vez de criar um concorrente.