一键导入
vibe-best-practices
// Ensures Vibe design system (@vibe/core) components follow best practices and accessibility standards. Use when writing or reviewing UI code in monday.com apps that import from @vibe/core or @vibe/core/next.
// Ensures Vibe design system (@vibe/core) components follow best practices and accessibility standards. Use when writing or reviewing UI code in monday.com apps that import from @vibe/core or @vibe/core/next.
Migrate an existing monday.com app from the old OAuth flow to the new OAuth 2.1 flow. Changes token endpoint from oauth2/token to oauth_ms/oauth/token, adds refresh token support, updates token storage, and optionally adds PKCE. ALWAYS use when someone mentions migrating monday OAuth, switching to the new OAuth flow, adding refresh tokens, updating the monday token endpoint, token expiration, or when code calls auth.monday.com/oauth2/token. Also trigger on OAuth deadline/deprecation announcements. Do NOT use for new OAuth from scratch, non-monday OAuth (Google, Slack, Spotify), client credentials flow, DCR, or general monday debugging.
Upgrades a project to a new major version of Vibe (@vibe/core) using MCP migration tools. Use when upgrading from v2 to v3 (monday-ui-react-core → @vibe/core) or from v3 to v4.
Build, test, and debug monday.com GraphQL queries and mutations. Introspects the live schema, handles pagination, column value formatting, and validates queries by executing them. Use when writing API queries, debugging response shapes, or figuring out column value JSON formats.
Bootstrap a project using the monday.com public GraphQL API. Installs the @mondaydotcomorg/api SDK, configures auth, pins API version, and sets up TypeScript codegen. Use when starting a new API integration or adding monday.com API to an existing project.
Migrate between monday.com API versions. Identifies your current version, shows breaking changes, guides code updates, and tests migrated queries. Use when a new API version is released or you need to upgrade from a deprecated version.
Production operations guidance for the monday.com API. Covers error handling, rate limits, complexity budgeting, retry strategies, webhooks, and caching. Use when preparing an API integration for production or debugging production issues.
| name | vibe-best-practices |
| description | Ensures Vibe design system (@vibe/core) components follow best practices and accessibility standards. Use when writing or reviewing UI code in monday.com apps that import from @vibe/core or @vibe/core/next. |
| user-invocable | true |
| allowed-tools | ["Read","Glob","Grep","Edit","Write","mcp__vibe__get-vibe-component-metadata","mcp__vibe__get-vibe-component-accessibility","mcp__vibe__list-vibe-public-components","mcp__vibe__list-vibe-icons","mcp__vibe__list-vibe-tokens","mcp__vibe__get-vibe-component-examples"] |
Verify Vibe component usage follows design system standards and WCAG 2.1 AA accessibility requirements using MCP tools before implementation or during code review.
Core Principle: Check compliance ALWAYS — for quick fixes, working code, urgent tasks, and when matching existing patterns. No exceptions.
Always use this skill when:
@vibe/core or @vibe/core/next components@vibe/core, @vibe/core/next, or @vibe/iconsBEFORE analyzing any code, check imports (lines 1–10):
@vibe/core/next when available? (Call get-vibe-component-metadata to check)Import violations are the most commonly missed. Stop and check imports first.
| Code Pattern | MCP Tool to Call | Why |
|---|---|---|
import { Dropdown } from "@vibe/core" | get-vibe-component-metadata | Check if /next version exists |
<Button kind={Button.kinds.PRIMARY}> | get-vibe-component-metadata | Get valid string prop values |
<div onClick={handler}> | list-vibe-public-components | Find accessible Vibe alternative |
style={{ fontSize: '16px' }} | list-vibe-tokens | Replace with design tokens |
monday-ui-react-core imports | list-vibe-public-components | Find v3 equivalents |
| Tool | When to Use |
|---|---|
list-vibe-public-components | Check if a Vibe component exists before using raw HTML |
get-vibe-component-metadata | Verify component API, props, and available versions |
get-vibe-component-accessibility | Get accessibility requirements for a component |
get-vibe-component-examples | See correct usage patterns |
list-vibe-icons | Find available icon names from @vibe/icons |
list-vibe-tokens | Find design tokens (spacing, colors, border-radius) |
| # | Rule | Quick Check |
|---|---|---|
| 1 | Use @vibe/core/next when available | Call get-vibe-component-metadata to check |
| 2 | Use Text/Heading for typography | Never manual text styling |
| 3 | String literals for props | "primary" not Button.kinds.PRIMARY |
| 4 | No mixing v2 and v3 | Never monday-ui-react-core |
| 5 | No !important in CSS | Breaks Vibe theme consistency |
| 6 | No inline styles on Vibe components | No style={} prop |
| 7 | Use design tokens | CSS custom properties, not hardcoded values |
STOP: Read this before writing or reviewing any Vibe code.
Scan imports first — check every import against Rule 1
Check component availability:
list-vibe-public-components
Verify component API:
get-vibe-component-metadata ComponentName
Check accessibility requirements:
get-vibe-component-accessibility ComponentName
See usage examples:
get-vibe-component-examples ComponentName
MANDATORY — no exceptions:
Critical: Do NOT skip MCP tools to save time. Tool calls are fast and prevent mistakes.
@vibe/core/next When Availableget-vibe-component-metadata for each component/next version exists in the response/next version available, import from @vibe/core/next/next version, import from @vibe/core// Violation:
import { Dropdown } from "@vibe/core";
// Compliant (after verifying /next exists via MCP):
import { Dropdown } from "@vibe/core/next";
Text and Heading for Typographyget-vibe-component-metadata for Text and Headingget-vibe-component-examples for proper usage patterns// Violation:
<p style={{ fontSize: "16px", fontWeight: "bold" }}>Task name</p>
// Compliant:
<Text type="text1" weight="bold">Task name</Text>
get-vibe-component-metadata for the component// Violation:
<Button kind={Button.kinds.PRIMARY}>Submit</Button>
// Compliant:
<Button kind="primary">Submit</Button>
monday-ui-react-core (v2)list-vibe-public-components to find v3 equivalents@vibe/core or @vibe/core/next// Violation:
import { Button } from "monday-ui-react-core";
// Compliant:
import { Button } from "@vibe/core";
!important in CSS!important declarationsget-vibe-component-metadata to find the proper prop or token/* Violation: */
.myButton {
background-color: blue !important;
}
/* Compliant — use component props or tokens: */
.myButton {
background-color: var(--primary-color);
}
style={{}} propsget-vibe-component-metadata to find proper props (e.g., gap, margin)// Violation:
<Flex style={{ gap: "16px" }}>...</Flex>
// Compliant:
<Flex gap="medium">...</Flex>
// (verify prop names via get-vibe-component-metadata)
list-vibe-tokens to find available design tokens/* Violation: */
.container {
margin-bottom: 16px;
color: #323338;
}
/* Compliant: */
.container {
margin-bottom: var(--space-16);
color: var(--primary-text-color);
}
list-vibe-public-componentsLists all public components from @vibe/core and @vibe/core/next.
When to use: Before implementing — check if Vibe has a component before reaching for raw HTML.
// DON'T immediately write:
<div onClick={handleClick}>Click me</div>
// DO check first:
// list-vibe-public-components → shows Clickable exists
<Clickable onClick={handleClick}>Click me</Clickable>
get-vibe-component-metadataReturns props, types, package (@vibe/core vs /next), deprecation status, and related components.
When to use: ALWAYS before using a component — verify API and check for /next version.
// Call: get-vibe-component-metadata Button
// Response: kind accepts "primary", "secondary", "tertiary"
// Violation:
<Button kind={Button.kinds.PRIMARY}>
// Compliant:
<Button kind="primary">
get-vibe-component-accessibilityReturns WCAG requirements, required props (e.g., aria-label), keyboard behavior, and screen reader announcements.
When to use: MANDATORY for EVERY Vibe component — before implementation and during review.
// Call: get-vibe-component-accessibility IconButton
// Response: aria-label required for icon-only buttons
// Violation:
<IconButton icon={Delete} onClick={handleDelete} />
// Compliant:
<IconButton icon={Delete} aria-label="Delete item" onClick={handleDelete} />
get-vibe-component-examplesReturns React usage examples and patterns.
When to use: Learning a new component's API or understanding correct usage patterns.
// Call: get-vibe-component-examples Modal
// Shows: Modal with ModalHeader, ModalContent, ModalFooter structure
list-vibe-iconsLists available icons with descriptions, categories, and correct names.
When to use: Finding the right icon name before importing from @vibe/icons.
// Call: list-vibe-icons close
// Response: Close, CloseSmall, CloseCircle
import { Close } from "@vibe/icons";
<IconButton icon={Close} aria-label="Close dialog" />;
list-vibe-tokensLists design tokens (spacing, colors, border-radius, typography).
When to use: Replacing hardcoded CSS values with Vibe tokens.
/* Call: list-vibe-tokens spacing */
/* Response: --space-16: 16px */
.container {
margin-bottom: var(--space-16);
}
get-vibe-component-accessibilityFor EVERY Vibe component, call get-vibe-component-accessibility to get specific requirements. Don't rely on assumptions — requirements vary by component and can change across versions.
// Raw HTML (avoid):
<div onClick={handleClick} role="button" tabIndex={0} onKeyDown={...}>
// Vibe component (preferred — handles accessibility automatically):
<Clickable onClick={handleClick}>
aria-label on icon-only buttonsalt text on imagestitle or inputAriaLabel on TextField)Check for:
{...props} may pass accessibility props<label htmlFor> elsewhere in the file<Tooltip> may provide an accessible name<ListItem> rendering <li> is correct if <List> provides <ul>Only flag confirmed violations, or use "Potential Issue" if uncertain.
⚠️ Vibe Standards Violation - Rule {number}
{Brief description}
**Rule:** {rule-name}
**Affected code:** Lines {start}-{end} in `{filename}`
**Fix:** {Specific remediation with code example}
Example:
⚠️ Vibe Standards Violation - Rule 3
Button prop uses static property instead of string literal.
**Rule:** String literals for props
**Affected code:** Line 12 in `TaskCard.tsx`
**Fix:**
- <Button kind={Button.kinds.PRIMARY}>Submit</Button>
+ <Button kind="primary">Submit</Button>
⚠️ Accessibility Violation - WCAG {criterion}
{Brief description}
**Element:** `{ComponentName}`
**WCAG:** {criterion-number} - {criterion-name}
**Affected code:** Lines {start}-{end} in `{filename}`
**Fix:** {Suggest Vibe component first, then manual fix}
Example:
⚠️ Accessibility Violation - WCAG 4.1.2
Icon-only button missing accessible name.
**Element:** `<IconButton>`
**WCAG:** 4.1.2 - Name, Role, Value
**Affected code:** Line 24 in `TaskCard.tsx`
**Fix:** Add aria-label prop:
<IconButton icon={Delete} aria-label="Delete task" onClick={handleDelete} />
Never skip compliance checks. No exceptions.
"This is a quick fix, I'll skip the checks" Even one-line changes can introduce import violations (Rule 1). Scanning imports takes 10 seconds.
"The code works, no need to change"
Working code can import from @vibe/core instead of /next, use static properties like Button.kinds.PRIMARY, or miss aria-label — all while functioning perfectly. Functionality ≠ Compliance.
"I'll match the existing pattern for consistency" Propagating anti-patterns creates more debt. Implement correctly per Vibe standards, then flag that the existing code also violates them.
"There are too many issues to report all of them" Report every violation. Group by type if needed, prioritize: Critical (accessibility) > High (import violations) > Medium (static props).
"I'll skip MCP tools to save time" MCP tools are fast (<500ms). They are the source of truth for Vibe APIs. Without them, you're guessing at prop values and accessibility requirements.
"That's out of scope for this task" Vibe compliance is always in scope when touching files with Vibe imports. Flag violations even if fixing them is out of scope — let the user decide.
Urgent bug fix:
"Match existing code used in 50+ files":
"Been in production 6 months, works fine":
Component Compliance:
@vibe/core/next when availableText/Heading.kinds., .sizes., .types.)monday-ui-react-core imports!important in CSSstyle={{}} props on Vibe componentsAccessibility:
get-vibe-component-accessibility for each componentaria-labelalt attributestitle or inputAriaLabel)MCP Tools Used:
list-vibe-public-components — checked component availabilityget-vibe-component-metadata — verified props and packageget-vibe-component-accessibility — checked requirements for each componentget-vibe-component-examples — reviewed usage patterns