@cascivo/mcp 0.1.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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/index.d.mts +100 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +721 -0
- package/dist/index.mjs.map +1 -0
- package/dist/registry.json +18215 -0
- package/package.json +58 -0
- package/readme.body.md +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["HERE","c","v","HERE"],"sources":["../src/registry.ts","../src/theme.ts","../src/scaffold.ts","../src/validate.ts","../src/scaffold-view.ts","../src/tokens.ts","../src/context.ts","../src/select.ts","../src/server.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface PropManifest {\n name: string\n type: string\n required: boolean\n default?: string\n description?: string\n}\n\nexport interface ComponentManifest {\n name: string\n description: string\n category: string\n states: string[]\n variants: string[]\n sizes: string[]\n props: PropManifest[]\n tokens: string[]\n accessibility: { role: string; wcag: string; keyboard: string[] }\n examples: { title: string; code: string; description?: string }[]\n dependencies: string[]\n tags: string[]\n}\n\nexport interface RegistryComponent {\n name: string\n type?: 'component' | 'layout' | 'block' | 'chart' | 'section'\n description: string\n category: string\n version: string\n files: string[]\n dependencies: string[]\n tags: string[]\n meta: ComponentManifest\n}\n\nexport interface Registry {\n version: string\n generatedAt: string\n components: RegistryComponent[]\n}\n\nconst HERE = dirname(fileURLToPath(import.meta.url))\n\n/**\n * Resolve the registry.json location. Checks, in order: an explicit path, the\n * `CASCIVO_REGISTRY_PATH` env var, a copy bundled next to the built server\n * (published package), and the monorepo root (dev).\n */\nexport function resolveRegistryPath(explicit?: string): string {\n const candidates = [\n explicit,\n process.env.CASCIVO_REGISTRY_PATH,\n join(HERE, 'registry.json'),\n join(HERE, '..', '..', '..', 'registry.json'),\n join(HERE, '..', '..', 'registry.json'),\n ].filter((p): p is string => typeof p === 'string' && p.length > 0)\n\n return (\n candidates.find((p) => existsSync(p)) ?? candidates[candidates.length - 1] ?? 'registry.json'\n )\n}\n\nexport function loadRegistry(path?: string): Registry {\n const resolved = resolveRegistryPath(path)\n const raw = JSON.parse(readFileSync(resolved, 'utf8')) as Registry\n if (!Array.isArray(raw.components)) {\n throw new Error(`Invalid registry at ${resolved}: \"components\" must be an array`)\n }\n return raw\n}\n\n/** List component manifests, optionally filtered by category and/or type. */\nexport function listComponents(\n registry: Registry,\n category?: string,\n type?: string,\n): ComponentManifest[] {\n let entries = registry.components\n if (category) entries = entries.filter((c) => c.category === category)\n if (type) entries = entries.filter((c) => c.type === type)\n return entries.map((c) => c.meta)\n}\n\n/** Find one component manifest by name (matches registry name or meta name). */\nexport function getComponent(registry: Registry, name: string): ComponentManifest | undefined {\n const target = name.toLowerCase()\n return registry.components.find(\n (c) => c.name.toLowerCase() === target || c.meta.name.toLowerCase() === target,\n )?.meta\n}\n\n// ---------------------------------------------------------------------------\n// Multi-registry support\n// ---------------------------------------------------------------------------\n\nexport interface RegistryDirectoryEntry {\n namespace: string\n name: string\n description?: string\n registryUrl: string\n verified?: boolean\n homepage?: string\n}\n\nconst DIRECTORY_URL = 'https://cascivo.com/r/registries.json'\nconst FETCH_TIMEOUT_MS = 15_000\nconst MAX_BODY_BYTES = 1_048_576 // 1 MB\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>\n\nasync function fetchWithGuards(url: string, fetchFn: FetchFn = fetch): Promise<string | null> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS)\n try {\n const res = await fetchFn(url, { signal: controller.signal })\n if (!res.ok) return null\n const buf = await res.arrayBuffer()\n if (buf.byteLength > MAX_BODY_BYTES) return null\n return new TextDecoder().decode(buf)\n } catch {\n return null\n } finally {\n clearTimeout(timer)\n }\n}\n\n/** Fetch the central cascade registry directory. Returns empty array on failure. */\nexport async function fetchDirectory(fetchFn?: FetchFn): Promise<RegistryDirectoryEntry[]> {\n const raw = await fetchWithGuards(DIRECTORY_URL, fetchFn)\n if (!raw) return []\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return []\n return parsed as RegistryDirectoryEntry[]\n } catch {\n return []\n }\n}\n\n/** Fetch the component index from a namespace's registryUrl. Returns null on failure. */\nexport async function fetchRegistryIndex(\n registryUrl: string,\n fetchFn?: FetchFn,\n): Promise<Registry | null> {\n // Resolve the registry.json URL: replace trailing `{name}` template or append /registry.json\n const indexUrl = registryUrl.includes('{name}')\n ? registryUrl.replace('{name}', 'registry').replace(/\\/registry$/, '/registry.json')\n : registryUrl.replace(/\\/?$/, '/registry.json').replace(/\\/\\/registry\\.json$/, '/registry.json')\n const raw = await fetchWithGuards(indexUrl, fetchFn)\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as Registry\n if (!Array.isArray(parsed.components)) return null\n return parsed\n } catch {\n return null\n }\n}\n\n/** Parse CASCADE_REGISTRIES env var — returns empty array on failure. */\nexport function getEnvRegistries(): RegistryDirectoryEntry[] {\n const raw = process.env['CASCADE_REGISTRIES']\n if (!raw) return []\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return []\n return parsed as RegistryDirectoryEntry[]\n } catch {\n return []\n }\n}\n\n/** Merge directory entries with env entries (env wins on namespace collision). */\nexport function mergeRegistries(\n directory: RegistryDirectoryEntry[],\n env: RegistryDirectoryEntry[],\n): RegistryDirectoryEntry[] {\n const map = new Map<string, RegistryDirectoryEntry>()\n for (const entry of directory) map.set(entry.namespace, entry)\n for (const entry of env) map.set(entry.namespace, entry)\n return Array.from(map.values())\n}\n\n/** Fuzzy search over name, tags, and description. */\nexport function searchComponents(registry: Registry, query: string): ComponentManifest[] {\n const q = query.toLowerCase().trim()\n if (q === '') return []\n return registry.components\n .filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.tags.some((t) => t.toLowerCase().includes(q)),\n )\n .map((c) => c.meta)\n}\n","export interface ThemeColors {\n /** Main brand / interactive color (maps to the accent token family). */\n primary: string\n /** Base gray used to derive surfaces, borders, and text. */\n neutral: string\n /** Secondary highlight color (info / focus ring). */\n accent: string\n}\n\n/** Darken a color by mixing in black (modern CSS, no preprocessor). */\nfunction darken(color: string, amount: number): string {\n return `color-mix(in oklab, ${color}, black ${amount}%)`\n}\n\n/** Lighten a color by mixing in white. */\nfunction lighten(color: string, amount: number): string {\n return `color-mix(in oklab, ${color}, white ${amount}%)`\n}\n\n/**\n * Generate a custom cascade theme as CSS. Maps the three input colors onto the\n * semantic token layer; component tokens inherit automatically.\n */\nexport function generateThemeCss(colors: ThemeColors, name = 'custom'): string {\n const { primary, neutral, accent } = colors\n return `/* Cascade — Generated theme: ${name} */\n\n@layer cascade.theme {\n [data-theme='${name}'] {\n color-scheme: light;\n\n /* ── Surface (derived from neutral) ───────────────── */\n --cascivo-color-bg: ${lighten(neutral, 96)};\n --cascivo-color-bg-subtle: ${lighten(neutral, 92)};\n --cascivo-color-surface: ${lighten(neutral, 98)};\n --cascivo-color-surface-raised: ${lighten(neutral, 94)};\n --cascivo-color-surface-overlay: ${lighten(neutral, 98)};\n --cascivo-color-border: ${lighten(neutral, 80)};\n --cascivo-color-border-strong: ${lighten(neutral, 65)};\n\n /* ── Text (derived from neutral) ──────────────────── */\n --cascivo-color-text: ${darken(neutral, 80)};\n --cascivo-color-text-subtle: ${darken(neutral, 50)};\n --cascivo-color-text-muted: ${lighten(neutral, 30)};\n --cascivo-color-text-on-accent: #ffffff;\n --cascivo-color-text-on-destructive: #ffffff;\n\n /* ── Accent / primary interactive ─────────────────── */\n --cascivo-color-accent: ${primary};\n --cascivo-color-accent-hover: ${darken(primary, 12)};\n --cascivo-color-accent-active: ${darken(primary, 24)};\n --cascivo-color-accent-subtle: ${lighten(primary, 88)};\n --cascivo-color-accent-muted: ${lighten(primary, 76)};\n\n /* ── Secondary accent (info / focus) ──────────────── */\n --cascivo-color-info: ${accent};\n --cascivo-color-info-subtle: ${lighten(accent, 88)};\n --cascivo-color-focus-ring: ${accent};\n --cascivo-focus-ring: 0 0 0 3px ${lighten(accent, 20)};\n\n /* ── Status ───────────────────────────────────────── */\n --cascivo-color-destructive: #dc2626;\n --cascivo-color-destructive-hover: ${darken('#dc2626', 12)};\n --cascivo-color-destructive-subtle: ${lighten('#dc2626', 88)};\n --cascivo-color-success: #16a34a;\n --cascivo-color-success-subtle: ${lighten('#16a34a', 88)};\n --cascivo-color-warning: #f59e0b;\n --cascivo-color-warning-subtle: ${lighten('#f59e0b', 88)};\n }\n}\n`\n}\n","export interface ScaffoldOptions {\n description: string\n components?: string[]\n}\n\nconst DEFAULT_COMPONENTS = ['card', 'input', 'button']\n\nfunction pascalCase(name: string): string {\n return name\n .split(/[-_\\s]+/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n}\n\n/** A reasonable default usage snippet per component for the scaffold. */\nfunction usage(component: string, Tag: string): string {\n switch (component) {\n case 'button':\n return ` <${Tag}>Get started</${Tag}>`\n case 'input':\n return ` <${Tag} label=\"Email\" placeholder=\"you@example.com\" />`\n case 'card':\n return ` <${Tag}>\\n <h2>Card title</h2>\\n <p>Card content goes here.</p>\\n </${Tag}>`\n case 'badge':\n return ` <${Tag}>New</${Tag}>`\n default:\n return ` <${Tag} />`\n }\n}\n\n/**\n * Generate a JSX page layout string from a natural-language description and an\n * optional list of cascade components to include.\n */\nexport function scaffoldPage(options: ScaffoldOptions): string {\n const components = options.components?.length ? options.components : DEFAULT_COMPONENTS\n const unique = [...new Set(components.map((c) => c.toLowerCase()))]\n\n const imports = unique\n .map((c) => `import { ${pascalCase(c)} } from './components/ui/${c}/${c}'`)\n .join('\\n')\n\n const body = unique.map((c) => usage(c, pascalCase(c))).join('\\n')\n\n return `${imports}\n\n/* ${options.description} */\nexport function Page() {\n return (\n <main\n data-theme=\"light\"\n style={{ maxWidth: '48rem', margin: '0 auto', padding: '2rem', display: 'grid', gap: '1rem' }}\n >\n${body}\n </main>\n )\n}\n`\n}\n","// Inlined from @cascivo/render — avoids a Node.js binary depending on React components at runtime.\n// Component name validation uses the registry (passed by caller) instead of the React component map.\n\nexport interface ValidationError {\n path: string\n message: string\n}\n\nexport interface ComponentNode {\n component: string\n props?: Record<string, unknown>\n bind?: Record<string, string>\n events?: Record<string, string>\n children?: ComponentNode[] | string\n}\n\nexport interface ViewConfig {\n $schema?: string\n version?: 1\n view: {\n layout?: string\n regions: Record<string, ComponentNode[]>\n }\n}\n\nconst DATA_REF_RE = /^\\$data\\./\nconst ACTION_REF_RE = /^\\$actions\\./\n\nfunction closestName(name: string, candidates: string[]): string | undefined {\n const target = name.toLowerCase()\n let best: string | undefined\n let bestDist = 3\n for (const candidate of candidates) {\n const dist = levenshtein(target, candidate.toLowerCase())\n if (dist < bestDist) {\n bestDist = dist\n best = candidate\n }\n }\n return best\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length\n const n = b.length\n const dp: number[][] = Array.from({ length: m + 1 }, (_, i) =>\n Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)),\n )\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i]![j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1]![j - 1]!\n : 1 + Math.min(dp[i - 1]![j]!, dp[i]![j - 1]!, dp[i - 1]![j - 1]!)\n }\n }\n return dp[m]![n]!\n}\n\nfunction validateNode(\n node: unknown,\n path: string,\n errors: ValidationError[],\n componentNames: Set<string>,\n): void {\n if (typeof node !== 'object' || node === null) {\n errors.push({ path, message: 'Expected a component node object' })\n return\n }\n const n = node as Record<string, unknown>\n if (typeof n['component'] !== 'string') {\n errors.push({ path: `${path}.component`, message: 'component must be a string' })\n return\n }\n const componentName = n['component'] as string\n if (!componentNames.has(componentName)) {\n const suggestion = closestName(componentName, [...componentNames])\n const hint = suggestion ? ` Did you mean \"${suggestion}\"?` : ''\n errors.push({\n path: `${path}.component`,\n message: `Unknown component \"${componentName}\".${hint}`,\n })\n return\n }\n\n const nodeBind = (n['bind'] ?? {}) as Record<string, string>\n for (const [key, value] of Object.entries(nodeBind)) {\n if (typeof value !== 'string' || !DATA_REF_RE.test(value)) {\n errors.push({\n path: `${path}.bind.${key}`,\n message: `bind values must start with \"$data.\" — got \"${value}\"`,\n })\n }\n }\n\n const nodeEvents = (n['events'] ?? {}) as Record<string, string>\n for (const [key, value] of Object.entries(nodeEvents)) {\n if (typeof value !== 'string' || !ACTION_REF_RE.test(value)) {\n errors.push({\n path: `${path}.events.${key}`,\n message: `events values must start with \"$actions.\" — got \"${value}\"`,\n })\n }\n }\n\n if (Array.isArray(n['children'])) {\n for (let i = 0; i < n['children'].length; i++) {\n validateNode(\n n['children'][i] as ComponentNode,\n `${path}.children[${i}]`,\n errors,\n componentNames,\n )\n }\n }\n}\n\n/** Validate a ViewConfig object. Component names are checked against the provided set. */\nexport function validateView(\n config: unknown,\n componentNames: Set<string>,\n): { valid: boolean; errors: ValidationError[] } {\n const errors: ValidationError[] = []\n\n if (typeof config !== 'object' || config === null) {\n return { valid: false, errors: [{ path: '', message: 'Config must be an object' }] }\n }\n\n const c = config as Record<string, unknown>\n const view = c['view']\n\n if (typeof view !== 'object' || view === null) {\n return { valid: false, errors: [{ path: 'view', message: 'view must be an object' }] }\n }\n\n const v = view as Record<string, unknown>\n const regions = v['regions']\n\n if (typeof regions !== 'object' || regions === null) {\n errors.push({ path: 'view.regions', message: 'view.regions must be an object' })\n return { valid: false, errors }\n }\n\n for (const [regionName, nodes] of Object.entries(regions as Record<string, unknown>)) {\n if (!Array.isArray(nodes)) {\n errors.push({\n path: `view.regions.${regionName}`,\n message: `Region \"${regionName}\" must be an array of component nodes`,\n })\n continue\n }\n for (let i = 0; i < nodes.length; i++) {\n validateNode(\n nodes[i] as ComponentNode,\n `view.regions.${regionName}[${i}]`,\n errors,\n componentNames,\n )\n }\n }\n\n return { valid: errors.length === 0, errors }\n}\n","import type { ViewConfig } from './validate.js'\nimport { validateView } from './validate.js'\nimport type { Registry } from './registry.js'\n\ninterface ScaffoldViewInput {\n description: string\n components?: string[]\n}\n\n/** Simple keyword matcher — returns region layout name based on description keywords. */\nfunction pickLayout(description: string): string {\n const d = description.toLowerCase()\n if (d.includes('dashboard') || d.includes('stats') || d.includes('kpi')) return 'dashboard'\n if (d.includes('settings') || d.includes('preferences') || d.includes('config')) return 'settings'\n if (d.includes('login') || d.includes('auth') || d.includes('sign')) return 'auth'\n return 'none'\n}\n\n/** Pick sensible components from the registry matching keywords in description. */\nfunction pickComponents(description: string, registry: Registry, explicit?: string[]): string[] {\n if (explicit && explicit.length > 0) return explicit.map((c) => c.toLowerCase())\n const d = description.toLowerCase()\n const candidates: string[] = []\n for (const entry of registry.components) {\n const name = entry.meta.name.toLowerCase()\n const tags = entry.tags.join(' ').toLowerCase()\n if (d.includes(name) || tags.split(' ').some((t) => d.includes(t))) {\n candidates.push(entry.meta.name)\n }\n }\n // Always add at least one component\n if (candidates.length === 0) candidates.push('Badge')\n return candidates.slice(0, 4)\n}\n\nfunction makeNode(\n componentName: string,\n registry: Registry,\n): { component: string; props?: Record<string, string | number | boolean> } {\n const entry = registry.components.find(\n (c) => c.meta.name.toLowerCase() === componentName.toLowerCase(),\n )\n if (!entry) return { component: componentName }\n const props: Record<string, string | number | boolean> = {}\n for (const prop of entry.meta.props ?? []) {\n if (prop.required && prop.default !== undefined) {\n props[prop.name] = prop.default\n } else if (\n prop.default !== undefined &&\n ['string', 'number', 'boolean'].includes(typeof prop.default)\n ) {\n // Skip defaults that are complex\n }\n }\n return Object.keys(props).length > 0\n ? { component: entry.meta.name, props }\n : { component: entry.meta.name }\n}\n\nexport function scaffoldView(\n input: ScaffoldViewInput,\n registry: Registry,\n): {\n config: ViewConfig\n errors: { path: string; message: string }[]\n} {\n const layout = pickLayout(input.description)\n const componentNames = pickComponents(input.description, registry, input.components)\n\n const config: ViewConfig = {\n $schema:\n 'https://raw.githubusercontent.com/urbanisierung/cascivo/main/packages/render/schema/view.v1.json',\n version: 1,\n view: {\n ...(layout !== 'none' ? { layout } : {}),\n regions: {\n main: componentNames.map((name) => makeNode(name, registry)),\n },\n },\n }\n\n const validNames = new Set(registry.components.map((c) => c.meta.name))\n const { errors } = validateView(config, validNames)\n return { config, errors }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface TokenCatalogEntry {\n name: string\n value: string\n layer: 'primitive' | 'semantic' | 'component'\n group: string\n resolvedDefault: string | null\n resolvesPerTheme: boolean\n}\n\nexport interface TokenCatalog {\n generatedAt: string\n count: number\n tokens: TokenCatalogEntry[]\n}\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>\n\nconst HERE = dirname(fileURLToPath(import.meta.url))\nconst CATALOG_BASE_URL = 'https://cascivo.com'\n\nexport async function loadTokenCatalog(fetchFn?: FetchFn): Promise<TokenCatalog> {\n const localPaths = [\n join(HERE, '..', '..', '..', 'apps', 'docs', 'public', 'tokens.catalog.json'),\n join(HERE, 'tokens.catalog.json'),\n ]\n for (const p of localPaths) {\n if (existsSync(p)) return JSON.parse(readFileSync(p, 'utf8')) as TokenCatalog\n }\n const url = `${CATALOG_BASE_URL}/tokens.catalog.json`\n const fn = fetchFn ?? fetch\n const res = await fn(url)\n if (!res.ok) throw new Error(`Failed to fetch token catalog: ${res.status}`)\n return res.json() as Promise<TokenCatalog>\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface ContextRelated {\n name: string\n relationship: string\n reason: string\n}\n\nexport interface ContextAntiPattern {\n bad: string\n good: string\n why: string\n}\n\nexport interface ContextFlexibility {\n area: string\n level: string\n note: string\n}\n\nexport interface ComponentIntent {\n whenToUse: string[]\n whenNotToUse: string[]\n antiPatterns: ContextAntiPattern[]\n related: ContextRelated[]\n a11yRationale?: string\n flexibility?: ContextFlexibility[]\n}\n\nexport interface ContextComponent {\n name: string\n category: string\n description: string\n intent: ComponentIntent\n contextUrl: string\n}\n\nexport interface ContextBundle {\n generatedAt: string\n tagline: string\n authoringRules: string[]\n tokenCatalogUrl: string\n components: ContextComponent[]\n}\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>\n\nconst HERE = dirname(fileURLToPath(import.meta.url))\nconst CONTEXT_BASE_URL = 'https://cascivo.com'\n\nexport async function loadContext(fetchFn?: FetchFn): Promise<ContextBundle> {\n const localPaths = [\n join(HERE, '..', '..', '..', 'apps', 'docs', 'public', 'context.json'),\n join(HERE, 'context.json'),\n ]\n for (const p of localPaths) {\n if (existsSync(p)) return JSON.parse(readFileSync(p, 'utf8')) as ContextBundle\n }\n const url = `${CONTEXT_BASE_URL}/context.json`\n const fn = fetchFn ?? fetch\n const res = await fn(url)\n if (!res.ok) throw new Error(`Failed to fetch context bundle: ${res.status}`)\n return res.json() as Promise<ContextBundle>\n}\n\nexport async function loadComponentMarkdown(\n name: string,\n fetchFn?: FetchFn,\n): Promise<string | null> {\n const slug = name.toLowerCase().replace(/\\s+/g, '-')\n const localPaths = [\n join(HERE, '..', '..', '..', 'apps', 'docs', 'public', 'context', `${slug}.md`),\n join(HERE, 'context', `${slug}.md`),\n ]\n for (const p of localPaths) {\n if (existsSync(p)) return readFileSync(p, 'utf8')\n }\n const url = `${CONTEXT_BASE_URL}/context/${slug}.md`\n const fn = fetchFn ?? fetch\n try {\n const res = await fn(url)\n if (!res.ok) return null\n return res.text()\n } catch {\n return null\n }\n}\n","import type { ContextComponent } from './context.js'\n\nexport interface SelectResult {\n name: string\n score: number\n why: string\n}\n\n// Minimum length for a need word to be scored (filters out articles, prepositions, etc.)\nconst MIN_WORD_LEN = 3\n\nfunction words(text: string): string[] {\n return (text.toLowerCase().match(/\\b\\w+\\b/g) ?? []).filter((w) => w.length >= MIN_WORD_LEN)\n}\n\nfunction countMatches(needWords: string[], text: string): string[] {\n const lower = text.toLowerCase()\n return needWords.filter((w) => lower.includes(w))\n}\n\nexport function selectComponent(need: string, components: ContextComponent[]): SelectResult[] {\n const needWords = words(need)\n if (needWords.length === 0) return []\n\n const scored = components.map((c) => {\n const whenToUseText = c.intent.whenToUse.join(' ')\n const whenNotToUseText = c.intent.whenNotToUse.join(' ')\n\n const whenToUseMatches = countMatches(needWords, whenToUseText)\n const descMatches = countMatches(needWords, c.description)\n const penaltyMatches = countMatches(needWords, whenNotToUseText)\n\n const score = whenToUseMatches.length * 2 + descMatches.length - penaltyMatches.length * 3\n\n // Build why from the best-matching whenToUse sentence\n let why = ''\n if (whenToUseMatches.length > 0) {\n const bestSentence = c.intent.whenToUse\n .map((s) => ({ s, count: countMatches(needWords, s).length }))\n .filter((x) => x.count > 0)\n .sort((a, b) => b.count - a.count)[0]?.s\n why = bestSentence\n ? `Matched: ${whenToUseMatches.map((w) => `'${w}'`).join(', ')} in whenToUse — \"${bestSentence}\"`\n : `Matched: ${whenToUseMatches.map((w) => `'${w}'`).join(', ')} in description`\n } else if (descMatches.length > 0) {\n why = `Matched: ${descMatches.map((w) => `'${w}'`).join(', ')} in description`\n }\n\n return { name: c.name, score, why, related: c.intent.related ?? [] }\n })\n\n // First pass: top 3 by score for related bonus\n const top3Names = new Set(\n [...scored]\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))\n .slice(0, 3)\n .map((r) => r.name),\n )\n\n // Apply related bonus: +1 if a top-3 component points at this component\n const relatedBonus = new Map<string, number>()\n for (const r of scored) {\n if (!top3Names.has(r.name)) continue\n for (const rel of r.related) {\n relatedBonus.set(rel.name, (relatedBonus.get(rel.name) ?? 0) + 1)\n }\n }\n\n const final = scored.map((r) => ({\n name: r.name,\n score: r.score + (relatedBonus.get(r.name) ?? 0),\n why: r.why,\n }))\n\n return final\n .filter((r) => r.score >= 0)\n .sort((a, b) => b.score - a.score || a.name.localeCompare(b.name))\n .slice(0, 5)\n}\n","import { spawnSync } from 'node:child_process'\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport {\n fetchDirectory,\n fetchRegistryIndex,\n getComponent,\n getEnvRegistries,\n listComponents,\n loadRegistry,\n mergeRegistries,\n searchComponents,\n type Registry,\n} from './registry.js'\nimport { generateThemeCss } from './theme.js'\nimport { scaffoldPage } from './scaffold.js'\nimport { validateView } from './validate.js'\nimport { scaffoldView } from './scaffold-view.js'\nimport { loadTokenCatalog } from './tokens.js'\nimport { loadContext, loadComponentMarkdown } from './context.js'\nimport { selectComponent } from './select.js'\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>\n\nexport interface ServerOptions {\n registryPath?: string\n version?: string\n /** Injectable fetch function — used for testing multi-registry features. */\n fetchFn?: FetchFn\n}\n\nconst json = (value: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n})\n\nconst text = (value: string) => ({ content: [{ type: 'text' as const, text: value }] })\n\nconst error = (message: string) => ({\n content: [{ type: 'text' as const, text: message }],\n isError: true,\n})\n\n/** Build a configured McpServer exposing the cascade component registry. */\nexport function createServer(options: ServerOptions = {}): McpServer {\n const registry: Registry = loadRegistry(options.registryPath)\n const fetchFn = options.fetchFn\n\n const server = new McpServer({\n name: '@cascivo/mcp',\n version: options.version ?? '0.0.0',\n })\n\n server.registerTool(\n 'list_registries',\n {\n title: 'List registries',\n description:\n 'List available component registries: the cascade directory plus any configured via CASCADE_REGISTRIES env.',\n inputSchema: {},\n },\n async () => {\n const [directory] = await Promise.all([fetchDirectory(fetchFn)])\n const env = getEnvRegistries()\n const entries = mergeRegistries(directory, env)\n return json(\n entries.map(({ namespace, name, description, verified, homepage }) => ({\n namespace,\n name,\n description,\n verified: verified ?? false,\n homepage,\n })),\n )\n },\n )\n\n server.registerTool(\n 'list_components',\n {\n title: 'List components',\n description: 'List all cascade components, optionally filtered by category and/or type.',\n inputSchema: {\n category: z\n .enum(['inputs', 'display', 'overlay', 'navigation', 'feedback', 'chart'])\n .optional()\n .describe('Filter by component category'),\n type: z\n .enum(['component', 'layout', 'block', 'chart'])\n .optional()\n .describe('Filter by entry type'),\n },\n },\n ({ category, type }) => json(listComponents(registry, category, type)),\n )\n\n server.registerTool(\n 'get_component',\n {\n title: 'Get component',\n description:\n 'Get the full manifest (props, states, tokens, a11y, examples) for one component.',\n inputSchema: {\n name: z.string().describe('Component name, e.g. \"button\"'),\n registry: z\n .string()\n .optional()\n .describe('Namespace of an external registry, e.g. \"@myns\". Omit for the default.'),\n },\n },\n async ({ name, registry: ns }) => {\n if (ns) {\n const env = getEnvRegistries()\n const directory = await fetchDirectory(fetchFn)\n const entries = mergeRegistries(directory, env)\n const entry = entries.find((e) => e.namespace === ns)\n if (!entry) return error(`Registry \"${ns}\" not found.`)\n const remoteRegistry = await fetchRegistryIndex(entry.registryUrl, fetchFn)\n if (!remoteRegistry) return error(`Failed to fetch registry index for \"${ns}\".`)\n const meta = getComponent(remoteRegistry, name)\n return meta ? json(meta) : error(`Component \"${name}\" not found in registry \"${ns}\".`)\n }\n const meta = getComponent(registry, name)\n return meta ? json(meta) : error(`Component \"${name}\" not found.`)\n },\n )\n\n server.registerTool(\n 'search_components',\n {\n title: 'Search components',\n description: 'Fuzzy search components by name, tags, or description.',\n inputSchema: {\n query: z.string().describe('Search query'),\n registry: z\n .string()\n .optional()\n .describe('Namespace of an external registry, e.g. \"@myns\". Omit for the default.'),\n },\n },\n async ({ query, registry: ns }) => {\n if (ns) {\n const env = getEnvRegistries()\n const directory = await fetchDirectory(fetchFn)\n const entries = mergeRegistries(directory, env)\n const entry = entries.find((e) => e.namespace === ns)\n if (!entry) return error(`Registry \"${ns}\" not found.`)\n const remoteRegistry = await fetchRegistryIndex(entry.registryUrl, fetchFn)\n if (!remoteRegistry) return error(`Failed to fetch registry index for \"${ns}\".`)\n return json(searchComponents(remoteRegistry, query))\n }\n return json(searchComponents(registry, query))\n },\n )\n\n server.registerTool(\n 'add_to_project',\n {\n title: 'Add to project',\n description: 'Add a component to the current project by running the cascade CLI.',\n inputSchema: {\n name: z.string().describe('Component name to add'),\n outputDir: z.string().optional().describe('Directory to write the component into'),\n },\n },\n ({ name, outputDir }) => {\n const env = outputDir ? { ...process.env, CASCIVO_OUTPUT_DIR: outputDir } : process.env\n const result = spawnSync('npx', ['-y', 'cascivo', 'add', name], { encoding: 'utf8', env })\n if (result.status !== 0) {\n return error(result.stderr || result.error?.message || `Failed to add \"${name}\".`)\n }\n return text(result.stdout || `Added ${name}.`)\n },\n )\n\n server.registerTool(\n 'create_theme',\n {\n title: 'Create theme',\n description: 'Generate a cascade theme CSS file from three colors.',\n inputSchema: {\n primary: z.string().describe('Primary / interactive color (any CSS color)'),\n neutral: z.string().describe('Base neutral color for surfaces and text'),\n accent: z.string().describe('Secondary accent color (info / focus)'),\n name: z.string().optional().describe('Theme name (default: \"custom\")'),\n },\n },\n ({ primary, neutral, accent, name }) =>\n text(generateThemeCss({ primary, neutral, accent }, name)),\n )\n\n server.registerTool(\n 'scaffold_page',\n {\n title: 'Scaffold page (deprecated)',\n description:\n '[Deprecated — use scaffold_view instead] Generate a JSX page layout from a description.',\n inputSchema: {\n description: z.string().describe('What the page is for'),\n components: z.array(z.string()).optional().describe('Components to include'),\n },\n },\n ({ description, components }) => {\n const { config } = scaffoldView(\n { description, ...(components ? { components } : {}) },\n registry,\n )\n return text(\n `[Deprecated] Use scaffold_view for config-first output. JSX scaffold:\\n\\n${scaffoldPage(components ? { description, components } : { description })}\\n\\n--- scaffold_view output ---\\n${JSON.stringify(config, null, 2)}`,\n )\n },\n )\n\n server.registerTool(\n 'validate_view',\n {\n title: 'Validate view config',\n description:\n 'Validate a CascadeView JSON config against the registry. Returns errors with exact paths.',\n inputSchema: {\n config: z.record(z.string(), z.unknown()).describe('The ViewConfig object to validate'),\n },\n },\n ({ config }) => {\n const componentNames = new Set(registry.components.map((c) => c.meta.name))\n const result = validateView(config, componentNames)\n return json(result)\n },\n )\n\n server.registerTool(\n 'scaffold_view',\n {\n title: 'Scaffold view config',\n description:\n 'Generate a valid starter ViewConfig from a description. Always validates before returning.',\n inputSchema: {\n description: z.string().describe('What the page/view is for'),\n components: z.array(z.string()).optional().describe('Component names to include'),\n },\n },\n ({ description, components }) => {\n const { config, errors } = scaffoldView(\n { description, ...(components ? { components } : {}) },\n registry,\n )\n if (errors.length > 0) {\n return json({ valid: false, errors, config })\n }\n return json({ valid: true, config })\n },\n )\n\n server.registerTool(\n 'get_tokens',\n {\n title: 'Get tokens',\n description:\n 'Get the cascade token catalog (closed set). Agents must select from this catalog rather than hard-coding values.',\n inputSchema: {\n group: z\n .string()\n .optional()\n .describe('Filter by token group, e.g. \"color\", \"space\", \"radius\"'),\n layer: z\n .enum(['primitive', 'semantic', 'component'])\n .optional()\n .describe('Filter by layer'),\n },\n },\n async ({ group, layer }) => {\n try {\n const catalog = await loadTokenCatalog(fetchFn)\n let tokens = catalog.tokens\n if (group) tokens = tokens.filter((t) => t.group === group)\n if (layer) tokens = tokens.filter((t) => t.layer === layer)\n return json({ count: tokens.length, tokens })\n } catch (e) {\n return error(`Token catalog unavailable: ${e instanceof Error ? e.message : String(e)}`)\n }\n },\n )\n\n server.registerTool(\n 'get_context',\n {\n title: 'Get context',\n description:\n 'Get intent, whenToUse/whenNotToUse, and authoring guidance for one component by name.',\n inputSchema: {\n name: z.string().describe('Component name, e.g. \"Toast\"'),\n },\n },\n async ({ name }) => {\n try {\n const ctx = await loadContext(fetchFn)\n const target = name.toLowerCase()\n const component = ctx.components.find((c) => c.name.toLowerCase() === target)\n if (!component) {\n const available = ctx.components.map((c) => c.name).join(', ')\n return error(`Component \"${name}\" not found. Available: ${available}`)\n }\n const md = await loadComponentMarkdown(component.name, fetchFn)\n return json({\n name: component.name,\n category: component.category,\n description: component.description,\n intent: component.intent,\n contextUrl: component.contextUrl,\n ...(md ? { markdown: md } : {}),\n })\n } catch (e) {\n return error(`Context bundle unavailable: ${e instanceof Error ? e.message : String(e)}`)\n }\n },\n )\n\n server.registerTool(\n 'select_component',\n {\n title: 'Select component',\n description:\n 'Heuristic ranking of cascade components by natural language need. Returns top matches with scores and reasons. Note: heuristic ranking, not a model call.',\n inputSchema: {\n need: z.string().describe('Natural language description of what the component should do'),\n },\n },\n async ({ need }) => {\n try {\n const ctx = await loadContext(fetchFn)\n const results = selectComponent(need, ctx.components)\n return json({\n note: 'Heuristic ranking — not a model call. Verify with get_context before using.',\n results,\n })\n } catch (e) {\n return error(`Context bundle unavailable: ${e instanceof Error ? e.message : String(e)}`)\n }\n },\n )\n\n return server\n}\n","import { argv } from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { createServer } from './server.js'\n\nexport const VERSION = '0.0.0'\n\nexport { createServer } from './server.js'\nexport type { ServerOptions } from './server.js'\nexport { generateThemeCss, type ThemeColors } from './theme.js'\nexport { scaffoldPage, type ScaffoldOptions } from './scaffold.js'\nexport {\n getComponent,\n listComponents,\n loadRegistry,\n searchComponents,\n type ComponentManifest,\n type Registry,\n type RegistryComponent,\n} from './registry.js'\n\n/** Start the MCP server over stdio. */\nexport async function main(): Promise<void> {\n const server = createServer({ version: VERSION })\n await server.connect(new StdioServerTransport())\n}\n\nconst isMain = argv[1] !== undefined && import.meta.url === pathToFileURL(argv[1]).href\n\nif (isMain) {\n main().catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err))\n process.exitCode = 1\n })\n}\n"],"mappings":"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"}
|