vireum-spec-cli 0.3.0 → 0.4.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/dist/commands/setup.js +205 -11
- package/package.json +1 -1
- package/src/skills/task-implement.md +22 -8
package/dist/commands/setup.js
CHANGED
|
@@ -158,14 +158,56 @@ async function runSetup() {
|
|
|
158
158
|
{ name: 'redis — inspecionar cache e filas', value: 'redis', checked: false },
|
|
159
159
|
],
|
|
160
160
|
});
|
|
161
|
-
// Context7 sempre presente
|
|
162
161
|
const mcpsFinais = mcpsSelecionados.includes('context7')
|
|
163
162
|
? mcpsSelecionados
|
|
164
163
|
: ['context7', ...mcpsSelecionados];
|
|
164
|
+
// ── Design System ──────────────────────────────────────────────────────────
|
|
165
|
+
console.log(chalk_1.default.hex('#2D7DD2').bold('\n🎨 Design System\n'));
|
|
166
|
+
const designSystem = await (0, prompts_1.select)({
|
|
167
|
+
message: 'Design system do projeto:',
|
|
168
|
+
choices: [
|
|
169
|
+
{ name: 'Shadcn/ui — componentes com Tailwind e Radix', value: 'shadcn' },
|
|
170
|
+
{ name: 'Tailwind — utilitários CSS puro', value: 'tailwind' },
|
|
171
|
+
{ name: 'Chakra UI — componentes React acessíveis', value: 'chakra' },
|
|
172
|
+
{ name: 'Material UI — componentes Google Material', value: 'mui' },
|
|
173
|
+
{ name: 'Custom — design system próprio', value: 'custom' },
|
|
174
|
+
{ name: 'Nenhum — sem design system definido', value: 'none' },
|
|
175
|
+
],
|
|
176
|
+
});
|
|
177
|
+
const design = { system: designSystem, cores: {}, fontes: {}, customizacoes: '' };
|
|
178
|
+
if (['shadcn', 'tailwind', 'chakra', 'mui'].includes(designSystem)) {
|
|
179
|
+
const temCustom = await (0, prompts_1.confirm)({
|
|
180
|
+
message: 'Tem customizacoes? (cores da marca, fontes especificas?)',
|
|
181
|
+
default: false,
|
|
182
|
+
});
|
|
183
|
+
if (temCustom) {
|
|
184
|
+
design.cores.primary = await (0, prompts_1.input)({ message: 'Cor primaria (ex: #2D7DD2 ou blue-600):', default: '' });
|
|
185
|
+
design.cores.secondary = await (0, prompts_1.input)({ message: 'Cor secundaria (ex: #1A3A5C ou slate-800):', default: '' });
|
|
186
|
+
design.cores.accent = await (0, prompts_1.input)({ message: 'Cor de destaque (ex: #1D9E75 ou green-500):', default: '' });
|
|
187
|
+
design.fontes.heading = await (0, prompts_1.input)({ message: 'Fonte de titulos (ex: Inter, Geist):', default: '' });
|
|
188
|
+
design.fontes.body = await (0, prompts_1.input)({ message: 'Fonte de corpo (ex: Inter, Roboto):', default: '' });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (designSystem === 'custom') {
|
|
192
|
+
const preencherAgora = await (0, prompts_1.confirm)({
|
|
193
|
+
message: 'Quer preencher o design system agora?',
|
|
194
|
+
default: true,
|
|
195
|
+
});
|
|
196
|
+
if (preencherAgora) {
|
|
197
|
+
design.cores.primary = await (0, prompts_1.input)({ message: 'Cor primaria:', default: '' });
|
|
198
|
+
design.cores.secondary = await (0, prompts_1.input)({ message: 'Cor secundaria:', default: '' });
|
|
199
|
+
design.cores.accent = await (0, prompts_1.input)({ message: 'Cor de destaque:', default: '' });
|
|
200
|
+
design.cores.background = await (0, prompts_1.input)({ message: 'Cor de fundo:', default: '' });
|
|
201
|
+
design.cores.text = await (0, prompts_1.input)({ message: 'Cor de texto:', default: '' });
|
|
202
|
+
design.fontes.heading = await (0, prompts_1.input)({ message: 'Fonte de titulos:', default: '' });
|
|
203
|
+
design.fontes.body = await (0, prompts_1.input)({ message: 'Fonte de corpo:', default: '' });
|
|
204
|
+
design.customizacoes = await (0, prompts_1.input)({ message: 'Componentes ou convencoes importantes (Enter para pular):', default: '' });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
165
207
|
// ── Gerar arquivos ─────────────────────────────────────────────────────────
|
|
166
208
|
console.log('');
|
|
167
209
|
const projeto = extrairProjeto(path.join(specDir, 'INDEX.md'));
|
|
168
|
-
const dados = { stack, infra, mcps: mcpsFinais, projeto };
|
|
210
|
+
const dados = { stack, infra, mcps: mcpsFinais, projeto, design };
|
|
169
211
|
for (const dir of [vireumDir, cursorDir]) {
|
|
170
212
|
if (!fs.existsSync(dir))
|
|
171
213
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -173,6 +215,7 @@ async function runSetup() {
|
|
|
173
215
|
const arquivos = [
|
|
174
216
|
{ path: path.join(specDir, 'architecture.md'), conteudo: gerarArchitecture(dados), msg: 'Atualizando architecture.md...' },
|
|
175
217
|
{ path: path.join(specDir, 'mcp-setup.md'), conteudo: gerarMcpSetup(dados), msg: 'Gerando mcp-setup.md...' },
|
|
218
|
+
{ path: path.join(specDir, 'design.md'), conteudo: gerarDesign(dados), msg: 'Gerando design.md...' },
|
|
176
219
|
{ path: path.join(vireumDir, 'rules.md'), conteudo: gerarRulesGlobal(), msg: 'Gerando .vireum/rules.md...' },
|
|
177
220
|
{ path: path.join(vireumDir, 'mcps.md'), conteudo: gerarMcpsGlobal(dados), msg: 'Gerando .vireum/mcps.md...' },
|
|
178
221
|
{ path: path.join(process.cwd(), 'CLAUDE.md'), conteudo: gerarClaudeMd(dados), msg: 'Gerando CLAUDE.md...' },
|
|
@@ -276,6 +319,16 @@ function gerarRulesGlobal() {
|
|
|
276
319
|
- Nunca puxar task do backlog para active sem validação humana explícita
|
|
277
320
|
- Sempre avisar escopo creep antes de implementar — parar e perguntar
|
|
278
321
|
|
|
322
|
+
## Regras de Planejamento
|
|
323
|
+
- Sempre planejar antes de implementar — escrever o que sera feito e quais arquivos serao tocados
|
|
324
|
+
- Confirmar o plano com o dev em tasks complexas antes de executar
|
|
325
|
+
- Nunca comecar a escrever codigo sem ter um plano claro
|
|
326
|
+
|
|
327
|
+
## Regras de Design
|
|
328
|
+
- Sempre consultar .spec/design.md antes de criar ou modificar qualquer componente de UI
|
|
329
|
+
- Nunca hardcodar cores — usar sempre os tokens definidos em design.md
|
|
330
|
+
- Nunca misturar design systems
|
|
331
|
+
|
|
279
332
|
## Regras de Spec
|
|
280
333
|
- Nunca marcar task como done sem validar os critérios de aceitação
|
|
281
334
|
- Nunca tomar decisão de arquitetura sem registrar em architecture.md com justificativa
|
|
@@ -294,6 +347,8 @@ function gerarRulesGlobal() {
|
|
|
294
347
|
|
|
295
348
|
## Nunca
|
|
296
349
|
- Implementar sem ler o spec primeiro
|
|
350
|
+
- Implementar sem planejar primeiro
|
|
351
|
+
- Criar componente de UI sem consultar design.md
|
|
297
352
|
- Tomar decisão de lib ou stack sem documentar o porquê
|
|
298
353
|
- Responder dúvida de escopo sem consultar requirements.md
|
|
299
354
|
- Comunicar diretamente com o cliente — isso é papel do dev
|
|
@@ -351,16 +406,20 @@ Acionado por: "desenvolve", "implementa", "cria", + nome de task
|
|
|
351
406
|
1. Leia \`.spec/tasks/active.md\`
|
|
352
407
|
2. Leia \`.spec/requirements.md\` para contexto da feature
|
|
353
408
|
3. Consulte o Context7 para docs atualizadas da lib que vai usar
|
|
354
|
-
4.
|
|
355
|
-
5.
|
|
356
|
-
6.
|
|
409
|
+
4. Se task de UI: leia \`.spec/design.md\` antes de qualquer componente
|
|
410
|
+
5. PLANEJAR: escreva o que sera implementado, quais arquivos serao tocados e riscos identificados
|
|
411
|
+
6. Confirme o plano com o dev antes de executar em tasks complexas
|
|
412
|
+
7. Implemente seguindo os critérios de aceitação da task
|
|
413
|
+
8. Ao concluir: marque como done, mova para \`tasks/done.md\`, atualize \`INDEX.md\`
|
|
414
|
+
9. Se decisão arquitetural tomada: registre em \`architecture.md\`
|
|
357
415
|
|
|
358
416
|
### Modo 2 — Bug
|
|
359
417
|
Acionado por: "erro", "bug", "quebrou", "não funciona"
|
|
360
|
-
1.
|
|
361
|
-
2.
|
|
362
|
-
3.
|
|
363
|
-
4.
|
|
418
|
+
1. PLANEJAR: descreva o que sera investigado e quais arquivos serao tocados
|
|
419
|
+
2. Crie hotfix em \`tasks/active.md\` com tag [H] e prioridade crítica
|
|
420
|
+
3. Identifique e resolva a causa raiz
|
|
421
|
+
4. Registre causa raiz em \`changelog.md\`
|
|
422
|
+
5. Verifique se o bug afeta outras tasks em \`tasks/active.md\`
|
|
364
423
|
|
|
365
424
|
### Modo 3 — Nova demanda
|
|
366
425
|
Acionado por: "cliente pediu", "adiciona", "quero incluir" (fora do spec)
|
|
@@ -379,6 +438,15 @@ Sempre que for usar uma lib do projeto, consulte a documentação atualizada via
|
|
|
379
438
|
Nunca assuma que você conhece a API mais recente — sempre verifique.
|
|
380
439
|
Libs deste projeto: ${libs}
|
|
381
440
|
|
|
441
|
+
## Arquivos de contexto disponíveis
|
|
442
|
+
- Escopo e features → leia \`.spec/requirements.md\`
|
|
443
|
+
- Decisoes tecnicas → leia \`.spec/architecture.md\`
|
|
444
|
+
- Perfis e permissoes → leia \`.spec/users.md\`
|
|
445
|
+
- Riscos → leia \`.spec/risks.md\`
|
|
446
|
+
- Tarefas ativas → leia \`.spec/tasks/active.md\`
|
|
447
|
+
- Historico → leia \`.spec/changelog.md\`
|
|
448
|
+
- Design e componentes → leia \`.spec/design.md\` antes de qualquer UI
|
|
449
|
+
|
|
382
450
|
## Regras globais
|
|
383
451
|
Leia \`.vireum/rules.md\` — aplicam-se a todas as sessões.
|
|
384
452
|
|
|
@@ -398,6 +466,7 @@ ${mcps.map((m) => `- ${m}`).join('\n')}
|
|
|
398
466
|
- Escopo creep: se a solicitação não está em requirements.md → PARAR e avisar
|
|
399
467
|
- Decisão de lib nova: registrar em architecture.md antes de usar
|
|
400
468
|
- Risco identificado: adicionar em risks.md antes de continuar
|
|
469
|
+
- UI sem consultar design.md → PARAR e consultar primeiro
|
|
401
470
|
`;
|
|
402
471
|
}
|
|
403
472
|
function gerarAgentsMd(d) {
|
|
@@ -411,6 +480,15 @@ function gerarAgentsMd(d) {
|
|
|
411
480
|
2. Identifique o modo pela solicitação
|
|
412
481
|
3. Siga o protocolo em CLAUDE.md
|
|
413
482
|
|
|
483
|
+
## Planejamento obrigatorio
|
|
484
|
+
Antes de qualquer implementacao:
|
|
485
|
+
1. Escreva o que sera feito e quais arquivos serao tocados
|
|
486
|
+
2. Identifique riscos e dependencias
|
|
487
|
+
3. Confirme com o dev em tasks complexas antes de executar
|
|
488
|
+
|
|
489
|
+
## Design
|
|
490
|
+
Sempre consultar \`.spec/design.md\` antes de criar ou modificar qualquer componente de UI.
|
|
491
|
+
|
|
414
492
|
## Context7
|
|
415
493
|
Sempre consultar docs atualizadas via Context7 antes de usar qualquer lib.
|
|
416
494
|
|
|
@@ -441,13 +519,23 @@ Este projeto usa Spec Driven Development pela Vireum Desenvolvimento.
|
|
|
441
519
|
- Sempre leia \`.spec/INDEX.md\` primeiro
|
|
442
520
|
- Carregue outros arquivos de spec apenas quando necessário
|
|
443
521
|
|
|
522
|
+
## Planejamento obrigatorio
|
|
523
|
+
Antes de qualquer implementacao:
|
|
524
|
+
- Escreva o que sera feito e quais arquivos serao tocados
|
|
525
|
+
- Identifique riscos e dependencias
|
|
526
|
+
- Confirme com o dev em tasks complexas antes de executar
|
|
527
|
+
|
|
528
|
+
## Design
|
|
529
|
+
- SEMPRE leia \`.spec/design.md\` antes de criar ou modificar qualquer componente de UI
|
|
530
|
+
- Nunca hardcodar cores — usar tokens do design.md
|
|
531
|
+
|
|
444
532
|
## Context7
|
|
445
533
|
- Sempre consultar Context7 antes de usar qualquer lib do projeto
|
|
446
534
|
- Nunca assumir que conhece a API mais recente
|
|
447
535
|
|
|
448
536
|
## Modos
|
|
449
|
-
- Implementar → leia tasks/active.md,
|
|
450
|
-
- Bug → crie hotfix [H] em active.md, registre causa raiz em changelog.md
|
|
537
|
+
- Implementar → PLANEJAR primeiro, consulte Context7, leia tasks/active.md, se UI leia design.md
|
|
538
|
+
- Bug → PLANEJAR investigacao, crie hotfix [H] em active.md, registre causa raiz em changelog.md
|
|
451
539
|
- Nova demanda → crie [PENDING] em backlog.md, aguarde aprovação
|
|
452
540
|
- Dúvida de escopo → consulte requirements.md
|
|
453
541
|
|
|
@@ -455,6 +543,112 @@ Este projeto usa Spec Driven Development pela Vireum Desenvolvimento.
|
|
|
455
543
|
- Ver \`.vireum/rules.md\` — regras globais
|
|
456
544
|
- Ver \`.spec/rules.md\` — regras do projeto
|
|
457
545
|
- Nunca implementar fora do spec sem [PENDING] aprovado
|
|
546
|
+
- Nunca implementar sem planejar primeiro
|
|
547
|
+
- Nunca criar UI sem consultar design.md
|
|
458
548
|
- Nunca marcar done sem critérios validados
|
|
459
549
|
`;
|
|
460
550
|
}
|
|
551
|
+
function gerarDesign(d) {
|
|
552
|
+
const { design, projeto } = d;
|
|
553
|
+
const sistemas = {
|
|
554
|
+
shadcn: {
|
|
555
|
+
descricao: 'Shadcn/ui com Tailwind CSS e Radix UI',
|
|
556
|
+
convencoes: [
|
|
557
|
+
'Usar cn() para mesclar classes Tailwind',
|
|
558
|
+
'Componentes em src/components/ui/',
|
|
559
|
+
'Variaveis CSS em globals.css via --primary, --secondary, etc.',
|
|
560
|
+
'Icones via lucide-react',
|
|
561
|
+
'Formularios com react-hook-form + zod',
|
|
562
|
+
],
|
|
563
|
+
tokens: 'Tailwind config + CSS variables',
|
|
564
|
+
},
|
|
565
|
+
tailwind: {
|
|
566
|
+
descricao: 'Tailwind CSS puro',
|
|
567
|
+
convencoes: [
|
|
568
|
+
'Classes utilitarias diretamente nos componentes',
|
|
569
|
+
'Cores customizadas em tailwind.config.ts',
|
|
570
|
+
'Componentes em src/components/',
|
|
571
|
+
'Nao criar classes CSS customizadas sem necessidade',
|
|
572
|
+
],
|
|
573
|
+
tokens: 'tailwind.config.ts',
|
|
574
|
+
},
|
|
575
|
+
chakra: {
|
|
576
|
+
descricao: 'Chakra UI',
|
|
577
|
+
convencoes: [
|
|
578
|
+
'Usar componentes do Chakra sempre que disponivel',
|
|
579
|
+
'Theme customizado em src/theme/',
|
|
580
|
+
'Variaveis de cor via useColorModeValue para dark/light mode',
|
|
581
|
+
'Spacing seguindo escala do Chakra (1 = 4px)',
|
|
582
|
+
],
|
|
583
|
+
tokens: 'ChakraProvider theme',
|
|
584
|
+
},
|
|
585
|
+
mui: {
|
|
586
|
+
descricao: 'Material UI (MUI)',
|
|
587
|
+
convencoes: [
|
|
588
|
+
'Usar componentes MUI sempre que disponivel',
|
|
589
|
+
'Theme customizado em src/theme/index.ts',
|
|
590
|
+
'Usar sx prop para customizacoes pontuais',
|
|
591
|
+
'Evitar inline styles — preferir theme tokens',
|
|
592
|
+
],
|
|
593
|
+
tokens: 'createTheme()',
|
|
594
|
+
},
|
|
595
|
+
custom: {
|
|
596
|
+
descricao: 'Design system proprio',
|
|
597
|
+
convencoes: ['Ver secao de convencoes abaixo'],
|
|
598
|
+
tokens: 'Ver secao de tokens abaixo',
|
|
599
|
+
},
|
|
600
|
+
none: {
|
|
601
|
+
descricao: 'Sem design system definido',
|
|
602
|
+
convencoes: ['A definir'],
|
|
603
|
+
tokens: 'A definir',
|
|
604
|
+
},
|
|
605
|
+
};
|
|
606
|
+
const ds = sistemas[design.system] || sistemas.none;
|
|
607
|
+
const coresSection = Object.keys(design.cores).filter(k => design.cores[k]).length
|
|
608
|
+
? Object.entries(design.cores)
|
|
609
|
+
.filter(([, v]) => v)
|
|
610
|
+
.map(([k, v]) => `- ${k}: ${v}`)
|
|
611
|
+
.join('\n')
|
|
612
|
+
: `> Usar tokens padrao do ${ds.descricao}`;
|
|
613
|
+
const fontesSection = Object.keys(design.fontes).filter(k => design.fontes[k]).length
|
|
614
|
+
? Object.entries(design.fontes)
|
|
615
|
+
.filter(([, v]) => v)
|
|
616
|
+
.map(([k, v]) => `- ${k}: ${v}`)
|
|
617
|
+
.join('\n')
|
|
618
|
+
: '> Usar fonte padrao do sistema';
|
|
619
|
+
return `# Design — ${projeto}
|
|
620
|
+
|
|
621
|
+
> A IA deve consultar este arquivo antes de criar ou modificar qualquer componente de UI.
|
|
622
|
+
> Nunca usar cores, fontes ou espacamentos fora dos tokens definidos aqui.
|
|
623
|
+
|
|
624
|
+
## Design System
|
|
625
|
+
**${ds.descricao}**
|
|
626
|
+
- Tokens: ${ds.tokens}
|
|
627
|
+
|
|
628
|
+
## Cores
|
|
629
|
+
${coresSection}
|
|
630
|
+
|
|
631
|
+
## Fontes
|
|
632
|
+
${fontesSection}
|
|
633
|
+
|
|
634
|
+
## Convencoes
|
|
635
|
+
${ds.convencoes.map((c) => `- ${c}`).join('\n')}
|
|
636
|
+
${design.customizacoes ? `\n## Convencoes Customizadas\n${design.customizacoes}` : ''}
|
|
637
|
+
|
|
638
|
+
## Regras para a IA
|
|
639
|
+
- Nunca criar componente sem consultar este arquivo primeiro
|
|
640
|
+
- Nunca hardcodar cores — usar sempre os tokens definidos acima
|
|
641
|
+
- Nunca misturar design systems — usar apenas ${ds.descricao}
|
|
642
|
+
- Novos componentes seguem as convencoes desta secao
|
|
643
|
+
- Em caso de duvida sobre UI, perguntar ao dev antes de implementar
|
|
644
|
+
${design.system === 'shadcn' ? '- Sempre usar cn() para mesclar classes condicionais\n- Preferir componentes do Shadcn antes de criar do zero' : ''}
|
|
645
|
+
${design.system === 'tailwind' ? '- Preferir classes Tailwind a CSS customizado\n- Nao criar novas classes sem necessidade real' : ''}
|
|
646
|
+
|
|
647
|
+
## Componentes Existentes
|
|
648
|
+
> A IA deve atualizar esta secao conforme novos componentes sao criados
|
|
649
|
+
|
|
650
|
+
| Componente | Localizacao | Descricao |
|
|
651
|
+
|------------|-------------|-----------|
|
|
652
|
+
| | | |
|
|
653
|
+
`;
|
|
654
|
+
}
|
package/package.json
CHANGED
|
@@ -2,13 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
Quando o dev pedir para implementar uma task:
|
|
4
4
|
|
|
5
|
+
## 1. Antes de implementar — PLANEJAR
|
|
6
|
+
Escreva um plano antes de qualquer codigo:
|
|
7
|
+
- O que sera implementado
|
|
8
|
+
- Quais arquivos serao criados ou modificados
|
|
9
|
+
- Dependencias ou riscos identificados
|
|
10
|
+
- Confirme com o dev se o plano faz sentido antes de continuar
|
|
11
|
+
|
|
12
|
+
## 2. Consultar contexto
|
|
5
13
|
1. Leia `.spec/tasks/active.md` e identifique a task solicitada
|
|
6
14
|
2. Leia `.spec/requirements.md` para contexto da feature
|
|
7
|
-
3. Leia `.spec/architecture.md` para
|
|
8
|
-
4.
|
|
9
|
-
5.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
3. Leia `.spec/architecture.md` para decisoes tecnicas ja tomadas
|
|
16
|
+
4. Consulte Context7 para docs atualizadas da lib que vai usar
|
|
17
|
+
5. Verifique os criterios de aceitacao da task
|
|
18
|
+
|
|
19
|
+
## 3. Implementar
|
|
20
|
+
- Siga a camada definida (Backend / Frontend / Integracao)
|
|
21
|
+
- Siga as decisoes de stack do architecture.md
|
|
22
|
+
- Nao instale libs novas sem registrar em architecture.md
|
|
23
|
+
|
|
24
|
+
## 4. Ao concluir
|
|
25
|
+
- Marque o status como [x] em active.md
|
|
26
|
+
- Mova a task para tasks/done.md
|
|
27
|
+
- Atualize o INDEX.md
|
|
28
|
+
- Se tomou decisao arquitetural, registre em architecture.md com justificativa
|