@spec-wave/cli 0.13.0 → 0.14.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/README.md +39 -6
- package/bin/spec-wave.mjs +14 -1
- package/package.json +1 -1
- package/src/commands/code-review.mjs +5 -8
- package/src/commands/decompose.mjs +412 -130
- package/src/commands/dev-agent.mjs +3 -2
- package/src/commands/doctor.mjs +239 -9
- package/src/commands/generate-plan.mjs +105 -30
- package/src/commands/generate-spec.mjs +17 -5
- package/src/commands/implement.mjs +39 -15
- package/src/commands/info.mjs +4 -3
- package/src/commands/issue.mjs +4 -4
- package/src/commands/move.mjs +162 -0
- package/src/commands/order.mjs +1 -12
- package/src/commands/qa.mjs +5 -8
- package/src/commands/refresh.mjs +4 -3
- package/src/commands/story.mjs +1 -12
- package/src/commands/task.mjs +1 -11
- package/src/commands/update.mjs +43 -19
- package/src/commands/validate.mjs +37 -22
- package/src/config.mjs +40 -1
- package/src/lib/board.mjs +88 -26
- package/src/lib/claude.mjs +315 -70
- package/src/lib/critique.mjs +391 -91
- package/src/lib/decomposition-doc.mjs +451 -0
- package/src/lib/implement-board.mjs +14 -1
- package/src/lib/project-root.mjs +93 -0
- package/src/lib/templates.mjs +53 -0
- package/src/setup/files.mjs +3 -10
- package/src/templates/skill/SKILL.md +143 -27
- package/src/templates/workflows/code-review.yml +1 -1
- package/src/templates/workflows/decompose.yml +20 -6
- package/src/templates/workflows/generate-plan.yml +1 -1
- package/src/templates/workflows/generate-spec.yml +1 -1
- package/src/templates/workflows/qa.yml +1 -1
- package/src/templates/workflows/validate.yml +1 -1
package/README.md
CHANGED
|
@@ -68,7 +68,8 @@ Ferramenta Node.js que configura e opera o fluxo via linha de comando.
|
|
|
68
68
|
| `generate-spec` | Gera `spec.md` (usado pelo GitHub Action) |
|
|
69
69
|
| `generate-plan` | Gera `plan.md` (usado pelo GitHub Action) |
|
|
70
70
|
| `validate` | Valida spec.md e plan.md (usado pelo GitHub Action) |
|
|
71
|
-
| `decompose` |
|
|
71
|
+
| `decompose` | Gera o rascunho da decomposição em `decomposition.md`; com `--apply`, cria as Stories/Tasks a partir do rascunho revisado (usado pelo GitHub Action) |
|
|
72
|
+
| `move <n> <etapa>` | Move qualquer item do board (Feature, Story, Task, Bug, RFC) para uma Etapa — a Etapa nunca retrocede |
|
|
72
73
|
| `code-review` | Move Feature para Code Review ao abrir PR (usado pelo GitHub Action) |
|
|
73
74
|
| `qa` | Move Feature para QA ao aprovar PR (usado pelo GitHub Action) |
|
|
74
75
|
| `implement` | Aciona o spec-kit localmente para implementar uma Feature (Stories pendentes em ordem de dependência), Story ou Task |
|
|
@@ -81,7 +82,7 @@ Ferramenta Node.js que configura e opera o fluxo via linha de comando.
|
|
|
81
82
|
| `generate-spec.yml` | label `spec-wave:spec` | Gera `docs/features/<slug>/spec.md` via IA |
|
|
82
83
|
| `generate-plan.yml` | label `spec-wave:plan` | Gera `docs/features/<slug>/plan.md` via IA |
|
|
83
84
|
| `validate.yml` | label `spec-wave:ready` | Valida seções obrigatórias; adiciona `spec-wave:plan-approved` |
|
|
84
|
-
| `decompose.yml` |
|
|
85
|
+
| `decompose.yml` | labels `spec-wave:decompose` / `spec-wave:decompose-apply` | 1º grava e critica o rascunho `decomposition.md`; 2º cria Stories e Tasks como sub-issues |
|
|
85
86
|
| `code-review.yml` | PR aberto/reaberto | Move Feature para `👀 Code Review` |
|
|
86
87
|
| `qa.yml` | PR aprovado | Move Feature para `🧪 QA` |
|
|
87
88
|
|
|
@@ -285,20 +286,52 @@ O Action `validate.yml` verifica se todas as seções obrigatórias estão prese
|
|
|
285
286
|
|
|
286
287
|
---
|
|
287
288
|
|
|
288
|
-
### 6. Decompor em Stories e Tasks
|
|
289
|
+
### 6. Decompor em Stories e Tasks (duas etapas)
|
|
290
|
+
|
|
291
|
+
A decomposição não cria issues de uma vez. Primeiro nasce um **rascunho revisável**;
|
|
292
|
+
as issues só são criadas depois que você aprova.
|
|
293
|
+
|
|
294
|
+
**6a. Gerar o rascunho:**
|
|
289
295
|
|
|
290
296
|
```bash
|
|
291
297
|
gh issue edit 12 --add-label "spec-wave:decompose"
|
|
292
298
|
```
|
|
293
299
|
|
|
294
|
-
O Action `
|
|
300
|
+
O Action grava `docs/features/<slug>/decomposition.md` no repositório e submete o
|
|
301
|
+
arquivo à crítica adversarial. **Nenhuma issue é criada.**
|
|
302
|
+
|
|
303
|
+
```markdown
|
|
304
|
+
# Decomposição — [FEATURE] Pagamento com PIX
|
|
305
|
+
<!-- spec-wave:decomposition v1 issue=12 kind=stories -->
|
|
306
|
+
|
|
307
|
+
## Story 1 — selecionar PIX como forma de pagamento
|
|
308
|
+
|
|
309
|
+
**User story:** Como cliente, quero selecionar PIX, para pagar mais rápido
|
|
310
|
+
**Depende de:** —
|
|
311
|
+
|
|
312
|
+
### Task 1.1 — criar endpoint POST /orders/:id/payment/pix
|
|
313
|
+
### Task 1.2 — integrar API do banco via webhook
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Se a crítica encontrar contradições **graves**, ela comenta na issue citando
|
|
317
|
+
`Story N` / `Task N.M`, aplica `spec-wave:critique-failed` e o Action **falha**.
|
|
318
|
+
Você corrige o `decomposition.md` — o artefato que os achados referenciam — e
|
|
319
|
+
reaplica `spec-wave:decompose`: o arquivo é criticado como está, sem ser regerado.
|
|
320
|
+
|
|
321
|
+
**6b. Aplicar o rascunho aprovado:**
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
gh issue edit 12 --add-label "spec-wave:decompose-apply"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Agora as sub-issues da Feature #12 são criadas a partir do arquivo:
|
|
295
328
|
|
|
296
329
|
```
|
|
297
|
-
#13 [STORY]
|
|
330
|
+
#13 [STORY] selecionar PIX como forma de pagamento
|
|
298
331
|
#14 [TASK] Criar endpoint POST /orders/:id/payment/pix
|
|
299
332
|
#15 [TASK] Integrar API do banco via webhook
|
|
300
333
|
#16 [TASK] Exibir QR Code na tela de checkout
|
|
301
|
-
#17 [STORY]
|
|
334
|
+
#17 [STORY] receber confirmação do pagamento
|
|
302
335
|
#18 [TASK] Webhook de confirmação do banco
|
|
303
336
|
#19 [TASK] Notificação por e-mail ao confirmar
|
|
304
337
|
```
|
package/bin/spec-wave.mjs
CHANGED
|
@@ -157,8 +157,9 @@ program
|
|
|
157
157
|
|
|
158
158
|
program
|
|
159
159
|
.command('decompose')
|
|
160
|
-
.description('
|
|
160
|
+
.description('Gera o rascunho da decomposição em decomposition.md; com --apply, cria as Stories/Tasks a partir do rascunho revisado (usado pelo GitHub Action)')
|
|
161
161
|
.requiredOption('--issue-number <n>', 'Número da issue no GitHub')
|
|
162
|
+
.option('--apply', 'Aplica o decomposition.md já revisado: cria as issues (sem esta flag, apenas gera/critica o rascunho)')
|
|
162
163
|
.action(async (options) => {
|
|
163
164
|
const { decompose } = await import('../src/commands/decompose.mjs');
|
|
164
165
|
await decompose(options).catch(err => { console.error(err.message); process.exit(1); });
|
|
@@ -212,6 +213,18 @@ program
|
|
|
212
213
|
await task({ action, issue: n }).catch(err => { console.error(err.message); process.exit(1); });
|
|
213
214
|
});
|
|
214
215
|
|
|
216
|
+
program
|
|
217
|
+
.command('move')
|
|
218
|
+
.description('Move qualquer item do board (Feature, Story, Task, Bug, RFC) para uma Etapa — a Etapa nunca retrocede')
|
|
219
|
+
.argument('<n>', 'Número da issue, ex.: 8 ou #8')
|
|
220
|
+
.argument('<etapa>', 'Etapa de destino, com ou sem emoji, ex.: "code review", "Homologação", "🎉 Done"')
|
|
221
|
+
.option('--status <valor>', 'Valor do campo Status no destino: Todo, In Progress ou Done (default: Todo)')
|
|
222
|
+
.action(async (n, etapa, options) => {
|
|
223
|
+
const { move } = await import('../src/commands/move.mjs');
|
|
224
|
+
await move({ issue: n, stage: etapa, ...options })
|
|
225
|
+
.catch(err => { console.error(err.message); process.exit(1); });
|
|
226
|
+
});
|
|
227
|
+
|
|
215
228
|
program
|
|
216
229
|
.command('story')
|
|
217
230
|
.description('Gerencia uma Story no board: review (move para Code Review)')
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
1
|
import { resolveToken } from '../api/auth.mjs';
|
|
4
2
|
import { getIssue, getPR, commentOnIssue } from '../api/github-rest.mjs';
|
|
5
3
|
import { addProjectItem, getIssueParent, listSubIssues, getItemSingleSelectValue } from '../api/github-graphql.mjs';
|
|
6
4
|
import { detectIssueType } from '../lib/issue-type.mjs';
|
|
7
5
|
import { loadProjectConfig, resolveField, advanceToStage } from '../lib/board.mjs';
|
|
8
|
-
import {
|
|
6
|
+
import { loadConfig } from '../lib/project-root.mjs';
|
|
7
|
+
import { STATUS_OPTIONS, STAGE_ORDER, STAGE_DONE, PROGRESS_TODO, PROGRESS_DONE, isManualStageType } from '../config.mjs';
|
|
9
8
|
|
|
10
9
|
// Ao abrir o PR: Stories/Feature → Etapa "👀 Code Review" (Status "Todo");
|
|
11
10
|
// Tasks → Etapa "🎉 Done" (Status "Done"), pois a implementação da task terminou.
|
|
@@ -118,11 +117,9 @@ export async function codeReview({ prNumber }) {
|
|
|
118
117
|
const token = await resolveToken();
|
|
119
118
|
const projectToken = process.env.PROJECT_TOKEN || token;
|
|
120
119
|
const [envOwner, envRepo] = (process.env.GITHUB_REPOSITORY || '').split('/');
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const owner = envOwner || cfg.owner;
|
|
125
|
-
const repo = envRepo || cfg.repo;
|
|
120
|
+
const { config: cfg } = loadConfig();
|
|
121
|
+
const owner = envOwner || cfg?.owner;
|
|
122
|
+
const repo = envRepo || cfg?.repo;
|
|
126
123
|
|
|
127
124
|
if (!owner || !repo) {
|
|
128
125
|
throw new Error(
|