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

bash
npm run registry

Two 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

FieldMeaning
name, version, license, repositoryPackage identity. version tracks package.json.
countNumber of components.
tokens, utilsPaths of the token file and the cn() helper.
peerDependenciesnpm packages every component may need.
agentPointers to the CLI, MCP entry and agent docs.
categoriesMap of category → component names.
componentsThe array described below.

A component entry

FieldTypeMeaning
namestringKebab-case slug and file name.
titlestringPascalCase name of the primary export.
categorystringOne of actions, forms, feedback, data, overlays, navigation, craft, text, hover, footers.
descriptionstringThe file's first /** … */ comment.
filestringRepo-relative path.
exportsstring[]Exported component names, in file order.
clientbooleanTrue if the file starts with "use client".
dependenciesstring[]npm peers this file imports beyond react.
registryDependenciesstring[]Sibling components it imports. add copies these too.
tagsstring[]Category and client/rsc-safe.
apiApiEntry[]Props per export, generated from types.

The api field

FieldMeaning
api[].nameThe exported component.
api[].extendsNative attribute sets it forwards, such as ButtonHTMLAttributes<HTMLButtonElement>.
api[].props[].name / typeProp name and its TypeScript type (long unions are clipped).
api[].props[].requiredTrue if the prop has no ? in its type.
api[].props[].defaultThe default from the destructured parameter, or null.
api[].props[].descriptionThe 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.

registry/components.json (excerpt)
{
  "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

bash
# 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.