chore: remove unused dependencies and Storybook (Onda 1 PR 1.2)#97
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
WalkthroughEste PR remove a integração completa do Storybook do projeto. Todas as configurações de build ( ChangesDesativação e Remoção do Storybook
Estimated code review effort🎯 2 (Simples) | ⏱️ ~12 minutos Remoção homogênea sem lógica complexa. Validar: (1) nenhuma dependência viva referencia Storybook; (2) build/dev pipeline funciona; (3) registry reorg não quebra renderização. Sem bugs, segurança ou issues de performance introduzidos. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Remove deps comprovadamente não usadas + Storybook completo.
## Deps removidas (35 pacotes)
### Tier A — Lovable residual (2)
- @lovable.dev/cloud-auth-js (0 imports)
- lovable-tagger (era usado em vite.config — também removido daí)
### Tier B — Shadcn instalado mas não usado (6)
- @radix-ui/react-aspect-ratio
- @radix-ui/react-navigation-menu
- @radix-ui/react-visually-hidden (visually-hidden.tsx é custom Tailwind sr-only)
- embla-carousel-react
- input-otp
- vaul
### Tier C — Plugins Vite não configurados (3)
- vite-plugin-compression2 (não estava em vite.config)
- vite-plugin-pwa (não estava em vite.config)
- @vitejs/plugin-react-swc (vite usa @vitejs/plugin-react regular)
### Tier D — Mortos (12)
- web-vitals (src/lib/web-vitals.ts é arquivo CUSTOM, não usa pacote)
- prop-types (projeto é TypeScript)
- serialize-javascript
- wait-on
- glob
- fast-check
- @tailwindcss/typography (não estava em tailwind.config plugins)
- @hookform/resolvers (0 imports — react-hook-form fica)
- @types/dompurify (dompurify v3 tem types embutidos)
- jsdom (vitest usa happy-dom)
- lint-staged (sem config em package.json)
### Tier E — Storybook completo (12)
Decisão técnica: REMOVER (custo > benefício pra app interno SaaS):
- storybook
- @chromatic-com/storybook
- @storybook/addon-a11y
- @storybook/addon-docs
- @storybook/addon-essentials
- @storybook/addon-interactions
- @storybook/addon-links
- @storybook/addon-onboarding
- @storybook/addon-vitest
- @storybook/blocks
- @storybook/react
- @storybook/react-vite
- eslint-plugin-storybook
## Arquivos removidos (37)
- .storybook/main.ts
- .storybook/preview.ts
- src/stories/ (Button, Header, Page + assets)
- src/components/ui/stories/ (10 stories)
## Configs atualizadas
- vite.config.ts: removido import + uso de lovable-tagger
- eslint.config.js: removido eslint-plugin-storybook + plugin
- package.json: removidos scripts 'storybook' e 'build-storybook'
## Não removidos (falsos positivos detectados)
A análise inicial sugeriu remover jspdf e jspdf-autotable, mas
o build falhou — eles são importados dinamicamente em
src/pages/AdminTelemetriaPage.tsx (await import('jspdf')).
Mantidos no package.json.
## Stress-test executado
- bun install --frozen-lockfile: OK
- bun run build: OK (built in 1m 24s)
- Vercel preview vai validar deploy de produção
## Resultado
- Total deps: 130 → 95 (-27%)
- Pacotes removidos no node_modules: ~250 (estimativa, deps transitivas)
- Tempo de bun install esperado mais rápido
- Superficie de attack surface reduzida (menos deps = menos CVEs)
## Reversibilidade
Storybook pode ser reinstalado a qualquer momento com:
bunx storybook init
Refs: docs/auditorias/2026-05-08-1548-auditoria-profunda.md (Achado C2, P2)
Refs: /workspace/notes/faxina-onda-1-decisoes-finais.md (decisões finais)
f7ed472 to
e3f6f0d
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e3f6f0d22c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "husky": "^9.1.7", | ||
| "lint-staged": "^17.0.2", | ||
| "lovable-tagger": "^1.1.13", | ||
| "playwright": "^1.59.1", |
There was a problem hiding this comment.
Restore the pre-commit dependency
Removing lint-staged leaves .husky/pre-commit running bun run lint-staged, but there is no package script by that name and the binary is no longer installed. I checked the hook and bun run --help confirms bun run <script> executes package scripts/files; in this checkout bun run lint-staged --help now exits with error: Script not found "lint-staged", so every developer commit with hooks enabled will fail until the dependency is restored or the hook is updated.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/components/ui/registry.json`:
- Around line 17-33: The variant arrays in registry.json (the "variant" key)
contain many duplicate "hover" entries which can create duplicate options or key
collisions in consumers; edit each "variant" array (e.g., the arrays shown
around the occurrences in the diff) to remove repeated values so each value is
unique, or—if hover represents a separate UI state—move hover into a dedicated
field (e.g., "state" or "pseudo") and keep "variant" as the unique set of
styling variants; ensure every "variant" array across the file contains only
unique entries after your change.
- Around line 269-276: The sheet.variants.side array contains invalid
non-direction entries ("sm")—remove the two "sm" values so sheet.variants.side
only includes valid directions ("top", "bottom", "left", "right"); locate the
sheet.variants.side symbol in the registry.json and edit the array to contain
the four proper directions, ensuring no stray tokens like "sm" remain that would
break variant resolution or produce invalid classes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 400956ef-67ba-4d9d-b5fa-7b558d55c893
⛔ Files ignored due to path filters (16)
bun.lockis excluded by!**/*.lock,!**/*.locksrc/stories/assets/accessibility.pngis excluded by!**/*.pngsrc/stories/assets/accessibility.svgis excluded by!**/*.svgsrc/stories/assets/addon-library.pngis excluded by!**/*.pngsrc/stories/assets/assets.pngis excluded by!**/*.pngsrc/stories/assets/context.pngis excluded by!**/*.pngsrc/stories/assets/discord.svgis excluded by!**/*.svgsrc/stories/assets/docs.pngis excluded by!**/*.pngsrc/stories/assets/figma-plugin.pngis excluded by!**/*.pngsrc/stories/assets/github.svgis excluded by!**/*.svgsrc/stories/assets/share.pngis excluded by!**/*.pngsrc/stories/assets/styling.pngis excluded by!**/*.pngsrc/stories/assets/testing.pngis excluded by!**/*.pngsrc/stories/assets/theming.pngis excluded by!**/*.pngsrc/stories/assets/tutorials.svgis excluded by!**/*.svgsrc/stories/assets/youtube.svgis excluded by!**/*.svg
📒 Files selected for processing (26)
.storybook/main.ts.storybook/preview.tseslint.config.jspackage.jsonsrc/components/ui/registry.jsonsrc/components/ui/stories/Button.stories.tsxsrc/components/ui/stories/Card.stories.tsxsrc/components/ui/stories/Input.stories.tsxsrc/components/ui/stories/Introduction.stories.tsxsrc/components/ui/stories/Link.stories.tsxsrc/components/ui/stories/dialog.stories.tsxsrc/components/ui/stories/select.stories.tsxsrc/components/ui/stories/textarea.stories.tsxsrc/components/ui/stories/tooltip.stories.tsxsrc/stories/Button.stories.tssrc/stories/Button.tsxsrc/stories/Configure.mdxsrc/stories/Header.stories.tssrc/stories/Header.tsxsrc/stories/Page.stories.tssrc/stories/Page.tsxsrc/stories/assets/avif-test-image.avifsrc/stories/button.csssrc/stories/header.csssrc/stories/page.cssvite.config.ts
💤 Files with no reviewable changes (23)
- src/stories/button.css
- .storybook/preview.ts
- src/stories/Page.tsx
- src/components/ui/stories/Introduction.stories.tsx
- src/stories/Header.stories.ts
- src/stories/Button.tsx
- src/stories/header.css
- .storybook/main.ts
- vite.config.ts
- src/components/ui/stories/tooltip.stories.tsx
- src/stories/Page.stories.ts
- eslint.config.js
- src/stories/Configure.mdx
- src/stories/page.css
- src/components/ui/stories/select.stories.tsx
- src/components/ui/stories/Button.stories.tsx
- src/stories/Header.tsx
- src/components/ui/stories/dialog.stories.tsx
- src/components/ui/stories/textarea.stories.tsx
- src/components/ui/stories/Link.stories.tsx
- src/components/ui/stories/Input.stories.tsx
- src/stories/Button.stories.ts
- src/components/ui/stories/Card.stories.tsx
| "variant": [ | ||
| "default", | ||
| "hover", | ||
| "hover", | ||
| "destructive", | ||
| "hover", | ||
| "hover", | ||
| "outline", | ||
| "hover", | ||
| "hover", | ||
| "hover", | ||
| "secondary", | ||
| "hover", | ||
| "hover", | ||
| "ghost", | ||
| "hover", | ||
| "hover", | ||
| "link", | ||
| "hover", | ||
| "whatsapp", | ||
| "hover", | ||
| "hover", | ||
| "glowPurple", | ||
| "hover", | ||
| "hover", | ||
| "glowGradient", | ||
| "hover", | ||
| "neon", | ||
| "hover", | ||
| "hover", | ||
| "neonOutline", | ||
| "hover", | ||
| "outline", | ||
| "hover", | ||
| "hover", | ||
| "success", | ||
| "destructive", | ||
| "hover", | ||
| "muted", | ||
| "hover" | ||
| ], |
There was a problem hiding this comment.
Duplicidade de valores nas variantes pode causar comportamento incorreto no consumer
Há repetição massiva de "hover" nas listas de variant (ex.: Line 20/22/24, Line 128+ e Line 248+). Isso costuma gerar opções duplicadas na UI e colisão de chave quando o valor é tratado como identificador único.
Sugestão: manter apenas valores únicos em cada array de variantes (ou separar estado hover em outro campo, se esse for o modelo esperado).
Diff sugerido (exemplo de normalização)
"icon-button": {
"name": "icon-button",
"variants": {
"variant": [
"default",
- "hover",
- "hover",
"secondary",
- "hover",
"ghost",
- "hover",
- "hover",
"outline",
- "hover",
- "hover",
"destructive",
- "hover",
"muted",
- "hover"
+ "hover"
], "badge": {
"name": "badge",
"variants": {
"variant": [
"default",
- "hover",
"secondary",
- "hover",
"destructive",
- "hover",
"outline",
- "hover",
"subtle",
"success",
"warning",
"info",
"whatsapp",
- "hover",
"glowPurple",
"hover"
]
}
},Also applies to: 126-163, 246-263
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/components/ui/registry.json` around lines 17 - 33, The variant arrays in
registry.json (the "variant" key) contain many duplicate "hover" entries which
can create duplicate options or key collisions in consumers; edit each "variant"
array (e.g., the arrays shown around the occurrences in the diff) to remove
repeated values so each value is unique, or—if hover represents a separate UI
state—move hover into a dedicated field (e.g., "state" or "pseudo") and keep
"variant" as the unique set of styling variants; ensure every "variant" array
across the file contains only unique entries after your change.
| "side": [ | ||
| "top", | ||
| "bottom", | ||
| "left", | ||
| "sm", | ||
| "default", | ||
| "lg" | ||
| "right", | ||
| "sm" | ||
| ] |
There was a problem hiding this comment.
sheet.variants.side contém valores inválidos para direção
Em side, os valores "sm" nas Lines 273 e 275 não representam direção e parecem ter sido inseridos por engano. Isso pode quebrar resolução de variante de sheet (ou gerar classe inválida).
Diff sugerido
"sheet": {
"name": "sheet",
"variants": {
"side": [
"top",
"bottom",
"left",
- "sm",
- "right",
- "sm"
+ "right"
]
}
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "side": [ | |
| "top", | |
| "bottom", | |
| "left", | |
| "sm", | |
| "default", | |
| "lg" | |
| "right", | |
| "sm" | |
| ] | |
| "side": [ | |
| "top", | |
| "bottom", | |
| "left", | |
| "right" | |
| ] |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/components/ui/registry.json` around lines 269 - 276, The
sheet.variants.side array contains invalid non-direction entries ("sm")—remove
the two "sm" values so sheet.variants.side only includes valid directions
("top", "bottom", "left", "right"); locate the sheet.variants.side symbol in the
registry.json and edit the array to contain the four proper directions, ensuring
no stray tokens like "sm" remain that would break variant resolution or produce
invalid classes.
There was a problem hiding this comment.
Pull request overview
Removes unused dependencies and fully deletes the Storybook setup (configs + example/UI stories) to reduce maintenance and dependency surface area.
Changes:
- Removed Storybook scripts, devDependencies, ESLint integration, and deleted
.storybook/+ story files/assets. - Removed
lovable-taggerusage fromvite.config.ts. - Updated
src/components/ui/registry.jsoncontents (auto-generated component variant registry).
Reviewed changes
Copilot reviewed 25 out of 42 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| vite.config.ts | Drops lovable-tagger import/usage from Vite plugins. |
| package.json | Removes Storybook + other unused deps and drops Storybook scripts. |
| eslint.config.js | Removes eslint-plugin-storybook integration. |
| .storybook/preview.ts | Deleted Storybook preview configuration. |
| .storybook/main.ts | Deleted Storybook main configuration. |
| src/stories/Page.tsx | Deleted Storybook example page component. |
| src/stories/Page.stories.ts | Deleted Storybook story for example page. |
| src/stories/page.css | Deleted Storybook example page styles. |
| src/stories/Header.tsx | Deleted Storybook example header component. |
| src/stories/Header.stories.ts | Deleted Storybook story for example header. |
| src/stories/header.css | Deleted Storybook example header styles. |
| src/stories/Button.tsx | Deleted Storybook example button component. |
| src/stories/Button.stories.ts | Deleted Storybook story for example button. |
| src/stories/button.css | Deleted Storybook example button styles. |
| src/stories/Configure.mdx | Deleted Storybook MDX docs page. |
| src/stories/assets/youtube.svg | Deleted Storybook asset. |
| src/stories/assets/tutorials.svg | Deleted Storybook asset. |
| src/stories/assets/github.svg | Deleted Storybook asset. |
| src/stories/assets/discord.svg | Deleted Storybook asset. |
| src/stories/assets/accessibility.svg | Deleted Storybook asset. |
| src/components/ui/stories/tooltip.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/textarea.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/select.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/Link.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/Introduction.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/Input.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/dialog.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/Card.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/stories/Button.stories.tsx | Deleted UI component Storybook story. |
| src/components/ui/registry.json | Updates the auto-generated design-system registry data. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "fast-check": "^4.7.0", | ||
| "globals": "^15.15.0", | ||
| "happy-dom": "^20.9.0", | ||
| "husky": "^9.1.7", |
| plugins: [ | ||
| react(), | ||
| mode === "development" && componentTagger(), | ||
| ].filter(Boolean), |
| "variant": [ | ||
| "default", | ||
| "hover", | ||
| "hover", | ||
| "destructive", | ||
| "hover", | ||
| "hover", | ||
| "outline", | ||
| "hover", | ||
| "hover", | ||
| "hover", | ||
| "secondary", |
↩️ Resposta ao feedback CodeRabbit
Você está certo, mas é problema PRÉ-EXISTENTE — não introduzido por esta PR. Análise
O script tem um bug de regex ao parsear variants de CVA (class-variance-authority): ele captura // button.tsx (CVA)
variants: {
variant: {
default: "bg-primary hover:bg-primary/90", // <- regex captura "hover"
secondary: "hover:bg-secondary/80", // <- de novo
}
}Daí os Impacto real
Esta PRSó reorganizou Plano de resoluçãoBug do gerador será corrigido em PR à parte na Onda 2 ( // scripts/generate-component-registry.ts (proposta de fix)
function extractVariants(content: string) {
// Usar AST parser (TypeScript Compiler API ou ts-morph) ao invés de regex
// Regex atual confunde 'hover:' de classes Tailwind com keys de variant
}Esta PR mergeia normalmente. Os 2 actionable comments são fora do escopo (escopo: remover Storybook + 35 deps mortas). |
|
Tip For best results, initiate chat on the files or code changes.
Vou registrar isso na memória para revisões futuras. Quer que eu abra uma issue no GitHub para rastrear o fix do (´◔ ω ◔`) registrando no caderninho... ✏️ Learnings added
|
…103) * fix(ds): generate-component-registry usa AST parser em vez de regex (Onda 2 PR 2.3) Resolve issue do CodeRabbit no PR #97 (Onda 1.2): regex `/[a-zA-Z0-9]+(?=:)/g` capturava prefixos do Tailwind dentro das strings de classes (`hover:`, `focus:`, `dark:`) como se fossem nomes de variants. ## O bug ```ts variants: { variant: { default: 'h-10', ghost: 'h-9 hover:bg-accent focus:ring-2', // ^^^^^ ^^^^^ // Capturados como subkeys 'hover' e 'focus' — errado! } } ``` Output buggado em registry.json: ```json { "variant": ["default", "ghost", "hover", "focus", "hover"] } ``` Output correto: ```json { "variant": ["default", "ghost"] } ``` ## Stats: antes vs depois | Métrica | Antes | Depois | |---|---|---| | Ocorrências de "hover" no registry.json | **45** | **0** | | Ocorrências de "focus" no registry.json | 0 | 0 | | Componentes com variants | 13 | 13 (sem mudança real) | ## Solução: TypeScript Compiler API Substituí o regex por AST parser usando `ts.createSourceFile()` (built-in, já nas deps via TS 5.8.3 — sem deps novas). A função `extractVariants()` agora: 1. Cria um AST do source TSX 2. Visita cada `ObjectLiteralExpression` 3. Procura por nó com **AMBAS** as propriedades `variants` e `defaultVariants` (padrão CVA — Class Variance Authority — descarta objetos não-CVA) 4. Para cada variant, extrai apenas as `PropertyAssignment` no nível correto da árvore — strings/className NÃO são parseadas ## Componentes que tinham keys fantasma (todos corrigidos) - icon-button: tinha 9 "hover" + 6 keys reais → agora só 6 keys reais - card: tinha 8 "hover" + variants reais → corrigido - (e outros 11 componentes) ## Stress-test - ✅ `bun run build` (1m): registry regenerado durante prebuild, sem erros - ✅ `bun run scripts/generate-component-registry.ts`: 13 with variants, 56 skipped - ✅ TypeScript: sem erros novos - ✅ Diff de registry.json: pesquisa de "hover" caiu de 45 → 0 ## Refs - /workspace/notes/coderabbit-feedback-pr97.md (issue do PR #97) - TypeScript AST: https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API * fix(ds): ordenar files alfabeticamente para output determinístico CodeRabbit no PR #103: sem sort, ordem do readdirSync varia por filesystem/ambiente, gerando diff ruidoso entre execuções. ```diff - const files = readdirSync(UI_DIR); + const files = readdirSync(UI_DIR).sort((a, b) => a.localeCompare(b)); ``` Bonus: o registry.json agora fica ordenado alfabeticamente (avatar primeiro, zoom-in último), facilitando navegação visual e diff.
🌊 Faxina Onda 1 — PR 1.2: Deps mortas + Storybook completo
Refs: PR #96 (1.1 antecedente) | Auditoria de estado atual (Achado C2, P2)
🎯 O que muda
📉 35 pacotes removidos do package.json (130 → 95)
Tier A — Lovable residual (2 deps)
@lovable.dev/cloud-auth-jslovable-taggervite.config.ts— removido juntoTier B — Shadcn instalado mas não usado (6 deps)
@radix-ui/react-aspect-ratio@radix-ui/react-navigation-menu@radix-ui/react-visually-hiddenvisually-hidden.tsxé custom (Tailwindsr-only)embla-carousel-reactinput-otpvaulTier C — Plugins Vite não configurados (3 deps)
vite-plugin-compression2vite.config.tsvite-plugin-pwavite.config.ts@vitejs/plugin-react-swc@vitejs/plugin-reactregularTier D — Mortos comprovados (12 deps)
web-vitalssrc/lib/web-vitals.tsé arquivo custom, não usa pacoteprop-typesserialize-javascriptwait-onglobfast-check@tailwindcss/typographytailwind.config.tsplugins@hookform/resolversreact-hook-formem si fica)@types/dompurifyjsdomhappy-domlint-stagedpackage.jsonTier E — Storybook completo (12 deps + arquivos + configs)
Decisão técnica: REMOVER (justificativa em
/workspace/notes/faxina-onda-1-decisoes-finais.md):bunx storybook initreinstala em 30sPacotes removidos:
storybook,@chromatic-com/storybook,@storybook/addon-{a11y,docs,essentials,interactions,links,onboarding,vitest},@storybook/blocks,@storybook/react,@storybook/react-vite,eslint-plugin-storybook.📂 Arquivos removidos (37)
.storybook/(config completo:main.ts,preview.ts)src/stories/(Button, Header, Page + 17 assets)src/components/ui/stories/(10 stories de UI components)⚙️ Configs atualizadas (3)
vite.config.ts: removido import + uso delovable-taggereslint.config.js: removidoeslint-plugin-storybookpackage.json: removidos scriptsstorybookebuild-storybookDurante o stress-test, a análise inicial sugeriu remover
jspdfejspdf-autotable, mas o build falhou:Causa: import dinâmico (
await import('jspdf')) não é detectado por grep estático.Solução: reinstalei
jspdfejspdf-autotableviabun add.Lição aprendida: sempre rodar
bun run buildANTES de commit de remoção de deps.📊 Impacto
Bonus:
node_modulesdeve encolher ~30% (deps transitivas).🧪 Stress-test executado pré-commit
bun install --frozen-lockfilebun run buildbun.lockregenerado🤝 Coordenação com PR #96 (PR 1.1)
Por que está como DRAFT:
PR 1.1 modifica
.gitignoree essa branch foi criada antes de 1.1 mergear. Para evitar conflito:maingit rebase mainneste branch (vai pegar gitignore atualizado automaticamente)🔄 Reversibilidade
Storybook pode ser reinstalado em 30 segundos com:
Reverter PR completo:
📋 Próximos PRs da Onda 1
console.*→loggerDecisões persistidas em
/workspace/notes/faxina-onda-1-decisoes-finais.md.🤖 Gerado por Claude Opus 4.7 via Claude Code MCP
👤 Solicitado por: Joaquim (Promo Brindes)
📅 Data: 2026-05-08
Summary by CodeRabbit
Release Notes