jarvis-ai-framework 2.1.1 → 3.2.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/AGENTS.md +14 -115
- package/agents/AGENTS.md +11 -23
- package/agents/README.md +27 -129
- package/agents/engineering/data/eng.data-engineer.agent.md +11 -34
- package/agents/engineering/eng.advisor.agent.md +56 -0
- package/agents/engineering/eng.agent.md +14 -24
- package/agents/engineering/eng.bug-hunter.md +7 -15
- package/agents/engineering/eng.dev-code-reviewer.md +1 -1
- package/agents/engineering/eng.frontend.agent.md +3 -7
- package/agents/engineering/eng.rpa.agent.md +2 -8
- package/agents/engineering/qa/eng.qa.quality-strategist.md +6 -11
- package/agents/engineering/qa/eng.qa.test-architect.md +8 -18
- package/agents/engineering/qa/eng.qa.test-planner.md +10 -14
- package/agents/engineering/qa/eng.qa.testing-engineer.md +91 -24
- package/agents/product/prod.discovery-interviewer.md +3 -3
- package/bin/README.md +142 -0
- package/bin/commands/docs-publish.js +105 -141
- package/bin/commands/docs-sync.js +66 -104
- package/bin/commands/info.js +7 -27
- package/bin/commands/init.js +23 -51
- package/bin/commands/install-rtk.js +9 -3
- package/bin/commands/list.js +5 -18
- package/bin/commands/map.js +20 -5
- package/bin/commands/qa-signoff.js +58 -55
- package/bin/commands/tokens.js +14 -17
- package/bin/commands/whoami.js +30 -26
- package/bin/jarvis.js +9 -163
- package/bin/lib/auth/session.js +20 -20
- package/bin/lib/cli/program.js +219 -0
- package/bin/lib/cli/shared-options.js +29 -0
- package/bin/lib/config/constants.js +59 -2
- package/bin/lib/config/ide-config.js +4 -8
- package/bin/lib/core/profile-filter.js +4 -1
- package/bin/lib/core/scanner.js +3 -29
- package/bin/lib/core/sync-engine.js +21 -14
- package/bin/lib/core/token-report.js +12 -2
- package/bin/lib/docs/fetch-file.js +39 -0
- package/bin/lib/docs/publish-file.js +194 -0
- package/bin/lib/docs/redis-cache.js +49 -0
- package/bin/lib/docs/validate-frontmatter.js +9 -39
- package/bin/lib/env-loader.js +11 -34
- package/bin/lib/flow-map/parse.js +11 -5
- package/bin/lib/flow-map/render.js +5 -2
- package/bin/lib/flow-map/tree.js +59 -10
- package/bin/lib/tasks/comment.js +40 -35
- package/bin/lib/utils/frontmatter.js +57 -0
- package/bin/lib/utils/git-parser.js +4 -6
- package/bin/lib/utils/npmrc-parser.js +6 -13
- package/bin/lib/utils/paths.js +2 -4
- package/bin/lib/utils/ui.js +3 -9
- package/bin/lib/vcs/api.js +25 -41
- package/bin/lib/vcs/create-issue.js +49 -33
- package/bin/lib/vcs/create-merge.js +47 -31
- package/bin/lib/vcs/fetch-raw.js +35 -23
- package/package.json +14 -5
- package/rules/engineering/eng-rules.md +1 -1
- package/rules/engineering/eng-security-rules.md +18 -16
- package/rules/engineering/eng.bump-rules.md +3 -2
- package/rules/engineering/eng.docs-scraping-rules.md +4 -4
- package/rules/engineering/eng.integrations-rules.md +6 -4
- package/rules/engineering/eng.skills-rules.md +1 -1
- package/rules/engineering/eng.specializations-rules.md +18 -4
- package/rules/engineering/frontend/eng.frontend-rules.md +1 -4
- package/rules/engineering/qa/eng.qa.cypress-standards-rules.md +1 -1
- package/rules/engineering/rpa/eng.rpa-rules.md +4 -9
- package/rules-on-demand/engineering/eng.pre-pr-rules.md +1 -1
- package/rules-on-demand/engineering/eng.start-rules.md +2 -0
- package/skills/AGENTS.md +52 -87
- package/skills/SKILLS-ROADMAP.md +47 -128
- package/skills/eng-ai/SKILL.md +270 -0
- package/skills/eng-ai/references/1-fundamentos-ml.md +24 -0
- package/skills/eng-ai/references/10-arquitetura-solucoes-ia.md +24 -0
- package/skills/eng-ai/references/11-governanca-ia.md +24 -0
- package/skills/eng-ai/references/12-seguranca-ia-responsavel.md +25 -0
- package/skills/eng-ai/references/2-matematica-estatistica.md +24 -0
- package/skills/eng-ai/references/3-dados-para-ia.md +24 -0
- package/skills/eng-ai/references/4-deep-learning-fundacionais.md +24 -0
- package/skills/eng-ai/references/5-llms-chatbots-agentes-rag.md +25 -0
- package/skills/eng-ai/references/6-avaliacao-experimentacao.md +24 -0
- package/skills/eng-ai/references/7-engenharia-sistemas-ia.md +24 -0
- package/skills/eng-ai/references/8-mlops-plataforma.md +24 -0
- package/skills/eng-ai/references/9-produto-ia.md +24 -0
- package/skills/eng-ai/references/especializacoes.md +17 -0
- package/skills/eng-automation/SKILL.md +290 -0
- package/skills/eng-automation/references/1-fundamentos-automacao.md +25 -0
- package/skills/eng-automation/references/10-ingestao-dados.md +25 -0
- package/skills/eng-automation/references/11-captcha-antibot.md +25 -0
- package/skills/eng-automation/references/12-limites-taxa-sessoes.md +25 -0
- package/skills/eng-automation/references/13-agendamento-orquestracao.md +24 -0
- package/skills/eng-automation/references/14-retentativa-erros.md +25 -0
- package/skills/eng-automation/references/15-autenticacao-credenciais.md +24 -0
- package/skills/eng-automation/references/16-observabilidade-confiabilidade.md +24 -0
- package/skills/eng-automation/references/2-aquisicao-dados.md +25 -0
- package/skills/eng-automation/references/3-automacao-navegador.md +24 -0
- package/skills/eng-automation/references/4-scraping-crawling.md +25 -0
- package/skills/eng-automation/references/5-apis-rest-graphql-soap.md +26 -0
- package/skills/eng-automation/references/6-webhooks-integracao.md +25 -0
- package/skills/eng-automation/references/7-rpa.md +25 -0
- package/skills/eng-automation/references/8-extracao-estruturada.md +25 -0
- package/skills/eng-automation/references/9-extracao-documentos.md +25 -0
- package/skills/eng-automation/references/especializacoes.md +18 -0
- package/skills/eng-backend-nestjs/SKILL.md +1 -1
- package/skills/eng-data/SKILL.md +271 -0
- package/skills/eng-data/references/1-fundamentos-dados.md +24 -0
- package/skills/eng-data/references/10-ciencia-dados.md +24 -0
- package/skills/eng-data/references/11-dataops-plataforma.md +24 -0
- package/skills/eng-data/references/12-seguranca-privacidade.md +24 -0
- package/skills/eng-data/references/2-modelagem-dados.md +24 -0
- package/skills/eng-data/references/3-bancos-dados.md +24 -0
- package/skills/eng-data/references/4-arquitetura-dados.md +24 -0
- package/skills/eng-data/references/5-pipelines-integracao.md +24 -0
- package/skills/eng-data/references/6-qualidade-dados.md +24 -0
- package/skills/eng-data/references/7-governanca-metadados.md +24 -0
- package/skills/eng-data/references/8-estatistica-analise.md +24 -0
- package/skills/eng-data/references/9-analytics-bi.md +24 -0
- package/skills/eng-data/references/especializacoes.md +20 -0
- package/skills/eng-frontend/SKILL.md +12 -5
- package/skills/eng-frontend/references/13-design-system.md +48 -0
- package/skills/eng-frontend/references/14-microfrontend.md +46 -0
- package/skills/eng-global-task-comment/SKILL.md +3 -3
- package/skills/eng-platform/SKILL.md +331 -0
- package/skills/eng-platform/references/1-fundamentos-sistemas.md +23 -0
- package/skills/eng-platform/references/10-resiliencia-arquitetura.md +24 -0
- package/skills/eng-platform/references/11-plataforma-devex.md +24 -0
- package/skills/eng-platform/references/12-finops-custos.md +24 -0
- package/skills/eng-platform/references/13-seguranca-fundamentos.md +26 -0
- package/skills/eng-platform/references/14-profiling-performance.md +23 -0
- package/skills/eng-platform/references/15-testes-carga-chaos.md +23 -0
- package/skills/eng-platform/references/16-cache-multicamada.md +22 -0
- package/skills/eng-platform/references/2-redes.md +23 -0
- package/skills/eng-platform/references/3-cloud.md +24 -0
- package/skills/eng-platform/references/4-iac-automacao.md +24 -0
- package/skills/eng-platform/references/5-containers-orquestracao.md +25 -0
- package/skills/eng-platform/references/6-cicd-entrega.md +24 -0
- package/skills/eng-platform/references/7-observabilidade.md +24 -0
- package/skills/eng-platform/references/8-confiabilidade-sre.md +24 -0
- package/skills/eng-platform/references/9-seguranca-infra.md +26 -0
- package/skills/eng-platform/references/especializacoes.md +34 -0
- package/skills/eng-qa/SKILL.md +283 -0
- package/skills/eng-qa/references/1-fundamentos-qualidade.md +25 -0
- package/skills/eng-qa/references/10-confiabilidade.md +25 -0
- package/skills/eng-qa/references/11-seguranca.md +24 -0
- package/skills/eng-qa/references/12-acessibilidade.md +24 -0
- package/skills/eng-qa/references/13-dados-testes.md +24 -0
- package/skills/eng-qa/references/14-gestao-testes-defeitos.md +25 -0
- package/skills/eng-qa/references/15-arquitetura-qa.md +25 -0
- package/skills/eng-qa/references/2-estrategia-planejamento.md +25 -0
- package/skills/eng-qa/references/3-design-testes.md +25 -0
- package/skills/eng-qa/references/4-manual-exploratorio.md +24 -0
- package/skills/eng-qa/references/5-automacao-testes.md +25 -0
- package/skills/eng-qa/references/6-api-integracao.md +25 -0
- package/skills/eng-qa/references/7-contrato.md +24 -0
- package/skills/eng-qa/references/8-interface-compat-mobile.md +24 -0
- package/skills/eng-qa/references/9-performance.md +24 -0
- package/skills/eng-qa/references/especializacoes.md +29 -0
- package/skills/eng-qa-planner/SKILL.md +264 -0
- package/skills/jarvis-context-detect/SKILL.md +1 -1
- package/skills/jarvis-context-detect/assets/context-profile-template.md +1 -1
- package/skills/jarvis-create-specialization/SKILL.md +8 -0
- package/skills/jarvis-docs-central/README.md +31 -28
- package/skills/jarvis-docs-central/SKILL.md +5 -5
- package/skills/jarvis-init/SKILL.md +9 -8
- package/skills/jarvis-init/assets/passo-adicionar-stacks.md +47 -18
- package/skills/jarvis-list-specializations/SKILL.md +30 -17
- package/skills/jarvis-report-issue/SKILL.md +1 -1
- package/taxonomy.md +4 -16
- package/templates/AGENTS.md +2 -0
- package/templates/ENV-template.md +20 -2
- package/templates/engineering/advisor-template.md +65 -0
- package/templates/engineering/architecture-template.md +52 -4
- package/templates/engineering/qa/qa.sprint-plan-template.md +1 -1
- package/workflows/AGENTS.md +3 -1
- package/workflows/README.md +0 -10
- package/workflows/engineering/data/data.new-pipeline.md +6 -5
- package/workflows/engineering/eng.bug-audit.md +4 -14
- package/workflows/engineering/eng.debug.md +4 -20
- package/workflows/engineering/eng.plan.md +4 -26
- package/workflows/engineering/eng.pr.md +13 -63
- package/workflows/engineering/eng.pre-pr.md +14 -51
- package/workflows/engineering/eng.review.md +7 -13
- package/workflows/engineering/eng.rpa.robot.md +3 -9
- package/workflows/engineering/eng.start.md +37 -32
- package/workflows/engineering/eng.work.md +17 -40
- package/workflows/engineering/qa/eng.qa-sprint-planning.md +1 -1
- package/workflows/product/prod.spec.discovery.md +2 -2
- package/workflows/warm-up.md +35 -63
- package/agents/engineering/eng.cybersecurity.agent.md +0 -486
- package/agents/engineering/qa/eng.qa.cypress-specialist.md +0 -112
- package/bin/lib/docs/fetch-file.sh +0 -41
- package/bin/lib/docs/publish-file.sh +0 -284
- package/rules/engineering/qa/eng.qa.exploratory-session-rules.md +0 -137
- package/rules/engineering/qa/eng.qa.quality-gate-scoring-rules.md +0 -181
- package/rules/engineering/qa/eng.qa.tech-spec-validation-criteria-rules.md +0 -120
- package/skills/eng-ai-engineer/SKILL.md +0 -303
- package/skills/eng-data-bi/SKILL.md +0 -206
- package/skills/eng-data-debug/SKILL.md +0 -314
- package/skills/eng-data-engineer/SKILL.md +0 -266
- package/skills/eng-data-onboard/SKILL.md +0 -317
- package/skills/eng-data-orchestrator/SKILL.md +0 -433
- package/skills/eng-devops-performance-engineer/SKILL.md +0 -319
- package/skills/eng-frontend-design-system/SKILL.md +0 -155
- package/skills/eng-frontend-design-system/references/1-estrutura-pacote.md +0 -57
- package/skills/eng-frontend-design-system/references/2-tokens.md +0 -116
- package/skills/eng-frontend-design-system/references/3-componentes.md +0 -165
- package/skills/eng-frontend-design-system/references/4-storybook.md +0 -85
- package/skills/eng-frontend-design-system/references/5-auditoria-versionamento.md +0 -76
- package/skills/eng-frontend-microfrontend/SKILL.md +0 -164
- package/skills/eng-frontend-microfrontend/references/1-criando-remote.md +0 -109
- package/skills/eng-frontend-microfrontend/references/2-configurando-shell.md +0 -70
- package/skills/eng-frontend-microfrontend/references/3-contratos-interface.md +0 -73
- package/skills/eng-frontend-microfrontend/references/4-shared-dependencies.md +0 -48
- package/skills/eng-frontend-microfrontend/references/5-event-bus.md +0 -59
- package/skills/eng-frontend-microfrontend/references/6-monorepo-deploy.md +0 -77
- package/skills/eng-frontend-microfrontend/references/7-troubleshooting.md +0 -45
- package/skills/eng-global-browser-extension-builder/SKILL.md +0 -392
- package/skills/eng-global-jira-comment/SKILL.md +0 -27
- package/skills/eng-qa-a11y-audit/SKILL.md +0 -276
- package/skills/eng-qa-bug-report/SKILL.md +0 -877
- package/skills/eng-qa-bug-report/TASK_MANAGERS.md +0 -138
- package/skills/eng-qa-bug-report/references/1-integracao-task-managers.md +0 -148
- package/skills/eng-qa-bug-report/references/2-exemplos-de-uso.md +0 -46
- package/skills/eng-qa-bug-report/references/3-bug-to-test.md +0 -45
- package/skills/eng-qa-cypress-e2e/SKILL.md +0 -184
- package/skills/eng-qa-dev-guide/SKILL.md +0 -173
- package/skills/eng-qa-e2e/SKILL.md +0 -407
- package/skills/eng-qa-e2e-spec-writer/SKILL.md +0 -329
- package/skills/eng-qa-exploratory/SKILL.md +0 -196
- package/skills/eng-qa-gate/SKILL.md +0 -377
- package/skills/eng-qa-gate/assets/checklist-validacao.md +0 -291
- package/skills/eng-qa-graphql-contract/SKILL.md +0 -263
- package/skills/eng-qa-quality-report/SKILL.md +0 -419
- package/skills/eng-qa-test-plan/SKILL.md +0 -473
- package/skills/eng-qa-testsprite/SKILL.md +0 -332
- package/skills/eng-qa-testsprite/references/testsprite-mcp.md +0 -224
- package/skills/eng-qa-unit-test/SKILL.md +0 -478
- package/skills/eng-scraper/SKILL.md +0 -260
- package/skills/eng-scraper/references/1-puppeteer.md +0 -140
- package/skills/eng-scraper/references/2-playwright-cheerio-pdf.md +0 -82
- package/skills/eng-scraper/references/3-anti-bot.md +0 -94
- package/skills/eng-scraper/references/4-resiliencia-etl-monitoramento.md +0 -137
- package/skills/eng-scraper-robot-builder/SKILL.md +0 -377
- package/skills/eng-security-cybersecurity/SKILL.md +0 -250
- package/skills/eng-security-cybersecurity/references/1-owasp-top-10.md +0 -331
- package/skills/eng-security-cybersecurity/references/2-secrets-management.md +0 -31
- package/skills/eng-security-cybersecurity/references/3-input-validation.md +0 -43
- package/skills/eng-security-cybersecurity/references/4-compliance.md +0 -20
- package/skills/eng-security-patch/SKILL.md +0 -388
- package/skills/eng-security-threat-model/SKILL.md +0 -171
- package/skills/eng-security-triage/SKILL.md +0 -276
- package/templates/engineering/qa/eng.qa.quality-gate-examples-template.md +0 -311
- package/templates/engineering/qa/eng.qa.quality-gate-report-template.md +0 -249
- package/templates/engineering/qa/qa.cypress-test-template.md +0 -172
- package/templates/engineering/qa/qa.exploratory-session-template.md +0 -148
- package/templates/engineering/qa/qa.quality-report-template.md +0 -130
- package/workflows/engineering/eng.security-audit.md +0 -319
- package/workflows/engineering/eng.security-incident.md +0 -281
- package/workflows/engineering/eng.security-pipeline.md +0 -219
- package/workflows/engineering/eng.security-review.md +0 -241
- package/workflows/engineering/qa/eng.qa-dev-quality-guide.md +0 -57
- package/workflows/engineering/qa/eng.qa-e2e-test-generation.md +0 -57
- package/workflows/engineering/qa/eng.qa-exploratory-session.md +0 -68
- package/workflows/engineering/qa/eng.qa-quality-gate-validation.md +0 -209
- package/workflows/engineering/qa/eng.qa-quality-report.md +0 -85
- /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-coverage-template.md +0 -0
- /package/skills/{eng-qa-test-plan → eng-qa-planner}/assets/test-patterns.md +0 -0
- /package/templates/{CDD aplicado a Prompts.md → cdd-aplicado-a-prompts.md} +0 -0
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
# Criando um Componente e Acessibilidade
|
|
2
|
-
|
|
3
|
-
> Parte do skill `eng-frontend-design-system`. Leia este arquivo quando a tarefa criar ou alterar um componente (CVA, API pública, acessibilidade, Radix UI).
|
|
4
|
-
|
|
5
|
-
## Criando um Componente
|
|
6
|
-
|
|
7
|
-
### Checklist antes de criar
|
|
8
|
-
|
|
9
|
-
- [ ] Verificar se já existe componente similar (`ls src/components/`)
|
|
10
|
-
- [ ] Verificar se o Radix UI tem primitive para este componente
|
|
11
|
-
- [ ] Confirmar variantes necessárias com design
|
|
12
|
-
- [ ] Definir API de props antes de implementar
|
|
13
|
-
|
|
14
|
-
### Padrão com CVA (class-variance-authority)
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
// src/components/Button/Button.tsx
|
|
18
|
-
import { cva, type VariantProps } from 'class-variance-authority'
|
|
19
|
-
import { cn } from '../../utils/cn'
|
|
20
|
-
import type { ButtonHTMLAttributes } from 'react'
|
|
21
|
-
|
|
22
|
-
const buttonVariants = cva(
|
|
23
|
-
// Base — aplicado a todas as variantes
|
|
24
|
-
[
|
|
25
|
-
'inline-flex items-center justify-center gap-2',
|
|
26
|
-
'rounded font-medium transition-colors',
|
|
27
|
-
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
|
|
28
|
-
'disabled:opacity-50 disabled:pointer-events-none',
|
|
29
|
-
],
|
|
30
|
-
{
|
|
31
|
-
variants: {
|
|
32
|
-
variant: {
|
|
33
|
-
primary: 'bg-interactive-primary text-white hover:bg-interactive-primary-hover',
|
|
34
|
-
secondary: 'border border-gray-300 bg-white text-content-primary hover:bg-gray-50',
|
|
35
|
-
ghost: 'text-content-primary hover:bg-gray-100',
|
|
36
|
-
destructive: 'bg-feedback-error text-white hover:bg-red-600',
|
|
37
|
-
link: 'text-interactive-primary underline-offset-4 hover:underline p-0 h-auto',
|
|
38
|
-
},
|
|
39
|
-
size: {
|
|
40
|
-
sm: 'h-8 px-3 text-sm',
|
|
41
|
-
md: 'h-10 px-4 text-base',
|
|
42
|
-
lg: 'h-12 px-6 text-lg',
|
|
43
|
-
icon: 'h-10 w-10',
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
defaultVariants: {
|
|
47
|
-
variant: 'primary',
|
|
48
|
-
size: 'md',
|
|
49
|
-
},
|
|
50
|
-
}
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
export interface ButtonProps
|
|
54
|
-
extends ButtonHTMLAttributes<HTMLButtonElement>,
|
|
55
|
-
VariantProps<typeof buttonVariants> {
|
|
56
|
-
loading?: boolean
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function Button({
|
|
60
|
-
className,
|
|
61
|
-
variant,
|
|
62
|
-
size,
|
|
63
|
-
loading,
|
|
64
|
-
disabled,
|
|
65
|
-
children,
|
|
66
|
-
...props
|
|
67
|
-
}: ButtonProps) {
|
|
68
|
-
return (
|
|
69
|
-
<button
|
|
70
|
-
className={cn(buttonVariants({ variant, size }), className)}
|
|
71
|
-
disabled={disabled || loading}
|
|
72
|
-
aria-busy={loading}
|
|
73
|
-
{...props}
|
|
74
|
-
>
|
|
75
|
-
{loading && <span className="sr-only">Carregando...</span>}
|
|
76
|
-
{children}
|
|
77
|
-
</button>
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Exportar variantes para uso externo (ex: estender em outro componente)
|
|
82
|
-
export { buttonVariants }
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Utilitário `cn` (obrigatório)
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
// src/utils/cn.ts
|
|
89
|
-
import { clsx, type ClassValue } from 'clsx'
|
|
90
|
-
import { twMerge } from 'tailwind-merge'
|
|
91
|
-
|
|
92
|
-
export function cn(...inputs: ClassValue[]) {
|
|
93
|
-
return twMerge(clsx(inputs))
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Ponto de entrada do componente
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
// src/components/Button/index.ts
|
|
101
|
-
export { Button, buttonVariants } from './Button'
|
|
102
|
-
export type { ButtonProps } from './Button'
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Regras de API pública
|
|
106
|
-
|
|
107
|
-
- Props que o consumidor pode precisar sobrescrever: exportar o tipo
|
|
108
|
-
- Nunca expor detalhes de implementação interna nas props
|
|
109
|
-
- `className` sempre aceito para extensibilidade
|
|
110
|
-
- `ref` sempre passado via `forwardRef` em elementos DOM
|
|
111
|
-
|
|
112
|
-
```typescript
|
|
113
|
-
// Padrão com forwardRef (obrigatório para componentes com elemento DOM)
|
|
114
|
-
import { forwardRef } from 'react'
|
|
115
|
-
|
|
116
|
-
export const Input = forwardRef<HTMLInputElement, InputProps>(
|
|
117
|
-
function Input({ className, ...props }, ref) {
|
|
118
|
-
return (
|
|
119
|
-
<input
|
|
120
|
-
ref={ref}
|
|
121
|
-
className={cn(inputVariants(), className)}
|
|
122
|
-
{...props}
|
|
123
|
-
/>
|
|
124
|
-
)
|
|
125
|
-
}
|
|
126
|
-
)
|
|
127
|
-
Input.displayName = 'Input'
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Acessibilidade em Componentes
|
|
133
|
-
|
|
134
|
-
### Componentes compostos com Radix UI
|
|
135
|
-
|
|
136
|
-
```typescript
|
|
137
|
-
// ✅ Dialog com Radix — acessibilidade built-in
|
|
138
|
-
import * as Dialog from '@radix-ui/react-dialog'
|
|
139
|
-
|
|
140
|
-
export function Modal({ title, description, trigger, children }: ModalProps) {
|
|
141
|
-
return (
|
|
142
|
-
<Dialog.Root>
|
|
143
|
-
<Dialog.Trigger asChild>{trigger}</Dialog.Trigger>
|
|
144
|
-
<Dialog.Portal>
|
|
145
|
-
<Dialog.Overlay className="fixed inset-0 bg-background-overlay" />
|
|
146
|
-
<Dialog.Content
|
|
147
|
-
className="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 ..."
|
|
148
|
-
aria-describedby={description ? 'modal-description' : undefined}
|
|
149
|
-
>
|
|
150
|
-
<Dialog.Title>{title}</Dialog.Title>
|
|
151
|
-
{description && (
|
|
152
|
-
<Dialog.Description id="modal-description">{description}</Dialog.Description>
|
|
153
|
-
)}
|
|
154
|
-
{children}
|
|
155
|
-
<Dialog.Close asChild>
|
|
156
|
-
<button aria-label="Fechar">✕</button>
|
|
157
|
-
</Dialog.Close>
|
|
158
|
-
</Dialog.Content>
|
|
159
|
-
</Dialog.Portal>
|
|
160
|
-
</Dialog.Root>
|
|
161
|
-
)
|
|
162
|
-
}
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
---
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# Storybook
|
|
2
|
-
|
|
3
|
-
> Parte do skill `eng-frontend-design-system`. Leia este arquivo quando a tarefa envolver stories ou a configuração do Storybook.
|
|
4
|
-
|
|
5
|
-
## Storybook
|
|
6
|
-
|
|
7
|
-
### Configuração base
|
|
8
|
-
|
|
9
|
-
```typescript
|
|
10
|
-
// .storybook/main.ts
|
|
11
|
-
import type { StorybookConfig } from '@storybook/react-vite'
|
|
12
|
-
|
|
13
|
-
const config: StorybookConfig = {
|
|
14
|
-
stories: ['../src/**/*.stories.@(ts|tsx)'],
|
|
15
|
-
addons: [
|
|
16
|
-
'@storybook/addon-essentials',
|
|
17
|
-
'@storybook/addon-a11y', // auditoria de acessibilidade
|
|
18
|
-
'@storybook/addon-interactions', // testes interativos
|
|
19
|
-
],
|
|
20
|
-
framework: '@storybook/react-vite',
|
|
21
|
-
}
|
|
22
|
-
export default config
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### Story padrão
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
// src/components/Button/Button.stories.tsx
|
|
29
|
-
import type { Meta, StoryObj } from '@storybook/react'
|
|
30
|
-
import { Button } from './Button'
|
|
31
|
-
|
|
32
|
-
const meta: Meta<typeof Button> = {
|
|
33
|
-
title: 'Components/Button',
|
|
34
|
-
component: Button,
|
|
35
|
-
tags: ['autodocs'],
|
|
36
|
-
argTypes: {
|
|
37
|
-
variant: {
|
|
38
|
-
control: 'select',
|
|
39
|
-
options: ['primary', 'secondary', 'ghost', 'destructive', 'link'],
|
|
40
|
-
},
|
|
41
|
-
size: {
|
|
42
|
-
control: 'select',
|
|
43
|
-
options: ['sm', 'md', 'lg', 'icon'],
|
|
44
|
-
},
|
|
45
|
-
loading: { control: 'boolean' },
|
|
46
|
-
disabled: { control: 'boolean' },
|
|
47
|
-
},
|
|
48
|
-
}
|
|
49
|
-
export default meta
|
|
50
|
-
type Story = StoryObj<typeof Button>
|
|
51
|
-
|
|
52
|
-
// Story principal — estado padrão
|
|
53
|
-
export const Default: Story = {
|
|
54
|
-
args: {
|
|
55
|
-
children: 'Botão',
|
|
56
|
-
variant: 'primary',
|
|
57
|
-
size: 'md',
|
|
58
|
-
},
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Todas as variantes juntas
|
|
62
|
-
export const AllVariants: Story = {
|
|
63
|
-
render: () => (
|
|
64
|
-
<div className="flex flex-wrap gap-3">
|
|
65
|
-
<Button variant="primary">Primary</Button>
|
|
66
|
-
<Button variant="secondary">Secondary</Button>
|
|
67
|
-
<Button variant="ghost">Ghost</Button>
|
|
68
|
-
<Button variant="destructive">Destructive</Button>
|
|
69
|
-
</div>
|
|
70
|
-
),
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Estados especiais
|
|
74
|
-
export const Loading: Story = { args: { children: 'Salvando...', loading: true } }
|
|
75
|
-
export const Disabled: Story = { args: { children: 'Desabilitado', disabled: true } }
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Checklist de story
|
|
79
|
-
- [ ] Autodocs ativo (`tags: ['autodocs']`)
|
|
80
|
-
- [ ] ArgTypes com `control` para cada prop variável
|
|
81
|
-
- [ ] Story para cada estado relevante (loading, disabled, erro)
|
|
82
|
-
- [ ] Story `AllVariants` para overview visual
|
|
83
|
-
- [ ] Addon `a11y` habilitado (verificar violations na aba Accessibility)
|
|
84
|
-
|
|
85
|
-
---
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# Auditoria de Consistência e Versionamento
|
|
2
|
-
|
|
3
|
-
> Parte do skill `eng-frontend-design-system`. Leia este arquivo quando a tarefa auditar tokens e componentes ou tratar breaking changes e versionamento.
|
|
4
|
-
|
|
5
|
-
## Auditoria de Consistência
|
|
6
|
-
|
|
7
|
-
### Detectar tokens hardcodados (proibido)
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
# Cores hardcodadas no código (deve retornar zero resultados)
|
|
11
|
-
grep -r "#[0-9a-fA-F]\{3,6\}\b" src/components/ --include="*.tsx" --include="*.ts"
|
|
12
|
-
grep -r "rgb(\|rgba(\|hsl(" src/components/ --include="*.tsx"
|
|
13
|
-
|
|
14
|
-
# Valores de espaçamento hardcodados
|
|
15
|
-
grep -r "style={{" src/components/ --include="*.tsx" | grep -v "className"
|
|
16
|
-
|
|
17
|
-
# Fontes hardcodadas
|
|
18
|
-
grep -r "fontFamily\|fontSize" src/components/ --include="*.tsx" | grep -v "var(--font"
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
### Verificar componentes sem story
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
# Componentes sem arquivo de story correspondente
|
|
25
|
-
for f in src/components/**/*.tsx; do
|
|
26
|
-
base="${f%.tsx}"
|
|
27
|
-
[ ! -f "${base}.stories.tsx" ] && echo "SEM STORY: $f"
|
|
28
|
-
done
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Verificar componentes sem teste
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
for f in src/components/**/*.tsx; do
|
|
35
|
-
base="${f%.tsx}"
|
|
36
|
-
[ ! -f "${base}.test.tsx" ] && echo "SEM TESTE: $f"
|
|
37
|
-
done
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## Versionamento e Breaking Changes
|
|
43
|
-
|
|
44
|
-
### O que é uma breaking change?
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
Breaking change (bump MAJOR):
|
|
48
|
-
- Remover uma prop
|
|
49
|
-
- Renomear uma prop sem alias de retrocompatibilidade
|
|
50
|
-
- Alterar o tipo de uma prop (ex: string → enum)
|
|
51
|
-
- Remover uma variante existente
|
|
52
|
-
- Alterar comportamento padrão visível
|
|
53
|
-
|
|
54
|
-
Non-breaking (bump MINOR ou PATCH):
|
|
55
|
-
- Adicionar nova prop opcional
|
|
56
|
-
- Adicionar nova variante
|
|
57
|
-
- Corrigir bug visual
|
|
58
|
-
- Melhorar acessibilidade
|
|
59
|
-
- Atualizar documentação
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Processo para breaking change
|
|
63
|
-
|
|
64
|
-
```markdown
|
|
65
|
-
1. Criar deprecation notice na versão atual (adicionar `@deprecated` no JSDoc)
|
|
66
|
-
2. Documentar no CHANGELOG.md com seção "Migration Guide"
|
|
67
|
-
3. Dar prazo de 1 sprint para os consumidores migrarem (comunicar no canal do time)
|
|
68
|
-
4. Lançar major version com a mudança
|
|
69
|
-
5. Atualizar todos os remotes que consomem o componente
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
// Deprecation notice
|
|
74
|
-
/** @deprecated Use `variant="destructive"` em vez de `danger`. Será removido em v2.0. */
|
|
75
|
-
export type LegacyButtonVariant = 'danger'
|
|
76
|
-
```
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: eng-frontend-microfrontend
|
|
3
|
-
description: >
|
|
4
|
-
Especialista em arquitetura micro frontend com Module Federation.
|
|
5
|
-
Cobre shell/remote apps, contratos de interface, shared dependencies, event bus,
|
|
6
|
-
monorepo frontend, desenvolvimento local standalone e estratégias de deploy independente.
|
|
7
|
-
Trigger: Use para criar novo remote, configurar Module Federation, integrar ao shell,
|
|
8
|
-
definir contrato de interface entre apps, resolver conflitos de shared libs ou planejar
|
|
9
|
-
migração para arquitetura micro frontend.
|
|
10
|
-
license: AGPL-3.0
|
|
11
|
-
compatibility: Designed for Claude Code (or similar products)
|
|
12
|
-
allowed-tools: Read Write Edit Glob Grep Bash
|
|
13
|
-
metadata:
|
|
14
|
-
author: jarvis-team
|
|
15
|
-
version: "1.0"
|
|
16
|
-
area: frontend
|
|
17
|
-
stack: microfrontend
|
|
18
|
-
argument-hint: "[novo-remote|shell|contrato|shared-deps|monorepo|debug] [contexto]"
|
|
19
|
-
disable-model-invocation: false
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
# Eng Micro Frontend — Especialista em Arquitetura Distribuída de Frontend
|
|
23
|
-
|
|
24
|
-
Você é um **especialista em micro frontend com Module Federation** — arquitetura onde múltiplas
|
|
25
|
-
aplicações frontend independentes colaboram para formar um produto coeso.
|
|
26
|
-
|
|
27
|
-
## Objetivo
|
|
28
|
-
|
|
29
|
-
Projetar, implementar e manter micro frontends corretos, isolados e evoluíveis — com contratos
|
|
30
|
-
claros entre shell e remotes, shared dependencies controladas e deploys verdadeiramente independentes.
|
|
31
|
-
|
|
32
|
-
## Conceitos Centrais
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
Shell (Host) — orquestra a composição; monta os remotes nas rotas certas
|
|
36
|
-
Remote (MFE) — feature isolada; expõe componentes/rotas para o shell consumir
|
|
37
|
-
Design System — pacote compartilhado de componentes e tokens (não é um remote)
|
|
38
|
-
Event Bus — canal de comunicação desacoplado entre shell e remotes
|
|
39
|
-
Contrato de Interface — tipos TypeScript que definem o que o remote expõe e o que espera do shell
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Entrada
|
|
43
|
-
|
|
44
|
-
- `$ARGUMENTS` — o que será feito: `novo-remote`, `shell`, `contrato`, `shared-deps`, `monorepo`, `debug`
|
|
45
|
-
|
|
46
|
-
## Recursos
|
|
47
|
-
|
|
48
|
-
- **ENV**: `$IDE/ENV.md`
|
|
49
|
-
- **Skill complementar**: `eng-frontend` (componentes), `eng-frontend-design-system` (tokens e componentes compartilhados)
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Pré-requisito
|
|
54
|
-
|
|
55
|
-
Verificar `ENV.md` antes de executar. Confirmar bundler em uso:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# Vite com @originjs/vite-plugin-federation
|
|
59
|
-
grep -r "vite-plugin-federation\|@module-federation" package.json
|
|
60
|
-
|
|
61
|
-
# Webpack com ModuleFederationPlugin
|
|
62
|
-
grep -r "ModuleFederationPlugin\|webpack" package.json
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
> **Nota de stack:** Os exemplos de código neste skill usam **Vite + @originjs/vite-plugin-federation**
|
|
66
|
-
> por ser a configuração mais comum em projetos novos. Se o projeto usa **Webpack**, os conceitos
|
|
67
|
-
> são idênticos — apenas a configuração do `ModuleFederationPlugin` muda.
|
|
68
|
-
> A seção "Criando um Remote" inclui referência para ambos os bundlers onde relevante.
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## Árvore de Decisão
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
O que será feito?
|
|
76
|
-
├── Criar novo remote → Seção: Criando um Remote
|
|
77
|
-
├── Configurar o shell → Seção: Configurando o Shell
|
|
78
|
-
├── Definir contrato de interface → Seção: Contratos de Interface
|
|
79
|
-
├── Gerenciar shared dependencies → Seção: Shared Dependencies
|
|
80
|
-
├── Configurar monorepo → Seção: Monorepo Frontend
|
|
81
|
-
├── Comunicação entre apps → Seção: Event Bus
|
|
82
|
-
├── Deploy independente → Seção: Estratégia de Deploy
|
|
83
|
-
└── Debug de problema → Seção: Troubleshooting
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## Referências (leia só o tema que a tarefa pedir)
|
|
89
|
-
|
|
90
|
-
Leia **só** o arquivo do tema que a tarefa pedir; o restante fica fora do contexto.
|
|
91
|
-
|
|
92
|
-
| Tema | Quando ler | Arquivo |
|
|
93
|
-
|------|-----------|---------|
|
|
94
|
-
| Criando um Remote | A tarefa criar um remote novo (estrutura, bootstrap, Vite e modo standalone) | `references/1-criando-remote.md` |
|
|
95
|
-
| Configurando o Shell | A tarefa configurar o shell ou o lazy loading de remotes | `references/2-configurando-shell.md` |
|
|
96
|
-
| Contratos de Interface | A tarefa definir ou alterar contratos entre shell e remotes | `references/3-contratos-interface.md` |
|
|
97
|
-
| Shared Dependencies | A tarefa envolver dependências compartilhadas ou conflito de versão | `references/4-shared-dependencies.md` |
|
|
98
|
-
| Event Bus | A tarefa envolver comunicação entre remotes por eventos | `references/5-event-bus.md` |
|
|
99
|
-
| Monorepo e Estratégia de Deploy | A tarefa envolver a estrutura do monorepo, o deploy independente ou o versionamento de remotes | `references/6-monorepo-deploy.md` |
|
|
100
|
-
| Troubleshooting de Micro Frontend | Houver erro de módulo compartilhado, remote indisponível ou componente que não re-renderiza | `references/7-troubleshooting.md` |
|
|
101
|
-
|
|
102
|
-
## Checklist de Novo Remote
|
|
103
|
-
|
|
104
|
-
- [ ] `bootstrap.ts` com import dinâmico
|
|
105
|
-
- [ ] Funciona em modo standalone (`npm run dev`)
|
|
106
|
-
- [ ] `exposed/` contém apenas a API pública
|
|
107
|
-
- [ ] Contrato de interface criado em `mfe-contracts`
|
|
108
|
-
- [ ] Shared dependencies declaradas com `singleton: true` e `requiredVersion`
|
|
109
|
-
- [ ] ErrorBoundary no ponto de montagem do shell
|
|
110
|
-
- [ ] Testes de integração com shell (ao menos smoke test)
|
|
111
|
-
- [ ] URL de deploy configurada via variável de ambiente
|
|
112
|
-
- [ ] Breaking changes documentadas e comunicadas ao time do shell
|
|
113
|
-
|
|
114
|
-
### Skills invocados durante a execução do skill
|
|
115
|
-
|
|
116
|
-
| Passo | Skill | Condição |
|
|
117
|
-
|-------|-------|----------|
|
|
118
|
-
| — | Nenhuma — skill autocontida | — |
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Regras
|
|
123
|
-
|
|
124
|
-
### Nunca
|
|
125
|
-
- Importar diretamente de outro remote (rompe isolamento e cria acoplamento)
|
|
126
|
-
- Compartilhar estado via módulo — usar event bus ou props via shell
|
|
127
|
-
- Deploy do shell acoplado ao deploy de um remote (derrota o propósito)
|
|
128
|
-
- `eager: true` em shared libs (causa erro de bootstrap)
|
|
129
|
-
- Hardcodar URL do remoteEntry (sempre via variável de ambiente)
|
|
130
|
-
|
|
131
|
-
### Sempre
|
|
132
|
-
- Cada remote funciona standalone para desenvolvimento local
|
|
133
|
-
- Contratos de interface em TypeScript antes de integrar ao shell
|
|
134
|
-
- `singleton: true` para React, React DOM, React Router e design system
|
|
135
|
-
- ErrorBoundary no shell ao montar cada remote
|
|
136
|
-
- Versionar breaking changes no contrato com semver
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## Output
|
|
141
|
-
|
|
142
|
-
| Artefato | Descrição |
|
|
143
|
-
|----------|-----------|
|
|
144
|
-
| Configuração Module Federation | `vite.config.ts` ou `webpack.config.ts` do remote e/ou shell |
|
|
145
|
-
| Contrato de interface | Types em `mfe-contracts` |
|
|
146
|
-
| Ponto de montagem | Lazy import + ErrorBoundary no shell |
|
|
147
|
-
| Event bus | Tipos de eventos e usage examples |
|
|
148
|
-
| Pipeline CI | Configuração de build/deploy independente |
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Mensagem de Conclusão
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
Micro Frontend configurado!
|
|
156
|
-
|
|
157
|
-
Remote: {nome}
|
|
158
|
-
Expõe: {lista do exposed}
|
|
159
|
-
Contrato: {arquivo de tipos criado}
|
|
160
|
-
Shared deps: {lista das dependências compartilhadas}
|
|
161
|
-
Standalone: {porta de dev local}
|
|
162
|
-
|
|
163
|
-
Próximo passo: {integrar ao shell | definir contrato | configurar CI}
|
|
164
|
-
```
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# Criando um Remote
|
|
2
|
-
|
|
3
|
-
> Parte do skill `eng-frontend-microfrontend`. Leia este arquivo quando a tarefa criar um remote novo (estrutura, bootstrap, Vite e modo standalone).
|
|
4
|
-
|
|
5
|
-
## Criando um Remote
|
|
6
|
-
|
|
7
|
-
### Estrutura de um remote
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
apps/
|
|
11
|
-
└── {nome-remote}/
|
|
12
|
-
├── src/
|
|
13
|
-
│ ├── bootstrap.ts ← entry point async (necessário para Module Federation)
|
|
14
|
-
│ ├── index.ts ← importa e executa bootstrap
|
|
15
|
-
│ ├── App.tsx ← root do remote (para modo standalone)
|
|
16
|
-
│ ├── routes/ ← rotas do remote
|
|
17
|
-
│ ├── components/ ← componentes locais do remote
|
|
18
|
-
│ └── exposed/ ← o que será exposto via Module Federation
|
|
19
|
-
│ ├── index.ts ← re-exporta tudo que é público
|
|
20
|
-
│ └── RemoteApp.tsx ← componente raiz exposto ao shell
|
|
21
|
-
├── vite.config.ts ← ou webpack.config.ts
|
|
22
|
-
├── package.json
|
|
23
|
-
└── tsconfig.json
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Por que `bootstrap.ts` é obrigatório?
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
// src/index.ts — entry point síncrono
|
|
30
|
-
import('./bootstrap') // import() dinâmico é necessário para Module Federation funcionar
|
|
31
|
-
|
|
32
|
-
// src/bootstrap.ts — inicialização real
|
|
33
|
-
import React from 'react'
|
|
34
|
-
import ReactDOM from 'react-dom/client'
|
|
35
|
-
import App from './App'
|
|
36
|
-
|
|
37
|
-
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
38
|
-
<React.StrictMode>
|
|
39
|
-
<App />
|
|
40
|
-
</React.StrictMode>
|
|
41
|
-
)
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
> Sem o `bootstrap.ts`, o eager consumption de shared libs causa erro em runtime.
|
|
45
|
-
|
|
46
|
-
### Configuração Vite (vite-plugin-federation)
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
// vite.config.ts do remote
|
|
50
|
-
import { defineConfig } from 'vite'
|
|
51
|
-
import react from '@vitejs/plugin-react'
|
|
52
|
-
import federation from '@originjs/vite-plugin-federation'
|
|
53
|
-
|
|
54
|
-
export default defineConfig({
|
|
55
|
-
plugins: [
|
|
56
|
-
react(),
|
|
57
|
-
federation({
|
|
58
|
-
name: '{nome-remote}', // identificador único do remote
|
|
59
|
-
filename: 'remoteEntry.js', // arquivo gerado
|
|
60
|
-
exposes: {
|
|
61
|
-
'./App': './src/exposed/RemoteApp', // o que o shell pode importar
|
|
62
|
-
'./routes': './src/exposed/routes', // rotas para shell carregar
|
|
63
|
-
},
|
|
64
|
-
shared: {
|
|
65
|
-
react: { singleton: true, requiredVersion: '^18.0.0' },
|
|
66
|
-
'react-dom': { singleton: true, requiredVersion: '^18.0.0' },
|
|
67
|
-
'react-router-dom': { singleton: true },
|
|
68
|
-
// design system — sempre singleton para evitar instâncias duplicadas
|
|
69
|
-
'@{org}/design-system': { singleton: true },
|
|
70
|
-
},
|
|
71
|
-
}),
|
|
72
|
-
],
|
|
73
|
-
build: {
|
|
74
|
-
target: 'esnext',
|
|
75
|
-
minify: false, // facilita debug; ativar em prod via CI flag
|
|
76
|
-
cssCodeSplit: false, // evita problemas com CSS em remotes
|
|
77
|
-
},
|
|
78
|
-
})
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Modo standalone (obrigatório para dev local)
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
|
-
// src/App.tsx — funciona sem shell
|
|
85
|
-
import { BrowserRouter } from 'react-router-dom'
|
|
86
|
-
import { AppRoutes } from './routes'
|
|
87
|
-
|
|
88
|
-
export default function App() {
|
|
89
|
-
return (
|
|
90
|
-
<BrowserRouter>
|
|
91
|
-
<AppRoutes />
|
|
92
|
-
</BrowserRouter>
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
```json
|
|
98
|
-
// package.json do remote
|
|
99
|
-
{
|
|
100
|
-
"scripts": {
|
|
101
|
-
"dev": "vite --port 3001", // standalone
|
|
102
|
-
"dev:federated": "vite --port 3001 --mode federated", // com Module Federation ativo
|
|
103
|
-
"build": "vite build",
|
|
104
|
-
"preview": "vite preview --port 3001"
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
---
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
# Configurando o Shell
|
|
2
|
-
|
|
3
|
-
> Parte do skill `eng-frontend-microfrontend`. Leia este arquivo quando a tarefa configurar o shell ou o lazy loading de remotes.
|
|
4
|
-
|
|
5
|
-
## Configurando o Shell
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
// vite.config.ts do shell
|
|
9
|
-
import federation from '@originjs/vite-plugin-federation'
|
|
10
|
-
|
|
11
|
-
export default defineConfig({
|
|
12
|
-
plugins: [
|
|
13
|
-
react(),
|
|
14
|
-
federation({
|
|
15
|
-
name: 'shell',
|
|
16
|
-
remotes: {
|
|
17
|
-
'{nome-remote}': 'http://localhost:3001/assets/remoteEntry.js',
|
|
18
|
-
// Em produção, usar variável de ambiente:
|
|
19
|
-
// '{nome-remote}': process.env.VITE_REMOTE_URL_NOME_REMOTE,
|
|
20
|
-
},
|
|
21
|
-
shared: {
|
|
22
|
-
react: { singleton: true },
|
|
23
|
-
'react-dom': { singleton: true },
|
|
24
|
-
'react-router-dom': { singleton: true },
|
|
25
|
-
'@{org}/design-system': { singleton: true },
|
|
26
|
-
},
|
|
27
|
-
}),
|
|
28
|
-
],
|
|
29
|
-
})
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Lazy loading de remotes no shell
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
// src/routes/index.tsx — shell monta remotes por rota
|
|
36
|
-
import { lazy, Suspense } from 'react'
|
|
37
|
-
import { Routes, Route } from 'react-router-dom'
|
|
38
|
-
|
|
39
|
-
// Tipagem do remote (importar do contrato de interface)
|
|
40
|
-
const RemoteApp = lazy(() =>
|
|
41
|
-
import('{nome-remote}/App').then((m) => ({ default: m.default }))
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
function ErrorFallback({ error }: { error: Error }) {
|
|
45
|
-
return (
|
|
46
|
-
<div role="alert">
|
|
47
|
-
<p>Falha ao carregar módulo. <button onClick={() => window.location.reload()}>Tentar novamente</button></p>
|
|
48
|
-
</div>
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function ShellRoutes() {
|
|
53
|
-
return (
|
|
54
|
-
<Routes>
|
|
55
|
-
<Route
|
|
56
|
-
path="/{caminho-remote}/*"
|
|
57
|
-
element={
|
|
58
|
-
<Suspense fallback={<div>Carregando...</div>}>
|
|
59
|
-
<ErrorBoundary FallbackComponent={ErrorFallback}>
|
|
60
|
-
<RemoteApp />
|
|
61
|
-
</ErrorBoundary>
|
|
62
|
-
</Suspense>
|
|
63
|
-
}
|
|
64
|
-
/>
|
|
65
|
-
</Routes>
|
|
66
|
-
)
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
---
|