@spec-wave/cli 0.14.0 → 0.16.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 (76) hide show
  1. package/README.md +1 -0
  2. package/bin/spec-wave.mjs +44 -2
  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-rest.mjs +206 -2
  13. package/src/commands/bug.mjs +8 -0
  14. package/src/commands/code-review.mjs +45 -4
  15. package/src/commands/decompose.mjs +11 -49
  16. package/src/commands/dev-agent.mjs +3 -3
  17. package/src/commands/doctor.mjs +77 -6
  18. package/src/commands/generate-bug.mjs +195 -0
  19. package/src/commands/generate-plan.mjs +6 -20
  20. package/src/commands/generate-spec.mjs +6 -22
  21. package/src/commands/implement.mjs +105 -2
  22. package/src/commands/init.mjs +3 -3
  23. package/src/commands/install-skill.mjs +72 -16
  24. package/src/commands/issue.mjs +9 -7
  25. package/src/commands/move.mjs +11 -1
  26. package/src/commands/qa.mjs +23 -2
  27. package/src/commands/refresh.mjs +145 -5
  28. package/src/commands/triage.mjs +174 -0
  29. package/src/commands/update.mjs +352 -62
  30. package/src/commands/validate.mjs +82 -10
  31. package/src/config.mjs +159 -1
  32. package/src/lib/bug-context.mjs +160 -0
  33. package/src/lib/bug-doc.mjs +51 -0
  34. package/src/lib/bug-triage.mjs +81 -0
  35. package/src/lib/claude.mjs +71 -254
  36. package/src/lib/critique.mjs +43 -30
  37. package/src/lib/implement-board.mjs +12 -1
  38. package/src/lib/plugin-skills.mjs +122 -0
  39. package/src/lib/pr-branch.mjs +267 -0
  40. package/src/lib/prompt-loader.mjs +257 -0
  41. package/src/lib/skill-file.mjs +35 -0
  42. package/src/plugin/.claude-plugin/plugin.json +20 -0
  43. package/src/plugin/README.md +73 -0
  44. package/src/plugin/skills/bug/SKILL.md +60 -0
  45. package/src/plugin/skills/bug/model-prompt.critique.md +48 -0
  46. package/src/plugin/skills/bug/model-prompt.md +74 -0
  47. package/src/plugin/skills/decompose/SKILL.md +111 -0
  48. package/src/plugin/skills/decompose/model-prompt.critique.md +46 -0
  49. package/src/plugin/skills/decompose/model-prompt.feature.md +69 -0
  50. package/src/plugin/skills/decompose/model-prompt.rfc.md +52 -0
  51. package/src/plugin/skills/doctor/SKILL.md +51 -0
  52. package/src/plugin/skills/fix-pr/SKILL.md +130 -0
  53. package/src/plugin/skills/implement/SKILL.md +102 -0
  54. package/src/plugin/skills/info/SKILL.md +40 -0
  55. package/src/plugin/skills/issue/SKILL.md +63 -0
  56. package/src/plugin/skills/move/SKILL.md +52 -0
  57. package/src/plugin/skills/order/SKILL.md +36 -0
  58. package/src/plugin/skills/plan/SKILL.md +53 -0
  59. package/src/plugin/skills/plan/model-prompt.critique.md +44 -0
  60. package/src/plugin/skills/plan/model-prompt.md +59 -0
  61. package/src/plugin/skills/plan/reference/tech-context.md +56 -0
  62. package/src/plugin/skills/ready/SKILL.md +44 -0
  63. package/src/plugin/skills/rfc/SKILL.md +47 -0
  64. package/src/plugin/skills/setup/SKILL.md +67 -0
  65. package/src/plugin/skills/spec/SKILL.md +37 -0
  66. package/src/plugin/skills/spec/model-prompt.md +61 -0
  67. package/src/plugin/skills/story/SKILL.md +49 -0
  68. package/src/plugin/skills/task/SKILL.md +41 -0
  69. package/src/plugin/skills/triage/SKILL.md +52 -0
  70. package/src/plugin/skills/uninstall/SKILL.md +43 -0
  71. package/src/plugin/skills/update/SKILL.md +51 -0
  72. package/src/plugin/skills/workflow/SKILL.md +154 -0
  73. package/src/templates/skill/SKILL.md +69 -7
  74. package/src/templates/workflows/generate-bug.yml +36 -0
  75. package/src/templates/workflows/validate.yml +2 -1
  76. 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** | 📥 Backlog | 🚧 Desenvolvimento → 🎉 Done | Ao aprovar, vai direto para Done (não passa por Homologação). |
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.
@@ -180,11 +182,19 @@ Mesmas flags do `issue` (exceto `--type`, fixo em `feature`). Mantido para o flu
180
182
  |------|------|-----------|
181
183
  | `--global` | flag | Verifica a skill no escopo do usuário (padrão: projeto). |
182
184
  | `--skip-skill` / `--skip-config` / `--skip-repo` | flag | Pula a categoria correspondente. |
185
+ | `--branch [nome]` | flag/string | Envia os arquivos do repo como **Pull Request** numa branch, em **um único commit**, em vez de commitar direto na branch default. Sem valor, usa `spec-wave/update-v<versão>`. |
186
+ | `--config-in-pr` / `--no-config-in-pr` | flag | Força incluir/excluir o `.spec-wave.json` do PR (o default decide sozinho — veja abaixo). |
183
187
  | `--dry-run` | flag | Mostra o que seria atualizado sem alterar nada. |
184
188
  | `--yes` | flag | Aplica sem pedir confirmação. |
185
189
 
186
190
  > Detecta e atualiza **somente o que divergiu** da versão atual da CLI: a **skill** instalada (por agente), o **`.spec-wave.json`** local (se versão/formato divergir) e os **workflows/labels** do repo (compara com os templates empacotados). Interativo por padrão (mostra o plano e confirma). É o atalho recomendado após atualizar a CLI.
187
191
 
192
+ > **`--branch` (modo Pull Request).** Sem a flag, os arquivos do repo vão em **commits diretos na branch default** — o que falha no meio da execução em repositório com proteção de branch, deixando parte aplicada, e contorna a revisão. Com a flag, todos os arquivos vão em **um commit atômico** numa branch nova e um PR é aberto: se algo falhar antes da criação da branch, **nada** é alterado no repositório. É **idempotente** — rodar duas vezes não gera um segundo commit nem um segundo PR.
193
+ >
194
+ > Duas coisas **não** entram no PR, porque não são versionáveis: as **labels** (metadado do repositório — já valem na base, com ou sem merge) e a **skill** (arquivo em máquina local). O corpo do PR diz isso explicitamente a quem revisa.
195
+ >
196
+ > ⚠️ O modo PR exige **`pull_requests: write`** além de `contents: write` (ou o escopo `repo` num PAT classic). Sem essa permissão, a branch é criada e o PR falha — a mensagem oferece a URL de `compare` para abrir à mão.
197
+
188
198
  ### `@spec-wave/cli generate-plan` · `generate-spec` · `validate` · `decompose`
189
199
  | Flag | Tipo | Descrição |
190
200
  |------|------|-----------|
@@ -417,12 +427,16 @@ Traz tudo para a versão atual da CLI, atualizando **só o que mudou**: a skill
417
427
  npx @spec-wave/cli@latest update --dry-run
418
428
  ```
419
429
  2. Mostre ao usuário o resumo (skill / config / arquivos do repo / labels que divergiram). Se **nada** estiver desatualizado, informe que já está tudo na versão atual e encerre.
420
- 3. Se o usuário aprovar, aplique:
430
+ 3. **Pergunte como os arquivos do repo devem sair** — e prefira o Pull Request:
421
431
  ```bash
422
- npx @spec-wave/cli@latest update --yes
432
+ npx @spec-wave/cli@latest update --yes --branch # 1 commit atômico + PR (recomendado)
433
+ npx @spec-wave/cli@latest update --yes # commits diretos na branch default
423
434
  ```
424
435
  - Escopos podem ser limitados com `--skip-skill`, `--skip-config`, `--skip-repo`.
425
- - Atualizações de **arquivos do repo** são commitadas no remoto; o **`.spec-wave.json`** é local (lembre o usuário de commitá-lo).
436
+ - **Com `--branch`:** os arquivos do repo vão em **um único commit** numa branch nova e um PR é aberto nada é escrito na branch default. Passe o link do PR ao usuário e lembre que o merge é dele. Exige `pull_requests: write` no token.
437
+ - **Sem `--branch`:** cada arquivo é um commit direto na branch default. Em repositório com **proteção de branch** isso falha no meio e deixa parte aplicada — nesses casos use `--branch`.
438
+ - **Nos dois modos**, as **labels** são aplicadas direto na base (metadado do repositório, não versionável) e a **skill** é gravada em máquina local. Nenhuma das duas entra no PR.
439
+ - **`.spec-wave.json`:** com `--branch`, ele entra no PR se o repositório **já o versiona**; se não versiona, segue apenas local e o usuário precisa commitá-lo (ou use `--config-in-pr` para passar a versioná-lo). Sem `--branch`, é sempre só local.
426
440
  4. Se a skill foi atualizada, oriente recarregar/reiniciar o agente para pegar a nova versão.
427
441
 
428
442
  ---
@@ -650,7 +664,7 @@ Aciona o spec-kit para implementar uma **Feature** (todas as Stories pendentes,
650
664
  ```
651
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}`).
652
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.
653
- 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 **não** for Feature, Story nem Task (ex.: Bug, 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`).
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`).
654
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.
655
669
 
656
670
  ---
@@ -678,6 +692,54 @@ Crie um documento RFC seguindo a estrutura do RFC-001.
678
692
 
679
693
  ---
680
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
+
681
743
  ### `/spec-wave fix-pr <número-do-pr>`
682
744
 
683
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 { AI_PROVIDERS, getProvider, DEFAULT_PROVIDER, WORKFLOW_FILES, ISSUE_TEMPLATE_FILES } from '../config.mjs';
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 - 12 colunas kanban\n - 5 campos customizados\n - 15 labels\n - ${WORKFLOW_FILES.length} workflows + ${ISSUE_TEMPLATE_FILES.length} issue templates`,
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
  },