@hareru/mcp 0.2.0 → 0.3.0

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.
package/README.md CHANGED
@@ -43,7 +43,7 @@ Add to your `claude_desktop_config.json`:
43
43
  |-----|-------------|
44
44
  | `hareru-ui://tokens` | DTCG design tokens (light/dark themes, 150+ CSS custom properties) |
45
45
  | `hareru-ui://tokens/schema` | JSON Schema for design tokens — CSS variable enums and type constraints |
46
- | `hareru-ui://components` | Component registry — 40+ components with CVA variants and Props interfaces |
46
+ | `hareru-ui://components` | Component registry — 49 components with CVA variants, Props, states, a11y, and examples |
47
47
  | `hareru-ui://components/schema` | JSON Schema for the component registry |
48
48
  | `hareru-ui://bundles` | Task bundles — curated component sets for common UI patterns |
49
49
  | `hareru-ui://rules/consumer` | Consumer rules for AI agents — import patterns, styling rules, and token reference |
@@ -52,7 +52,7 @@ Add to your `claude_desktop_config.json`:
52
52
 
53
53
  | Tool | Description | Parameters |
54
54
  |------|-------------|------------|
55
- | `get-component-usage` | Get usage docs for a component — import, variants, props, and JSX example | `componentName` (string) |
55
+ | `get-component-usage` | Get usage docs for a component — import, variants, props, JSX example, states, accessibility, and examples when available | `componentName` (string) |
56
56
  | `get-bundle-usage` | Get usage docs for a task bundle — components, CSS imports, and token categories | `bundleName` (string) |
57
57
  | `validate-token-value` | Validate a CSS value against the token schema | `tokenType` (string), `value` (string) |
58
58
  | `recommend-css-mode` | Recommend the best CSS import mode based on project context | `hasTailwind` (boolean), `componentCount` (number), `hasExistingReset?` (boolean) |
package/dist/index.js CHANGED
@@ -356,6 +356,33 @@ function formatUsageMarkdown(entry) {
356
356
  }
357
357
  parts.push("");
358
358
  }
359
+ const states = entry.states ?? [];
360
+ if (states.length > 0) {
361
+ parts.push("## States");
362
+ parts.push("");
363
+ parts.push("| State | Type | Values | Default |");
364
+ parts.push("|-------|------|--------|---------|");
365
+ for (const s of states) {
366
+ const values = s.type === "enum" ? s.values.map(escPipe).join(", ") : "-";
367
+ const def = s.type === "enum" && s.defaultValue ? escPipe(s.defaultValue) : "-";
368
+ parts.push(`| ${escPipe(s.name)} | ${s.type} | ${values} | ${def} |`);
369
+ }
370
+ parts.push("");
371
+ }
372
+ const a11y = entry.a11y;
373
+ if (a11y) {
374
+ parts.push("## Accessibility");
375
+ parts.push("");
376
+ if (a11y.roles?.length) parts.push(`- Roles: ${a11y.roles.join(", ")}`);
377
+ if (a11y.ariaAttributes?.length) parts.push(`- ARIA: ${a11y.ariaAttributes.join(", ")}`);
378
+ if (a11y.semanticElements?.length)
379
+ parts.push(`- Semantic elements: ${a11y.semanticElements.join(", ")}`);
380
+ if (a11y.keyboardInteractions?.length)
381
+ parts.push(`- Keyboard: ${a11y.keyboardInteractions.join("; ")}`);
382
+ if (a11y.liveRegion) parts.push("- Live region: yes");
383
+ if (a11y.notes) parts.push(`- Notes: ${a11y.notes}`);
384
+ parts.push("");
385
+ }
359
386
  if (entry.peerComponents) {
360
387
  parts.push("## Also Consider");
361
388
  parts.push("");
@@ -364,29 +391,43 @@ function formatUsageMarkdown(entry) {
364
391
  }
365
392
  parts.push("");
366
393
  }
367
- parts.push("## Example");
368
- parts.push("");
369
- parts.push("```tsx");
370
- if (variants.length > 0) {
371
- const firstVariant = variants[0];
372
- const propsStr = Object.entries(firstVariant.defaultVariants).map(([k, v]) => `${k}="${v}"`).join(" ");
373
- parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);
374
- } else if (subs.length > 0) {
375
- parts.push(`<${entry.name}>`);
376
- for (const sub of subs) {
377
- parts.push(` <${sub}>Content</${sub}>`);
394
+ const examples = entry.examples ?? [];
395
+ if (examples.length > 0) {
396
+ parts.push("## Example");
397
+ parts.push("");
398
+ for (const ex of examples) {
399
+ parts.push(`### ${ex.title}`);
400
+ parts.push("");
401
+ parts.push("```tsx");
402
+ parts.push(ex.code);
403
+ parts.push("```");
404
+ parts.push("");
378
405
  }
379
- parts.push(`</${entry.name}>`);
380
406
  } else {
381
- parts.push(`<${entry.name}>Content</${entry.name}>`);
407
+ parts.push("## Example");
408
+ parts.push("");
409
+ parts.push("```tsx");
410
+ if (variants.length > 0) {
411
+ const firstVariant = variants[0];
412
+ const propsStr = Object.entries(firstVariant.defaultVariants).map(([k, v]) => `${k}="${v}"`).join(" ");
413
+ parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);
414
+ } else if (subs.length > 0) {
415
+ parts.push(`<${entry.name}>`);
416
+ for (const sub of subs) {
417
+ parts.push(` <${sub}>Content</${sub}>`);
418
+ }
419
+ parts.push(`</${entry.name}>`);
420
+ } else {
421
+ parts.push(`<${entry.name}>Content</${entry.name}>`);
422
+ }
423
+ parts.push("```");
382
424
  }
383
- parts.push("```");
384
425
  return parts.join("\n");
385
426
  }
386
427
  function registerTools(server) {
387
428
  server.tool(
388
429
  "get-component-usage",
389
- "Get usage documentation for a Hareru UI component \u2014 import, variants, props, and JSX example",
430
+ "Get usage documentation for a Hareru UI component \u2014 import, variants, props, states, accessibility, and examples",
390
431
  { componentName: z2.string().describe('Component name (e.g. "Button", "Card", "Alert")') },
391
432
  async ({ componentName }) => {
392
433
  const registry = loadRegistry();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/utils.ts","../src/resources.ts","../src/tools.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\nimport { registerTools } from './tools.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as {\n version: string;\n};\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: 'hareru-ui',\n version: pkg.version,\n });\n\n registerResources(server);\n registerTools(server);\n registerPrompts(server);\n\n return server;\n}\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Hareru UI MCP server started (stdio)');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { loadConsumerRules, loadRegistry, loadSchema } from './utils.js';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'create-ui',\n 'Generate a UI component using Hareru UI design system',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A settings form with name and email fields\")',\n ),\n framework: z.string().optional().describe('Target framework: react (default)'),\n },\n async ({ description, framework }) => {\n const registry = loadRegistry();\n const schema = loadSchema();\n\n const componentList = registry.components\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${variantInfo}${desc}`;\n })\n .join('\\n');\n\n const bundles = registry.taskBundles ?? [];\n const bundleList =\n bundles.length > 0\n ? bundles\n .map((b) => `- ${b.name}: ${b.description} (${b.components.length} components)`)\n .join('\\n')\n : '';\n\n const cssVars = schema.properties.cssVariables.items.enum.slice(0, 20).join(', ');\n const fw = framework ?? 'react';\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using the Hareru UI design system (${fw}).\n\n## Available Components\n\n${componentList}\n\n## Design Token CSS Variables (sample)\n\n${cssVars}, ...\n\n## Rules\n\n1. Import components from '@hareru/ui'. For CSS setup, refer to the consumer-rules (standalone: '@hareru/ui/styles.css', portable: '@hareru/tokens/css' + '@hareru/ui/styles/components.css')\n2. Use only semantic variant props (e.g. variant=\"default\"), never hardcode CSS values\n3. Use CSS variables (--hui-*) for any custom styling\n4. All components support forwardRef\n5. Use BEM class naming (hui-*) if adding custom classes\n6. Colors use OKLCH format\n\n## Task\n\n${description}\n${bundleList ? `\\n## Available Bundles\\n\\n${bundleList}\\n` : ''}\nGenerate a complete ${fw} component that fulfills this requirement.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'create-ui-tailwind',\n 'Generate a UI component mixing Hareru UI and Tailwind CSS with Cascade Layer guidance',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A dashboard card with Tailwind layout and Hareru UI buttons\")',\n ),\n },\n async ({ description }) => {\n const registry = loadRegistry();\n\n const componentList = registry.components\n .map((c) => {\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${desc}`;\n })\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using Hareru UI + Tailwind CSS v4 together.\n\n## Cascade Layer Order\n\nDeclare this layer order at the top of your CSS entry point:\n\n\\`\\`\\`css\n@layer theme, base, hui, components, utilities;\n@import 'tailwindcss';\n@import '@hareru/tokens/css';\n@import '@hareru/ui/styles/components.layer.css';\n\\`\\`\\`\n\n- Hareru components live in \\`@layer hui\\` — below Tailwind \\`utilities\\`\n- Tailwind utility classes (e.g. \\`flex\\`, \\`gap-4\\`, \\`p-2\\`) can safely override Hareru layout\n- Never use Tailwind classes to override Hareru component internals (colors, border-radius, shadows) — use \\`--hui-*\\` CSS variables instead\n\n## Mixing Classes Example\n\n\\`\\`\\`tsx\n{/* Tailwind for layout, Hareru for components */}\n<div className=\"flex gap-4 p-6\">\n <Card className=\"flex-1\">\n <CardHeader>Title</CardHeader>\n <CardContent>\n <Button variant=\"default\">Action</Button>\n </CardContent>\n </Card>\n</div>\n\\`\\`\\`\n\n## Available Components\n\n${componentList}\n\n## Rules\n\n1. Import components from \\`@hareru/ui\\`\n2. Use Tailwind utilities for layout (flex, grid, gap, padding, margin)\n3. Use Hareru components for interactive UI elements (Button, Input, Card, Dialog)\n4. Use \\`--hui-*\\` CSS variables for theming — do not override with Tailwind color classes\n5. Use BEM class naming (\\`hui-*\\`) if adding custom component styles\n6. Colors are OKLCH format\n\n## Task\n\n${description}\n\nGenerate a complete React component that combines Tailwind layout utilities with Hareru UI components.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'consumer-rules',\n 'Get the rules for using Hareru UI in your project',\n {},\n async () => {\n const rules = loadConsumerRules();\n\n const CODE_BLOCK_SECTIONS = new Set(['cssImports']);\n\n const rulesSections = Object.entries(rules.rules)\n .map(([key, section]) => {\n const ruleList = section.rules.map((r) => `- ${r}`).join('\\n');\n const examples = Object.entries(section.examples)\n .map(([label, code]) =>\n CODE_BLOCK_SECTIONS.has(key)\n ? `**${label}:**\\n\\`\\`\\`css\\n${code}\\n\\`\\`\\``\n : ` ${label}: ${code}`,\n )\n .join('\\n');\n return `### ${key}\\n${section.description}\\n\\n${ruleList}\\n\\nExamples:\\n${examples}`;\n })\n .join('\\n\\n');\n\n const tokenRef = Object.entries(rules.tokenQuickReference)\n .map(([category, pattern]) => `- ${category}: ${pattern}`)\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Hareru UI Consumer Rules (v${rules.version})\n\nThese rules apply when using Hareru UI in any project.\n\n## Rules\n\n${rulesSections}\n\n## Token Quick Reference\n\n${tokenRef}`,\n },\n },\n ],\n };\n },\n );\n}\n","export {\n loadTokens,\n loadSchema,\n loadRegistry,\n loadComponentSchema,\n loadConsumerRules,\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n recommendCssMode,\n} from '@hareru/registry';\n\nexport type {\n TokensJSON,\n SchemaJSON,\n ComponentRegistryJSON,\n ComponentEntry,\n TaskBundle,\n ComponentGroup,\n TokenCategory,\n VariantDef,\n CustomPropDef,\n PropDef,\n ComponentSchemaJSON,\n ConsumerRulesJSON,\n CssMode,\n CssModeContext,\n} from '@hareru/registry';\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadComponentSchema,\n loadConsumerRules,\n loadRegistry,\n loadSchema,\n loadTokens,\n} from './utils.js';\n\nexport function registerResources(server: McpServer): void {\n const schema = loadSchema();\n const tokenCount = schema.properties.tokenCount.const;\n const registry = loadRegistry();\n\n server.resource(\n 'tokens',\n 'hareru-ui://tokens',\n {\n description: `DTCG design tokens (light/dark themes, ${tokenCount} CSS custom properties)`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadTokens(), null, 2) }],\n }),\n );\n\n server.resource(\n 'tokens-schema',\n 'hareru-ui://tokens/schema',\n {\n description: 'JSON Schema for design tokens — CSS variable enums and type constraints',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'components',\n 'hareru-ui://components',\n {\n description: `Component registry — ${registry.componentCount} components with CVA variants and Props interfaces`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry, null, 2) }],\n }),\n );\n\n server.resource(\n 'bundles',\n 'hareru-ui://bundles',\n {\n description: `Task bundles — ${registry.taskBundles?.length ?? 0} curated component sets for common UI patterns`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry.taskBundles ?? [], null, 2) }],\n }),\n );\n\n server.resource(\n 'components-schema',\n 'hareru-ui://components/schema',\n {\n description: 'JSON Schema for the component registry',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadComponentSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'consumer-rules',\n 'hareru-ui://rules/consumer',\n {\n description:\n 'Consumer rules for AI agents — import patterns, styling rules, and token reference',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadConsumerRules(), null, 2) }],\n }),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport {\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n loadRegistry,\n loadSchema,\n recommendCssMode,\n} from './utils.js';\nimport type { ComponentEntry } from './utils.js';\n\nfunction escPipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction formatVariantsTable(entry: ComponentEntry): string {\n const variants = entry.variants ?? [];\n if (variants.length === 0) return 'No CVA variants defined.';\n\n const lines: string[] = ['| Variant | Options | Default |', '|---------|---------|---------|'];\n for (const v of variants) {\n for (const [key, options] of Object.entries(v.variants)) {\n const defaultVal = v.defaultVariants[key] ?? '-';\n lines.push(\n `| ${escPipe(key)} | ${options.map(escPipe).join(', ')} | ${escPipe(defaultVal)} |`,\n );\n }\n }\n return lines.join('\\n');\n}\n\nfunction formatUsageMarkdown(entry: ComponentEntry): string {\n const parts: string[] = [];\n\n parts.push(`# ${entry.displayName}`);\n parts.push('');\n\n // Description (Phase 3A)\n parts.push(entry.description);\n parts.push('');\n\n // AI Guidance (Phase 3A)\n if (entry.aiHint) {\n parts.push('## AI Guidance');\n parts.push('');\n parts.push(entry.aiHint);\n parts.push('');\n }\n\n // Import section\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n const subs = entry.subcomponents ?? [];\n const allNames = [entry.name, ...subs];\n parts.push(`import { ${allNames.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section (registry-driven)\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const dep of entry.requiredCssArtifacts ?? []) {\n parts.push(`@import '@hareru/ui/${dep}';`);\n }\n parts.push(`@import '@hareru/ui/${entry.cssArtifact}';`);\n parts.push('```');\n parts.push('');\n\n const variants = entry.variants ?? [];\n const props = entry.props ?? [];\n\n if (variants.length > 0) {\n parts.push('## Variants');\n parts.push('');\n parts.push(formatVariantsTable(entry));\n parts.push('');\n }\n\n if (props.length > 0) {\n parts.push('## Props');\n parts.push('');\n for (const prop of props) {\n if (prop.extends) {\n parts.push(`- **${prop.name}** extends \\`${prop.extends}\\``);\n } else {\n parts.push(`- **${prop.name}**`);\n }\n }\n parts.push('');\n }\n\n // Also Consider (Phase 3A)\n if (entry.peerComponents) {\n parts.push('## Also Consider');\n parts.push('');\n for (const peer of entry.peerComponents) {\n parts.push(`- ${peer}`);\n }\n parts.push('');\n }\n\n parts.push('## Example');\n parts.push('');\n parts.push('```tsx');\n if (variants.length > 0) {\n const firstVariant = variants[0];\n const propsStr = Object.entries(firstVariant.defaultVariants)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);\n } else if (subs.length > 0) {\n parts.push(`<${entry.name}>`);\n for (const sub of subs) {\n parts.push(` <${sub}>Content</${sub}>`);\n }\n parts.push(`</${entry.name}>`);\n } else {\n parts.push(`<${entry.name}>Content</${entry.name}>`);\n }\n parts.push('```');\n\n return parts.join('\\n');\n}\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n 'get-component-usage',\n 'Get usage documentation for a Hareru UI component — import, variants, props, and JSX example',\n { componentName: z.string().describe('Component name (e.g. \"Button\", \"Card\", \"Alert\")') },\n async ({ componentName }) => {\n const registry = loadRegistry();\n const entry = registry.components.find(\n (c) => c.name.toLowerCase() === componentName.toLowerCase(),\n );\n\n if (!entry) {\n const available = registry.components.map((c) => c.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Component \"${componentName}\" not found. Available components: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: formatUsageMarkdown(entry) }],\n };\n },\n );\n\n server.tool(\n 'get-bundle-usage',\n 'Get usage documentation for a Hareru UI task bundle — components, CSS imports, and token categories',\n { bundleName: z.string().describe('Bundle name (e.g. \"agent-chat-shell\", \"form-basics\")') },\n async ({ bundleName }) => {\n const registry = loadRegistry();\n const bundles = registry.taskBundles ?? [];\n const bundle = bundles.find((b) => b.name.toLowerCase() === bundleName.toLowerCase());\n\n if (!bundle) {\n const available = bundles.map((b) => b.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Bundle \"${bundleName}\" not found. Available bundles: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n const componentMap = new Map(registry.components.map((c) => [c.name, c]));\n\n const parts: string[] = [];\n parts.push(`# Bundle: ${bundle.name}`);\n parts.push('');\n parts.push(bundle.description);\n parts.push('');\n\n // Import section — expand subcomponents so the import is copy-pasteable\n const allImports: string[] = [];\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n allImports.push(compName);\n if (comp?.subcomponents) {\n allImports.push(...comp.subcomponents);\n }\n }\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n parts.push(`import { ${allImports.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const artifact of bundle.cssArtifacts) {\n parts.push(`@import '@hareru/ui/${artifact}';`);\n }\n parts.push('```');\n parts.push('');\n\n // Token categories\n parts.push('## Token Categories');\n parts.push('');\n parts.push(bundle.tokenCategories.join(', '));\n parts.push('');\n\n // Components detail\n parts.push('## Components');\n parts.push('');\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n if (comp) {\n parts.push(`- **${comp.name}** — ${comp.description}`);\n } else {\n parts.push(`- **${compName}**`);\n }\n }\n parts.push('');\n\n return {\n content: [{ type: 'text' as const, text: parts.join('\\n') }],\n };\n },\n );\n\n server.tool(\n 'validate-token-value',\n 'Validate a CSS token value against the Hareru UI design token schema',\n {\n tokenType: z\n .string()\n .describe(\n 'Token type: color, dimension, fontFamily, fontWeight, duration, number, shadow, typography, cubicBezier',\n ),\n value: z.string().describe('The value to validate (e.g. \"oklch(0.5 0.2 250)\")'),\n },\n async ({ tokenType, value }) => {\n const schema = loadSchema();\n const constraint =\n schema.properties.typeConstraints.properties[\n tokenType as keyof typeof schema.properties.typeConstraints.properties\n ];\n\n if (!constraint) {\n const availableTypes = Object.keys(schema.properties.typeConstraints.properties).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Unknown token type \"${tokenType}\". Available types: ${availableTypes}`,\n },\n ],\n isError: true,\n };\n }\n\n if (!constraint.pattern) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — token type \"${tokenType}\" has no pattern constraint (any ${constraint.type ?? 'string'} value accepted).`,\n },\n ],\n };\n }\n\n let regex: RegExp;\n try {\n regex = new RegExp(constraint.pattern);\n } catch {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error — invalid pattern for token type \"${tokenType}\": ${constraint.pattern}`,\n },\n ],\n isError: true,\n };\n }\n\n const isValid = regex.test(value);\n\n if (isValid) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — \"${value}\" matches the ${tokenType} pattern: ${constraint.pattern}`,\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Invalid — \"${value}\" does not match the ${tokenType} pattern.\\nExpected: ${constraint.pattern}\\nDescription: ${constraint.description ?? tokenType}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'recommend-css-mode',\n 'Recommend the best CSS import mode for a Hareru UI project based on project context',\n {\n hasTailwind: z.boolean().describe('Whether Tailwind CSS is detected in the project'),\n componentCount: z\n .number()\n .int()\n .min(0)\n .describe('Number of Hareru components used in the project'),\n hasExistingReset: z\n .boolean()\n .optional()\n .describe(\n 'Whether the project already has a CSS reset or framework (e.g. Bootstrap, Pico CSS)',\n ),\n },\n async ({ hasTailwind, componentCount, hasExistingReset }) => {\n const result = recommendCssMode({ hasTailwind, componentCount, hasExistingReset });\n\n const allModes = CSS_MODES.map((m) => {\n const marker = m === result.mode ? ' ← recommended' : '';\n return `- **${m}**: ${CSS_MODE_DESCRIPTIONS[m]}${marker}`;\n }).join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## Recommended CSS Mode: \\`${result.mode}\\`\\n\\n${result.reason}\\n\\n## All Modes\\n\\n${allModes}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'list-components-by-group',\n 'List Hareru UI components filtered by group',\n {\n group: z\n .enum([\n 'core',\n 'form',\n 'layout',\n 'overlay',\n 'navigation',\n 'feedback',\n 'data-display',\n 'agent',\n 'di-domain',\n ])\n .describe('Component group to filter by'),\n },\n async ({ group }) => {\n const registry = loadRegistry();\n const filtered = registry.components.filter((c) => c.group === group);\n\n if (filtered.length === 0) {\n const groups = [...new Set(registry.components.map((c) => c.group))].sort();\n return {\n content: [\n {\n type: 'text' as const,\n text: `No components in group \"${group}\". Available groups: ${groups.join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines = filtered\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n return `- **${c.name}**${variantInfo} — ${c.description}`;\n })\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## ${group} (${filtered.length} components)\\n\\n${lines}`,\n },\n ],\n };\n },\n );\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;;;ACHrC,SAAS,SAAS;;;ACDlB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ADLA,SAAS,gBAAgB,QAAyB;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,EACV,OAAO,EACP;AAAA,QACC;AAAA,MACF;AAAA,MACF,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,IAC/E;AAAA,IACA,OAAO,EAAE,aAAa,UAAU,MAAM;AACpC,YAAM,WAAW,aAAa;AAC9B,YAAM,SAAS,WAAW;AAE1B,YAAM,gBAAgB,SAAS,WAC5B,IAAI,CAAC,MAAM;AACV,cAAM,WAAW,EAAE,YAAY,CAAC;AAChC,cAAM,cACJ,SAAS,SAAS,IACd,KAAK,SAAS,QAAQ,CAAC,MAAM,OAAO,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,MACjH;AACN,cAAM,OAAO,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK;AACrD,eAAO,KAAK,EAAE,IAAI,GAAG,WAAW,GAAG,IAAI;AAAA,MACzC,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,UAAU,SAAS,eAAe,CAAC;AACzC,YAAM,aACJ,QAAQ,SAAS,IACb,QACG,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,WAAW,KAAK,EAAE,WAAW,MAAM,cAAc,EAC9E,KAAK,IAAI,IACZ;AAEN,YAAM,UAAU,OAAO,WAAW,aAAa,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAChF,YAAM,KAAK,aAAa;AAExB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,6DAA6D,EAAE;AAAA;AAAA;AAAA;AAAA,EAIjF,aAAa;AAAA;AAAA;AAAA;AAAA,EAIb,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaP,WAAW;AAAA,EACX,aAAa;AAAA;AAAA;AAAA,EAA6B,UAAU;AAAA,IAAO,EAAE;AAAA,sBACzC,EAAE;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,EACV,OAAO,EACP;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,EAAE,YAAY,MAAM;AACzB,YAAM,WAAW,aAAa;AAE9B,YAAM,gBAAgB,SAAS,WAC5B,IAAI,CAAC,MAAM;AACV,cAAM,OAAO,EAAE,cAAc,WAAM,EAAE,WAAW,KAAK;AACrD,eAAO,KAAK,EAAE,IAAI,GAAG,IAAI;AAAA,MAC3B,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiClB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAab,WAAW;AAAA;AAAA;AAAA,YAGD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,YAAM,QAAQ,kBAAkB;AAEhC,YAAM,sBAAsB,oBAAI,IAAI,CAAC,YAAY,CAAC;AAElD,YAAM,gBAAgB,OAAO,QAAQ,MAAM,KAAK,EAC7C,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM;AACvB,cAAM,WAAW,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAC7D,cAAM,WAAW,OAAO,QAAQ,QAAQ,QAAQ,EAC7C;AAAA,UAAI,CAAC,CAAC,OAAO,IAAI,MAChB,oBAAoB,IAAI,GAAG,IACvB,KAAK,KAAK;AAAA;AAAA,EAAmB,IAAI;AAAA,UACjC,KAAK,KAAK,KAAK,IAAI;AAAA,QACzB,EACC,KAAK,IAAI;AACZ,eAAO,OAAO,GAAG;AAAA,EAAK,QAAQ,WAAW;AAAA;AAAA,EAAO,QAAQ;AAAA;AAAA;AAAA,EAAkB,QAAQ;AAAA,MACpF,CAAC,EACA,KAAK,MAAM;AAEd,YAAM,WAAW,OAAO,QAAQ,MAAM,mBAAmB,EACtD,IAAI,CAAC,CAAC,UAAU,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,EAAE,EACxD,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MAAM,gCAAgC,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/D,aAAa;AAAA;AAAA;AAAA;AAAA,EAIb,QAAQ;AAAA,YACE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AE3MO,SAAS,kBAAkB,QAAyB;AACzD,QAAM,SAAS,WAAW;AAC1B,QAAM,aAAa,OAAO,WAAW,WAAW;AAChD,QAAM,WAAW,aAAa;AAE9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,0CAA0C,UAAU;AAAA,MACjE,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,6BAAwB,SAAS,cAAc;AAAA,MAC5D,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa,uBAAkB,SAAS,aAAa,UAAU,CAAC;AAAA,MAChE,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,SAAS,eAAe,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IACzF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aACE;AAAA,MACF,UAAU;AAAA,IACZ;AAAA,IACA,OAAO,SAAS;AAAA,MACd,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,KAAK,UAAU,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC;AAAA,IAClF;AAAA,EACF;AACF;;;ACrFA,SAAS,KAAAA,UAAS;AAUlB,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,OAAO,KAAK;AAC/B;AAEA,SAAS,oBAAoB,OAA+B;AAC1D,QAAM,WAAW,MAAM,YAAY,CAAC;AACpC,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,QAAkB,CAAC,mCAAmC,iCAAiC;AAC7F,aAAW,KAAK,UAAU;AACxB,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,EAAE,QAAQ,GAAG;AACvD,YAAM,aAAa,EAAE,gBAAgB,GAAG,KAAK;AAC7C,YAAM;AAAA,QACJ,KAAK,QAAQ,GAAG,CAAC,MAAM,QAAQ,IAAI,OAAO,EAAE,KAAK,IAAI,CAAC,MAAM,QAAQ,UAAU,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,oBAAoB,OAA+B;AAC1D,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK,MAAM,WAAW,EAAE;AACnC,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,MAAM,WAAW;AAC5B,QAAM,KAAK,EAAE;AAGb,MAAI,MAAM,QAAQ;AAChB,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,MAAM;AACvB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ;AACnB,QAAM,OAAO,MAAM,iBAAiB,CAAC;AACrC,QAAM,WAAW,CAAC,MAAM,MAAM,GAAG,IAAI;AACrC,QAAM,KAAK,YAAY,SAAS,KAAK,IAAI,CAAC,uBAAuB;AACjE,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,QAAQ;AACnB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,QAAQ;AACnB,QAAM,KAAK,kCAAkC;AAC7C,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,QAAQ;AACnB,QAAM,KAAK,+BAA+B;AAC1C,aAAW,OAAO,MAAM,wBAAwB,CAAC,GAAG;AAClD,UAAM,KAAK,uBAAuB,GAAG,IAAI;AAAA,EAC3C;AACA,QAAM,KAAK,uBAAuB,MAAM,WAAW,IAAI;AACvD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAEb,QAAM,WAAW,MAAM,YAAY,CAAC;AACpC,QAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,oBAAoB,KAAK,CAAC;AACrC,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,EAAE;AACb,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS;AAChB,cAAM,KAAK,OAAO,KAAK,IAAI,gBAAgB,KAAK,OAAO,IAAI;AAAA,MAC7D,OAAO;AACL,cAAM,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACjC;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,MAAM,gBAAgB;AACxB,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,EAAE;AACb,eAAW,QAAQ,MAAM,gBAAgB;AACvC,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,YAAY;AACvB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,QAAQ;AACnB,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,eAAe,SAAS,CAAC;AAC/B,UAAM,WAAW,OAAO,QAAQ,aAAa,eAAe,EACzD,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAC7B,KAAK,GAAG;AACX,UAAM,KAAK,IAAI,MAAM,IAAI,IAAI,QAAQ,aAAa,MAAM,IAAI,GAAG;AAAA,EACjE,WAAW,KAAK,SAAS,GAAG;AAC1B,UAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAC5B,eAAW,OAAO,MAAM;AACtB,YAAM,KAAK,MAAM,GAAG,aAAa,GAAG,GAAG;AAAA,IACzC;AACA,UAAM,KAAK,KAAK,MAAM,IAAI,GAAG;AAAA,EAC/B,OAAO;AACL,UAAM,KAAK,IAAI,MAAM,IAAI,aAAa,MAAM,IAAI,GAAG;AAAA,EACrD;AACA,QAAM,KAAK,KAAK;AAEhB,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,cAAc,QAAyB;AACrD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,eAAeC,GAAE,OAAO,EAAE,SAAS,iDAAiD,EAAE;AAAA,IACxF,OAAO,EAAE,cAAc,MAAM;AAC3B,YAAM,WAAW,aAAa;AAC9B,YAAM,QAAQ,SAAS,WAAW;AAAA,QAChC,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,cAAc,YAAY;AAAA,MAC5D;AAEA,UAAI,CAAC,OAAO;AACV,cAAM,YAAY,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAClE,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,cAAc,aAAa,sCAAsC,SAAS;AAAA,YAClF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,oBAAoB,KAAK,EAAE,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,YAAYA,GAAE,OAAO,EAAE,SAAS,sDAAsD,EAAE;AAAA,IAC1F,OAAO,EAAE,WAAW,MAAM;AACxB,YAAM,WAAW,aAAa;AAC9B,YAAM,UAAU,SAAS,eAAe,CAAC;AACzC,YAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,WAAW,YAAY,CAAC;AAEpF,UAAI,CAAC,QAAQ;AACX,cAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AACtD,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,WAAW,UAAU,mCAAmC,SAAS;AAAA,YACzE;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,eAAe,IAAI,IAAI,SAAS,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,YAAM,QAAkB,CAAC;AACzB,YAAM,KAAK,aAAa,OAAO,IAAI,EAAE;AACrC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO,WAAW;AAC7B,YAAM,KAAK,EAAE;AAGb,YAAM,aAAuB,CAAC;AAC9B,iBAAW,YAAY,OAAO,YAAY;AACxC,cAAM,OAAO,aAAa,IAAI,QAAQ;AACtC,mBAAW,KAAK,QAAQ;AACxB,YAAI,MAAM,eAAe;AACvB,qBAAW,KAAK,GAAG,KAAK,aAAa;AAAA,QACvC;AAAA,MACF;AACA,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,YAAY,WAAW,KAAK,IAAI,CAAC,uBAAuB;AACnE,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAGb,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,iBAAiB;AAC5B,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,kCAAkC;AAC7C,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB;AAC/B,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,+BAA+B;AAC1C,iBAAW,YAAY,OAAO,cAAc;AAC1C,cAAM,KAAK,uBAAuB,QAAQ,IAAI;AAAA,MAChD;AACA,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAGb,YAAM,KAAK,qBAAqB;AAChC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,OAAO,gBAAgB,KAAK,IAAI,CAAC;AAC5C,YAAM,KAAK,EAAE;AAGb,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,EAAE;AACb,iBAAW,YAAY,OAAO,YAAY;AACxC,cAAM,OAAO,aAAa,IAAI,QAAQ;AACtC,YAAI,MAAM;AACR,gBAAM,KAAK,OAAO,KAAK,IAAI,aAAQ,KAAK,WAAW,EAAE;AAAA,QACvD,OAAO;AACL,gBAAM,KAAK,OAAO,QAAQ,IAAI;AAAA,QAChC;AAAA,MACF;AACA,YAAM,KAAK,EAAE;AAEb,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAWA,GACR,OAAO,EACP;AAAA,QACC;AAAA,MACF;AAAA,MACF,OAAOA,GAAE,OAAO,EAAE,SAAS,mDAAmD;AAAA,IAChF;AAAA,IACA,OAAO,EAAE,WAAW,MAAM,MAAM;AAC9B,YAAM,SAAS,WAAW;AAC1B,YAAM,aACJ,OAAO,WAAW,gBAAgB,WAChC,SACF;AAEF,UAAI,CAAC,YAAY;AACf,cAAM,iBAAiB,OAAO,KAAK,OAAO,WAAW,gBAAgB,UAAU,EAAE,KAAK,IAAI;AAC1F,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,uBAAuB,SAAS,uBAAuB,cAAc;AAAA,YAC7E;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,WAAW,SAAS;AACvB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,4BAAuB,SAAS,oCAAoC,WAAW,QAAQ,QAAQ;AAAA,YACvG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,gBAAQ,IAAI,OAAO,WAAW,OAAO;AAAA,MACvC,QAAQ;AACN,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,gDAA2C,SAAS,MAAM,WAAW,OAAO;AAAA,YACpF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,KAAK,KAAK;AAEhC,UAAI,SAAS;AACX,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,iBAAY,KAAK,iBAAiB,SAAS,aAAa,WAAW,OAAO;AAAA,YAClF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,mBAAc,KAAK,wBAAwB,SAAS;AAAA,YAAwB,WAAW,OAAO;AAAA,eAAkB,WAAW,eAAe,SAAS;AAAA,UAC3J;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAaA,GAAE,QAAQ,EAAE,SAAS,iDAAiD;AAAA,MACnF,gBAAgBA,GACb,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,SAAS,iDAAiD;AAAA,MAC7D,kBAAkBA,GACf,QAAQ,EACR,SAAS,EACT;AAAA,QACC;AAAA,MACF;AAAA,IACJ;AAAA,IACA,OAAO,EAAE,aAAa,gBAAgB,iBAAiB,MAAM;AAC3D,YAAM,SAAS,iBAAiB,EAAE,aAAa,gBAAgB,iBAAiB,CAAC;AAEjF,YAAM,WAAW,UAAU,IAAI,CAAC,MAAM;AACpC,cAAM,SAAS,MAAM,OAAO,OAAO,wBAAmB;AACtD,eAAO,OAAO,CAAC,OAAO,sBAAsB,CAAC,CAAC,GAAG,MAAM;AAAA,MACzD,CAAC,EAAE,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,8BAA8B,OAAO,IAAI;AAAA;AAAA,EAAS,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA,EAAuB,QAAQ;AAAA,UACtG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAOA,GACJ,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS,8BAA8B;AAAA,IAC5C;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,WAAW,aAAa;AAC9B,YAAM,WAAW,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAEpE,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,SAAS,CAAC,GAAG,IAAI,IAAI,SAAS,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK;AAC1E,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,2BAA2B,KAAK,wBAAwB,OAAO,KAAK,IAAI,CAAC;AAAA,YACjF;AAAA,UACF;AAAA,UACA,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,QAAQ,SACX,IAAI,CAAC,MAAM;AACV,cAAM,WAAW,EAAE,YAAY,CAAC;AAChC,cAAM,cACJ,SAAS,SAAS,IACd,KAAK,SAAS,QAAQ,CAAC,MAAM,OAAO,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,MACjH;AACN,eAAO,OAAO,EAAE,IAAI,KAAK,WAAW,WAAM,EAAE,WAAW;AAAA,MACzD,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,MAAM,KAAK,KAAK,SAAS,MAAM;AAAA;AAAA,EAAmB,KAAK;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AJ/ZA,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,MAAM,KAAK,MAAM,aAAa,KAAK,WAAW,MAAM,cAAc,GAAG,OAAO,CAAC;AAI5E,SAAS,eAA0B;AACxC,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,EACf,CAAC;AAED,oBAAkB,MAAM;AACxB,gBAAc,MAAM;AACpB,kBAAgB,MAAM;AAEtB,SAAO;AACT;AAEA,eAAsB,cAA6B;AACjD,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,UAAQ,MAAM,sCAAsC;AACtD;","names":["z","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/prompts.ts","../src/utils.ts","../src/resources.ts","../src/tools.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\nimport { registerTools } from './tools.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8')) as {\n version: string;\n};\n\nexport function createServer(): McpServer {\n const server = new McpServer({\n name: 'hareru-ui',\n version: pkg.version,\n });\n\n registerResources(server);\n registerTools(server);\n registerPrompts(server);\n\n return server;\n}\n\nexport async function startServer(): Promise<void> {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Hareru UI MCP server started (stdio)');\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { loadConsumerRules, loadRegistry, loadSchema } from './utils.js';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'create-ui',\n 'Generate a UI component using Hareru UI design system',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A settings form with name and email fields\")',\n ),\n framework: z.string().optional().describe('Target framework: react (default)'),\n },\n async ({ description, framework }) => {\n const registry = loadRegistry();\n const schema = loadSchema();\n\n const componentList = registry.components\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${variantInfo}${desc}`;\n })\n .join('\\n');\n\n const bundles = registry.taskBundles ?? [];\n const bundleList =\n bundles.length > 0\n ? bundles\n .map((b) => `- ${b.name}: ${b.description} (${b.components.length} components)`)\n .join('\\n')\n : '';\n\n const cssVars = schema.properties.cssVariables.items.enum.slice(0, 20).join(', ');\n const fw = framework ?? 'react';\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using the Hareru UI design system (${fw}).\n\n## Available Components\n\n${componentList}\n\n## Design Token CSS Variables (sample)\n\n${cssVars}, ...\n\n## Rules\n\n1. Import components from '@hareru/ui'. For CSS setup, refer to the consumer-rules (standalone: '@hareru/ui/styles.css', portable: '@hareru/tokens/css' + '@hareru/ui/styles/components.css')\n2. Use only semantic variant props (e.g. variant=\"default\"), never hardcode CSS values\n3. Use CSS variables (--hui-*) for any custom styling\n4. All components support forwardRef\n5. Use BEM class naming (hui-*) if adding custom classes\n6. Colors use OKLCH format\n\n## Task\n\n${description}\n${bundleList ? `\\n## Available Bundles\\n\\n${bundleList}\\n` : ''}\nGenerate a complete ${fw} component that fulfills this requirement.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'create-ui-tailwind',\n 'Generate a UI component mixing Hareru UI and Tailwind CSS with Cascade Layer guidance',\n {\n description: z\n .string()\n .describe(\n 'What the component should do (e.g. \"A dashboard card with Tailwind layout and Hareru UI buttons\")',\n ),\n },\n async ({ description }) => {\n const registry = loadRegistry();\n\n const componentList = registry.components\n .map((c) => {\n const desc = c.description ? ` — ${c.description}` : '';\n return `- ${c.name}${desc}`;\n })\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `You are a UI developer using Hareru UI + Tailwind CSS v4 together.\n\n## Cascade Layer Order\n\nDeclare this layer order at the top of your CSS entry point:\n\n\\`\\`\\`css\n@layer theme, base, hui, components, utilities;\n@import 'tailwindcss';\n@import '@hareru/tokens/css';\n@import '@hareru/ui/styles/components.layer.css';\n\\`\\`\\`\n\n- Hareru components live in \\`@layer hui\\` — below Tailwind \\`utilities\\`\n- Tailwind utility classes (e.g. \\`flex\\`, \\`gap-4\\`, \\`p-2\\`) can safely override Hareru layout\n- Never use Tailwind classes to override Hareru component internals (colors, border-radius, shadows) — use \\`--hui-*\\` CSS variables instead\n\n## Mixing Classes Example\n\n\\`\\`\\`tsx\n{/* Tailwind for layout, Hareru for components */}\n<div className=\"flex gap-4 p-6\">\n <Card className=\"flex-1\">\n <CardHeader>Title</CardHeader>\n <CardContent>\n <Button variant=\"default\">Action</Button>\n </CardContent>\n </Card>\n</div>\n\\`\\`\\`\n\n## Available Components\n\n${componentList}\n\n## Rules\n\n1. Import components from \\`@hareru/ui\\`\n2. Use Tailwind utilities for layout (flex, grid, gap, padding, margin)\n3. Use Hareru components for interactive UI elements (Button, Input, Card, Dialog)\n4. Use \\`--hui-*\\` CSS variables for theming — do not override with Tailwind color classes\n5. Use BEM class naming (\\`hui-*\\`) if adding custom component styles\n6. Colors are OKLCH format\n\n## Task\n\n${description}\n\nGenerate a complete React component that combines Tailwind layout utilities with Hareru UI components.`,\n },\n },\n ],\n };\n },\n );\n\n server.prompt(\n 'consumer-rules',\n 'Get the rules for using Hareru UI in your project',\n {},\n async () => {\n const rules = loadConsumerRules();\n\n const CODE_BLOCK_SECTIONS = new Set(['cssImports']);\n\n const rulesSections = Object.entries(rules.rules)\n .map(([key, section]) => {\n const ruleList = section.rules.map((r) => `- ${r}`).join('\\n');\n const examples = Object.entries(section.examples)\n .map(([label, code]) =>\n CODE_BLOCK_SECTIONS.has(key)\n ? `**${label}:**\\n\\`\\`\\`css\\n${code}\\n\\`\\`\\``\n : ` ${label}: ${code}`,\n )\n .join('\\n');\n return `### ${key}\\n${section.description}\\n\\n${ruleList}\\n\\nExamples:\\n${examples}`;\n })\n .join('\\n\\n');\n\n const tokenRef = Object.entries(rules.tokenQuickReference)\n .map(([category, pattern]) => `- ${category}: ${pattern}`)\n .join('\\n');\n\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Hareru UI Consumer Rules (v${rules.version})\n\nThese rules apply when using Hareru UI in any project.\n\n## Rules\n\n${rulesSections}\n\n## Token Quick Reference\n\n${tokenRef}`,\n },\n },\n ],\n };\n },\n );\n}\n","export {\n loadTokens,\n loadSchema,\n loadRegistry,\n loadComponentSchema,\n loadConsumerRules,\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n recommendCssMode,\n} from '@hareru/registry';\n\nexport type {\n TokensJSON,\n SchemaJSON,\n ComponentRegistryJSON,\n ComponentEntry,\n TaskBundle,\n ComponentGroup,\n TokenCategory,\n VariantDef,\n CustomPropDef,\n PropDef,\n StateDef,\n A11yDef,\n ExampleDef,\n ComponentSchemaJSON,\n ConsumerRulesJSON,\n CssMode,\n CssModeContext,\n} from '@hareru/registry';\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadComponentSchema,\n loadConsumerRules,\n loadRegistry,\n loadSchema,\n loadTokens,\n} from './utils.js';\n\nexport function registerResources(server: McpServer): void {\n const schema = loadSchema();\n const tokenCount = schema.properties.tokenCount.const;\n const registry = loadRegistry();\n\n server.resource(\n 'tokens',\n 'hareru-ui://tokens',\n {\n description: `DTCG design tokens (light/dark themes, ${tokenCount} CSS custom properties)`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadTokens(), null, 2) }],\n }),\n );\n\n server.resource(\n 'tokens-schema',\n 'hareru-ui://tokens/schema',\n {\n description: 'JSON Schema for design tokens — CSS variable enums and type constraints',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'components',\n 'hareru-ui://components',\n {\n description: `Component registry — ${registry.componentCount} components with CVA variants and Props interfaces`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry, null, 2) }],\n }),\n );\n\n server.resource(\n 'bundles',\n 'hareru-ui://bundles',\n {\n description: `Task bundles — ${registry.taskBundles?.length ?? 0} curated component sets for common UI patterns`,\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(registry.taskBundles ?? [], null, 2) }],\n }),\n );\n\n server.resource(\n 'components-schema',\n 'hareru-ui://components/schema',\n {\n description: 'JSON Schema for the component registry',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadComponentSchema(), null, 2) }],\n }),\n );\n\n server.resource(\n 'consumer-rules',\n 'hareru-ui://rules/consumer',\n {\n description:\n 'Consumer rules for AI agents — import patterns, styling rules, and token reference',\n mimeType: 'application/json',\n },\n async (uri) => ({\n contents: [{ uri: uri.href, text: JSON.stringify(loadConsumerRules(), null, 2) }],\n }),\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport {\n CSS_MODES,\n CSS_MODE_DESCRIPTIONS,\n loadRegistry,\n loadSchema,\n recommendCssMode,\n} from './utils.js';\nimport type { ComponentEntry } from './utils.js';\n\nfunction escPipe(s: string): string {\n return s.replace(/\\|/g, '\\\\|');\n}\n\nfunction formatVariantsTable(entry: ComponentEntry): string {\n const variants = entry.variants ?? [];\n if (variants.length === 0) return 'No CVA variants defined.';\n\n const lines: string[] = ['| Variant | Options | Default |', '|---------|---------|---------|'];\n for (const v of variants) {\n for (const [key, options] of Object.entries(v.variants)) {\n const defaultVal = v.defaultVariants[key] ?? '-';\n lines.push(\n `| ${escPipe(key)} | ${options.map(escPipe).join(', ')} | ${escPipe(defaultVal)} |`,\n );\n }\n }\n return lines.join('\\n');\n}\n\nfunction formatUsageMarkdown(entry: ComponentEntry): string {\n const parts: string[] = [];\n\n parts.push(`# ${entry.displayName}`);\n parts.push('');\n\n // Description (Phase 3A)\n parts.push(entry.description);\n parts.push('');\n\n // AI Guidance (Phase 3A)\n if (entry.aiHint) {\n parts.push('## AI Guidance');\n parts.push('');\n parts.push(entry.aiHint);\n parts.push('');\n }\n\n // Import section\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n const subs = entry.subcomponents ?? [];\n const allNames = [entry.name, ...subs];\n parts.push(`import { ${allNames.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section (registry-driven)\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const dep of entry.requiredCssArtifacts ?? []) {\n parts.push(`@import '@hareru/ui/${dep}';`);\n }\n parts.push(`@import '@hareru/ui/${entry.cssArtifact}';`);\n parts.push('```');\n parts.push('');\n\n const variants = entry.variants ?? [];\n const props = entry.props ?? [];\n\n if (variants.length > 0) {\n parts.push('## Variants');\n parts.push('');\n parts.push(formatVariantsTable(entry));\n parts.push('');\n }\n\n if (props.length > 0) {\n parts.push('## Props');\n parts.push('');\n for (const prop of props) {\n if (prop.extends) {\n parts.push(`- **${prop.name}** extends \\`${prop.extends}\\``);\n } else {\n parts.push(`- **${prop.name}**`);\n }\n }\n parts.push('');\n }\n\n // States (Phase 3C)\n const states = entry.states ?? [];\n if (states.length > 0) {\n parts.push('## States');\n parts.push('');\n parts.push('| State | Type | Values | Default |');\n parts.push('|-------|------|--------|---------|');\n for (const s of states) {\n const values = s.type === 'enum' ? s.values.map(escPipe).join(', ') : '-';\n const def = s.type === 'enum' && s.defaultValue ? escPipe(s.defaultValue) : '-';\n parts.push(`| ${escPipe(s.name)} | ${s.type} | ${values} | ${def} |`);\n }\n parts.push('');\n }\n\n // Accessibility (Phase 3C)\n const a11y = entry.a11y;\n if (a11y) {\n parts.push('## Accessibility');\n parts.push('');\n if (a11y.roles?.length) parts.push(`- Roles: ${a11y.roles.join(', ')}`);\n if (a11y.ariaAttributes?.length) parts.push(`- ARIA: ${a11y.ariaAttributes.join(', ')}`);\n if (a11y.semanticElements?.length)\n parts.push(`- Semantic elements: ${a11y.semanticElements.join(', ')}`);\n if (a11y.keyboardInteractions?.length)\n parts.push(`- Keyboard: ${a11y.keyboardInteractions.join('; ')}`);\n if (a11y.liveRegion) parts.push('- Live region: yes');\n if (a11y.notes) parts.push(`- Notes: ${a11y.notes}`);\n parts.push('');\n }\n\n // Also Consider (Phase 3A)\n if (entry.peerComponents) {\n parts.push('## Also Consider');\n parts.push('');\n for (const peer of entry.peerComponents) {\n parts.push(`- ${peer}`);\n }\n parts.push('');\n }\n\n // Example (Phase 3C: prefer canonical examples from manifest)\n const examples = entry.examples ?? [];\n if (examples.length > 0) {\n parts.push('## Example');\n parts.push('');\n for (const ex of examples) {\n parts.push(`### ${ex.title}`);\n parts.push('');\n parts.push('```tsx');\n parts.push(ex.code);\n parts.push('```');\n parts.push('');\n }\n } else {\n // Fallback: auto-generated example\n parts.push('## Example');\n parts.push('');\n parts.push('```tsx');\n if (variants.length > 0) {\n const firstVariant = variants[0];\n const propsStr = Object.entries(firstVariant.defaultVariants)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n parts.push(`<${entry.name} ${propsStr}>Content</${entry.name}>`);\n } else if (subs.length > 0) {\n parts.push(`<${entry.name}>`);\n for (const sub of subs) {\n parts.push(` <${sub}>Content</${sub}>`);\n }\n parts.push(`</${entry.name}>`);\n } else {\n parts.push(`<${entry.name}>Content</${entry.name}>`);\n }\n parts.push('```');\n }\n\n return parts.join('\\n');\n}\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n 'get-component-usage',\n 'Get usage documentation for a Hareru UI component — import, variants, props, states, accessibility, and examples',\n { componentName: z.string().describe('Component name (e.g. \"Button\", \"Card\", \"Alert\")') },\n async ({ componentName }) => {\n const registry = loadRegistry();\n const entry = registry.components.find(\n (c) => c.name.toLowerCase() === componentName.toLowerCase(),\n );\n\n if (!entry) {\n const available = registry.components.map((c) => c.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Component \"${componentName}\" not found. Available components: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: formatUsageMarkdown(entry) }],\n };\n },\n );\n\n server.tool(\n 'get-bundle-usage',\n 'Get usage documentation for a Hareru UI task bundle — components, CSS imports, and token categories',\n { bundleName: z.string().describe('Bundle name (e.g. \"agent-chat-shell\", \"form-basics\")') },\n async ({ bundleName }) => {\n const registry = loadRegistry();\n const bundles = registry.taskBundles ?? [];\n const bundle = bundles.find((b) => b.name.toLowerCase() === bundleName.toLowerCase());\n\n if (!bundle) {\n const available = bundles.map((b) => b.name).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Bundle \"${bundleName}\" not found. Available bundles: ${available}`,\n },\n ],\n isError: true,\n };\n }\n\n const componentMap = new Map(registry.components.map((c) => [c.name, c]));\n\n const parts: string[] = [];\n parts.push(`# Bundle: ${bundle.name}`);\n parts.push('');\n parts.push(bundle.description);\n parts.push('');\n\n // Import section — expand subcomponents so the import is copy-pasteable\n const allImports: string[] = [];\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n allImports.push(compName);\n if (comp?.subcomponents) {\n allImports.push(...comp.subcomponents);\n }\n }\n parts.push('## Import');\n parts.push('');\n parts.push('```tsx');\n parts.push(`import { ${allImports.join(', ')} } from '@hareru/ui';`);\n parts.push('```');\n parts.push('');\n\n // CSS section\n parts.push('## CSS');\n parts.push('');\n parts.push('**Standalone:**');\n parts.push('```css');\n parts.push(`@import '@hareru/ui/styles.css';`);\n parts.push('```');\n parts.push('');\n parts.push('**Per-component:**');\n parts.push('```css');\n parts.push(`@import '@hareru/tokens/css';`);\n for (const artifact of bundle.cssArtifacts) {\n parts.push(`@import '@hareru/ui/${artifact}';`);\n }\n parts.push('```');\n parts.push('');\n\n // Token categories\n parts.push('## Token Categories');\n parts.push('');\n parts.push(bundle.tokenCategories.join(', '));\n parts.push('');\n\n // Components detail\n parts.push('## Components');\n parts.push('');\n for (const compName of bundle.components) {\n const comp = componentMap.get(compName);\n if (comp) {\n parts.push(`- **${comp.name}** — ${comp.description}`);\n } else {\n parts.push(`- **${compName}**`);\n }\n }\n parts.push('');\n\n return {\n content: [{ type: 'text' as const, text: parts.join('\\n') }],\n };\n },\n );\n\n server.tool(\n 'validate-token-value',\n 'Validate a CSS token value against the Hareru UI design token schema',\n {\n tokenType: z\n .string()\n .describe(\n 'Token type: color, dimension, fontFamily, fontWeight, duration, number, shadow, typography, cubicBezier',\n ),\n value: z.string().describe('The value to validate (e.g. \"oklch(0.5 0.2 250)\")'),\n },\n async ({ tokenType, value }) => {\n const schema = loadSchema();\n const constraint =\n schema.properties.typeConstraints.properties[\n tokenType as keyof typeof schema.properties.typeConstraints.properties\n ];\n\n if (!constraint) {\n const availableTypes = Object.keys(schema.properties.typeConstraints.properties).join(', ');\n return {\n content: [\n {\n type: 'text' as const,\n text: `Unknown token type \"${tokenType}\". Available types: ${availableTypes}`,\n },\n ],\n isError: true,\n };\n }\n\n if (!constraint.pattern) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — token type \"${tokenType}\" has no pattern constraint (any ${constraint.type ?? 'string'} value accepted).`,\n },\n ],\n };\n }\n\n let regex: RegExp;\n try {\n regex = new RegExp(constraint.pattern);\n } catch {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error — invalid pattern for token type \"${tokenType}\": ${constraint.pattern}`,\n },\n ],\n isError: true,\n };\n }\n\n const isValid = regex.test(value);\n\n if (isValid) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `Valid — \"${value}\" matches the ${tokenType} pattern: ${constraint.pattern}`,\n },\n ],\n };\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Invalid — \"${value}\" does not match the ${tokenType} pattern.\\nExpected: ${constraint.pattern}\\nDescription: ${constraint.description ?? tokenType}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'recommend-css-mode',\n 'Recommend the best CSS import mode for a Hareru UI project based on project context',\n {\n hasTailwind: z.boolean().describe('Whether Tailwind CSS is detected in the project'),\n componentCount: z\n .number()\n .int()\n .min(0)\n .describe('Number of Hareru components used in the project'),\n hasExistingReset: z\n .boolean()\n .optional()\n .describe(\n 'Whether the project already has a CSS reset or framework (e.g. Bootstrap, Pico CSS)',\n ),\n },\n async ({ hasTailwind, componentCount, hasExistingReset }) => {\n const result = recommendCssMode({ hasTailwind, componentCount, hasExistingReset });\n\n const allModes = CSS_MODES.map((m) => {\n const marker = m === result.mode ? ' ← recommended' : '';\n return `- **${m}**: ${CSS_MODE_DESCRIPTIONS[m]}${marker}`;\n }).join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## Recommended CSS Mode: \\`${result.mode}\\`\\n\\n${result.reason}\\n\\n## All Modes\\n\\n${allModes}`,\n },\n ],\n };\n },\n );\n\n server.tool(\n 'list-components-by-group',\n 'List Hareru UI components filtered by group',\n {\n group: z\n .enum([\n 'core',\n 'form',\n 'layout',\n 'overlay',\n 'navigation',\n 'feedback',\n 'data-display',\n 'agent',\n 'di-domain',\n ])\n .describe('Component group to filter by'),\n },\n async ({ group }) => {\n const registry = loadRegistry();\n const filtered = registry.components.filter((c) => c.group === group);\n\n if (filtered.length === 0) {\n const groups = [...new Set(registry.components.map((c) => c.group))].sort();\n return {\n content: [\n {\n type: 'text' as const,\n text: `No components in group \"${group}\". Available groups: ${groups.join(', ')}`,\n },\n ],\n isError: true,\n };\n }\n\n const lines = filtered\n .map((c) => {\n const variants = c.variants ?? [];\n const variantInfo =\n variants.length > 0\n ? ` [${variants.flatMap((v) => Object.entries(v.variants).map(([k, opts]) => `${k}(${opts.join('|')})`)).join(', ')}]`\n : '';\n return `- **${c.name}**${variantInfo} — ${c.description}`;\n })\n .join('\\n');\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `## ${group} (${filtered.length} components)\\n\\n${lines}`,\n },\n ],\n };\n },\n );\n}\n"],"mappings":"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","names":["z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hareru/mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server for Hareru UI design system — exposes tokens, schema, and component registry to AI agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -39,7 +39,7 @@
39
39
  "dependencies": {
40
40
  "@modelcontextprotocol/sdk": "^1.12.0",
41
41
  "zod": "^3.23.0",
42
- "@hareru/registry": "0.2.0"
42
+ "@hareru/registry": "0.3.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.0.0",