Skip to content

Vibe4#3257

Merged
rivka-ungar merged 79 commits intomasterfrom
vibe4
Mar 18, 2026
Merged

Vibe4#3257
rivka-ungar merged 79 commits intomasterfrom
vibe4

Conversation

@rivka-ungar
Copy link
Copy Markdown
Contributor

@rivka-ungar rivka-ungar commented Feb 25, 2026

User description

https://monday.monday.com/boards/10027056258/pulses/10027056598


PR Type

Enhancement, Documentation


Description

  • Set up v3-to-v4 migration infrastructure with CLI support

  • Add comprehensive breaking change implementation skill guide

  • Create migration documentation and codemod templates

  • Establish v4 changelog and migration guide framework


Diagram Walkthrough

flowchart LR
  CLI["CLI Support<br/>--migration v4"]
  INFRA["Migration Infrastructure<br/>v3-to-v4 directory"]
  SKILL["Breaking Change Skill<br/>SKILL.md + References"]
  DOCS["Migration Documentation<br/>VIBE4_CHANGELOG.md<br/>VIBE4_MIGRATION_GUIDE.md"]
  
  CLI --> INFRA
  INFRA --> SKILL
  SKILL --> DOCS
Loading

File Walkthrough

Relevant files
Enhancement
2 files
vibe-codemod.ts
Add v4 migration type to CLI with warnings                             
+12/-3   
type-imports-migration.ts
Create no-op type imports migration for v4                             
+24/-0   
Documentation
11 files
SKILL.md
Comprehensive breaking change implementation workflow guide
+579/-0 
codemod-best-practices.md
Document codemod patterns and common pitfalls                       
+273/-0 
codemod-examples.md
Provide codemod implementation examples and patterns         
+125/-0 
dependency-analysis.md
Guide for analyzing component dependencies systematically
+150/-0 
pr-templates.md
Templates for PR, commits, migration guides, and reviews 
+285/-0 
testing-validation.md
Testing strategies and validation checklist for changes   
+211/-0 
workflow-checklist.md
Complete phase-by-phase workflow checklist for breaking changes
+194/-0 
VIBE4_CHANGELOG.md
Track v4 breaking changes with status and migration info 
+126/-0 
VIBE4_MIGRATION_GUIDE.md
Comprehensive v3 to v4 migration guide with step-by-step instructions
+279/-0 
README.md
Update documentation to include v4 migration option           
+8/-3     
README.md
Document v3-to-v4 transformation structure and patterns   
+139/-0 
Configuration changes
1 files
enumMappings.json
Create enum mapping template for v4 migrations                     
+15/-0   

rivka-ungar and others added 3 commits February 25, 2026 08:54
- Add VIBE4_CHANGELOG.md for tracking breaking changes
- Add VIBE4_MIGRATION_GUIDE.md with comprehensive migration documentation
- Create v3-to-v4 migration structure in codemod package
- Update CLI to support --migration v4
- Add helper script for generating component migrations
- Set up enum mapping template for string literal conversions

This provides the foundation for implementing individual breaking
changes and their corresponding codemods as development progresses.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix broken codemod infrastructure that was causing build failures.

ISSUE:
- type-imports-migration.ts had TypeScript errors accessing .name property
- path.value.id can be Identifier OR TSQualifiedName
- TSQualifiedName doesn't have .name property, causing TS2339 errors
- Build failures blocked all v4 codemod development

SOLUTION:
- Convert to safe no-op until actual type migrations are identified for v4
- Satisfies codemod CLI infrastructure requirements
- Removes TypeScript compilation errors
- Documents TODO structure for future type migrations

This is general v4 infrastructure, not specific to any breaking change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@rivka-ungar rivka-ungar requested a review from a team as a code owner February 25, 2026 20:27
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Feb 25, 2026

PR Reviewer Guide 🔍

(Review updated until commit b69ab5a)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 3 🔵🔵🔵⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Path Mismatch

The v4 CLI “process last” list references transformation filenames with a .js extension, while the newly added v3-to-v4 transformation shown in this PR is a .ts file. Validate that the runtime actually resolves the built JS outputs in the expected transformationsDir and that the v4-specific ordering is applied to the intended files.

const filesToProcessLast =
  migrationType === "v3"
    ? [
        resolve(transformationsDir, "next-imports-migration.js"),
        resolve(transformationsDir, "type-imports-migration.js"),
        resolve(transformationsDir, "packages-rename-migration.js")
      ]
    : migrationType === "v4"
      ? [
          resolve(transformationsDir, "type-imports-migration.js"),
          resolve(transformationsDir, "packages-rename-migration.js")
        ]
      : [];
No-op Transform

The new v3-to-v4 type imports migration is intentionally a no-op, but ensure the codemod wrapper/runner won’t still emit formatting-only diffs for files when no AST changes are made. Consider explicitly returning early in a way that guarantees the original source is preserved when there are no edits.

import { wrap } from "../../../src/utils";
import { TransformationContext } from "../../../types";

/**
 * Type import migrations for v3 to v4
 *
 * Currently no TypeScript interface or type migrations have been identified for v4.
 * This transformation is a no-op until specific type migrations are needed.
 *
 * When type migrations are identified, add them here following the pattern:
 * 1. Renaming TypeScript interfaces and types
 * 2. Moving types between packages
 * 3. Converting deprecated types to new ones
 */
function transform(_context: TransformationContext) {
  // No type migrations identified for v3-to-v4 yet
  // This is a no-op transformation to satisfy the codemod infrastructure
  // TODO: Add specific type migrations here as they are identified:
  // - Interface renames: { "OldInterface": "NewInterface" }
  // - Type alias updates: { "OldType": "NewType" }
  // - Import path changes for moved types
}

export default wrap(transform);
Doc Inconsistency

The v3-to-v4 README’s example code uses getCoreImportsForFile, while the newly added breaking-change skill docs recommend using getImports(root, NEW_CORE_IMPORT_PATH) for correct import detection. Align examples to avoid encouraging patterns that are known to be incorrect for @vibe/core import paths.

```typescript
import {
  wrap,
  getCoreImportsForFile,
  getComponentNameOrAliasFromImports,
  findComponentElements,
  migratePropsNames
} from "../../../src/utils";
import { TransformationContext } from "../../../types";

/**
 * Migration description:
 * 1. Change description
 * 2. Another change
 */
function transform({ j, root, filePath }: TransformationContext) {
  const imports = getCoreImportsForFile(root);
  const componentName = getComponentNameOrAliasFromImports(j, imports, "ComponentName");
  if (!componentName) return;

  const elements = findComponentElements(root, componentName);
  if (!elements.length) return;

  elements.forEach(elementPath => {
    // Apply transformations here
    migratePropsNames(j, elementPath, filePath, componentName, {
      oldPropName: "newPropName"
    });
  });
}

export default wrap(transform);

</details>

</td></tr>
</table>

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
@rivka-ungar rivka-ungar marked this pull request as draft February 25, 2026 22:21
rivka-ungar and others added 2 commits February 26, 2026 12:20
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
#3266)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 26, 2026

📦 Bundle Size Analysis

Changed Components

Component Base PR Diff
@vibe/dialog 53.84KB 52.15KB -1.69KB 🟢
@vibe/icon-button 68.11KB 66.02KB -2.08KB 🟢
@vibe/tooltip 63KB 61.3KB -1.7KB 🟢
@vibe/typography 65.48KB 63.44KB -2.04KB 🟢
AccordionItem 68.2KB 66.5KB -1.7KB 🟢
AlertBanner 72.79KB 70.85KB -1.95KB 🟢
AlertBannerText 65.45KB 63.89KB -1.56KB 🟢
Avatar 68.36KB 66.73KB -1.63KB 🟢
AvatarGroup 96.14KB 93.35KB -2.79KB 🟢
BreadcrumbItem 66.17KB 64.65KB -1.52KB 🟢
BreadcrumbMenu 70.31KB 68.67KB -1.63KB 🟢
BreadcrumbMenuItem 79.38KB 77.11KB -2.27KB 🟢
ButtonGroup 70.28KB 68.35KB -1.92KB 🟢
Checkbox 68.69KB 66.91KB -1.78KB 🟢
Chips 77.11KB 75.05KB -2.06KB 🟢
ColorPicker 76.33KB 74.45KB -1.88KB 🟢
ColorPickerContent 75.48KB 73.71KB -1.76KB 🟢
Combobox 86.36KB 84.06KB -2.3KB 🟢
DatePicker 134.6KB 112.53KB -22.07KB 🟢
Dropdown 125.94KB 95.19KB -30.76KB 🟢
EditableHeading 68.35KB 66.47KB -1.88KB 🟢
EditableText 68.25KB 66.38KB -1.87KB 🟢
EmptyState 72.68KB 70.39KB -2.29KB 🟢
ExpandCollapse 67.99KB 66.22KB -1.77KB 🟢
Info 74.33KB 72.05KB -2.28KB 🟢
Label 70.47KB 68.6KB -1.87KB 🟢
List 74.86KB 73KB -1.86KB 🟢
ListItem 67.43KB 65.69KB -1.73KB 🟢
ListItemAvatar 68.54KB 67KB -1.54KB 🟢
ListTitle 66.81KB 65.01KB -1.8KB 🟢
MenuItem 79.37KB 77.01KB -2.36KB 🟢
MenuItemButton 72.23KB 70.17KB -2.06KB 🟢
MenuTitle 67.19KB 65.38KB -1.81KB 🟢
MenuButton 67.83KB 66.17KB -1.65KB 🟢
Modal 111.98KB 79.25KB -32.73KB 🟢
ModalHeader 67.6KB 65.77KB -1.83KB 🟢
ModalFooter 69.55KB 67.69KB -1.86KB 🟢
ModalFooterWizard 70.49KB 68.62KB -1.87KB 🟢
NumberField 74.88KB 72.87KB -2.01KB 🟢
RadioButton 67.63KB 65.89KB -1.74KB 🟢
Search 72.53KB 70.65KB -1.88KB 🟢
Slider 75.92KB 73.87KB -2.05KB 🟢
SplitButton 68.84KB 66.69KB -2.15KB 🟢
Steps 73.54KB 71.35KB -2.18KB 🟢
TableBody 68.61KB 66.77KB -1.84KB 🟢
TableCell 67.02KB 65.14KB -1.88KB 🟢
TableHeaderCell 74.16KB 72.2KB -1.96KB 🟢
TableRowMenu 70.61KB 69KB -1.61KB 🟢
TableVirtualizedBody 73.33KB 71.4KB -1.93KB 🟢
Tab 65.67KB 64.03KB -1.64KB 🟢
TextArea 68.05KB 66.38KB -1.67KB 🟢
TextField 71.42KB 69.45KB -1.96KB 🟢
TextWithHighlight 65.89KB 64.37KB -1.51KB 🟢
Tipseen 73.26KB 71.29KB -1.97KB 🟢
TipseenContent 73.68KB 71.63KB -2.05KB 🟢
TipseenMedia 73.48KB 71.34KB -2.14KB 🟢
TipseenWizard 75.98KB 73.93KB -2.06KB 🟢
Toast 76.28KB 74.08KB -2.21KB 🟢
Toggle 68.33KB 66.65KB -1.68KB 🟢
TransitionView 37.71KB 5.42KB -32.29KB 🟢
ListItem (Next) 71.65KB 70.03KB -1.63KB 🟢
ListTitle (Next) 67.09KB 65.39KB -1.7KB 🟢
Unchanged Components
Component Base PR Diff
@vibe/button 17.74KB 17.3KB -444B 🟢
@vibe/clickable 6.07KB 5.97KB -99B 🟢
@vibe/icon 13.01KB 12.91KB -103B 🟢
@vibe/layer 2.96KB 2.96KB 0B ➖
@vibe/layout 10.56KB 9.82KB -758B 🟢
@vibe/loader 5.8KB 5.66KB -150B 🟢
Accordion 6.34KB 6.32KB -27B 🟢
AlertBannerButton 19.22KB 18.76KB -472B 🟢
AlertBannerLink 15.61KB 15.28KB -333B 🟢
AttentionBox 74.4KB 74.28KB -129B 🟢
Badge 43.52KB 43.19KB -342B 🟢
BreadcrumbsBar 5.79KB 5.69KB -108B 🟢
Counter 42.41KB 42.33KB -84B 🟢
Divider 5.53KB 5.46KB -76B 🟢
FormattedNumber 5.93KB 5.83KB -104B 🟢
GridKeyboardNavigationContext 4.66KB 4.67KB +11B 🔺
HiddenText 5.46KB 5.42KB -49B 🟢
Link 15.15KB 14.9KB -252B 🟢
ListItemIcon 14.17KB 14KB -169B 🟢
Menu 8.74KB 8.63KB -122B 🟢
MenuDivider 5.66KB 5.58KB -74B 🟢
MenuGridItem 7.24KB 7.16KB -75B 🟢
ModalContent 4.77KB 4.71KB -52B 🟢
ModalMedia 7.78KB 7.52KB -267B 🟢
ModalBasicLayout 9.23KB 8.93KB -301B 🟢
ModalMediaLayout 8.31KB 8.07KB -250B 🟢
ModalSideBySideLayout 6.37KB 6.3KB -63B 🟢
MultiStepIndicator 53.3KB 53.02KB -282B 🟢
ProgressBar 7.43KB 7.34KB -92B 🟢
Skeleton 6.18KB 6KB -186B 🟢
SplitButtonMenu 8.87KB 8.81KB -66B 🟢
Table 7.31KB 7.25KB -62B 🟢
TableContainer 5.37KB 5.3KB -68B 🟢
TableHeader 5.7KB 5.66KB -41B 🟢
TableRow 5.61KB 5.54KB -68B 🟢
TabList 8.93KB 8.89KB -39B 🟢
TabPanel 5.35KB 5.3KB -47B 🟢
TabPanels 5.97KB 5.83KB -137B 🟢
TabsContext 5.55KB 5.46KB -89B 🟢
ThemeProvider 4.68KB 4.36KB -329B 🟢
ToastButton 19.07KB 18.61KB -472B 🟢
ToastLink 15.42KB 15.12KB -312B 🟢
VirtualizedGrid 12.64KB 12.62KB -17B 🟢
VirtualizedList 12.44KB 12.25KB -202B 🟢
List (Next) 8.25KB 8.17KB -75B 🟢

📊 Summary:

  • Total Base Size: 4.98MB
  • Total PR Size: 4.75MB
  • Total Difference: 235.21KB

⚠️ Significant size change detected! Please review the changes carefully.

rivka-ungar and others added 16 commits February 26, 2026 13:07
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…3280)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Rivka Ungar <rivkaun@monday.com>
Co-authored-by: vibe-bot <vibe@monday.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#3290)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
rivka-ungar and others added 19 commits March 8, 2026 12:45
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
 - @vibe/base@4.0.0-alpha.0
 - @vibe/codemod@4.0.0-alpha.0
 - @vibe/button@4.0.0-alpha.0
 - @vibe/clickable@4.0.0-alpha.0
 - @vibe/dialog@4.0.0-alpha.0
 - @vibe/icon@4.0.0-alpha.0
 - @vibe/icon-button@4.0.0-alpha.0
 - @vibe/layer@4.0.0-alpha.0
 - @vibe/layout@4.0.0-alpha.0
 - @vibe/loader@4.0.0-alpha.0
 - @vibe/tooltip@4.0.0-alpha.0
 - @vibe/typography@4.0.0-alpha.0
 - @vibe/config@4.0.0-alpha.0
 - @vibe/core@4.0.0-alpha.0
 - @vibe/docs@4.0.0-alpha.0
 - @vibe/hooks@4.0.0-alpha.0
 - @vibe/icons@4.0.0-alpha.0
 - @vibe/mcp@4.0.0-alpha.0
 - @vibe/shared@4.0.0-alpha.0
 - vibe-storybook-components@4.0.0-alpha.0
 - @vibe/style@4.0.0-alpha.0
 - @vibe/testkit@4.0.0-alpha.0
 - @vibe/base@4.0.0-alpha.1
 - @vibe/codemod@4.0.0-alpha.1
 - @vibe/button@4.0.0-alpha.1
 - @vibe/clickable@4.0.0-alpha.1
 - @vibe/dialog@4.0.0-alpha.1
 - @vibe/icon@4.0.0-alpha.1
 - @vibe/icon-button@4.0.0-alpha.1
 - @vibe/layer@4.0.0-alpha.1
 - @vibe/layout@4.0.0-alpha.1
 - @vibe/loader@4.0.0-alpha.1
 - @vibe/tooltip@4.0.0-alpha.1
 - @vibe/typography@4.0.0-alpha.1
 - @vibe/config@4.0.0-alpha.1
 - @vibe/core@4.0.0-alpha.1
 - @vibe/docs@4.0.0-alpha.1
 - @vibe/hooks@4.0.0-alpha.1
 - @vibe/icons@4.0.0-alpha.1
 - @vibe/mcp@4.0.0-alpha.1
 - @vibe/shared@4.0.0-alpha.1
 - vibe-storybook-components@4.0.0-alpha.1
 - @vibe/style@4.0.0-alpha.1
 - @vibe/testkit@4.0.0-alpha.1
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
 - @vibe/base@4.0.0-alpha.2
 - @vibe/codemod@4.0.0-alpha.2
 - @vibe/button@4.0.0-alpha.2
 - @vibe/clickable@4.0.0-alpha.2
 - @vibe/dialog@4.0.0-alpha.2
 - @vibe/icon@4.0.0-alpha.2
 - @vibe/icon-button@4.0.0-alpha.2
 - @vibe/layer@4.0.0-alpha.2
 - @vibe/layout@4.0.0-alpha.2
 - @vibe/loader@4.0.0-alpha.2
 - @vibe/tooltip@4.0.0-alpha.2
 - @vibe/typography@4.0.0-alpha.2
 - @vibe/config@4.0.0-alpha.2
 - @vibe/core@4.0.0-alpha.2
 - @vibe/docs@4.0.0-alpha.2
 - @vibe/hooks@4.0.0-alpha.2
 - @vibe/icons@4.0.0-alpha.2
 - @vibe/mcp@4.0.0-alpha.2
 - @vibe/shared@4.0.0-alpha.2
 - vibe-storybook-components@4.0.0-alpha.2
 - @vibe/style@4.0.0-alpha.2
 - @vibe/testkit@4.0.0-alpha.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
 - @vibe/base@4.0.0-beta.0
 - @vibe/codemod@4.0.0-beta.0
 - @vibe/button@4.0.0-beta.0
 - @vibe/clickable@4.0.0-beta.0
 - @vibe/dialog@4.0.0-beta.0
 - @vibe/icon@4.0.0-beta.0
 - @vibe/icon-button@4.0.0-beta.0
 - @vibe/layer@4.0.0-beta.0
 - @vibe/layout@4.0.0-beta.0
 - @vibe/loader@4.0.0-beta.0
 - @vibe/tooltip@4.0.0-beta.0
 - @vibe/typography@4.0.0-beta.0
 - @vibe/config@4.0.0-beta.0
 - @vibe/core@4.0.0-beta.0
 - @vibe/docs@4.0.0-beta.0
 - @vibe/hooks@4.0.0-beta.0
 - @vibe/icons@4.0.0-beta.0
 - @vibe/mcp@4.0.0-beta.0
 - @vibe/shared@4.0.0-beta.0
 - vibe-storybook-components@4.0.0-beta.0
 - @vibe/style@4.0.0-beta.0
 - @vibe/testkit@4.0.0-beta.0
Comment on lines +41 to +42
"@vibe/shared": "^4.0.0-beta.0",
"@vibe/style": "^4.0.0-beta.0",
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the versions should be fixed (no carret) @rivka-ungar

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch!

 - @vibe/base@4.0.0-rc.0
 - @vibe/codemod@4.0.0-rc.0
 - @vibe/button@4.0.0-rc.0
 - @vibe/clickable@4.0.0-rc.0
 - @vibe/dialog@4.0.0-rc.0
 - @vibe/icon@4.0.0-rc.0
 - @vibe/icon-button@4.0.0-rc.0
 - @vibe/layer@4.0.0-rc.0
 - @vibe/layout@4.0.0-rc.0
 - @vibe/loader@4.0.0-rc.0
 - @vibe/tooltip@4.0.0-rc.0
 - @vibe/typography@4.0.0-rc.0
 - @vibe/config@4.0.0-rc.0
 - @vibe/core@4.0.0-rc.0
 - @vibe/docs@4.0.0-rc.0
 - @vibe/hooks@4.0.0-rc.0
 - @vibe/icons@4.0.0-rc.0
 - @vibe/mcp@4.0.0-rc.0
 - @vibe/shared@4.0.0-rc.0
 - vibe-storybook-components@4.0.0-rc.0
 - @vibe/style@4.0.0-rc.0
 - @vibe/testkit@4.0.0-rc.0
@rivka-ungar rivka-ungar marked this pull request as ready for review March 18, 2026 10:20
Copy link
Copy Markdown
Member

@talkor talkor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very cool!

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Vibe 3 to Vibe 4 comprehensive migration infrastructure with codemods and type updates

✨ Enhancement 🧪 Tests

Grey Divider

Walkthroughs

Description
• Comprehensive Vibe 3 to Vibe 4 migration infrastructure with automated analysis tool and extensive
  codemod transformations
• **Migration analysis tool** (v4-migration.ts): Detects promoted components, deprecated APIs,
  removed props, enum usage, ARIA props, and CSS token changes with file:line references and
  step-by-step guidance
• **Component type refactoring**: Updated Dropdown, Dialog, AttentionBox types with new APIs
  (Floating UI support, generic types, discriminated unions)
• **Codemod transformations** (20+ new transformations):
  - ARIA props migration (camelCase to kebab-case)
  - Component prop renames: Icon (iconLabellabel), TextField (iconNameicon), VirtualizedList
  (getItemHeightgetItemSize)
  - Component migrations: TipseenImage→TipseenMedia, LinearProgressBar→ProgressBar, TextWithHighlight
  (tooltipPositiontooltipProps)
  - Deprecated prop removals: Dialog (enableNestedDialogLayer), Chips (disableClickableBehavior),
  Toggle (noSpacing), Flex (justify="stretch")
  - Enum to string literal conversions
  - Package renames: monday-ui-style@vibe/style
  - Next imports migration (promoted components from /next to main exports)
• **Type safety improvements**: Added comprehensive TypeScript generics to virtualized service
• **Test coverage**: 15+ new test suites for all codemod transformations
• **Testkit updates**: Checkbox and Dropdown testkit refactored for new component structures
• **Constants consolidation**: Removed deprecated enums (SystemTheme, ThemeColor, ToastType,
  TextFieldTextType) and migrated to string literals
• **CLI enhancements**: Added v4 migration command with dependency validation
• **Documentation**: Updated migration guidance and Storybook configuration
Diagram
flowchart LR
  V3["Vibe 3 Code"]
  ANALYSIS["v4-migration Analysis Tool"]
  CODEMODS["20+ Codemod Transformations"]
  TYPES["Updated Component Types"]
  V4["Vibe 4 Code"]
  
  V3 --> ANALYSIS
  ANALYSIS --> |"Detects breaking changes"| CODEMODS
  CODEMODS --> |"Props, imports, enums"| V4
  TYPES --> |"Type safety"| V4
  CODEMODS --> |"Uses updated"| TYPES
Loading

Grey Divider

File Changes

1. packages/mcp/src/server/tools/v4-migration.ts ✨ Enhancement +1230/-0

Comprehensive Vibe 3 to Vibe 4 migration analysis tool

• New comprehensive migration tool for Vibe 3 to Vibe 4 that analyzes projects and generates
 detailed migration guidance
• Detects promoted components (Dropdown, AttentionBox, Modal, DatePicker, Dialog) and their old vs
 new API usage
• Scans for deprecated APIs, removed props, enum usage, ARIA props, and CSS token changes with
 file:line references
• Provides step-by-step migration instructions, package dependency analysis, and automated codemod
 recommendations

packages/mcp/src/server/tools/v4-migration.ts


2. packages/core/src/components/Dropdown/Dropdown.types.ts ✨ Enhancement +249/-307

Dropdown component types refactored to new API

• Complete rewrite of Dropdown types from react-select based API to new custom implementation
• Introduces generic DropdownOption<Item> type and BaseDropdownProps with discriminated union
 types for single/multi-select modes
• Removes old props (react-select specific) and adds new props (size, direction, borderless,
 tooltipProps, middleware support)
• Adds new type exports: DropdownSizes, DropdownDirection, DropdownMultiControllerProps,
 DropdownSingleControllerProps

packages/core/src/components/Dropdown/Dropdown.types.ts


3. packages/codemod/transformations/core/v3-to-v4/__tests__/aria-props-migration.test.ts 🧪 Tests +251/-0

ARIA props migration test suite for v3 to v4

• New test suite for ARIA props migration codemod covering camelCase to standard aria-* attribute
 conversion
• Tests all ARIA prop migrations: ariaLabel, ariaHidden, ariaExpanded, ariaControls,
 ariaHasPopup, ariaLabeledBy, ariaLabelledBy, ariaDescribedBy
• Includes edge cases: aliased imports, legacy import paths, multiple props on same element, both
 old and new props existing

packages/codemod/transformations/core/v3-to-v4/tests/aria-props-migration.test.ts


View more (144)
4. packages/components/dialog/src/Dialog/Dialog.types.ts ✨ Enhancement +209/-0

Dialog component types updated with Floating UI support

• Adds new DialogProps interface with comprehensive prop documentation for the Dialog component
• Introduces DialogMiddleware and DialogPlacement types from @floating-ui/react-dom
• Adds new props: middleware (replaces modifiers), position, moveBy,
 referenceWrapperElement, and various event handlers
• Removes old props: modifiers, enableNestedDialogLayer (now always enabled)

packages/components/dialog/src/Dialog/Dialog.types.ts


5. packages/core/src/services/virtualized-service.ts ✨ Enhancement +47/-22

Virtualized service TypeScript types and generics

• Adds comprehensive TypeScript generics and type annotations to all exported functions
• Introduces NormalizedItem<T>, NormalizedItems<T>, IdGetter<T>, SizeGetter<T> types for
 type safety
• Improves type safety for getNormalizedItems, isItemInView, getMaxOffset, findItemAtOffset,
 and other utility functions
• Maintains backward compatibility while enabling better IDE support and type checking

packages/core/src/services/virtualized-service.ts


6. packages/codemod/transformations/core/v3-to-v4/__tests__/TextWithHighlight-component-migration.test.ts 🧪 Tests +158/-0

TextWithHighlight tooltipPosition migration test suite

• New test suite for TextWithHighlight component migration covering tooltipPosition to
 tooltipProps conversion
• Tests merging tooltipPosition into existing tooltipProps objects with multiple properties
• Includes edge cases: aliased imports, expression values, components without the prop

packages/codemod/transformations/core/v3-to-v4/tests/TextWithHighlight-component-migration.test.ts


7. packages/codemod/transformations/core/v3-to-v4/TipseenImage-component-migration.ts ✨ Enhancement +108/-0

TipseenImage to TipseenMedia component migration codemod

• New codemod transformation that replaces deprecated TipseenImage component with TipseenMedia
 wrapping an <img> element
• Migrates props: src, alt, className to img attributes, tipseenMediaClassName to
 TipseenMedia className
• Automatically adds style={{ objectFit: "cover", width: "100%" }} to img element
• Updates imports: removes TipseenImage, adds TipseenMedia if not already imported

packages/codemod/transformations/core/v3-to-v4/TipseenImage-component-migration.ts


8. packages/codemod/transformations/core/v3-to-v4/__tests__/TipseenImage-component-migration.test.ts 🧪 Tests +152/-0

TipseenImage migration test suite for v3 to v4

• New test suite for TipseenImage migration covering basic and complex prop scenarios
• Tests handling of all props (src, alt, className, tipseenMediaClassName) and expression values
• Includes edge cases: aliased imports, duplicate imports, nested usage within Tipseen component

packages/codemod/transformations/core/v3-to-v4/tests/TipseenImage-component-migration.test.ts


9. packages/codemod/transformations/core/v3-to-v4/__tests__/Icon-component-migration.test.ts 🧪 Tests +112/-0

Icon component props migration test suite

• New test suite for Icon component prop migration covering iconLabel, iconType, iconSize to
 label, type, size
• Tests individual and combined prop migrations with static strings and dynamic expressions
• Includes edge cases: aliased imports, multiple Icon components, components without deprecated
 props

packages/codemod/transformations/core/v3-to-v4/tests/Icon-component-migration.test.ts


10. packages/codemod/transformations/core/v3-to-v4/TextField-component-migration.ts ✨ Enhancement +86/-0

TextField component props migration codemod

• New codemod transformation for TextField component prop migrations
• Renames iconName prop to icon
• Converts iconsNames={{ primary, secondary }} object prop to flat iconLabel and
 secondaryIconLabel props
• Handles both static string values and dynamic expressions

packages/codemod/transformations/core/v3-to-v4/TextField-component-migration.ts


11. packages/codemod/transformations/core/v3-to-v4/__tests__/TextField-component-migration.test.ts 🧪 Tests +86/-0

TextField component migration test suite

• New test suite for TextField component migrations covering iconName and iconsNames prop
 transformations
• Tests individual and combined migrations with static and dynamic values
• Includes edge cases: aliased imports, partial iconsNames objects, components without the props

packages/codemod/transformations/core/v3-to-v4/tests/TextField-component-migration.test.ts


12. packages/codemod/transformations/core/v3-to-v4/TextWithHighlight-component-migration.ts ✨ Enhancement +84/-0

TextWithHighlight tooltipPosition migration codemod

• New codemod transformation that migrates TextWithHighlight tooltipPosition prop to
 tooltipProps={{ position }} object
• Handles merging tooltipPosition into existing tooltipProps objects
• Supports both static string values and dynamic expressions

packages/codemod/transformations/core/v3-to-v4/TextWithHighlight-component-migration.ts


13. packages/codemod/bin/vibe-codemod.ts ✨ Enhancement +12/-3

CLI support for v3 to v4 migration command

• Adds v4 migration type mapping to v3-to-v4 transformation directory
• Updates CLI help text to include v4 as available migration option
• Adds warning message for v4 migration when @vibe/core is not installed
• Configures v4 migration to run next-imports-migration and packages-rename-migration codemods

packages/codemod/bin/vibe-codemod.ts


14. packages/codemod/transformations/core/v3-to-v4/__tests__/VirtualizedList-component-migration.test.ts 🧪 Tests +66/-0

VirtualizedList component migration test suite

• New test file for VirtualizedList component migration transformation
• Tests renaming of getItemHeight prop to getItemSize
• Tests renaming of onVerticalScrollbarVisiblityChange prop to
 onLayoutDirectionScrollbarVisibilityChange
• Tests handling of aliased imports and components without proper imports

packages/codemod/transformations/core/v3-to-v4/tests/VirtualizedList-component-migration.test.ts


15. packages/codemod/transformations/core/v3-to-v4/__tests__/next-imports-migration.test.ts 🧪 Tests +81/-0

Next imports migration test suite

• New test file for next imports migration transformation
• Tests moving promoted components from @vibe/core/next to @vibe/core
• Tests splitting mixed imports where some components stay in /next
• Tests handling of multiple promoted components

packages/codemod/transformations/core/v3-to-v4/tests/next-imports-migration.test.ts


16. packages/testkit/__tests__/Checkbox.test.ts 🧪 Tests +11/-15

Checkbox testkit updates for new component structure

• Updated locator from exact match to prefix match using data-testid^="checkbox"
• Changed checkbox state assertions to target the input element directly
• Simplified attribute retrieval to use checkbox.getAttributeValue() instead of creating
 BaseElement
• Removed unused BaseElement import

packages/testkit/tests/Checkbox.test.ts


17. packages/core/src/components/AttentionBox/AttentionBox.types.ts ✨ Enhancement +86/-1

AttentionBox types expansion and prop restructuring

• Expanded type definitions with comprehensive prop interfaces
• Changed AttentionBoxType values from success/danger/dark to positive/negative/neutral
• Added mutually exclusive content props (text vs children)
• Added mutually exclusive title props for compact mode
• Added new props for icon, animate, action, and link configurations

packages/core/src/components/AttentionBox/AttentionBox.types.ts


18. packages/codemod/transformations/core/v3-to-v4/aria-props-migration.ts ✨ Enhancement +79/-0

ARIA props migration from camelCase to kebab-case

• New transformation to migrate camelCase aria props to kebab-case format
• Maps ariaLabel to aria-label, ariaHidden to aria-hidden, etc.
• Handles special case for Link component with ariaLabelDescription mapping
• Applies to 25+ components including Avatar, Button, Checkbox, Dropdown, etc.

packages/codemod/transformations/core/v3-to-v4/aria-props-migration.ts


19. packages/mcp/src/server/tools/dropdown-migration.ts 📝 Documentation +9/-9

Dropdown migration guidance for v4 default export

• Updated migration instructions to reflect Dropdown now being default in @vibe/core
• Changed from importing from @vibe/core/next to @vibe/core
• Updated breaking changes documentation to clarify v4 Dropdown replaces v3 version
• Updated recommendations to reflect new import path

packages/mcp/src/server/tools/dropdown-migration.ts


20. packages/codemod/transformations/core/v3-to-v4/__tests__/LinearProgressBar-component-migration.test.ts 🧪 Tests +52/-0

LinearProgressBar to ProgressBar migration test suite

• New test file for LinearProgressBar to ProgressBar component rename
• Tests renaming in imports, JSX elements, and type annotations
• Tests handling of multiple props and component aliases
• Tests that other components are not affected

packages/codemod/transformations/core/v3-to-v4/tests/LinearProgressBar-component-migration.test.ts


21. packages/codemod/transformations/core/v3-to-v4/LinearProgressBar-component-migration.ts ✨ Enhancement +53/-0

LinearProgressBar to ProgressBar component rename transformation

• New transformation to rename LinearProgressBar to ProgressBar
• Renames both component import and type imports (LinearProgressBarProps to ProgressBarProps)
• Updates JSX element names and type annotations
• Handles component aliases correctly

packages/codemod/transformations/core/v3-to-v4/LinearProgressBar-component-migration.ts


22. packages/shared/src/tests/constants.ts ⚙️ Configuration changes +11/-16

Test constants consolidation for ProgressBar and Modal

• Renamed LINEAR_PROGRESS_BAR test ID to PROGRESS_BAR
• Consolidated Modal test IDs by removing MODAL_NEXT_* variants
• Updated Modal test IDs to use simplified names (modal, modal-overlay, modal-header, etc.)
• Updated ComponentVibeId.LINEAR_PROGRESS_BAR to PROGRESS_BAR

packages/shared/src/tests/constants.ts


23. packages/codemod/transformations/core/v3-to-v4/__tests__/Flex-component-migration.test.ts 🧪 Tests +74/-0

Flex component migration test suite

• New test file for Flex component migration
• Tests removal of justify="stretch" prop
• Tests removal of justify={FlexJustify.STRETCH} enum value
• Tests that other justify values are preserved

packages/codemod/transformations/core/v3-to-v4/tests/Flex-component-migration.test.ts


24. packages/core/src/tests/constants.ts ⚙️ Configuration changes +11/-16

Test constants consolidation for ProgressBar and Modal

• Renamed LINEAR_PROGRESS_BAR test ID to PROGRESS_BAR
• Consolidated Modal test IDs by removing MODAL_NEXT_* variants
• Updated Modal test IDs to use simplified names
• Updated ComponentVibeId.LINEAR_PROGRESS_BAR to PROGRESS_BAR

packages/core/src/tests/constants.ts


25. packages/codemod/transformations/core/v3-to-v4/next-imports-migration.ts ✨ Enhancement +48/-0

Next imports migration transformation

• New transformation to move promoted components from @vibe/core/next to @vibe/core
• Keeps List component in @vibe/core/next
• Splits mixed imports into separate declarations when needed
• Handles bare imports and multiple specifiers

packages/codemod/transformations/core/v3-to-v4/next-imports-migration.ts


26. packages/codemod/transformations/core/v3-to-v4/__tests__/packages-rename-migration.test.ts 🧪 Tests +56/-0

Package rename migration test suite

• New test file for package rename migration
• Tests renaming monday-ui-style to @vibe/style
• Tests handling of subpaths like /tokens and /dist/utils
• Tests that unrelated imports are not affected

packages/codemod/transformations/core/v3-to-v4/tests/packages-rename-migration.test.ts


27. packages/codemod/transformations/core/v3-to-v4/__tests__/enums-migration.test.ts 🧪 Tests +63/-0

Enums to string literals migration test suite

• New test file for enum to string literal migration
• Tests replacing enum values like Button.kinds.PRIMARY with string "primary"
• Tests handling multiple enum values on same element
• Tests that string literals are not modified

packages/codemod/transformations/core/v3-to-v4/tests/enums-migration.test.ts


28. packages/codemod/transformations/core/v3-to-v4/__tests__/Dialog-component-migration.test.ts 🧪 Tests +44/-0

Dialog component migration test suite

• New test file for Dialog component migration
• Tests removal of deprecated enableNestedDialogLayer prop
• Tests handling of explicit true/false values
• Tests that Dialog without the prop is not modified

packages/codemod/transformations/core/v3-to-v4/tests/Dialog-component-migration.test.ts


29. packages/codemod/transformations/core/v3-to-v4/enums-migration.ts ✨ Enhancement +49/-0

Enums to string literals migration transformation

• New transformation to replace enum values with string literals
• Maps enum values from enumMappings.json to their string equivalents
• Only transforms components imported from @vibe/core
• Handles JSX element props with enum values

packages/codemod/transformations/core/v3-to-v4/enums-migration.ts


30. packages/codemod/transformations/core/v3-to-v4/__tests__/Chips-component-migration.test.ts 🧪 Tests +40/-0

Chips component migration test suite

• New test file for Chips component migration
• Tests removal of deprecated disableClickableBehavior prop
• Tests handling of explicit true/false values
• Tests that Chips without the prop is not modified

packages/codemod/transformations/core/v3-to-v4/tests/Chips-component-migration.test.ts


31. packages/codemod/transformations/core/v3-to-v4/__tests__/Toggle-component-migration.test.ts 🧪 Tests +40/-0

Toggle component migration test suite

• New test file for Toggle component migration
• Tests removal of deprecated noSpacing prop
• Tests handling of explicit true/false values
• Tests that Toggle without the prop is not modified

packages/codemod/transformations/core/v3-to-v4/tests/Toggle-component-migration.test.ts


32. packages/codemod/transformations/core/v3-to-v4/Flex-component-migration.ts ✨ Enhancement +38/-0

Flex component justify prop migration transformation

• New transformation to remove invalid justify="stretch" prop from Flex
• Removes both string literal and enum value forms
• Only affects Flex imported from @vibe/core
• Preserves other justify values

packages/codemod/transformations/core/v3-to-v4/Flex-component-migration.ts


33. packages/core/src/components/ThemeProvider/ThemeProviderConstants.ts ✨ Enhancement +4/-34

ThemeProvider constants enum removal and type import

• Removed deprecated SystemTheme and ThemeColor enums
• Imported types from ThemeProvider.types instead
• Updated SystemThemeClassMap to use string literals instead of enum values

packages/core/src/components/ThemeProvider/ThemeProviderConstants.ts


34. packages/components/clickable/src/useClickableProps/useClickableProps.ts ✨ Enhancement +6/-9

Clickable component aria props migration to kebab-case

• Changed aria props from camelCase to kebab-case format
• Removed overrideAriaHasPopup conversion logic
• Simplified tabIndex handling by removing Number() conversion
• Updated destructuring to use kebab-case prop names

packages/components/clickable/src/useClickableProps/useClickableProps.ts


35. packages/codemod/transformations/core/v3-to-v4/VirtualizedList-component-migration.ts ✨ Enhancement +32/-0

VirtualizedList component prop migration transformation

• New transformation for VirtualizedList prop migrations
• Renames getItemHeight to getItemSize
• Renames onVerticalScrollbarVisiblityChange to onLayoutDirectionScrollbarVisibilityChange
• Handles component aliases and imports from @vibe/core

packages/codemod/transformations/core/v3-to-v4/VirtualizedList-component-migration.ts


36. packages/docs/.storybook/main.ts ⚙️ Configuration changes +5/-5

Storybook style package alias updates

• Updated style package aliases from monday-ui-style to @vibe/style
• Changed import paths for mixins and functions to use new package name
• Updated all vite resolve aliases to reference @vibe/style

packages/docs/.storybook/main.ts


37. packages/codemod/transformations/core/v3-to-v4/Icon-component-migration.ts ✨ Enhancement +34/-0

Icon component prop migration transformation

• New transformation for Icon component prop migrations
• Renames iconLabel to label
• Renames iconType to type
• Renames iconSize to size
• Handles component aliases and imports from @vibe/core

packages/codemod/transformations/core/v3-to-v4/Icon-component-migration.ts


38. packages/testkit/components/Checkbox.ts ✨ Enhancement +3/-3

Checkbox testkit component structure updates

• Changed checkbox locator from div to input element
• Updated setChecked() to use click() instead of check()
• Updated setUnchecked() to use click() instead of uncheck()
• Simplified interaction methods for new component structure

packages/testkit/components/Checkbox.ts


39. packages/core/src/components/Table/Table/tableHelpers.ts ✨ Enhancement +4/-5

Table helpers skeleton type migration to string literals

• Changed SkeletonType import from enum to type import
• Updated import path to use correct relative path
• Replaced enum value references with string literals ("circle", "rectangle", "text")

packages/core/src/components/Table/Table/tableHelpers.ts


40. packages/core/src/components/Toast/ToastConstants.ts ✨ Enhancement +5/-34

Toast constants enum removal and string literal migration

• Removed deprecated ToastType and ToastActionType enums
• Removed deprecated ToastAction type
• Updated defaultIconMap to use string literals instead of enum values

packages/core/src/components/Toast/ToastConstants.ts


41. packages/testkit/__tests__/Dropdown.test.ts 🧪 Tests +4/-8

Dropdown testkit updates for new component structure

• Updated dropdown locator from class selector to data-vibe attribute selector
• Simplified attribute retrieval to use dropdown.getAttributeValue() directly
• Removed unused BaseElement import
• Updated expected attribute value assertion

packages/testkit/tests/Dropdown.test.ts


42. packages/codemod/transformations/core/v3-to-v4/Toggle-component-migration.ts ✨ Enhancement +29/-0

Toggle component noSpacing prop removal transformation

• New transformation to remove deprecated noSpacing prop from Toggle
• Only affects Toggle imported from @vibe/core
• Removes prop regardless of value

packages/codemod/transformations/core/v3-to-v4/Toggle-component-migration.ts


43. packages/codemod/transformations/core/v3-to-v4/packages-rename-migration.ts ✨ Enhancement +25/-0

Package rename migration transformation

• New transformation to rename monday-ui-style imports to @vibe/style
• Handles main package and all subpaths
• Preserves subpath structure in renamed imports

packages/codemod/transformations/core/v3-to-v4/packages-rename-migration.ts


44. packages/codemod/transformations/core/v3-to-v4/Dialog-component-migration.ts ✨ Enhancement +29/-0

Dialog component enableNestedDialogLayer prop removal transformation

• New transformation to remove deprecated enableNestedDialogLayer prop from Dialog
• Only affects Dialog imported from @vibe/core
• Removes prop regardless of value

packages/codemod/transformations/core/v3-to-v4/Dialog-component-migration.ts


45. packages/codemod/transformations/core/v3-to-v4/Chips-component-migration.ts ✨ Enhancement +28/-0

Chips component disableClickableBehavior prop removal transformation

• New transformation to remove deprecated disableClickableBehavior prop from Chips
• Only affects Chips imported from @vibe/core
• Removes prop regardless of value

packages/codemod/transformations/core/v3-to-v4/Chips-component-migration.ts


46. packages/core/src/components/TextField/TextFieldConstants.ts 📦 Other +2/-25

TextField constants

• Removed deprecated TextFieldTextType and TextFieldFeedbackState enums
• Updated FEEDBACK_CLASSES to use string literals instead of enum values

packages/core/src/components/TextField/TextFieldConstants.ts


47. .claude/skills/vibe-breaking-change/SKILL.md Additional files +598/-0

...

.claude/skills/vibe-breaking-change/SKILL.md


48. .claude/skills/vibe-breaking-change/references/codemod-best-practices.md Additional files +273/-0

...

.claude/skills/vibe-breaking-change/references/codemod-best-practices.md


49. .claude/skills/vibe-breaking-change/references/codemod-examples.md Additional files +125/-0

...

.claude/skills/vibe-breaking-change/references/codemod-examples.md


50. .claude/skills/vibe-breaking-change/references/dependency-analysis.md Additional files +150/-0

...

.claude/skills/vibe-breaking-change/references/dependency-analysis.md


51. .claude/skills/vibe-breaking-change/references/pr-templates.md Additional files +290/-0

...

.claude/skills/vibe-breaking-change/references/pr-templates.md


52. .claude/skills/vibe-breaking-change/references/testing-validation.md Additional files +211/-0

...

.claude/skills/vibe-breaking-change/references/testing-validation.md


53. .claude/skills/vibe-breaking-change/references/workflow-checklist.md Additional files +194/-0

...

.claude/skills/vibe-breaking-change/references/workflow-checklist.md


54. .cursor/rules/base-components.mdc Additional files +1/-1

...

.cursor/rules/base-components.mdc


55. .cursor/rules/component-internal-structure.mdc Additional files +0/-1

...

.cursor/rules/component-internal-structure.mdc


56. .cursor/rules/styling-conventions.mdc Additional files +5/-5

...

.cursor/rules/styling-conventions.mdc


57. .cursor/templates/package-separation/package.json Additional files +1/-1

...

.cursor/templates/package-separation/package.json


58. CLAUDE.md Additional files +1/-1

...

CLAUDE.md


59. README.md Additional files +3/-3

...

README.md


60. package.json Additional files +1/-1

...

package.json


61. packages/base/package.json Additional files +5/-4

...

packages/base/package.json


62. packages/base/src/BaseInput/BaseInput.module.scss Additional files +9/-7

...

packages/base/src/BaseInput/BaseInput.module.scss


63. packages/codemod/README.md Additional files +8/-3

...

packages/codemod/README.md


64. packages/codemod/package.json Additional files +1/-1

...

packages/codemod/package.json


65. packages/codemod/transformations/core/v3-to-v4/README.md Additional files +139/-0

...

packages/codemod/transformations/core/v3-to-v4/README.md


66. packages/codemod/transformations/core/v3-to-v4/enums/enumMappings.json Additional files +692/-0

...

packages/codemod/transformations/core/v3-to-v4/enums/enumMappings.json


67. packages/components/button/package.json Additional files +8/-7

...

packages/components/button/package.json


68. packages/components/button/src/Button/Button.module.scss Additional files +15/-16

...

packages/components/button/src/Button/Button.module.scss


69. packages/components/button/src/Button/Button.tsx Additional files +21/-46

...

packages/components/button/src/Button/Button.tsx


70. packages/components/button/src/Button/ButtonConstants.ts Additional files +0/-40

...

packages/components/button/src/Button/ButtonConstants.ts


71. packages/components/button/src/Button/__tests__/Button.snapshot.test.tsx Additional files +27/-11

...

packages/components/button/src/Button/tests/Button.snapshot.test.tsx


72. packages/components/button/src/Button/__tests__/Button.test.tsx Additional files +1/-1

...

packages/components/button/src/Button/tests/Button.test.tsx


73. packages/components/clickable/package.json Additional files +5/-4

...

packages/components/clickable/package.json


74. packages/components/clickable/src/Clickable/Clickable.module.scss Additional files +2/-2

...

packages/components/clickable/src/Clickable/Clickable.module.scss


75. packages/components/clickable/src/Clickable/Clickable.tsx Additional files +14/-16

...

packages/components/clickable/src/Clickable/Clickable.tsx


76. packages/components/clickable/src/Clickable/__tests__/Clickable.test.tsx Additional files +1/-1

...

packages/components/clickable/src/Clickable/tests/Clickable.test.tsx


77. packages/components/dialog/package.json Additional files +8/-8

...

packages/components/dialog/package.json


78. packages/components/dialog/src/Dialog/Dialog.tsx Additional files +497/-672

...

packages/components/dialog/src/Dialog/Dialog.tsx


79. packages/components/dialog/src/Dialog/DialogConstants.ts Additional files +0/-62

...

packages/components/dialog/src/Dialog/DialogConstants.ts


80. packages/components/dialog/src/Dialog/DialogContent/DialogContent.module.scss Additional files +0/-173

...

packages/components/dialog/src/Dialog/DialogContent/DialogContent.module.scss


81. packages/components/dialog/src/Dialog/DialogContent/DialogContent.tsx Additional files +0/-225

...

packages/components/dialog/src/Dialog/DialogContent/DialogContent.tsx


82. packages/components/dialog/src/Dialog/DialogContent/useDisableScroll.ts Additional files +0/-37

...

packages/components/dialog/src/Dialog/DialogContent/useDisableScroll.ts


83. packages/components/dialog/src/Dialog/__tests__/Dialog.test.tsx Additional files +445/-4

...

packages/components/dialog/src/Dialog/tests/Dialog.test.tsx


84. packages/components/dialog/src/Dialog/__tests__/useDisableScroll.test.ts Additional files +0/-0

...

packages/components/dialog/src/Dialog/tests/useDisableScroll.test.ts


85. packages/components/dialog/src/Dialog/components/DialogContent/DialogContent.module.scss Additional files +1/-1

...

packages/components/dialog/src/Dialog/components/DialogContent/DialogContent.module.scss


86. packages/components/dialog/src/Dialog/components/DialogContent/DialogContent.tsx Additional files +0/-0

...

packages/components/dialog/src/Dialog/components/DialogContent/DialogContent.tsx


87. packages/components/dialog/src/Dialog/components/Refable/Refable.tsx Additional files +0/-0

...

packages/components/dialog/src/Dialog/components/Refable/Refable.tsx


88. packages/components/dialog/src/Dialog/components/Refable/__tests__/Refable.test.tsx Additional files +0/-0

...

packages/components/dialog/src/Dialog/components/Refable/tests/Refable.test.tsx


89. packages/components/dialog/src/Dialog/hooks/__tests__/useDisableScroll.test.ts Additional files +0/-0

...

packages/components/dialog/src/Dialog/hooks/tests/useDisableScroll.test.ts


90. packages/components/dialog/src/Dialog/hooks/useDisableScroll.ts Additional files +0/-0

...

packages/components/dialog/src/Dialog/hooks/useDisableScroll.ts


91. packages/components/dialog/src/Dialog/index.ts Additional files +2/-9

...

packages/components/dialog/src/Dialog/index.ts


92. packages/components/dialog/src/Dialog/modifiers/observeContentResizeModifier.ts Additional files +0/-18

...

packages/components/dialog/src/Dialog/modifiers/observeContentResizeModifier.ts


93. packages/components/dialog/src/Dialog/modifiers/observeReferenceResizeModifier.ts Additional files +0/-22

...

packages/components/dialog/src/Dialog/modifiers/observeReferenceResizeModifier.ts


94. packages/components/dialog/src/Dialog/useForceUpdate.ts Additional files +0/-11

...

packages/components/dialog/src/Dialog/useForceUpdate.ts


95. packages/components/dialog/src/Dialog/usePopover.ts Additional files +0/-76

...

packages/components/dialog/src/Dialog/usePopover.ts


96. packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss Additional files +3/-3

...

packages/components/dialog/src/DialogContentContainer/DialogContentContainer.module.scss


97. packages/components/dialog/src/DialogContentContainer/DialogContentContainer.tsx Additional files +6/-22

...

packages/components/dialog/src/DialogContentContainer/DialogContentContainer.tsx


98. packages/components/dialog/src/Refable/Refable.tsx Additional files +0/-48

...

packages/components/dialog/src/Refable/Refable.tsx


99. packages/components/dialog/src/Refable/index.ts Additional files +0/-1

...

packages/components/dialog/src/Refable/index.ts


100. packages/components/icon-button/package.json Additional files +8/-8

...

packages/components/icon-button/package.json


101. packages/components/icon-button/src/IconButton/IconButton.tsx Additional files +17/-28

...

packages/components/icon-button/src/IconButton/IconButton.tsx


102. packages/components/icon-button/src/IconButton/__tests__/IconButton.snapshot.test.tsx Additional files +1/-1

...

packages/components/icon-button/src/IconButton/tests/IconButton.snapshot.test.tsx


103. packages/components/icon-button/src/IconButton/__tests__/IconButton.test.tsx Additional files +1/-1

...

packages/components/icon-button/src/IconButton/tests/IconButton.test.tsx


104. packages/components/icon/package.json Additional files +4/-4

...

packages/components/icon/package.json


105. packages/components/icon/src/Icon/CustomSvgIcon/CustomSvgIcon.tsx Additional files +12/-16

...

packages/components/icon/src/Icon/CustomSvgIcon/CustomSvgIcon.tsx


106. packages/components/icon/src/Icon/Icon.tsx Additional files +15/-29

...

packages/components/icon/src/Icon/Icon.tsx


107. packages/components/icon/src/Icon/constants.ts Additional files +0/-8

...

packages/components/icon/src/Icon/constants.ts


108. packages/components/icon/src/Icon/hooks/useIconProps.tsx Additional files +3/-3

...

packages/components/icon/src/Icon/hooks/useIconProps.tsx


109. packages/components/layer/package.json Additional files +7/-7

...

packages/components/layer/package.json


110. packages/components/layout/package.json Additional files +6/-5

...

packages/components/layout/package.json


111. packages/components/layout/src/Box/Box.module.scss Additional files +1/-1

...

packages/components/layout/src/Box/Box.module.scss


112. packages/components/layout/src/Box/Box.tsx Additional files +2/-66

...

packages/components/layout/src/Box/Box.tsx


113. packages/components/layout/src/Box/BoxConstants.ts Additional files +0/-250

...

packages/components/layout/src/Box/BoxConstants.ts


114. packages/components/layout/src/Box/_utilities.scss Additional files +10/-10

...

packages/components/layout/src/Box/_utilities.scss


115. packages/components/layout/src/Flex/Flex.tsx Additional files +14/-26

...

packages/components/layout/src/Flex/Flex.tsx


116. packages/components/layout/src/Flex/Flex.types.ts ...

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 18, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (3) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider


Action required

1. TooltipBaseProps not extending VibeComponentProps 📘 Rule violation ⚙ Maintainability
Description
TooltipBaseProps was changed to extend Omit<DialogProps,...> instead of extending
VibeComponentProps, breaking the required shared component prop contract. This can cause
inconsistent typing/behavior across components and violates the standard component typing pattern.
Code

packages/components/tooltip/src/Tooltip/Tooltip.tsx[37]

+interface TooltipBaseProps extends Omit<DialogProps, "position" | "content" | "children"> {
Evidence
PR Compliance ID 2 requires component prop interfaces to extend VibeComponentProps. The updated
interface declaration in Tooltip.tsx no longer extends VibeComponentProps.

CLAUDE.md
packages/components/tooltip/src/Tooltip/Tooltip.tsx[37-37]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`TooltipBaseProps` no longer extends `VibeComponentProps`, violating the required component props typing contract.

## Issue Context
The Tooltip props were refactored to inherit from `DialogProps` via `Omit&lt;&gt;`, but the base shared props type is required for all components.

## Fix Focus Areas
- packages/components/tooltip/src/Tooltip/Tooltip.tsx[37-37]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Clickable.module.scss contains @import 📘 Rule violation ⚙ Maintainability
Description
The updated Clickable.module.scss includes @import statements, which are forbidden in
.module.scss files by the styling compliance rules. This can introduce unintended coupling and
build/style ordering issues.
Code

packages/components/clickable/src/Clickable/Clickable.module.scss[R1-2]

+@import "~@vibe/style/dist/mixins/typography";
+@import "~@vibe/style/dist/mixins/states";
Evidence
PR Compliance ID 7 forbids any imports in .module.scss files. The modified lines add @import
statements to Clickable.module.scss.

CLAUDE.md
packages/components/clickable/src/Clickable/Clickable.module.scss[1-2]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`.module.scss` files must not contain `@import` (or other import statements), but `Clickable.module.scss` currently imports mixins.

## Issue Context
This file was updated to import from `~@vibe/style/...`, but the compliance rule requires eliminating imports entirely from CSS Modules files.

## Fix Focus Areas
- packages/components/clickable/src/Clickable/Clickable.module.scss[1-2]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. IconButton test uses literal testid 📘 Rule violation ⚙ Maintainability
Description
The IconButton Playwright test uses an ad-hoc literal data-testid selector string instead of using
the established shared constants/patterns. This reduces consistency and makes selectors harder to
maintain across refactors.
Code

packages/testkit/tests/IconButton.test.ts[7]

+const iconButtonLocator = 'button[data-testid^="icon-button"]';
Evidence
PR Compliance ID 10 requires using established test ID patterns from shared constants. The test uses
the literal icon-button in a selector, while the shared constants define
ComponentDefaultTestId.ICON_BUTTON for this purpose.

CLAUDE.md
packages/testkit/tests/IconButton.test.ts[7-7]
packages/core/src/tests/constants.ts[31-34]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The IconButton test selector hard-codes `icon-button` instead of using the shared test-id constants/patterns.

## Issue Context
`ComponentDefaultTestId.ICON_BUTTON` exists in `packages/core/src/tests/constants.ts` and should be the canonical source for this test id.

## Fix Focus Areas
- packages/testkit/__tests__/IconButton.test.ts[7-7]
- packages/core/src/tests/constants.ts[31-34]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View more (2)
4. Dialog drops string children 🐞 Bug ✓ Correctness
Description
DialogProps allows children to be a string, but Dialog renders children through Refable which
returns null for non-ReactElement children (strings), causing the trigger to disappear and
preventing correct anchoring/positioning.
Code

packages/components/dialog/src/Dialog/Dialog.types.ts[230]

+  children?: ReactElement | ReactElement[] | string;
Evidence
The public prop type explicitly allows string children, but Dialog routes children into Refable and
also computes hasValidChildren using React.isValidElement, which excludes strings. Refable
returns null for non-elements, so string children will be dropped at render time and Dialog will
also skip Floating UI positioning because it believes there are no valid children.

packages/components/dialog/src/Dialog/Dialog.types.ts[216-249]
packages/components/dialog/src/Dialog/Dialog.tsx[84-100]
packages/components/dialog/src/Dialog/Dialog.tsx[517-533]
packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[18-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`DialogProps.children` is typed to allow `string`, but `Refable` drops non-elements (`React.isValidElement` check), so a string trigger silently disappears and the dialog cannot anchor/position correctly.

### Issue Context
This is a type/runtime contract mismatch introduced by the new Dialog implementation that always wraps `{children}` with `Refable`.

### Fix Focus Areas
- packages/components/dialog/src/Dialog/Dialog.types.ts[226-231]
- packages/components/dialog/src/Dialog/Dialog.tsx[93-95]
- packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[20-34]

### Expected fix
Choose one (preferred: keep type+runtime consistent):
1) **Support string children**:
  - In `Refable`, if `child` is a string/number, wrap it with `wrapperElement` and render it (so it becomes a real reference element).
  - Update `hasValidChildren` in `Dialog.tsx` to treat string children as valid (or derive the decision from whether `referenceElement` exists) so Floating UI positioning is not skipped.

OR
2) **Disallow string children**:
  - Remove `string` from `DialogProps.children` (and from `RefableProps.children`) so TypeScript prevents unsupported usage instead of failing silently.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Trigger className not applied 🐞 Bug ✓ Correctness
Description
referenceWrapperClassName is passed to Refable, but for native HTML children Refable clones with
{...rest, ...childProps} so an existing child className overwrites the wrapper className, making
referenceWrapperClassName ineffective.
Code

packages/components/dialog/src/Dialog/Dialog.tsx[R519-522]

+      <Refable
+        className={cx(referenceWrapperClassName)}
+        wrapperElement={referenceWrapperElement}
+        ref={setReferenceElement}
Evidence
Dialog documents referenceWrapperClassName as a class applied to the reference wrapper element and
passes it to Refable. But for native elements, Refable spreads ...rest then ...childProps, so
childProps.className overwrites rest.className and the Dialog-provided wrapper class may be lost
whenever the child already has its own className.

packages/components/dialog/src/Dialog/Dialog.types.ts[80-93]
packages/components/dialog/src/Dialog/Dialog.tsx[517-533]
packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[36-52]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`referenceWrapperClassName` can be ignored for native trigger elements because `Refable` clones children using `{ ...rest, ...childProps }`, which lets `childProps.className` override `rest.className`.

### Issue Context
Dialog relies on `referenceWrapperClassName` to style/identify the trigger wrapper, and now always routes triggers through `Refable`.

### Fix Focus Areas
- packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[36-52]
- packages/components/dialog/src/Dialog/Dialog.types.ts[86-93]

### Expected fix
When cloning native elements in `Refable`, explicitly merge className instead of allowing overwrite, e.g.:
- Compute `const mergedClassName = cx(rest.className, childProps.className)` and pass `className: mergedClassName` in the clone props.

(Optionally) consider whether other wrapper props like `style` should merge or whether wrapper should intentionally override child props; but at minimum className should not be dropped.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@rivka-ungar rivka-ungar merged commit d7aad97 into master Mar 18, 2026
17 checks passed
@rivka-ungar rivka-ungar deleted the vibe4 branch March 18, 2026 10:24

// TODO TS-migration extend DialogProps, once Dialog is migrated to TS
interface TooltipBaseProps extends VibeComponentProps {
interface TooltipBaseProps extends Omit<DialogProps, "position" | "content" | "children"> {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. tooltipbaseprops not extending vibecomponentprops 📘 Rule violation ⚙ Maintainability

TooltipBaseProps was changed to extend Omit<DialogProps,...> instead of extending
VibeComponentProps, breaking the required shared component prop contract. This can cause
inconsistent typing/behavior across components and violates the standard component typing pattern.
Agent Prompt
## Issue description
`TooltipBaseProps` no longer extends `VibeComponentProps`, violating the required component props typing contract.

## Issue Context
The Tooltip props were refactored to inherit from `DialogProps` via `Omit<>`, but the base shared props type is required for all components.

## Fix Focus Areas
- packages/components/tooltip/src/Tooltip/Tooltip.tsx[37-37]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +1 to +2
@import "~@vibe/style/dist/mixins/typography";
@import "~@vibe/style/dist/mixins/states";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. clickable.module.scss contains @import 📘 Rule violation ⚙ Maintainability

The updated Clickable.module.scss includes @import statements, which are forbidden in
.module.scss files by the styling compliance rules. This can introduce unintended coupling and
build/style ordering issues.
Agent Prompt
## Issue description
`.module.scss` files must not contain `@import` (or other import statements), but `Clickable.module.scss` currently imports mixins.

## Issue Context
This file was updated to import from `~@vibe/style/...`, but the compliance rule requires eliminating imports entirely from CSS Modules files.

## Fix Focus Areas
- packages/components/clickable/src/Clickable/Clickable.module.scss[1-2]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@@ -4,7 +4,7 @@ import { iconButtonStory } from "./utils/url-helper";

let frame: FrameLocator;
let iconButton: IconButton;
const iconButtonLocator = 'button[data-testid="icon-button"]';
const iconButtonLocator = 'button[data-testid^="icon-button"]';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Iconbutton test uses literal testid 📘 Rule violation ⚙ Maintainability

The IconButton Playwright test uses an ad-hoc literal data-testid selector string instead of using
the established shared constants/patterns. This reduces consistency and makes selectors harder to
maintain across refactors.
Agent Prompt
## Issue description
The IconButton test selector hard-codes `icon-button` instead of using the shared test-id constants/patterns.

## Issue Context
`ComponentDefaultTestId.ICON_BUTTON` exists in `packages/core/src/tests/constants.ts` and should be the canonical source for this test id.

## Fix Focus Areas
- packages/testkit/__tests__/IconButton.test.ts[7-7]
- packages/core/src/tests/constants.ts[31-34]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

/**
* The reference element(s) that the dialog is positioned relative to.
*/
children?: ReactElement | ReactElement[] | string;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Dialog drops string children 🐞 Bug ✓ Correctness

DialogProps allows children to be a string, but Dialog renders children through Refable which
returns null for non-ReactElement children (strings), causing the trigger to disappear and
preventing correct anchoring/positioning.
Agent Prompt
### Issue description
`DialogProps.children` is typed to allow `string`, but `Refable` drops non-elements (`React.isValidElement` check), so a string trigger silently disappears and the dialog cannot anchor/position correctly.

### Issue Context
This is a type/runtime contract mismatch introduced by the new Dialog implementation that always wraps `{children}` with `Refable`.

### Fix Focus Areas
- packages/components/dialog/src/Dialog/Dialog.types.ts[226-231]
- packages/components/dialog/src/Dialog/Dialog.tsx[93-95]
- packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[20-34]

### Expected fix
Choose one (preferred: keep type+runtime consistent):
1) **Support string children**:
   - In `Refable`, if `child` is a string/number, wrap it with `wrapperElement` and render it (so it becomes a real reference element).
   - Update `hasValidChildren` in `Dialog.tsx` to treat string children as valid (or derive the decision from whether `referenceElement` exists) so Floating UI positioning is not skipped.

OR
2) **Disallow string children**:
   - Remove `string` from `DialogProps.children` (and from `RefableProps.children`) so TypeScript prevents unsupported usage instead of failing silently.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +519 to +522
<Refable
className={cx(referenceWrapperClassName)}
wrapperElement={referenceWrapperElement}
ref={setReferenceElement}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

5. Trigger classname not applied 🐞 Bug ✓ Correctness

referenceWrapperClassName is passed to Refable, but for native HTML children Refable clones with
{...rest, ...childProps} so an existing child className overwrites the wrapper className, making
referenceWrapperClassName ineffective.
Agent Prompt
### Issue description
`referenceWrapperClassName` can be ignored for native trigger elements because `Refable` clones children using `{ ...rest, ...childProps }`, which lets `childProps.className` override `rest.className`.

### Issue Context
Dialog relies on `referenceWrapperClassName` to style/identify the trigger wrapper, and now always routes triggers through `Refable`.

### Fix Focus Areas
- packages/components/dialog/src/Dialog/components/Refable/Refable.tsx[36-52]
- packages/components/dialog/src/Dialog/Dialog.types.ts[86-93]

### Expected fix
When cloning native elements in `Refable`, explicitly merge className instead of allowing overwrite, e.g.:
- Compute `const mergedClassName = cx(rest.className, childProps.className)` and pass `className: mergedClassName` in the clone props.

(Optionally) consider whether other wrapper props like `style` should merge or whether wrapper should intentionally override child props; but at minimum className should not be dropped.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants