@create-ui/cli 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/chunk-KFQXWKJJ.js +19 -0
  2. package/dist/chunk-KFQXWKJJ.js.map +1 -0
  3. package/dist/{chunk-2ELKDGGM.js → chunk-OGAWGP7T.js} +3 -3
  4. package/dist/{chunk-2ELKDGGM.js.map → chunk-OGAWGP7T.js.map} +1 -1
  5. package/dist/chunk-OITQ46YK.js +99 -0
  6. package/dist/chunk-OITQ46YK.js.map +1 -0
  7. package/dist/index.js +16 -16
  8. package/dist/index.js.map +1 -1
  9. package/dist/mcp/index.js +1 -1
  10. package/dist/registry/index.d.ts +3 -1
  11. package/dist/registry/index.js +1 -1
  12. package/dist/skills/createui/SKILL.md +81 -52
  13. package/dist/skills/createui/cli.md +1 -1
  14. package/dist/skills/createui/customization.md +14 -12
  15. package/dist/skills/createui/evals/evals.json +77 -0
  16. package/dist/skills/createui/mcp.md +12 -26
  17. package/dist/skills/createui/rules/a11y.md +148 -0
  18. package/dist/skills/createui/rules/composition.md +64 -26
  19. package/dist/skills/createui/rules/forms.md +2 -2
  20. package/dist/skills/createui/rules/icons.md +1 -1
  21. package/dist/skills/createui/rules/styling.md +2 -2
  22. package/dist/utils/index.js +1 -1
  23. package/dist/utils/index.js.map +1 -1
  24. package/package.json +1 -1
  25. package/dist/chunk-643QI2I2.js +0 -102
  26. package/dist/chunk-643QI2I2.js.map +0 -1
  27. package/dist/chunk-KQTXDVKV.js +0 -19
  28. package/dist/chunk-KQTXDVKV.js.map +0 -1
  29. package/dist/skills/createui/reference/accordion.md +0 -127
  30. package/dist/skills/createui/reference/app-store-badge.md +0 -88
  31. package/dist/skills/createui/reference/aspect-ratio.md +0 -52
  32. package/dist/skills/createui/reference/avatar.md +0 -230
  33. package/dist/skills/createui/reference/badge.md +0 -110
  34. package/dist/skills/createui/reference/breadcrumb.md +0 -153
  35. package/dist/skills/createui/reference/button-group.md +0 -116
  36. package/dist/skills/createui/reference/button.md +0 -104
  37. package/dist/skills/createui/reference/checkbox-group.md +0 -118
  38. package/dist/skills/createui/reference/checkbox.md +0 -79
  39. package/dist/skills/createui/reference/chip.md +0 -115
  40. package/dist/skills/createui/reference/close-button.md +0 -83
  41. package/dist/skills/createui/reference/country-flag.md +0 -109
  42. package/dist/skills/createui/reference/credit-card-input.md +0 -76
  43. package/dist/skills/createui/reference/date-input.md +0 -71
  44. package/dist/skills/createui/reference/dropdown-menu.md +0 -164
  45. package/dist/skills/createui/reference/field.md +0 -186
  46. package/dist/skills/createui/reference/info-tooltip.md +0 -110
  47. package/dist/skills/createui/reference/inline-alert.md +0 -146
  48. package/dist/skills/createui/reference/input-group.md +0 -171
  49. package/dist/skills/createui/reference/input-otp.md +0 -130
  50. package/dist/skills/createui/reference/input-stepper.md +0 -120
  51. package/dist/skills/createui/reference/input.md +0 -118
  52. package/dist/skills/createui/reference/label.md +0 -121
  53. package/dist/skills/createui/reference/pagination.md +0 -157
  54. package/dist/skills/createui/reference/phone-input.md +0 -77
  55. package/dist/skills/createui/reference/progress.md +0 -158
  56. package/dist/skills/createui/reference/radio-group.md +0 -133
  57. package/dist/skills/createui/reference/radio.md +0 -79
  58. package/dist/skills/createui/reference/scroll-area.md +0 -212
  59. package/dist/skills/createui/reference/segmented-control.md +0 -146
  60. package/dist/skills/createui/reference/select.md +0 -204
  61. package/dist/skills/createui/reference/separator.md +0 -99
  62. package/dist/skills/createui/reference/social-login-button.md +0 -130
  63. package/dist/skills/createui/reference/spinner.md +0 -68
  64. package/dist/skills/createui/reference/status-badge.md +0 -89
  65. package/dist/skills/createui/reference/switch-group.md +0 -122
  66. package/dist/skills/createui/reference/switch.md +0 -75
  67. package/dist/skills/createui/reference/tab-menu.md +0 -165
  68. package/dist/skills/createui/reference/text-link.md +0 -84
  69. package/dist/skills/createui/reference/textarea.md +0 -50
  70. package/dist/skills/createui/reference/toast.md +0 -162
  71. package/dist/skills/createui/reference/tooltip.md +0 -63
@@ -0,0 +1,99 @@
1
+ import {a}from'./chunk-OGAWGP7T.js';import {W,S as S$1,G,f,F}from'./chunk-KFQXWKJJ.js';import {Server}from'@modelcontextprotocol/sdk/server/index.js';import {ListToolsRequestSchema,CallToolRequestSchema}from'@modelcontextprotocol/sdk/types.js';import c from'dedent';import {z}from'zod';import {zodToJsonSchema}from'zod-to-json-schema';import {detect}from'@antfu/ni';async function S(t,{withFallback:e}={withFallback:false}){let r=await detect({programmatic:true,cwd:t});if(r==="yarn@berry")return "yarn";if(r==="pnpm@6")return "pnpm";if(r==="bun")return "bun";if(r==="deno")return "deno";if(!e)return r??"npm";let a=process.env.npm_config_user_agent||"";return a.startsWith("yarn")?"yarn":a.startsWith("pnpm")?"pnpm":a.startsWith("bun")?"bun":"npm"}async function w(t){let e=await S(t);return e==="pnpm"?"pnpm dlx":e==="bun"?"bunx":"npx"}var A="@create-ui/cli";async function R(t){return `${await w(process.cwd())} ${A} ${t}`}function v(t){return t.startsWith("@")&&t.includes("/")?t.slice(t.indexOf("/")+1):t}async function g(t=process.cwd()){try{let e=await f(t);if(e)return e}catch{}return F({})}async function _(t,e){let{query:r,registries:a}=e||{},o=await Promise.all(t.items.map(async s=>{let p=[`- ${s.name}`];return s.type&&p.push(`(${s.type})`),s.description&&p.push(`- ${s.description}`),s.registry&&p.push(`[${s.registry}]`),p.push(`
2
+ Add command: \`${await R(`add ${s.addCommandArgument}`)}\``),p.join(" ")})),i=`Found ${t.pagination.total} items`;r&&(i+=` matching "${r}"`),a&&a.length>0&&(i+=` in registries ${a.join(", ")}`),i+=":";let l=`Showing items ${t.pagination.offset+1}-${Math.min(t.pagination.offset+t.pagination.limit,t.pagination.total)} of ${t.pagination.total}:`,m=`${i}
3
+
4
+ ${l}
5
+
6
+ ${o.join(`
7
+
8
+ `)}`;return t.pagination.hasMore&&(m+=`
9
+
10
+ More items available. Use offset: ${t.pagination.offset+t.pagination.limit} to see the next page.`),t.items.some(s=>s.type==="registry:ui")&&(m+=`
11
+
12
+ Next: call get_item_examples_from_registries with "<item-name>-demo" before writing usage code for any of these components.`),m}function I(t){return t.map(e=>[`## ${e.name}`,e.description?`
13
+ ${e.description}
14
+ `:"",e.type?`**Type:** ${e.type}`:"",e.files&&e.files.length>0?`**Files:** ${e.files.length} file(s)`:"",e.dependencies&&e.dependencies.length>0?`**Dependencies:** ${e.dependencies.join(", ")}`:"",e.devDependencies&&e.devDependencies.length>0?`**Dev Dependencies:** ${e.devDependencies.join(", ")}`:"",e.type==="registry:ui"?`**Usage examples:** call get_item_examples_from_registries with "${e.name}-demo" or "${e.name}-example" before writing usage code.`:""].filter(Boolean).join(`
15
+ `))}function k(t,e){let r=t.map(o=>{let i=[`## Example: ${o.name}`,o.description?`
16
+ ${o.description}
17
+ `:""];return o.files?.length&&o.files.forEach(l=>{l.content&&(i.push(`### Code (${l.path}):
18
+ `),i.push("```tsx"),i.push(l.content),i.push("```"));}),i.filter(Boolean).join(`
19
+ `)});return `# Usage Examples
20
+
21
+ Found ${t.length} example${t.length>1?"s":""} matching "${e}":
22
+ `+r.join(`
23
+
24
+ ---
25
+
26
+ `)}var $=new Server({name:"createui",version:"1.0.0"},{capabilities:{resources:{},tools:{}},instructions:c`Create UI registry server. Create UI is its own design system with its own registry (@createui), CLI (npx @create-ui/cli), semantic tokens, and component APIs. Do not assume shadcn/ui conventions.
27
+
28
+ Workflow for writing UI:
29
+ 1. Before writing code with any component whose Create UI API you have not already confirmed in this session, call get_component_reference (a keyword like "tabs" or "removable tag" is fine). Call it with an empty query first to see the full catalog of components and whether the current user can use each one (free / pro / locked). Do not assume shadcn conventions.
30
+ 2. Need a broader or cross-registry search? Use search_items_in_registries.
31
+ 3. Inspect the raw source with view_items_in_registries (source + metadata).
32
+ 4. For full working demos, call get_item_examples_from_registries (query "<item>-demo" or "<item>-example"). get_component_reference is the concise API + gotchas; examples are the full galleries - they complement.
33
+ 5. Install with \`npx @create-ui/cli add <items>\`; never import a component that hasn't been added.
34
+ 6. Run get_audit_checklist after generating code.
35
+
36
+ Create UI API contract (differs from shadcn):
37
+ - Icons go through props, never as children next to text: leadingIcon / trailingIcon on Button, Badge, SegmentedControlItem, TabMenuItem, BreadcrumbItem, TextLink (plus iconOnly where supported). Chip takes its icon or Avatar as the FIRST CHILD (auto-slotted). InlineAlert and Toast use dedicated Icon subcomponents. Icons import from @create-ui/assets/icons (Remix Ri*), never lucide-react.
38
+ - Styling props: variant (color intent) + appearance (solid | outline | soft | ghost) + size + shape. There is no variant="outline", variant="secondary", or variant="destructive".
39
+ - Never hand-roll a pattern the registry covers: tabs = tab-menu (render content panels yourself, keyed by value), option toggles = segmented-control (value/onValueChange), tags = badge, removable tags = chip, callouts = inline-alert, loading buttons = the Button loading prop, initials avatars = Avatar + AvatarText (AvatarFallback does not exist).
40
+ - Semantic tokens only: bg-static, bg-weak, text-body, text-placeholder, bg-primary-base, border-light. Never raw palette colors or hex values. Call get_component_reference("tokens") for the full token vocabulary (colors, spacing, radius, typography, shadow, themes).
41
+ - Forms: FieldGroup + Field. Field owns size (xs | sm | md); nested Input/Select/Textarea inherit it via context.
42
+ - @createui is the only registry; never configure another.
43
+
44
+ If the createui Agent Skill is installed, follow it. Run \`npx @create-ui/cli info\` for the project's aliases, icon library, and config.`});$.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[{name:"get_component_reference",description:"Fetch the Create UI usage reference for a component: props/variants, 1-2 canonical snippets, when-to-use, gotchas. MANDATORY before writing code with any component whose Create UI API you have not already confirmed this session - our APIs differ from shadcn/general conventions, so do not guess. Accepts a name OR keyword (e.g. 'tab-menu', 'tabs', 'removable tag'). Call with an empty query to list all components and what the current user can access (free / pro / locked). For the styling vocabulary, query 'tokens' (or 'colors' / 'spacing' / 'typography') to get the semantic design tokens.",inputSchema:zodToJsonSchema(z.object({query:z.string().default("").describe("component name or keyword; empty string returns the catalog of all components")}))},{name:"search_items_in_registries",description:"Search for components in registries using fuzzy matching (requires components.json). Always follow up with get_item_examples_from_registries for any item you plan to use - Create UI component APIs differ from shadcn and the examples show the correct usage.",inputSchema:zodToJsonSchema(z.object({registries:z.array(z.string()).describe("Array of registry names to search (e.g., ['@createui', '@acme'])"),query:z.string().describe("Search query string for fuzzy matching against item names and descriptions"),limit:z.number().optional().describe("Maximum number of items to return"),offset:z.number().optional().describe("Number of items to skip for pagination")}))},{name:"view_items_in_registries",description:"View detailed information about specific registry items including the name, description, type and files content. Before writing usage code for an item, also call get_item_examples_from_registries - the component source alone does not show canonical usage (icon props, composition, variants).",inputSchema:zodToJsonSchema(z.object({items:z.array(z.string()).describe("Array of item names (e.g., ['button', 'card']). A '@createui/' prefix is also accepted.")}))},{name:"get_item_examples_from_registries",description:"Find usage examples and demos with their complete code. Call this BEFORE first use of any component. Search for patterns like '{item}-demo' (canonical usage), '{item}-example' (full gallery), or facet names like 'switch-thumb-icon', 'segmented-control-appearance', 'badge-with-icon'. Returns full implementation code with dependencies.",inputSchema:zodToJsonSchema(z.object({registries:z.array(z.string()).describe("Array of registry names to search (e.g., ['@createui', '@acme'])"),query:z.string().describe("Search query for examples (e.g., 'accordion-demo', 'button demo', 'card example', 'tooltip-demo', 'example-booking-form', 'example-hero'). Common patterns: '{item-name}-demo', '{item-name} example', 'example {item-name}'")}))},{name:"get_audit_checklist",description:"After creating new components or generating new code files, use this tool for a quick checklist to verify that everything is working as expected. Make sure to run the tool after all required steps have been completed.",inputSchema:zodToJsonSchema(z.object({}))}]}));$.setRequestHandler(CallToolRequestSchema,async t=>{try{if(!t.params.arguments)throw new Error("No tool arguments provided.");switch(t.params.name){case "get_component_reference":{let{query:e}=z.object({query:z.string().default("")}).parse(t.params.arguments);return {content:[{type:"text",text:await S$1(e)}]}}case "search_items_in_registries":{let r=z.object({registries:z.array(z.string()),query:z.string(),limit:z.number().optional(),offset:z.number().optional()}).parse(t.params.arguments),a$1=await a(r.registries,{query:r.query,limit:r.limit,offset:r.offset,config:await g(process.cwd()),useCache:!1});return a$1.items.length===0?{content:[{type:"text",text:c`No items found matching "${r.query}" in registries ${r.registries.join(", ")}, Try searching with a different query or registry.`}]}:{content:[{type:"text",text:await _(a$1,{query:r.query,registries:r.registries})}]}}case "view_items_in_registries":{let r=z.object({items:z.array(z.string())}).parse(t.params.arguments),a=await W(r.items.map(v),{config:await g(process.cwd()),useCache:!1});if(a?.length===0)return {content:[{type:"text",text:c`No items found for: ${r.items.join(", ")}
45
+
46
+ Make sure the item names are correct (e.g., button, card).`}]};let o=I(a);return {content:[{type:"text",text:c`Item Details:
47
+
48
+ ${o.join(`
49
+
50
+ ---
51
+
52
+ `)}`}]}}case "get_item_examples_from_registries":{let r=z.object({query:z.string(),registries:z.array(z.string())}).parse(t.params.arguments),a$1=await g(),o=await a(r.registries,{query:r.query,config:a$1,useCache:!1});if(o.items.length===0)return {content:[{type:"text",text:c`No examples found for query "${r.query}".
53
+
54
+ Try searching with patterns like:
55
+ - "accordion-demo" for accordion examples
56
+ - "button demo" or "button example"
57
+ - Component name followed by "-demo" or "example"
58
+
59
+ You can also:
60
+ 1. Use search_items_in_registries to find all items matching your query
61
+ 2. View the main component with view_items_in_registries for inline usage documentation`}]};let i=o.items.map(m=>m.addCommandArgument),l=await W(i,{config:a$1,useCache:!1});return {content:[{type:"text",text:k(l,r.query)}]}}case "get_audit_checklist":return {content:[{type:"text",text:c`## Create UI Audit Checklist
62
+
63
+ After adding or generating components, verify the generated code against Create UI's API contract:
64
+
65
+ ### Component usage
66
+ - [ ] Icons are passed via \`leadingIcon\` / \`trailingIcon\` props (Button, Badge, SegmentedControlItem, TabMenuItem, BreadcrumbItem, TextLink) - never as children next to text, never with sizing classes like \`size-4\`.
67
+ - [ ] Icons are imported from \`@create-ui/assets/icons\` (Remix \`Ri*\`), never from \`lucide-react\`.
68
+ - [ ] No hand-rolled equivalents of registry components: tabs use \`tab-menu\`, option toggles use \`segmented-control\` (\`value\`/\`onValueChange\`, not a row of Buttons), tags use \`badge\`, removable tags use \`chip\`, callouts use \`inline-alert\`, loading buttons use the \`loading\` prop.
69
+ - [ ] Avatar fallback initials use \`AvatarText\` (\`AvatarFallback\` does not exist).
70
+ - [ ] No invalid prop values: there is no \`variant="outline"\` / \`"secondary"\` / \`"destructive"\` - outline is \`appearance="outline"\`, destructive is \`variant="danger"\`.
71
+
72
+ ### Styling
73
+ - [ ] Only semantic tokens (\`bg-static\`, \`bg-weak\`, \`text-body\`, \`text-placeholder\`, \`bg-primary-base\`, \`border-light\`) - no raw palette colors or hex values.
74
+ - [ ] Focus styles use \`outline-*\`, never \`ring-*\`.
75
+ - [ ] Vertical stacks use \`flex flex-col gap-*\`, not \`space-y-*\`.
76
+ - [ ] Badges/Chips are not stretched full-width by their container; Buttons that should be full-width use explicit \`w-full\`.
77
+ - [ ] No default monoculture (applies to ALL UI, not just marketing): props are chosen per element's role, not left at defaults across the board. The one primary action is \`variant="primary"\` \`appearance="solid"\` while secondaries use outline/soft/ghost; sizes vary by density; semantic variants (\`danger\`/\`success\`/...) carry real meaning. If every Button/Badge on a screen shares the same default size+variant, this step was skipped.
78
+ - [ ] Showcase/marketing UI goes further: switches exercise variant/thumbIcon/ioTrigger, badges vary appearance deliberately, pricing toggles use the grouped segmented control.
79
+ - [ ] Footers and other neutral surfaces stay neutral (bg-static/bg-weak + border-light) - no saturated raw colors.
80
+ - [ ] One appearance="solid" primary action per section; secondary actions use soft/ghost/outline.
81
+
82
+ ### Forms
83
+ - [ ] Forms use \`FieldGroup\` + \`Field\`; \`size\` is set once on \`Field\` and inherited (never re-set on children).
84
+ - [ ] Validation uses \`data-invalid\` on \`Field\` and \`aria-invalid\` on the control.
85
+
86
+ ### Project health
87
+ - [ ] Imports use the project's aliases from components.json (run \`npx @create-ui/cli info\`).
88
+ - [ ] All dependencies are installed; no imports of components that were never added.
89
+ - [ ] No linting or TypeScript errors.
90
+ - [ ] Use the Playwright MCP if available to verify rendering.
91
+ `}]};default:throw new Error(`Tool ${t.params.name} not found`)}}catch(e){if(e instanceof z.ZodError)return {content:[{type:"text",text:c`Invalid input parameters:
92
+ ${e.errors.map(a=>`- ${a.path.join(".")}: ${a.message}`).join(`
93
+ `)}
94
+ `}],isError:true};if(e instanceof G){let a=e.message;return e.suggestion&&(a+=`
95
+
96
+ \u{1F4A1} ${e.suggestion}`),e.context&&(a+=`
97
+
98
+ Context: ${JSON.stringify(e.context,null,2)}`),{content:[{type:"text",text:c`Error (${e.code}): ${a}`}],isError:true}}let r=e instanceof Error?e.message:String(e);return {content:[{type:"text",text:c`Error: ${r}`}],isError:true}}});export{S as a,$ as b};//# sourceMappingURL=chunk-OITQ46YK.js.map
99
+ //# sourceMappingURL=chunk-OITQ46YK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/get-package-manager.ts","../src/mcp/utils.ts","../src/mcp/index.ts"],"names":["getPackageManager","targetDir","withFallback","packageManager","detect","userAgent","getPackageRunner","cwd","createui_CLI_COMMAND","npxcreateui","command","normalizeRegistryItemName","item","getMcpConfig","config","getConfig","configWithDefaults","formatSearchResultsWithPagination","results","options","query","registries","formattedItems","parts","header","showingRange","output","formatRegistryItems","items","formatItemExamples","sections","file","server","Server","dedent","ListToolsRequestSchema","zodToJsonSchema","z","CallToolRequestSchema","request","fetchReference","args","searchRegistries","registryItems","getRegistryItems","itemNames","fullItems","error","e","RegistryError","errorMessage"],"mappings":"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","file":"chunk-OITQ46YK.js","sourcesContent":["import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n if (packageManager === \"deno\") return \"deno\"\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { configWithDefaults } from \"@/src/registry/config\"\nimport { registryItemSchema, searchResultsSchema } from \"@/src/schema\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { getPackageRunner } from \"@/src/utils/get-package-manager\"\nimport { z } from \"zod\"\n\nconst createui_CLI_COMMAND = \"@create-ui/cli\"\n\nexport async function npxcreateui(command: string) {\n const packageRunner = await getPackageRunner(process.cwd())\n return `${packageRunner} ${createui_CLI_COMMAND} ${command}`\n}\n\n// Single-provider: items resolve by bare name (e.g. \"button\"). The MCP tools\n// historically accepted a \"@registry/item\" convention, so strip an optional\n// leading \"@registry/\" prefix. URLs and local file paths are returned untouched.\nexport function normalizeRegistryItemName(item: string) {\n if (item.startsWith(\"@\") && item.includes(\"/\")) {\n return item.slice(item.indexOf(\"/\") + 1)\n }\n\n return item\n}\n\nexport async function getMcpConfig(cwd = process.cwd()) {\n try {\n const config = await getConfig(cwd)\n if (config) {\n return config\n }\n } catch {\n // Fall back to defaults when components.json is missing or invalid.\n }\n\n return configWithDefaults({})\n}\n\nexport async function formatSearchResultsWithPagination(\n results: z.infer<typeof searchResultsSchema>,\n options?: {\n query?: string\n registries?: string[]\n }\n) {\n const { query, registries } = options || {}\n\n const formattedItems = await Promise.all(\n results.items.map(async (item) => {\n const parts: string[] = [`- ${item.name}`]\n\n if (item.type) {\n parts.push(`(${item.type})`)\n }\n\n if (item.description) {\n parts.push(`- ${item.description}`)\n }\n\n if (item.registry) {\n parts.push(`[${item.registry}]`)\n }\n\n parts.push(\n `\\n Add command: \\`${await npxcreateui(\n `add ${item.addCommandArgument}`\n )}\\``\n )\n\n return parts.join(\" \")\n })\n )\n\n let header = `Found ${results.pagination.total} items`\n if (query) {\n header += ` matching \"${query}\"`\n }\n if (registries && registries.length > 0) {\n header += ` in registries ${registries.join(\", \")}`\n }\n header += \":\"\n\n const showingRange = `Showing items ${\n results.pagination.offset + 1\n }-${Math.min(\n results.pagination.offset + results.pagination.limit,\n results.pagination.total\n )} of ${results.pagination.total}:`\n\n let output = `${header}\\n\\n${showingRange}\\n\\n${formattedItems.join(\"\\n\\n\")}`\n\n if (results.pagination.hasMore) {\n output += `\\n\\nMore items available. Use offset: ${\n results.pagination.offset + results.pagination.limit\n } to see the next page.`\n }\n\n if (results.items.some((item) => item.type === \"registry:ui\")) {\n output += `\\n\\nNext: call get_item_examples_from_registries with \"<item-name>-demo\" before writing usage code for any of these components.`\n }\n\n return output\n}\n\nexport function formatRegistryItems(\n items: z.infer<typeof registryItemSchema>[]\n) {\n return items.map((item) => {\n const parts: string[] = [\n `## ${item.name}`,\n item.description ? `\\n${item.description}\\n` : \"\",\n item.type ? `**Type:** ${item.type}` : \"\",\n item.files && item.files.length > 0\n ? `**Files:** ${item.files.length} file(s)`\n : \"\",\n item.dependencies && item.dependencies.length > 0\n ? `**Dependencies:** ${item.dependencies.join(\", \")}`\n : \"\",\n item.devDependencies && item.devDependencies.length > 0\n ? `**Dev Dependencies:** ${item.devDependencies.join(\", \")}`\n : \"\",\n item.type === \"registry:ui\"\n ? `**Usage examples:** call get_item_examples_from_registries with \"${item.name}-demo\" or \"${item.name}-example\" before writing usage code.`\n : \"\",\n ]\n return parts.filter(Boolean).join(\"\\n\")\n })\n}\n\nexport function formatItemExamples(\n items: z.infer<typeof registryItemSchema>[],\n query: string\n) {\n const sections = items.map((item) => {\n const parts: string[] = [\n `## Example: ${item.name}`,\n item.description ? `\\n${item.description}\\n` : \"\",\n ]\n\n if (item.files?.length) {\n item.files.forEach((file) => {\n if (file.content) {\n parts.push(`### Code (${file.path}):\\n`)\n parts.push(\"```tsx\")\n parts.push(file.content)\n parts.push(\"```\")\n }\n })\n }\n\n return parts.filter(Boolean).join(\"\\n\")\n })\n\n const header = `# Usage Examples\\n\\nFound ${items.length} example${\n items.length > 1 ? \"s\" : \"\"\n } matching \"${query}\":\\n`\n\n return header + sections.join(\"\\n\\n---\\n\\n\")\n}\n","import {\n fetchReference,\n getRegistryItems,\n searchRegistries,\n} from \"@/src/registry\"\nimport { RegistryError } from \"@/src/registry/errors\"\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\"\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\"\nimport dedent from \"dedent\"\nimport { z } from \"zod\"\nimport { zodToJsonSchema } from \"zod-to-json-schema\"\n\nimport {\n formatItemExamples,\n formatRegistryItems,\n formatSearchResultsWithPagination,\n getMcpConfig,\n normalizeRegistryItemName,\n} from \"./utils\"\n\nexport const server = new Server(\n {\n name: \"createui\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n resources: {},\n tools: {},\n },\n instructions: dedent`Create UI registry server. Create UI is its own design system with its own registry (@createui), CLI (npx @create-ui/cli), semantic tokens, and component APIs. Do not assume shadcn/ui conventions.\n\n Workflow for writing UI:\n 1. Before writing code with any component whose Create UI API you have not already confirmed in this session, call get_component_reference (a keyword like \"tabs\" or \"removable tag\" is fine). Call it with an empty query first to see the full catalog of components and whether the current user can use each one (free / pro / locked). Do not assume shadcn conventions.\n 2. Need a broader or cross-registry search? Use search_items_in_registries.\n 3. Inspect the raw source with view_items_in_registries (source + metadata).\n 4. For full working demos, call get_item_examples_from_registries (query \"<item>-demo\" or \"<item>-example\"). get_component_reference is the concise API + gotchas; examples are the full galleries - they complement.\n 5. Install with \\`npx @create-ui/cli add <items>\\`; never import a component that hasn't been added.\n 6. Run get_audit_checklist after generating code.\n\n Create UI API contract (differs from shadcn):\n - Icons go through props, never as children next to text: leadingIcon / trailingIcon on Button, Badge, SegmentedControlItem, TabMenuItem, BreadcrumbItem, TextLink (plus iconOnly where supported). Chip takes its icon or Avatar as the FIRST CHILD (auto-slotted). InlineAlert and Toast use dedicated Icon subcomponents. Icons import from @create-ui/assets/icons (Remix Ri*), never lucide-react.\n - Styling props: variant (color intent) + appearance (solid | outline | soft | ghost) + size + shape. There is no variant=\"outline\", variant=\"secondary\", or variant=\"destructive\".\n - Never hand-roll a pattern the registry covers: tabs = tab-menu (render content panels yourself, keyed by value), option toggles = segmented-control (value/onValueChange), tags = badge, removable tags = chip, callouts = inline-alert, loading buttons = the Button loading prop, initials avatars = Avatar + AvatarText (AvatarFallback does not exist).\n - Semantic tokens only: bg-static, bg-weak, text-body, text-placeholder, bg-primary-base, border-light. Never raw palette colors or hex values. Call get_component_reference(\"tokens\") for the full token vocabulary (colors, spacing, radius, typography, shadow, themes).\n - Forms: FieldGroup + Field. Field owns size (xs | sm | md); nested Input/Select/Textarea inherit it via context.\n - @createui is the only registry; never configure another.\n\n If the createui Agent Skill is installed, follow it. Run \\`npx @create-ui/cli info\\` for the project's aliases, icon library, and config.`,\n }\n)\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: \"get_component_reference\",\n description:\n \"Fetch the Create UI usage reference for a component: props/variants, 1-2 canonical \" +\n \"snippets, when-to-use, gotchas. MANDATORY before writing code with any component whose \" +\n \"Create UI API you have not already confirmed this session - our APIs differ from \" +\n \"shadcn/general conventions, so do not guess. Accepts a name OR keyword (e.g. 'tab-menu', \" +\n \"'tabs', 'removable tag'). Call with an empty query to list all components and what the \" +\n \"current user can access (free / pro / locked). For the styling vocabulary, query \" +\n \"'tokens' (or 'colors' / 'spacing' / 'typography') to get the semantic design tokens.\",\n inputSchema: zodToJsonSchema(\n z.object({\n query: z\n .string()\n .default(\"\")\n .describe(\n \"component name or keyword; empty string returns the catalog of all components\"\n ),\n })\n ),\n },\n {\n name: \"search_items_in_registries\",\n description:\n \"Search for components in registries using fuzzy matching (requires components.json). Always follow up with get_item_examples_from_registries for any item you plan to use - Create UI component APIs differ from shadcn and the examples show the correct usage.\",\n inputSchema: zodToJsonSchema(\n z.object({\n registries: z\n .array(z.string())\n .describe(\n \"Array of registry names to search (e.g., ['@createui', '@acme'])\"\n ),\n query: z\n .string()\n .describe(\n \"Search query string for fuzzy matching against item names and descriptions\"\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of items to return\"),\n offset: z\n .number()\n .optional()\n .describe(\"Number of items to skip for pagination\"),\n })\n ),\n },\n {\n name: \"view_items_in_registries\",\n description:\n \"View detailed information about specific registry items including the name, description, type and files content. Before writing usage code for an item, also call get_item_examples_from_registries - the component source alone does not show canonical usage (icon props, composition, variants).\",\n inputSchema: zodToJsonSchema(\n z.object({\n items: z\n .array(z.string())\n .describe(\n \"Array of item names (e.g., ['button', 'card']). A '@createui/' prefix is also accepted.\"\n ),\n })\n ),\n },\n {\n name: \"get_item_examples_from_registries\",\n description:\n \"Find usage examples and demos with their complete code. Call this BEFORE first use of any component. Search for patterns like '{item}-demo' (canonical usage), '{item}-example' (full gallery), or facet names like 'switch-thumb-icon', 'segmented-control-appearance', 'badge-with-icon'. Returns full implementation code with dependencies.\",\n inputSchema: zodToJsonSchema(\n z.object({\n registries: z\n .array(z.string())\n .describe(\n \"Array of registry names to search (e.g., ['@createui', '@acme'])\"\n ),\n query: z\n .string()\n .describe(\n \"Search query for examples (e.g., 'accordion-demo', 'button demo', 'card example', 'tooltip-demo', 'example-booking-form', 'example-hero'). Common patterns: '{item-name}-demo', '{item-name} example', 'example {item-name}'\"\n ),\n })\n ),\n },\n {\n name: \"get_audit_checklist\",\n description:\n \"After creating new components or generating new code files, use this tool for a quick checklist to verify that everything is working as expected. Make sure to run the tool after all required steps have been completed.\",\n inputSchema: zodToJsonSchema(z.object({})),\n },\n ],\n }\n})\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n try {\n if (!request.params.arguments) {\n throw new Error(\"No tool arguments provided.\")\n }\n\n switch (request.params.name) {\n case \"get_component_reference\": {\n const { query } = z\n .object({ query: z.string().default(\"\") })\n .parse(request.params.arguments)\n\n const text = await fetchReference(query)\n return {\n content: [\n {\n type: \"text\",\n text,\n },\n ],\n }\n }\n\n case \"search_items_in_registries\": {\n const inputSchema = z.object({\n registries: z.array(z.string()),\n query: z.string(),\n limit: z.number().optional(),\n offset: z.number().optional(),\n })\n\n const args = inputSchema.parse(request.params.arguments)\n const results = await searchRegistries(args.registries, {\n query: args.query,\n limit: args.limit,\n offset: args.offset,\n config: await getMcpConfig(process.cwd()),\n useCache: false,\n })\n\n if (results.items.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: dedent`No items found matching \"${\n args.query\n }\" in registries ${args.registries.join(\n \", \"\n )}, Try searching with a different query or registry.`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: await formatSearchResultsWithPagination(results, {\n query: args.query,\n registries: args.registries,\n }),\n },\n ],\n }\n }\n\n case \"view_items_in_registries\": {\n const inputSchema = z.object({\n items: z.array(z.string()),\n })\n\n const args = inputSchema.parse(request.params.arguments)\n const registryItems = await getRegistryItems(\n args.items.map(normalizeRegistryItemName),\n {\n config: await getMcpConfig(process.cwd()),\n useCache: false,\n }\n )\n\n if (registryItems?.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: dedent`No items found for: ${args.items.join(\", \")}\n\n Make sure the item names are correct (e.g., button, card).`,\n },\n ],\n }\n }\n\n const formattedItems = formatRegistryItems(registryItems)\n\n return {\n content: [\n {\n type: \"text\",\n text: dedent`Item Details:\n\n ${formattedItems.join(\"\\n\\n---\\n\\n\")}`,\n },\n ],\n }\n }\n\n case \"get_item_examples_from_registries\": {\n const inputSchema = z.object({\n query: z.string(),\n registries: z.array(z.string()),\n })\n\n const args = inputSchema.parse(request.params.arguments)\n const config = await getMcpConfig()\n\n const results = await searchRegistries(args.registries, {\n query: args.query,\n config,\n useCache: false,\n })\n\n if (results.items.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: dedent`No examples found for query \"${args.query}\".\n\n Try searching with patterns like:\n - \"accordion-demo\" for accordion examples\n - \"button demo\" or \"button example\"\n - Component name followed by \"-demo\" or \"example\"\n\n You can also:\n 1. Use search_items_in_registries to find all items matching your query\n 2. View the main component with view_items_in_registries for inline usage documentation`,\n },\n ],\n }\n }\n\n const itemNames = results.items.map((item) => item.addCommandArgument)\n const fullItems = await getRegistryItems(itemNames, {\n config,\n useCache: false,\n })\n\n return {\n content: [\n {\n type: \"text\",\n text: formatItemExamples(fullItems, args.query),\n },\n ],\n }\n }\n\n case \"get_audit_checklist\": {\n return {\n content: [\n {\n type: \"text\",\n text: dedent`## Create UI Audit Checklist\n\n After adding or generating components, verify the generated code against Create UI's API contract:\n\n ### Component usage\n - [ ] Icons are passed via \\`leadingIcon\\` / \\`trailingIcon\\` props (Button, Badge, SegmentedControlItem, TabMenuItem, BreadcrumbItem, TextLink) - never as children next to text, never with sizing classes like \\`size-4\\`.\n - [ ] Icons are imported from \\`@create-ui/assets/icons\\` (Remix \\`Ri*\\`), never from \\`lucide-react\\`.\n - [ ] No hand-rolled equivalents of registry components: tabs use \\`tab-menu\\`, option toggles use \\`segmented-control\\` (\\`value\\`/\\`onValueChange\\`, not a row of Buttons), tags use \\`badge\\`, removable tags use \\`chip\\`, callouts use \\`inline-alert\\`, loading buttons use the \\`loading\\` prop.\n - [ ] Avatar fallback initials use \\`AvatarText\\` (\\`AvatarFallback\\` does not exist).\n - [ ] No invalid prop values: there is no \\`variant=\"outline\"\\` / \\`\"secondary\"\\` / \\`\"destructive\"\\` - outline is \\`appearance=\"outline\"\\`, destructive is \\`variant=\"danger\"\\`.\n\n ### Styling\n - [ ] Only semantic tokens (\\`bg-static\\`, \\`bg-weak\\`, \\`text-body\\`, \\`text-placeholder\\`, \\`bg-primary-base\\`, \\`border-light\\`) - no raw palette colors or hex values.\n - [ ] Focus styles use \\`outline-*\\`, never \\`ring-*\\`.\n - [ ] Vertical stacks use \\`flex flex-col gap-*\\`, not \\`space-y-*\\`.\n - [ ] Badges/Chips are not stretched full-width by their container; Buttons that should be full-width use explicit \\`w-full\\`.\n - [ ] No default monoculture (applies to ALL UI, not just marketing): props are chosen per element's role, not left at defaults across the board. The one primary action is \\`variant=\"primary\"\\` \\`appearance=\"solid\"\\` while secondaries use outline/soft/ghost; sizes vary by density; semantic variants (\\`danger\\`/\\`success\\`/...) carry real meaning. If every Button/Badge on a screen shares the same default size+variant, this step was skipped.\n - [ ] Showcase/marketing UI goes further: switches exercise variant/thumbIcon/ioTrigger, badges vary appearance deliberately, pricing toggles use the grouped segmented control.\n - [ ] Footers and other neutral surfaces stay neutral (bg-static/bg-weak + border-light) - no saturated raw colors.\n - [ ] One appearance=\"solid\" primary action per section; secondary actions use soft/ghost/outline.\n\n ### Forms\n - [ ] Forms use \\`FieldGroup\\` + \\`Field\\`; \\`size\\` is set once on \\`Field\\` and inherited (never re-set on children).\n - [ ] Validation uses \\`data-invalid\\` on \\`Field\\` and \\`aria-invalid\\` on the control.\n\n ### Project health\n - [ ] Imports use the project's aliases from components.json (run \\`npx @create-ui/cli info\\`).\n - [ ] All dependencies are installed; no imports of components that were never added.\n - [ ] No linting or TypeScript errors.\n - [ ] Use the Playwright MCP if available to verify rendering.\n `,\n },\n ],\n }\n }\n\n default:\n throw new Error(`Tool ${request.params.name} not found`)\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n return {\n content: [\n {\n type: \"text\",\n text: dedent`Invalid input parameters:\n ${error.errors\n .map((e) => `- ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}\n `,\n },\n ],\n isError: true,\n }\n }\n\n if (error instanceof RegistryError) {\n let errorMessage = error.message\n\n if (error.suggestion) {\n errorMessage += `\\n\\n💡 ${error.suggestion}`\n }\n\n if (error.context) {\n errorMessage += `\\n\\nContext: ${JSON.stringify(error.context, null, 2)}`\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: dedent`Error (${error.code}): ${errorMessage}`,\n },\n ],\n isError: true,\n }\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error)\n return {\n content: [\n {\n type: \"text\",\n text: dedent`Error: ${errorMessage}`,\n },\n ],\n isError: true,\n }\n }\n})\n"]}