Tooling
Registry
registry/components.json is the machine-readable catalog behind the CLI, the MCP server and this site. It is generated from the source files, never edited by hand.
Generating it
npm run registryTwo steps run in order. agent/lib.mjs scans src/components/ui/*.tsx for exports, "use client", peers, sibling imports and the first doc comment. Then scripts/props.mjs asks the TypeScript checker for each component's props and writes them as api. npm run build runs both first, so the site never ships stale data.
Top-level fields
| Field | Meaning |
|---|---|
| name, version, license, repository | Package identity. version tracks package.json. |
| count | Number of components. |
| tokens, utils | Paths of the token file and the cn() helper. |
| peerDependencies | npm packages every component may need. |
| agent | Pointers to the CLI, MCP entry and agent docs. |
| categories | Map of category → component names. |
| components | The array described below. |
A component entry
| Field | Type | Meaning |
|---|---|---|
| name | string | Kebab-case slug and file name. |
| title | string | PascalCase name of the primary export. |
| category | string | One of actions, forms, feedback, data, overlays, navigation, craft, text, hover, footers. |
| description | string | The file's first /** … */ comment. |
| file | string | Repo-relative path. |
| exports | string[] | Exported component names, in file order. |
| client | boolean | True if the file starts with "use client". |
| dependencies | string[] | npm peers this file imports beyond react. |
| registryDependencies | string[] | Sibling components it imports. add copies these too. |
| tags | string[] | Category and client/rsc-safe. |
| api | ApiEntry[] | Props per export, generated from types. |
The api field
| Field | Meaning |
|---|---|
| api[].name | The exported component. |
| api[].extends | Native attribute sets it forwards, such as ButtonHTMLAttributes<HTMLButtonElement>. |
| api[].props[].name / type | Prop name and its TypeScript type (long unions are clipped). |
| api[].props[].required | True if the prop has no ? in its type. |
| api[].props[].default | The default from the destructured parameter, or null. |
| api[].props[].description | The prop's JSDoc, or a standard description for common names. |
Props inherited from React or the DOM are not listed; only props declared in this repo (including cva variants) are.
A real entry
This is slider, trimmed to its first two props. It is read from the registry when the page is built.
{
"name": "slider",
"title": "Slider",
"category": "forms",
"description": "Range slider with an accent fill, built on a native range input.",
"file": "src/components/ui/slider.tsx",
"exports": [
"Slider"
],
"client": true,
"dependencies": [],
"registryDependencies": [],
"tags": [
"forms",
"client"
],
"api": [
{
"name": "Slider",
"props": [
{
"name": "value",
"type": "number",
"required": false,
"default": null,
"description": "Controlled value."
},
{
"name": "defaultValue",
"type": "number",
"required": false,
"default": "40",
"description": "Initial value when uncontrolled."
}
],
"extends": []
}
]
}Using it
# the raw file on GitHub
curl -s https://raw.githubusercontent.com/arjunkshah12345-hash/vibeui/main/registry/components.json \
| jq -r '.components[] | select(.category=="forms") | .name'Agents rarely need the file directly: the MCP server exposes it as the vibeui://registry resource and through its tools. See Agents and MCP.