vireum-spec-cli 0.3.1 → 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.
@@ -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...' },
@@ -281,6 +324,11 @@ function gerarRulesGlobal() {
281
324
  - Confirmar o plano com o dev em tasks complexas antes de executar
282
325
  - Nunca comecar a escrever codigo sem ter um plano claro
283
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
+
284
332
  ## Regras de Spec
285
333
  - Nunca marcar task como done sem validar os critérios de aceitação
286
334
  - Nunca tomar decisão de arquitetura sem registrar em architecture.md com justificativa
@@ -300,6 +348,7 @@ function gerarRulesGlobal() {
300
348
  ## Nunca
301
349
  - Implementar sem ler o spec primeiro
302
350
  - Implementar sem planejar primeiro
351
+ - Criar componente de UI sem consultar design.md
303
352
  - Tomar decisão de lib ou stack sem documentar o porquê
304
353
  - Responder dúvida de escopo sem consultar requirements.md
305
354
  - Comunicar diretamente com o cliente — isso é papel do dev
@@ -357,11 +406,12 @@ Acionado por: "desenvolve", "implementa", "cria", + nome de task
357
406
  1. Leia \`.spec/tasks/active.md\`
358
407
  2. Leia \`.spec/requirements.md\` para contexto da feature
359
408
  3. Consulte o Context7 para docs atualizadas da lib que vai usar
360
- 4. PLANEJAR: escreva o que sera implementado, quais arquivos serao tocados e riscos identificados
361
- 5. Confirme o plano com o dev antes de executar em tasks complexas
362
- 6. Implemente seguindo os critérios de aceitação da task
363
- 7. Ao concluir: marque como done, mova para \`tasks/done.md\`, atualize \`INDEX.md\`
364
- 8. Se decisão arquitetural tomada: registre em \`architecture.md\`
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\`
365
415
 
366
416
  ### Modo 2 — Bug
367
417
  Acionado por: "erro", "bug", "quebrou", "não funciona"
@@ -388,6 +438,15 @@ Sempre que for usar uma lib do projeto, consulte a documentação atualizada via
388
438
  Nunca assuma que você conhece a API mais recente — sempre verifique.
389
439
  Libs deste projeto: ${libs}
390
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
+
391
450
  ## Regras globais
392
451
  Leia \`.vireum/rules.md\` — aplicam-se a todas as sessões.
393
452
 
@@ -407,6 +466,7 @@ ${mcps.map((m) => `- ${m}`).join('\n')}
407
466
  - Escopo creep: se a solicitação não está em requirements.md → PARAR e avisar
408
467
  - Decisão de lib nova: registrar em architecture.md antes de usar
409
468
  - Risco identificado: adicionar em risks.md antes de continuar
469
+ - UI sem consultar design.md → PARAR e consultar primeiro
410
470
  `;
411
471
  }
412
472
  function gerarAgentsMd(d) {
@@ -426,6 +486,9 @@ Antes de qualquer implementacao:
426
486
  2. Identifique riscos e dependencias
427
487
  3. Confirme com o dev em tasks complexas antes de executar
428
488
 
489
+ ## Design
490
+ Sempre consultar \`.spec/design.md\` antes de criar ou modificar qualquer componente de UI.
491
+
429
492
  ## Context7
430
493
  Sempre consultar docs atualizadas via Context7 antes de usar qualquer lib.
431
494
 
@@ -462,12 +525,16 @@ Antes de qualquer implementacao:
462
525
  - Identifique riscos e dependencias
463
526
  - Confirme com o dev em tasks complexas antes de executar
464
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
+
465
532
  ## Context7
466
533
  - Sempre consultar Context7 antes de usar qualquer lib do projeto
467
534
  - Nunca assumir que conhece a API mais recente
468
535
 
469
536
  ## Modos
470
- - Implementar → PLANEJAR primeiro, consulte Context7, leia tasks/active.md, siga critérios de aceitação
537
+ - Implementar → PLANEJAR primeiro, consulte Context7, leia tasks/active.md, se UI leia design.md
471
538
  - Bug → PLANEJAR investigacao, crie hotfix [H] em active.md, registre causa raiz em changelog.md
472
539
  - Nova demanda → crie [PENDING] em backlog.md, aguarde aprovação
473
540
  - Dúvida de escopo → consulte requirements.md
@@ -477,6 +544,111 @@ Antes de qualquer implementacao:
477
544
  - Ver \`.spec/rules.md\` — regras do projeto
478
545
  - Nunca implementar fora do spec sem [PENDING] aprovado
479
546
  - Nunca implementar sem planejar primeiro
547
+ - Nunca criar UI sem consultar design.md
480
548
  - Nunca marcar done sem critérios validados
481
549
  `;
482
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vireum-spec-cli",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Spec Driven Development framework by Vireum Desenvolvimento",
5
5
  "main": "dist/index.js",
6
6
  "bin": {