@xihan-ui/cli 0.0.0-stage → 4.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["FRAMEWORK_LABEL"],"sources":["../src/knowledge.ts","../src/query.ts","../src/render.ts","../src/tools.ts","../src/mcp.ts","../src/project.ts","../src/setup.ts","../src/cli.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 读取随包发布的离线数据:组件元数据、文档页、示例源码、令牌、design.md 与更新日志。\n\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\n/** 示例与文档可选的三种写法。 */\nexport type Framework = 'vue' | 'react' | 'web-components'\n\nexport const FRAMEWORKS: readonly Framework[] = ['vue', 'react', 'web-components']\n\nexport interface FieldRow {\n readonly name: string\n readonly type: string\n readonly optional: boolean\n readonly doc: string\n}\n\nexport interface AttributeRow {\n readonly part: string\n readonly attr: string\n readonly value: string\n}\n\nexport interface ComponentToken {\n readonly name: string\n readonly part: readonly string[]\n readonly property: readonly string[]\n readonly state: readonly string[]\n readonly defaultToken: readonly string[]\n readonly description: string\n}\n\nexport interface DemoEntry {\n readonly src: string\n readonly title: string\n readonly description: string\n}\n\nexport interface ComponentEntry {\n readonly id: string\n readonly name: string\n readonly title: string\n readonly category: string\n readonly categoryLabel: string\n readonly status: string | null\n readonly overview: string | null\n readonly guidance: Readonly<Record<string, string>>\n readonly artifacts: {\n readonly components: readonly string[]\n readonly composable: string | null\n readonly tag: string | null\n readonly machine: string | null\n readonly skin: string | null\n }\n readonly parts: readonly string[]\n readonly requiredParts: readonly string[]\n readonly props: readonly FieldRow[]\n readonly nodes: readonly { readonly name: string, readonly via: string, readonly fields: readonly FieldRow[] }[]\n readonly events: readonly { readonly name: string, readonly type: string, readonly description: string }[]\n readonly slots: readonly { readonly component: string, readonly name: string, readonly optional: boolean, readonly payload: string, readonly doc: string }[]\n readonly reactProps: readonly (FieldRow & { readonly component: string })[]\n readonly machine: {\n readonly states: readonly string[] | null\n readonly events: readonly string[] | null\n readonly guards: readonly string[] | null\n }\n readonly api: readonly { readonly name: string, readonly type: string, readonly doc: string }[]\n readonly keyboard: {\n readonly source: string\n readonly rows: readonly { readonly keys: readonly string[], readonly when: string, readonly does: string }[]\n }\n readonly aria: readonly AttributeRow[]\n readonly dataAttributes: readonly AttributeRow[]\n readonly componentTokens: readonly ComponentToken[]\n readonly demos: readonly DemoEntry[]\n}\n\nexport interface CategoryEntry {\n readonly id: string\n readonly label: string\n readonly description: string\n}\n\nexport interface PageEntry {\n /** 站内路径,不带扩展名,如 `guide/theme`、`components/select`。 */\n readonly path: string\n readonly title: string\n readonly summary: string\n readonly markdown: string\n}\n\nexport interface TokenEntry {\n readonly name: string\n readonly type: string\n /** tokens.json 里的原始取值,可能引用别的令牌。 */\n readonly value: string\n /** 沿 var() 展开后的取值。 */\n readonly resolved: string\n /** 除缺省档外还改写过它的令牌源。 */\n readonly layers: readonly string[]\n}\n\nexport interface TokenData {\n readonly tokens: readonly TokenEntry[]\n /** 只在 data-tone 作用域里有取值的语气族令牌。 */\n readonly tone: readonly string[]\n}\n\nexport interface Meta {\n readonly version: string\n readonly site: string\n}\n\n/** 示例源码:键是示例路径(如 `select/01-basic`),值是各写法的源码。 */\nexport type DemoSources = Readonly<Record<string, Partial<Record<Framework, string>>>>\n\nexport interface Knowledge {\n readonly meta: Meta\n readonly categories: readonly CategoryEntry[]\n readonly components: readonly ComponentEntry[]\n pages: () => readonly PageEntry[]\n demos: () => DemoSources\n tokens: () => TokenData\n designMd: () => string\n changelog: () => string\n}\n\n/** 包内 data/ 目录:src/ 与 dist/ 同在包根下一层。 */\nexport function defaultDataDir(): string {\n return join(dirname(fileURLToPath(import.meta.url)), '..', 'data')\n}\n\nfunction lazy<T>(load: () => T): () => T {\n let cached: { value: T } | undefined\n return () => {\n cached ??= { value: load() }\n return cached.value\n }\n}\n\n/** 从数据目录读出全部知识;大文件在首次用到时才读。 */\nexport function loadKnowledge(dataDir: string = defaultDataDir()): Knowledge {\n const text = (file: string): string => readFileSync(join(dataDir, file), 'utf8')\n const json = <T>(file: string): T => JSON.parse(text(file)) as T\n let meta: Meta\n try {\n meta = json<Meta>('meta.json')\n }\n catch (error) {\n throw new Error(`读不到 @xihan-ui/cli 的离线数据(${dataDir}):${(error as Error).message}`)\n }\n const { categories, components } = json<{ categories: CategoryEntry[], components: ComponentEntry[] }>('components.json')\n return {\n meta,\n categories,\n components,\n pages: lazy(() => json<PageEntry[]>('pages.json')),\n demos: lazy(() => json<DemoSources>('demos.json')),\n tokens: lazy(() => json<TokenData>('tokens.json')),\n designMd: lazy(() => text('design.md')),\n changelog: lazy(() => text('changelog.md')),\n }\n}\n\n/** kebab-case 或带 Xh 前缀的 PascalCase 名字统一成组件标识。 */\nfunction normalize(name: string): string {\n return name\n .trim()\n .replace(/^<|\\/?>$/g, '')\n .replace(/^xh-/i, '')\n .replace(/^Xh(?=[A-Z])/, '')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/** 按标识、PascalCase 名、自定义元素标签、部件组件名或中文名找组件。 */\nexport function findComponent(knowledge: Knowledge, name: string): ComponentEntry | undefined {\n const raw = name.trim()\n if (!raw)\n return undefined\n const id = normalize(raw)\n const exact = knowledge.components.find(c => c.id === id || c.name === raw)\n if (exact)\n return exact\n const exported = /^Xh[A-Z]/.test(raw) ? raw : `Xh${raw}`\n return knowledge.components.find(c => c.artifacts.components.includes(exported))\n}\n\n/** 两个字符串的编辑距离。 */\nfunction distance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i)\n for (let i = 1; i <= a.length; i++) {\n let previous = row[0]!\n row[0] = i\n for (let j = 1; j <= b.length; j++) {\n const current = row[j]!\n row[j] = Math.min(row[j]! + 1, row[j - 1]! + 1, previous + (a[i - 1] === b[j - 1] ? 0 : 1))\n previous = current\n }\n }\n return row[b.length]!\n}\n\n/** 找不到组件时的候选:名字互相包含或编辑距离不超过 2。 */\nexport function suggestComponents(knowledge: Knowledge, name: string, limit = 5): ComponentEntry[] {\n const id = normalize(name)\n if (!id)\n return []\n return knowledge.components\n .map(c => ({ c, score: c.id.includes(id) || id.includes(c.id) || c.name.includes(name.trim()) ? 0 : distance(c.id, id) }))\n .filter(x => x.score <= 2)\n .sort((a, b) => a.score - b.score || a.c.id.localeCompare(b.c.id))\n .slice(0, limit)\n .map(x => x.c)\n}\n\n/** 按站内路径找文档页:完整路径优先,其次末段同名的唯一一页。 */\nexport function findPage(knowledge: Knowledge, path: string): PageEntry | undefined {\n const key = path.trim().replace(/^\\/+|\\/+$/g, '').replace(/\\.md$/, '').replace(/\\/index$/, '')\n const pages = knowledge.pages()\n const exact = pages.find(p => p.path === key)\n if (exact)\n return exact\n const tail = pages.filter(p => p.path.split('/').pop() === key)\n return tail.length === 1 ? tail[0] : undefined\n}\n\n/** 把 vue / react / wc / web-components 等写法统一成框架标识。 */\nexport function parseFramework(value: string | undefined): Framework | undefined {\n if (value === undefined)\n return undefined\n const v = value.trim().toLowerCase()\n if (v === 'vue')\n return 'vue'\n if (v === 'react' || v === 'tsx')\n return 'react'\n if (v === 'wc' || v === 'web-components' || v === 'webcomponents' || v === 'html')\n return 'web-components'\n return undefined\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 各条命令与 MCP 工具共用的查询:返回结构化结果,渲染交给 render.ts。\n\nimport type { ComponentEntry, ComponentToken, DemoEntry, Framework, Knowledge, PageEntry, TokenEntry } from './knowledge'\nimport { findComponent, findPage, suggestComponents } from './knowledge'\n\n/** 查询失败:带上可直接展示给使用者的说明与候选。 */\nexport class QueryError extends Error {\n readonly suggestions: readonly string[]\n\n constructor(message: string, suggestions: readonly string[] = []) {\n super(message)\n this.name = 'QueryError'\n this.suggestions = suggestions\n }\n}\n\n/** 找组件,找不到时抛出带候选的 QueryError。 */\nexport function requireComponent(knowledge: Knowledge, name: string): ComponentEntry {\n const entry = findComponent(knowledge, name)\n if (entry)\n return entry\n const near = suggestComponents(knowledge, name).map(c => `${c.title}(${c.id})`)\n throw new QueryError(`没有名为「${name}」的组件。用 list 查看全部组件。`, near)\n}\n\nexport interface ListOptions {\n readonly category?: string\n readonly query?: string\n}\n\nexport interface ComponentGroup {\n readonly id: string\n readonly label: string\n readonly description: string\n readonly components: readonly ComponentEntry[]\n}\n\n/** 按分类列组件,可按分类标识 / 名称与关键字过滤。 */\nexport function listComponents(knowledge: Knowledge, options: ListOptions = {}): ComponentGroup[] {\n const category = options.category?.trim()\n const query = options.query?.trim().toLowerCase()\n if (category && !knowledge.categories.some(c => c.id === category || c.label === category)) {\n throw new QueryError(\n `没有名为「${category}」的分类。`,\n knowledge.categories.map(c => `${c.id}(${c.label})`),\n )\n }\n return knowledge.categories\n .filter(c => !category || c.id === category || c.label === category)\n .map(c => ({\n ...c,\n components: knowledge.components.filter(entry =>\n entry.category === c.id\n && (!query\n || entry.id.includes(query)\n || entry.title.toLowerCase().includes(query)\n || entry.name.includes(query)\n || (entry.overview ?? '').toLowerCase().includes(query)),\n ),\n }))\n .filter(c => c.components.length > 0)\n}\n\nexport interface DocResult {\n readonly path: string\n readonly title: string\n readonly framework: Framework\n readonly markdown: string\n}\n\nconst FENCE_LANG: Record<Framework, string> = { 'vue': 'vue', 'react': 'tsx', 'web-components': 'html' }\nconst FRAMEWORK_LABEL: Record<Framework, string> = { 'vue': 'Vue', 'react': 'React', 'web-components': 'Web Components' }\n\n/** 把页面里的 <XhDemo src=\"…\" /> 换成所选写法的示例源码。 */\nexport function inlineDemos(knowledge: Knowledge, markdown: string, framework: Framework): string {\n return markdown.replace(/<XhDemo\\s+src=\"([^\"]+)\"\\s*\\/>/g, (_, src: string) => {\n const source = knowledge.demos()[src]?.[framework]\n if (source === undefined)\n return `> 示例 \\`${src}\\` 没有 ${FRAMEWORK_LABEL[framework]} 写法。`\n return `\\`\\`\\`${FENCE_LANG[framework]}\\n${source}\\n\\`\\`\\``\n })\n}\n\n/** 组件或文档页的完整 Markdown,示例按所选写法内联。 */\nexport function resolveDoc(knowledge: Knowledge, name: string, framework: Framework): DocResult {\n const entry = findComponent(knowledge, name)\n const page = entry ? findPage(knowledge, `components/${entry.id}`) : findPage(knowledge, name)\n if (!page) {\n const near = [\n ...suggestComponents(knowledge, name).map(c => c.id),\n ...knowledge.pages().filter(p => p.path.includes(name.trim().toLowerCase())).map(p => p.path),\n ].slice(0, 8)\n throw new QueryError(`没有名为「${name}」的组件或文档页。组件写标识(如 select),文档页写站内路径(如 guide/theme)。`, near)\n }\n return { path: page.path, title: page.title, framework, markdown: inlineDemos(knowledge, page.markdown, framework) }\n}\n\n/** 除组件页外的全部文档页,按路径排序。 */\nexport function listPages(knowledge: Knowledge): PageEntry[] {\n return knowledge.pages()\n .filter(p => !p.path.startsWith('components/'))\n .sort((a, b) => a.path.localeCompare(b.path))\n}\n\nexport interface DemoResult {\n readonly component: ComponentEntry\n readonly framework: Framework\n readonly demo: DemoEntry\n readonly source: string\n}\n\n/** 按序号、文件基名或标题找组件的某个示例。 */\nexport function findDemo(entry: ComponentEntry, name: string): DemoEntry | undefined {\n const key = name.trim()\n if (/^\\d+$/.test(key))\n return entry.demos[Number(key) - 1]\n return entry.demos.find((demo) => {\n const base = demo.src.slice(demo.src.indexOf('/') + 1)\n return base === key || base.replace(/^\\d+-/, '') === key || demo.title === key\n })\n}\n\n/** 一个示例在所选写法下的源码。 */\nexport function demoSource(knowledge: Knowledge, entry: ComponentEntry, name: string, framework: Framework): DemoResult {\n const demo = findDemo(entry, name)\n if (!demo) {\n throw new QueryError(\n `${entry.title} 没有名为「${name}」的示例。`,\n entry.demos.map((d, i) => `${i + 1}. ${d.src.slice(d.src.indexOf('/') + 1)}(${d.title})`),\n )\n }\n const source = knowledge.demos()[demo.src]?.[framework]\n if (source === undefined) {\n const available = Object.keys(knowledge.demos()[demo.src] ?? {})\n throw new QueryError(`示例 ${demo.src} 没有 ${FRAMEWORK_LABEL[framework]} 写法。`, available)\n }\n return { component: entry, framework, demo, source }\n}\n\nexport interface TokenQuery {\n readonly query?: string\n readonly component?: string\n}\n\nexport type TokenResult\n = | { readonly kind: 'global', readonly query: string, readonly tokens: readonly TokenEntry[], readonly tone: readonly string[] }\n | { readonly kind: 'component', readonly component: ComponentEntry, readonly tokens: readonly ComponentToken[] }\n | { readonly kind: 'families', readonly families: readonly { readonly family: string, readonly count: number }[] }\n\n/** 令牌族:`--xh-<族>-…` 的第一段。 */\nexport function tokenFamily(name: string): string {\n return name.replace(/^--xh-/, '').split('-')[0] ?? ''\n}\n\n/**\n * 查令牌:给组件时列它的覆盖槽,给关键字时按名字匹配全局令牌,都不给时列令牌族。\n * 关键字可写完整名、前缀或片段,如 `bg-brand`、`--xh-shape`。\n */\nexport function queryTokens(knowledge: Knowledge, options: TokenQuery = {}): TokenResult {\n if (options.component) {\n const entry = requireComponent(knowledge, options.component)\n return { kind: 'component', component: entry, tokens: entry.componentTokens }\n }\n const data = knowledge.tokens()\n const query = options.query?.trim()\n if (!query) {\n const counts = new Map<string, number>()\n for (const token of data.tokens)\n counts.set(tokenFamily(token.name), (counts.get(tokenFamily(token.name)) ?? 0) + 1)\n return {\n kind: 'families',\n families: [...counts].map(([family, count]) => ({ family, count })).sort((a, b) => a.family.localeCompare(b.family)),\n }\n }\n const needle = query.replace(/^--xh-/, '').replace(/^--/, '').toLowerCase()\n const tokens = data.tokens.filter(t => t.name.slice('--xh-'.length).toLowerCase().includes(needle))\n const tone = data.tone.filter(name => name.slice('--xh-'.length).includes(needle))\n if (tokens.length === 0 && tone.length === 0)\n throw new QueryError(`没有名字含「${query}」的令牌。不带关键字查询可列出全部令牌族。`)\n return { kind: 'global', query, tokens, tone }\n}\n\nexport interface PartsResult {\n readonly component: ComponentEntry\n}\n\n/** 组件的样式钩子:部件选择器、数据属性、状态取值与覆盖槽。 */\nexport function componentParts(knowledge: Knowledge, name: string): PartsResult {\n return { component: requireComponent(knowledge, name) }\n}\n\nexport interface ChangelogSection {\n readonly version: string\n readonly date: string\n readonly body: string\n}\n\nexport interface ChangelogQuery {\n readonly from?: string\n readonly to?: string\n readonly keyword?: string\n}\n\n/** 把更新日志切成按版本的段。 */\nexport function parseChangelog(markdown: string): ChangelogSection[] {\n const out: ChangelogSection[] = []\n const parts = markdown.split(/^## /m).slice(1)\n for (const part of parts) {\n const newline = part.indexOf('\\n')\n const heading = newline === -1 ? part : part.slice(0, newline)\n const [version = '', ...rest] = heading.trim().split(/\\s+/)\n if (!version)\n continue\n out.push({\n version: version.replace(/^v/, ''),\n date: rest.join(' ').replace(/^\\(|\\)$/g, ''),\n body: newline === -1 ? '' : part.slice(newline + 1).trim(),\n })\n }\n return out\n}\n\n/** 语义化版本比较:预发布排在同号正式版之前。 */\nexport function compareVersions(a: string, b: string): number {\n const split = (v: string): [number[], string] => {\n const [core = '', pre = ''] = v.replace(/^v/, '').split('-', 2)\n return [core.split('.').map(n => Number(n) || 0), pre]\n }\n const [ca, pa] = split(a)\n const [cb, pb] = split(b)\n for (let i = 0; i < Math.max(ca.length, cb.length); i++) {\n const diff = (ca[i] ?? 0) - (cb[i] ?? 0)\n if (diff !== 0)\n return diff\n }\n if (pa === pb)\n return 0\n if (!pa)\n return 1\n if (!pb)\n return -1\n return pa.localeCompare(pb, 'en', { numeric: true })\n}\n\n/**\n * 取更新日志:只给 from 时取这一版,给 from 与 to 时取 (from, to] 区间,\n * 都不给时取最近一版;keyword 只保留含该词的条目。\n */\nexport function queryChangelog(knowledge: Knowledge, options: ChangelogQuery = {}): ChangelogSection[] {\n const sections = parseChangelog(knowledge.changelog())\n if (sections.length === 0)\n throw new QueryError('更新日志为空。')\n let picked: ChangelogSection[]\n if (options.from && options.to) {\n const [low, high] = compareVersions(options.from, options.to) <= 0 ? [options.from, options.to] : [options.to, options.from]\n picked = sections.filter(s => compareVersions(s.version, low) > 0 && compareVersions(s.version, high) <= 0)\n }\n else if (options.from) {\n const version = options.from.replace(/^v/, '')\n picked = sections.filter(s => s.version === version)\n if (picked.length === 0)\n throw new QueryError(`更新日志里没有 ${options.from}。`, sections.slice(0, 8).map(s => s.version))\n }\n else {\n picked = sections.slice(0, 1)\n }\n const keyword = options.keyword?.trim()\n if (!keyword)\n return picked\n const needles = keywordVariants(knowledge, keyword)\n return picked\n .map(s => ({\n ...s,\n body: s.body\n .split('\\n')\n .filter(line => /^\\s*[-*]\\s/.test(line) && needles.some(n => line.toLowerCase().includes(n)))\n .join('\\n'),\n }))\n .filter(s => s.body)\n}\n\n/** 关键字是组件名时,连同它的 PascalCase 名与中文名一起匹配。 */\nfunction keywordVariants(knowledge: Knowledge, keyword: string): string[] {\n const entry = findComponent(knowledge, keyword)\n const words = entry ? [entry.id, entry.title, entry.name, keyword] : [keyword]\n return [...new Set(words.map(w => w.toLowerCase()))]\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 把查询结果渲染成 Markdown,命令行与 MCP 工具输出同一份文本。\n\nimport type { ComponentEntry, Framework, Knowledge, PageEntry } from './knowledge'\nimport type { ChangelogSection, ComponentGroup, DemoResult, DocResult, TokenResult } from './query'\n\nconst code = (s: string): string => `\\`${s.replace(/`/g, '')}\\``\nconst cell = (s: string): string => s.replace(/\\r?\\n/g, ' ').replace(/\\|/g, '\\\\|')\nconst codeCell = (s: string): string => cell(code(s))\n\nfunction table(head: readonly string[], rows: readonly (readonly string[])[]): string[] {\n return [\n `| ${head.join(' | ')} |`,\n `| ${head.map(() => '---').join(' | ')} |`,\n ...rows.map(row => `| ${row.join(' | ')} |`),\n ]\n}\n\n/** Vue / React 的根组件名:Root 优先,其次同名组件。 */\nexport function rootComponent(entry: ComponentEntry): string | undefined {\n const names = entry.artifacts.components\n return names.find(n => n === `Xh${entry.title}Root`) ?? names.find(n => n === `Xh${entry.title}`) ?? names[0]\n}\n\nexport function renderList(knowledge: Knowledge, groups: readonly ComponentGroup[]): string {\n const total = groups.reduce((sum, g) => sum + g.components.length, 0)\n const L = [`# XiHan.UI 组件 · v${knowledge.meta.version}`, '', `共 ${total} 个。查看某个组件用 info,完整文档用 doc。`, '']\n for (const group of groups) {\n L.push(`## ${group.label}(${group.id})`, '')\n if (group.description)\n L.push(group.description, '')\n L.push(...table(\n ['组件', '名称', 'Vue / React 根组件', '自定义元素', '状态'],\n group.components.map(c => [\n `${c.title}(${code(c.id)})`,\n cell(c.name),\n rootComponent(c) ? code(rootComponent(c)!) : '—',\n c.artifacts.tag ? code(`<${c.artifacts.tag}>`) : '—',\n c.status ?? '',\n ]),\n ), '')\n }\n return L.join('\\n')\n}\n\nfunction fieldTable(rows: readonly { name: string, type: string, optional: boolean, doc: string }[]): string[] {\n return table(['属性', '类型', '必填', '说明'], rows.map(r => [codeCell(r.name), codeCell(r.type), r.optional ? '' : '是', cell(r.doc)]))\n}\n\nexport function renderInfo(knowledge: Knowledge, entry: ComponentEntry): string {\n const a = entry.artifacts\n const L = [`# ${entry.title} ${entry.name}`, '']\n if (entry.status)\n L.push(`状态:${code(entry.status)}`, '')\n if (entry.overview)\n L.push(entry.overview, '')\n L.push(`分类:${entry.categoryLabel}(${entry.category})· 文档:${knowledge.meta.site}/components/${entry.id}`, '')\n\n L.push('## 产物', '')\n const artifactRows: string[][] = []\n if (a.components.length)\n artifactRows.push(['Vue / React 组件', a.components.map(code).join(' ')])\n if (a.composable)\n artifactRows.push(['Vue 组合式函数', code(a.composable)])\n if (a.tag)\n artifactRows.push(['自定义元素', code(`<${a.tag}>`)])\n artifactRows.push(['状态机', a.machine ? code(a.machine) : '无'])\n if (a.skin)\n artifactRows.push(['皮肤', code(a.skin)])\n L.push(...table(['层', '值'], artifactRows), '')\n\n const required = new Set(entry.requiredParts)\n L.push('## 部件', '', `${code(`data-scope=\"${entry.id}\"`)}:${entry.parts.map(p => (required.has(p) ? `**${code(p)}**` : code(p))).join(' · ')}(加粗为必需部件)`, '')\n\n if (entry.props.length)\n L.push('## Props', '', ...fieldTable(entry.props), '')\n for (const node of entry.nodes)\n L.push(`### ${node.name}`, '', `${code(node.via)} 的元素。`, '', ...fieldTable(node.fields), '')\n if (entry.events.length) {\n L.push('## 事件', '', '自定义元素的载荷在 `detail`;Vue 为同名 emit。', '')\n L.push(...table(['事件', '载荷', '说明'], entry.events.map(e => [codeCell(e.name), e.type ? codeCell(e.type) : '', cell(e.description)])), '')\n }\n if (entry.slots.length) {\n L.push('## Vue 插槽(带载荷)', '')\n L.push(...table(['组件', '插槽', '载荷', '说明'], entry.slots.map(s => [code(s.component), code(s.name), s.payload ? codeCell(s.payload) : '—', cell(s.doc)])), '')\n }\n if (entry.reactProps.length) {\n L.push('## React 适配器 props', '', '只列 React 组件自己声明的属性,DOM 属性与上面 Props 表里同名的不重复列。', '')\n L.push(...table(['组件', '属性', '类型', '必填', '说明'], entry.reactProps.map(r => [code(r.component), codeCell(r.name), codeCell(r.type), r.optional ? '' : '是', cell(r.doc)])), '')\n }\n const states = entry.dataAttributes.filter(d => d.attr === 'data-state')\n if (states.length)\n L.push('## 状态', '', ...table(['部件', 'data-state'], states.map(s => [code(s.part), cell(s.value)])), '')\n if (entry.api.length) {\n L.push('## connect API', '', '`getXxxProps()` 返回对应部件的宿主属性,组合式函数与自定义布局用它。', '')\n L.push(...table(['成员', '类型', '说明'], entry.api.map(x => [codeCell(x.name), codeCell(x.type), cell(x.doc)])), '')\n }\n L.push('## 键盘', '')\n if (entry.keyboard.rows.length)\n L.push(...table(['按键', '生效条件', '行为'], entry.keyboard.rows.map(r => [r.keys.map(code).join(' / '), cell(r.when), cell(r.does)])), '')\n else\n L.push('无键盘交互。', '')\n for (const title of ['何时使用', '何时不用', '反模式']) {\n const text = entry.guidance[title]\n if (text)\n L.push(`## ${title}`, '', text, '')\n }\n if (entry.demos.length)\n L.push('## 示例', '', ...entry.demos.map((d, i) => `${i + 1}. ${d.title}${d.description ? `:${d.description}` : ''}(${code(d.src)})`), '')\n return L.join('\\n')\n}\n\nexport function renderParts(entry: ComponentEntry): string {\n const L = [`# ${entry.title} 的样式钩子`, '']\n L.push(\n '皮肤按部件选择器书写;覆盖样式写进 `@layer xihan.overrides`(无层皮肤时用不低于 `[data-scope][data-part]` 的特异性),',\n '颜色、间距、圆角等只取语义令牌或下面的组件覆盖槽,不写散值。',\n '',\n )\n L.push('## 部件选择器', '')\n const required = new Set(entry.requiredParts)\n L.push(...table(['部件', '选择器', '必需'], entry.parts.map(p => [code(p), code(`[data-scope=\"${entry.id}\"][data-part=\"${p}\"]`), required.has(p) ? '是' : ''])), '')\n if (entry.dataAttributes.length) {\n L.push('## 数据属性', '', '由 connect 写入;条件不成立时不输出。', '')\n L.push(...table(['部件', '属性', '值'], entry.dataAttributes.map(d => [code(d.part), code(d.attr), cell(d.value)])), '')\n }\n if (entry.aria.length) {\n L.push('## ARIA', '', '由 connect 写入,不要手写。', '')\n L.push(...table(['部件', '属性', '值'], entry.aria.map(d => [code(d.part), code(d.attr), cell(d.value)])), '')\n }\n if (entry.componentTokens.length) {\n L.push('## 组件覆盖槽', '', '在组件根或任意祖先上设置即可覆盖,缺省值取后面的令牌。', '')\n L.push(...table(\n ['变量', '部件', '属性', '状态', '缺省'],\n entry.componentTokens.map(t => [code(t.name), t.part.map(code).join(' '), t.property.map(code).join(' '), t.state.map(code).join(' '), t.defaultToken.map(code).join(' ')]),\n ), '')\n }\n else {\n L.push('## 组件覆盖槽', '', '本组件没有专属覆盖槽,外观由语义令牌决定。', '')\n }\n return L.join('\\n')\n}\n\nexport function renderDoc(doc: DocResult): string {\n return doc.markdown\n}\n\nexport function renderPages(knowledge: Knowledge, pages: readonly PageEntry[]): string {\n const L = [`# XiHan.UI 文档页 · v${knowledge.meta.version}`, '', '组件页用组件标识读取(如 `select`),其余页面用下列路径读取。', '']\n L.push(...table(['路径', '标题', '摘要'], pages.map(p => [code(p.path), cell(p.title), cell(p.summary)])), '')\n return L.join('\\n')\n}\n\nconst FRAMEWORK_LABEL: Record<Framework, string> = { 'vue': 'Vue', 'react': 'React', 'web-components': 'Web Components' }\n\nexport function renderDemoList(entry: ComponentEntry): string {\n if (entry.demos.length === 0)\n return `# ${entry.title} 的示例\\n\\n本组件还没有示例。`\n const L = [`# ${entry.title} 的示例`, '', '按序号或文件基名取源码,写法可选 Vue、React、Web Components。', '']\n L.push(...table(['#', '示例', '标题', '说明'], entry.demos.map((d, i) => [String(i + 1), code(d.src.slice(d.src.indexOf('/') + 1)), cell(d.title), cell(d.description)])), '')\n return L.join('\\n')\n}\n\nexport function renderDemo(result: DemoResult): string {\n const lang = result.framework === 'vue' ? 'vue' : result.framework === 'react' ? 'tsx' : 'html'\n const L = [`# ${result.component.title} · ${result.demo.title}(${FRAMEWORK_LABEL[result.framework]})`, '']\n if (result.demo.description)\n L.push(result.demo.description, '')\n L.push(`\\`\\`\\`${lang}`, result.source, '```', '')\n return L.join('\\n')\n}\n\nexport function renderTokens(result: TokenResult): string {\n if (result.kind === 'families') {\n const L = ['# 设计令牌族', '', '用关键字查具体令牌(如 `bg-brand`、`shape`、`control-h`),用 component 查某个组件的覆盖槽。', '']\n L.push(...table(['族', '令牌数', '示例前缀'], result.families.map(f => [code(f.family), String(f.count), code(`--xh-${f.family}-*`)])), '')\n return L.join('\\n')\n }\n if (result.kind === 'component') {\n const entry = result.component\n if (result.tokens.length === 0)\n return `# ${entry.title} 的覆盖槽\\n\\n本组件没有专属覆盖槽,外观由语义令牌决定。`\n const L = [`# ${entry.title} 的覆盖槽`, '']\n L.push(...table(\n ['变量', '部件', '属性', '状态', '缺省', '说明'],\n result.tokens.map(t => [code(t.name), t.part.map(code).join(' '), t.property.map(code).join(' '), t.state.map(code).join(' '), t.defaultToken.map(code).join(' '), cell(t.description)]),\n ), '')\n return L.join('\\n')\n }\n const L = [`# 令牌 · ${result.query}`, '', '取值是缺省档(浅色 · 舒适 · 基础对比度)下的值;「改写档」是还重新给过它的令牌源(深色、紧凑、高对比度、减弱动效、打印等)。', '']\n if (result.tokens.length) {\n L.push(...table(\n ['令牌', '类型', '取值', '展开后', '改写档'],\n result.tokens.map(t => [code(t.name), t.type, codeCell(t.value), t.resolved === t.value ? '' : codeCell(t.resolved), t.layers.join(' / ') || '—']),\n ), '')\n }\n if (result.tone.length) {\n L.push('## 语气族', '', '只在写了 `data-tone` 的节点及其后代里有取值。', '')\n L.push(...result.tone.map(name => `- ${code(name)}`), '')\n }\n return L.join('\\n')\n}\n\nexport function renderChangelog(sections: readonly ChangelogSection[]): string {\n if (sections.length === 0)\n return '没有匹配的更新条目。'\n return sections.map(s => `## v${s.version}${s.date ? ` (${s.date})` : ''}\\n\\n${s.body}`).join('\\n\\n')\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// MCP 工具与提示词的定义:参数结构、说明与处理函数。\n\nimport type { Framework, Knowledge } from './knowledge'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { FRAMEWORKS, parseFramework } from './knowledge'\nimport { componentParts, demoSource, listComponents, listPages, queryChangelog, queryTokens, requireComponent, resolveDoc } from './query'\nimport { renderChangelog, renderDemo, renderDemoList, renderDoc, renderInfo, renderList, renderPages, renderParts, renderTokens } from './render'\n\nexport interface ToolContext {\n readonly knowledge: Knowledge\n /** 未指定写法时使用的写法:项目里识别到的适配器,识别不到时是 Vue。 */\n readonly framework: Framework\n}\n\ntype Args = Readonly<Record<string, unknown>>\n\nexport interface JsonSchema {\n readonly type: 'object'\n readonly properties: Readonly<Record<string, Readonly<Record<string, unknown>>>>\n readonly required?: readonly string[]\n readonly additionalProperties: false\n}\n\nexport interface ToolDefinition {\n readonly name: string\n readonly title: string\n readonly description: string\n readonly inputSchema: JsonSchema\n readonly run: (args: Args, context: ToolContext) => string\n}\n\n/** 参数校验失败。 */\nexport class ArgumentError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ArgumentError'\n }\n}\n\nfunction optionalString(args: Args, key: string): string | undefined {\n const value = args[key]\n if (value === undefined || value === null || value === '')\n return undefined\n if (typeof value !== 'string')\n throw new ArgumentError(`参数 ${key} 必须是字符串`)\n return value\n}\n\nfunction requiredString(args: Args, key: string): string {\n const value = optionalString(args, key)\n if (value === undefined)\n throw new ArgumentError(`缺少参数 ${key}`)\n return value\n}\n\nfunction frameworkArg(args: Args, context: ToolContext): Framework {\n const raw = optionalString(args, 'framework')\n if (raw === undefined)\n return context.framework\n const framework = parseFramework(raw)\n if (!framework)\n throw new ArgumentError(`framework 只能是 ${FRAMEWORKS.join(' / ')},收到 ${raw}`)\n return framework\n}\n\nconst frameworkProperty = {\n type: 'string',\n enum: [...FRAMEWORKS],\n description: '示例写法:vue、react 或 web-components。缺省取项目里装的适配器,识别不到时为 vue。',\n}\n\nconst componentProperty = {\n type: 'string',\n description: '组件名:标识(date-picker)、PascalCase(DatePicker)、导出名(XhDatePickerRoot)、标签(xh-date-picker)或中文名均可。',\n}\n\nexport const TOOLS: readonly ToolDefinition[] = [\n {\n name: 'xihan_ui_list',\n title: '列出组件',\n description: '按分类列出 XiHan.UI 的全部组件:标识、中文名、Vue / React 根组件名、自定义元素标签与状态。不确定该用哪个组件时先调它。',\n inputSchema: {\n type: 'object',\n properties: {\n category: { type: 'string', description: '只列某个分类,写分类标识或中文名,如 form、数据录入。' },\n query: { type: 'string', description: '按名称或概述里的关键字过滤。' },\n },\n additionalProperties: false,\n },\n run: (args, { knowledge }) => renderList(knowledge, listComponents(knowledge, {\n category: optionalString(args, 'category'),\n query: optionalString(args, 'query'),\n })),\n },\n {\n name: 'xihan_ui_info',\n title: '组件 API',\n description: '取一个组件的完整 API:产物(导出名、标签、皮肤)、部件、Props 与条目数据结构、事件、插槽、React 专有属性、状态、connect API 与键盘规格。写组件代码前必须先查,不要凭记忆写属性名。',\n inputSchema: {\n type: 'object',\n properties: { component: componentProperty },\n required: ['component'],\n additionalProperties: false,\n },\n run: (args, { knowledge }) => renderInfo(knowledge, requireComponent(knowledge, requiredString(args, 'component'))),\n },\n {\n name: 'xihan_ui_doc',\n title: '完整文档',\n description: '取组件页或指南页的完整 Markdown,示例按所选写法内联为源码。组件写标识(select),指南写站内路径(guide/theme、installation、adapters/react);不传 name 时列出全部指南页。',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: '组件名或文档页路径。' },\n framework: frameworkProperty,\n },\n additionalProperties: false,\n },\n run: (args, context) => {\n const name = optionalString(args, 'name')\n if (!name)\n return renderPages(context.knowledge, listPages(context.knowledge))\n return renderDoc(resolveDoc(context.knowledge, name, frameworkArg(args, context)))\n },\n },\n {\n name: 'xihan_ui_demo',\n title: '示例源码',\n description: '取组件的可运行示例。不传 name 时列出该组件的全部示例;传序号、文件基名或标题时返回所选写法的完整源码。',\n inputSchema: {\n type: 'object',\n properties: {\n component: componentProperty,\n name: { type: 'string', description: '示例序号(1 起)、文件基名(01-basic 或 basic)或标题。' },\n framework: frameworkProperty,\n },\n required: ['component'],\n additionalProperties: false,\n },\n run: (args, context) => {\n const entry = requireComponent(context.knowledge, requiredString(args, 'component'))\n const name = optionalString(args, 'name')\n if (!name)\n return renderDemoList(entry)\n return renderDemo(demoSource(context.knowledge, entry, name, frameworkArg(args, context)))\n },\n },\n {\n name: 'xihan_ui_token',\n title: '设计令牌',\n description: '查设计令牌。传 query 按名字片段查全局令牌(如 bg-brand、shape、control-h、motion-duration)及其缺省取值;传 component 列该组件的覆盖槽;都不传时列出令牌族。写样式时只用这里查得到的令牌,不写散值。',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '令牌名或名字片段,可带 --xh- 前缀。' },\n component: componentProperty,\n },\n additionalProperties: false,\n },\n run: (args, { knowledge }) => renderTokens(queryTokens(knowledge, {\n query: optionalString(args, 'query'),\n component: optionalString(args, 'component'),\n })),\n },\n {\n name: 'xihan_ui_parts',\n title: '样式钩子',\n description: '取组件的样式钩子:每个部件的 [data-scope][data-part] 选择器、connect 写入的数据属性与状态取值、ARIA、组件覆盖槽及其缺省令牌。改组件外观前先查它。',\n inputSchema: {\n type: 'object',\n properties: { component: componentProperty },\n required: ['component'],\n additionalProperties: false,\n },\n run: (args, { knowledge }) => renderParts(componentParts(knowledge, requiredString(args, 'component')).component),\n },\n {\n name: 'xihan_ui_design_md',\n title: '设计语言',\n description: '取 XiHan.UI 的 design.md:缺省主题的颜色、排版、间距、圆角与组件样式令牌,以及视觉规则与禁忌。生成整页界面或判断视觉取舍时读它。',\n inputSchema: { type: 'object', properties: {}, additionalProperties: false },\n run: (_, { knowledge }) => knowledge.designMd(),\n },\n {\n name: 'xihan_ui_changelog',\n title: '更新日志',\n description: '查更新日志。只传 from 取这一版;传 from 与 to 取两版之间(不含 from、含 to)的全部变更,用于升级迁移;keyword 只保留提到它的条目(可写组件名)。都不传时取最近一版。',\n inputSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: '版本号,如 4.0.0。' },\n to: { type: 'string', description: '版本号,如 4.1.0。' },\n keyword: { type: 'string', description: '关键字或组件名。' },\n },\n additionalProperties: false,\n },\n run: (args, { knowledge }) => renderChangelog(queryChangelog(knowledge, {\n from: optionalString(args, 'from'),\n to: optionalString(args, 'to'),\n keyword: optionalString(args, 'keyword'),\n })),\n },\n]\n\nexport interface PromptArgument {\n readonly name: string\n readonly description: string\n readonly required: boolean\n}\n\nexport interface PromptDefinition {\n readonly name: string\n readonly title: string\n readonly description: string\n readonly arguments: readonly PromptArgument[]\n readonly render: (args: Readonly<Record<string, string>>, context: ToolContext) => string\n}\n\n/** 包内 skills/xihan-ui/SKILL.md 的正文,去掉 frontmatter。 */\nexport function skillBody(): string {\n const file = join(dirname(fileURLToPath(import.meta.url)), '..', 'skills', 'xihan-ui', 'SKILL.md')\n return readFileSync(file, 'utf8').replace(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n/, '').trim()\n}\n\nexport const PROMPTS: readonly PromptDefinition[] = [\n {\n name: 'xihan-ui-expert',\n title: 'XiHan.UI 专家',\n description: '以 XiHan.UI 专家身份工作:先查 API 再写代码,样式只走部件选择器与令牌。',\n arguments: [],\n render: (_, { framework }) => [\n `你是 XiHan.UI 的专家。当前项目的写法是 ${framework}。以下是使用规范,回答与写代码都按它执行;`,\n '涉及具体组件时先调 xihan_ui_info / xihan_ui_doc / xihan_ui_demo 查证,不要凭记忆写组件名、属性或部件。',\n '',\n skillBody(),\n ].join('\\n'),\n },\n {\n name: 'xihan-ui-page-generator',\n title: '用 XiHan.UI 搭页面',\n description: '按描述用 XiHan.UI 组件搭一整页界面。',\n arguments: [\n { name: 'description', description: '页面要做什么:用途、区块、数据与交互。', required: true },\n { name: 'framework', description: '写法:vue、react 或 web-components,缺省取项目里的适配器。', required: false },\n ],\n render: (args, context) => {\n const framework = parseFramework(args.framework) ?? context.framework\n return [\n `用 XiHan.UI 的 ${framework} 写法实现下面这个页面:`,\n '',\n args.description ?? '',\n '',\n '步骤:',\n '1. 调 xihan_ui_design_md 了解视觉规则,调 xihan_ui_list 选定要用的组件;',\n '2. 对每个选定的组件调 xihan_ui_info 核对导出名、部件与 Props,需要时调 xihan_ui_demo 参考示例;',\n '3. 页面布局用 Layout / Flex / Grid 等布局组件与间距令牌,颜色、间距、圆角只取 xihan_ui_token 查得到的令牌;',\n '4. 交付完整可运行的代码,并列出用到的组件与需要额外安装的包。',\n ].join('\\n')\n },\n },\n]\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// stdio 传输的 MCP 服务端:逐行读 JSON-RPC 请求,逐行写响应,日志只写 stderr。\n\nimport type { Readable, Writable } from 'node:stream'\nimport type { ToolContext } from './tools'\nimport process from 'node:process'\nimport { createInterface } from 'node:readline'\nimport { QueryError } from './query'\nimport { ArgumentError, PROMPTS, TOOLS } from './tools'\n\n/** 按新到旧排列的受支持协议版本。 */\nexport const PROTOCOL_VERSIONS = ['2025-11-25', '2025-06-18', '2025-03-26', '2024-11-05'] as const\n\nconst PARSE_ERROR = -32700\nconst INVALID_REQUEST = -32600\nconst METHOD_NOT_FOUND = -32601\nconst INVALID_PARAMS = -32602\n\ntype Id = string | number\n\ninterface Request {\n readonly jsonrpc: '2.0'\n readonly id?: Id | null\n readonly method: string\n readonly params?: unknown\n}\n\ntype Response\n = | { jsonrpc: '2.0', id: Id | null, result: unknown }\n | { jsonrpc: '2.0', id: Id | null, error: { code: number, message: string } }\n\nclass RpcError extends Error {\n readonly code: number\n\n constructor(code: number, message: string) {\n super(message)\n this.code = code\n }\n}\n\nexport interface McpServerOptions {\n readonly context: ToolContext\n readonly version: string\n /** 写进 initialize 结果的使用说明。 */\n readonly instructions: string\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** 处理一条请求;通知(不带 id)返回 undefined。 */\nexport function handleMessage(message: unknown, options: McpServerOptions): Response | undefined {\n const record = asRecord(message)\n const id = record.id\n const validId = typeof id === 'string' || typeof id === 'number'\n if (record.jsonrpc !== '2.0' || typeof record.method !== 'string') {\n return { jsonrpc: '2.0', id: validId ? id : null, error: { code: INVALID_REQUEST, message: '不是合法的 JSON-RPC 2.0 请求' } }\n }\n const request = record as unknown as Request\n const isNotification = !('id' in record)\n try {\n const result = dispatch(request, options)\n if (isNotification)\n return undefined\n return { jsonrpc: '2.0', id: validId ? id : null, result: result ?? {} }\n }\n catch (error) {\n if (isNotification)\n return undefined\n const code = error instanceof RpcError ? error.code : -32603\n return { jsonrpc: '2.0', id: validId ? id : null, error: { code, message: (error as Error).message } }\n }\n}\n\nfunction dispatch(request: Request, options: McpServerOptions): unknown {\n const params = asRecord(request.params)\n switch (request.method) {\n case 'initialize': {\n const requested = params.protocolVersion\n const protocolVersion = PROTOCOL_VERSIONS.find(v => v === requested) ?? PROTOCOL_VERSIONS[0]\n return {\n protocolVersion,\n capabilities: { tools: { listChanged: false }, prompts: { listChanged: false } },\n serverInfo: { name: 'xihan-ui', title: 'XiHan.UI', version: options.version },\n instructions: options.instructions,\n }\n }\n case 'notifications/initialized':\n case 'notifications/cancelled':\n return undefined\n case 'ping':\n return {}\n case 'tools/list':\n return {\n tools: TOOLS.map(tool => ({\n name: tool.name,\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n }\n case 'tools/call':\n return callTool(params, options.context)\n case 'prompts/list':\n return {\n prompts: PROMPTS.map(prompt => ({\n name: prompt.name,\n title: prompt.title,\n description: prompt.description,\n arguments: prompt.arguments,\n })),\n }\n case 'prompts/get':\n return getPrompt(params, options.context)\n default:\n throw new RpcError(METHOD_NOT_FOUND, `不支持的方法:${request.method}`)\n }\n}\n\nfunction callTool(params: Record<string, unknown>, context: ToolContext): unknown {\n const tool = TOOLS.find(t => t.name === params.name)\n if (!tool)\n throw new RpcError(INVALID_PARAMS, `没有名为 ${String(params.name)} 的工具`)\n try {\n return { content: [{ type: 'text', text: tool.run(asRecord(params.arguments), context) }] }\n }\n catch (error) {\n if (error instanceof QueryError || error instanceof ArgumentError) {\n const near = error instanceof QueryError && error.suggestions.length ? `\\n\\n候选:\\n${error.suggestions.map(s => `- ${s}`).join('\\n')}` : ''\n return { content: [{ type: 'text', text: `${error.message}${near}` }], isError: true }\n }\n throw error\n }\n}\n\nfunction getPrompt(params: Record<string, unknown>, context: ToolContext): unknown {\n const prompt = PROMPTS.find(p => p.name === params.name)\n if (!prompt)\n throw new RpcError(INVALID_PARAMS, `没有名为 ${String(params.name)} 的提示词`)\n const raw = asRecord(params.arguments)\n const args: Record<string, string> = {}\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value === 'string')\n args[key] = value\n }\n const missing = prompt.arguments.filter(a => a.required && !args[a.name])\n if (missing.length)\n throw new RpcError(INVALID_PARAMS, `缺少参数:${missing.map(a => a.name).join('、')}`)\n return {\n description: prompt.description,\n messages: [{ role: 'user', content: { type: 'text', text: prompt.render(args, context) } }],\n }\n}\n\n/** 处理一行输入:单条请求或批量数组,返回要写出的那一行(没有响应时为 undefined)。 */\nexport function handleLine(line: string, options: McpServerOptions): string | undefined {\n let message: unknown\n try {\n message = JSON.parse(line)\n }\n catch {\n return JSON.stringify({ jsonrpc: '2.0', id: null, error: { code: PARSE_ERROR, message: '无法解析的 JSON' } })\n }\n if (Array.isArray(message)) {\n const responses = message.map(m => handleMessage(m, options)).filter(r => r !== undefined)\n return responses.length ? JSON.stringify(responses) : undefined\n }\n const response = handleMessage(message, options)\n return response ? JSON.stringify(response) : undefined\n}\n\n/** 在给定的输入输出流上运行服务端,输入结束时返回。 */\nexport function serveStdio(options: McpServerOptions, input: Readable = process.stdin, output: Writable = process.stdout): Promise<void> {\n const reader = createInterface({ input, crlfDelay: Infinity })\n reader.on('line', (line) => {\n if (!line.trim())\n return\n const reply = handleLine(line, options)\n if (reply !== undefined)\n output.write(`${reply}\\n`)\n })\n return new Promise(resolve => reader.once('close', () => resolve()))\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 识别当前项目的根目录、用的是哪个适配器、装的是哪一版 XiHan.UI。\n\nimport type { Framework } from './knowledge'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport process from 'node:process'\n\nexport interface ProjectInfo {\n /** 写 MCP 配置的项目根:所在 git 仓库的根,不在仓库里时为读取依赖的那个目录。 */\n readonly root: string | undefined\n /** 读取依赖的 package.json 所在目录。 */\n readonly packageDir: string | undefined\n /** 依赖里出现的适配器;同时出现多个时按 Vue、React、Web Components 取第一个。 */\n readonly framework: Framework | undefined\n /** node_modules 里实际装的 XiHan.UI 版本。 */\n readonly installedVersion: string | undefined\n}\n\nconst ADAPTER_PACKAGES: readonly [Framework, string][] = [\n ['vue', '@xihan-ui/vue'],\n ['react', '@xihan-ui/react'],\n ['web-components', '@xihan-ui/web-components'],\n]\n\nfunction readJson(path: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(readFileSync(path, 'utf8')) as Record<string, unknown>\n }\n catch {\n return undefined\n }\n}\n\n/** 向上找第一个含 .git 的目录。 */\nfunction gitRoot(start: string): string | undefined {\n let dir = start\n for (;;) {\n if (existsSync(join(dir, '.git')))\n return dir\n const parent = dirname(dir)\n if (parent === dir)\n return undefined\n dir = parent\n }\n}\n\n/** 向上找最近的 package.json 所在目录,不越过 stop。 */\nfunction nearestPackageDir(start: string, stop: string | undefined): string | undefined {\n let dir = start\n for (;;) {\n if (existsSync(join(dir, 'package.json')))\n return dir\n const parent = dirname(dir)\n if (parent === dir || dir === stop)\n return undefined\n dir = parent\n }\n}\n\nfunction declaredDependencies(dir: string): Record<string, string> {\n const manifest = readJson(join(dir, 'package.json')) ?? {}\n return {\n ...(manifest.dependencies as Record<string, string> | undefined),\n ...(manifest.devDependencies as Record<string, string> | undefined),\n }\n}\n\nfunction declaresXihanUi(dir: string): boolean {\n return Object.keys(declaredDependencies(dir)).some(name => name.startsWith('@xihan-ui/'))\n}\n\n/** 仓库根的一级子目录里第一个依赖 XiHan.UI 的,如前后端分仓结构里的 frontend/。 */\nfunction xihanUiChild(repo: string): string | undefined {\n return readdirSync(repo, { withFileTypes: true })\n .filter(entry => entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules')\n .map(entry => entry.name)\n .sort()\n .map(name => join(repo, name))\n .find(dir => existsSync(join(dir, 'package.json')) && declaresXihanUi(dir))\n}\n\n/** 从 start 向上逐级找 node_modules/<name>/package.json 里的版本。 */\nfunction installedVersionOf(start: string, name: string): string | undefined {\n let dir = start\n for (;;) {\n const manifest = readJson(join(dir, 'node_modules', name, 'package.json'))\n if (typeof manifest?.version === 'string')\n return manifest.version\n const parent = dirname(dir)\n if (parent === dir)\n return undefined\n dir = parent\n }\n}\n\nexport function detectProject(cwd: string = process.cwd()): ProjectInfo {\n const repo = gitRoot(cwd)\n let packageDir = nearestPackageDir(cwd, repo)\n if (repo && (!packageDir || !declaresXihanUi(packageDir)))\n packageDir = xihanUiChild(repo) ?? packageDir\n const root = repo ?? packageDir\n if (!packageDir)\n return { root, packageDir: undefined, framework: undefined, installedVersion: undefined }\n const declared = declaredDependencies(packageDir)\n const adapter = ADAPTER_PACKAGES.find(([, name]) => name in declared)\n const probe = adapter?.[1] ?? '@xihan-ui/core'\n return {\n root,\n packageDir,\n framework: adapter?.[0],\n installedVersion: installedVersionOf(packageDir, probe),\n }\n}\n\n/** 项目装的版本与 CLI 数据版本不一致时的提示;一致或未安装时返回 undefined。 */\nexport function versionNotice(project: ProjectInfo, dataVersion: string): string | undefined {\n if (!project.installedVersion || project.installedVersion === dataVersion)\n return undefined\n return `当前项目装的是 XiHan.UI ${project.installedVersion},这份 CLI 的数据对应 ${dataVersion}。`\n + `要按项目版本查询,改用 npx -y @xihan-ui/cli@${project.installedVersion}。`\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 把 MCP 服务端配置与 XiHan.UI 技能写进项目,供各 AI 编程工具读取。\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport type Client = 'claude' | 'cursor' | 'vscode' | 'codex'\nexport type SetupMode = 'mcp' | 'skill' | 'both'\n\nexport const CLIENTS: readonly Client[] = ['claude', 'cursor', 'vscode', 'codex']\nexport const SETUP_MODES: readonly SetupMode[] = ['mcp', 'skill', 'both']\n\n/** MCP 配置里的服务名。 */\nexport const SERVER_NAME = 'xihan-ui'\n\nexport interface SetupOptions {\n readonly client: Client\n readonly mode: SetupMode\n /** 项目根目录,配置文件写在它下面。 */\n readonly root: string\n /** 配置里钉住的 @xihan-ui/cli 版本。 */\n readonly version: string\n readonly platform: NodeJS.Platform\n}\n\nexport type SetupAction\n = | { readonly kind: 'json', readonly path: string, readonly key: 'mcpServers' | 'servers', readonly entry: Readonly<Record<string, unknown>> }\n | { readonly kind: 'file', readonly path: string, readonly content: string }\n | { readonly kind: 'print', readonly target: string, readonly content: string }\n\n/** 启动服务端的命令;Windows 上 Claude Code 需要经 cmd /c 调 npx。 */\nexport function serverCommand(client: Client, version: string, platform: NodeJS.Platform): { command: string, args: string[] } {\n const args = ['-y', `@xihan-ui/cli@${version}`, 'mcp']\n if (client === 'claude' && platform === 'win32')\n return { command: 'cmd', args: ['/c', 'npx', ...args] }\n return { command: 'npx', args }\n}\n\nfunction skillSource(): string {\n return readFileSync(join(dirname(fileURLToPath(import.meta.url)), '..', 'skills', 'xihan-ui', 'SKILL.md'), 'utf8')\n}\n\n/** 按客户端与模式算出要做的事,不碰磁盘。 */\nexport function planSetup(options: SetupOptions): SetupAction[] {\n const actions: SetupAction[] = []\n const { command, args } = serverCommand(options.client, options.version, options.platform)\n if (options.mode !== 'skill') {\n switch (options.client) {\n case 'claude':\n actions.push({ kind: 'json', path: join(options.root, '.mcp.json'), key: 'mcpServers', entry: { command, args } })\n break\n case 'cursor':\n actions.push({ kind: 'json', path: join(options.root, '.cursor', 'mcp.json'), key: 'mcpServers', entry: { command, args } })\n break\n case 'vscode':\n actions.push({ kind: 'json', path: join(options.root, '.vscode', 'mcp.json'), key: 'servers', entry: { type: 'stdio', command, args } })\n break\n case 'codex':\n actions.push({\n kind: 'print',\n target: '~/.codex/config.toml',\n content: [`[mcp_servers.${SERVER_NAME}]`, `command = \"${command}\"`, `args = [${args.map(a => `\"${a}\"`).join(', ')}]`].join('\\n'),\n })\n break\n }\n }\n if (options.mode !== 'mcp') {\n const dir = options.client === 'claude' ? join('.claude', 'skills') : join('.agents', 'skills')\n actions.push({ kind: 'file', path: join(options.root, dir, SERVER_NAME, 'SKILL.md'), content: skillSource() })\n }\n return actions\n}\n\nfunction readConfig(path: string): Record<string, unknown> {\n if (!existsSync(path))\n return {}\n const text = readFileSync(path, 'utf8')\n if (!text.trim())\n return {}\n try {\n const value = JSON.parse(text) as unknown\n if (value === null || typeof value !== 'object' || Array.isArray(value))\n throw new Error('顶层不是对象')\n return value as Record<string, unknown>\n }\n catch (error) {\n throw new Error(`无法解析 ${path}(${(error as Error).message}),文件未改动;请按 --dry-run 打印的片段手动合并`)\n }\n}\n\n/** 一条动作的说明,--dry-run 与执行后都打印它。 */\nexport function describeAction(action: SetupAction): string {\n if (action.kind === 'json')\n return `在 ${action.path} 的 ${action.key} 里写入 ${SERVER_NAME}:\\n${JSON.stringify({ [action.key]: { [SERVER_NAME]: action.entry } }, null, 2)}`\n if (action.kind === 'file')\n return `写入 ${action.path}`\n return `把下面这段加进 ${action.target}:\\n${action.content}`\n}\n\n/** 执行动作:JSON 配置只改 xihan-ui 一项,其余内容原样保留。 */\nexport function applyAction(action: SetupAction): void {\n if (action.kind === 'print')\n return\n mkdirSync(dirname(action.path), { recursive: true })\n if (action.kind === 'file') {\n writeFileSync(action.path, action.content)\n return\n }\n const config = readConfig(action.path)\n const servers = (config[action.key] !== null && typeof config[action.key] === 'object' ? config[action.key] : {}) as Record<string, unknown>\n config[action.key] = { ...servers, [SERVER_NAME]: action.entry }\n writeFileSync(action.path, `${JSON.stringify(config, null, 2)}\\n`)\n}\n\n/** 核对动作是否已经生效;返回未生效的说明。 */\nexport function checkAction(action: SetupAction): string | undefined {\n if (action.kind === 'print')\n return undefined\n if (!existsSync(action.path))\n return `缺少 ${action.path}`\n if (action.kind === 'file')\n return readFileSync(action.path, 'utf8') === action.content ? undefined : `${action.path} 与当前版本的技能不一致`\n const config = readConfig(action.path)\n const servers = config[action.key] as Record<string, unknown> | undefined\n const current = servers?.[SERVER_NAME]\n if (!current)\n return `${action.path} 里没有 ${SERVER_NAME}`\n return JSON.stringify(current) === JSON.stringify(action.entry) ? undefined : `${action.path} 里的 ${SERVER_NAME} 与期望不一致`\n}\n","/*\n * Copyright (c) 2021-Present XiHanFun and contributors.\n * Licensed under the MIT License. See LICENSE in the project root for license information.\n */\n\n// 命令行入口:解析参数、分派命令、按 markdown 或 json 输出。\n\nimport type { Framework, Knowledge } from './knowledge'\nimport type { Client, SetupMode } from './setup'\nimport process from 'node:process'\nimport { parseArgs } from 'node:util'\nimport { FRAMEWORKS, loadKnowledge, parseFramework } from './knowledge'\nimport { serveStdio } from './mcp'\nimport { detectProject, versionNotice } from './project'\nimport { componentParts, demoSource, listComponents, listPages, queryChangelog, QueryError, queryTokens, requireComponent, resolveDoc } from './query'\nimport { renderChangelog, renderDemo, renderDemoList, renderDoc, renderInfo, renderList, renderPages, renderParts, renderTokens } from './render'\nimport { applyAction, checkAction, CLIENTS, describeAction, planSetup, SETUP_MODES } from './setup'\nimport { ArgumentError } from './tools'\n\nconst HELP = `xihan-ui —— XiHan.UI 的离线知识库与 MCP 服务端\n\n用法:xihan-ui <命令> [参数] [选项]\n\n查询\n list [--category <分类>] [--query <关键字>] 按分类列出组件\n info <组件> 组件 API:产物、部件、Props、事件、插槽、状态、键盘\n doc [<组件|页面>] 完整文档,示例按写法内联;不带参数列出指南页\n demo <组件> [<示例>] 列出示例或输出示例源码\n token [<关键字>] [--component <组件>] 设计令牌与组件覆盖槽\n parts <组件> 部件选择器、数据属性与覆盖槽\n design.md 设计语言文档\n changelog [<版本> [<版本>]] [--keyword <词>] 更新日志,两个版本时取区间\n\n集成\n mcp 以 stdio 启动 MCP 服务端\n setup --client <${CLIENTS.join('|')}> 写入 MCP 配置与技能\n [--mode <${SETUP_MODES.join('|')}>] [--pin <版本>] [--dry-run] [--check]\n\n选项\n --framework <vue|react|web-components> 示例写法,缺省取项目里装的适配器\n --format <markdown|json> 输出格式,缺省 markdown\n -v, --version 打印版本\n -h, --help 打印本帮助\n\n组件名可写标识(date-picker)、PascalCase(DatePicker)、导出名(XhDatePickerRoot)、标签(xh-date-picker)或中文名。`\n\nclass UsageError extends Error {}\n\n/** 命令行的输入输出环境,缺省为当前进程。 */\nexport interface CliEnvironment {\n readonly stdout: (text: string) => void\n readonly stderr: (text: string) => void\n /** 离线数据目录,缺省为包内 data/。 */\n readonly dataDir?: string\n /** 识别项目所用的目录,缺省为 process.cwd()。 */\n readonly cwd?: string\n}\n\nconst defaultEnvironment: CliEnvironment = {\n stdout: text => process.stdout.write(`${text}\\n`),\n stderr: text => process.stderr.write(`${text}\\n`),\n}\n\nfunction requireArg(value: string | undefined, usage: string): string {\n if (!value)\n throw new UsageError(`缺少参数。用法:xihan-ui ${usage}`)\n return value\n}\n\nfunction pickFramework(value: string | undefined, fallback: Framework): Framework {\n if (value === undefined)\n return fallback\n const framework = parseFramework(value)\n if (!framework)\n throw new UsageError(`--framework 只能是 ${FRAMEWORKS.join(' / ')},收到 ${value}`)\n return framework\n}\n\ninterface Result {\n readonly markdown: string\n readonly json: unknown\n}\n\nfunction query(command: string, positionals: readonly string[], values: Record<string, string | boolean | undefined>, knowledge: Knowledge, framework: Framework): Result {\n const str = (key: string): string | undefined => (typeof values[key] === 'string' ? values[key] as string : undefined)\n switch (command) {\n case 'list': {\n const groups = listComponents(knowledge, { category: str('category'), query: str('query') })\n return { markdown: renderList(knowledge, groups), json: groups }\n }\n case 'info': {\n const entry = requireComponent(knowledge, requireArg(positionals[0], 'info <组件>'))\n return { markdown: renderInfo(knowledge, entry), json: entry }\n }\n case 'doc': {\n if (!positionals[0]) {\n const pages = listPages(knowledge).map(({ markdown: _, ...page }) => page)\n return { markdown: renderPages(knowledge, listPages(knowledge)), json: pages }\n }\n const doc = resolveDoc(knowledge, positionals[0], framework)\n return { markdown: renderDoc(doc), json: doc }\n }\n case 'demo': {\n const entry = requireComponent(knowledge, requireArg(positionals[0], 'demo <组件> [<示例>]'))\n if (!positionals[1])\n return { markdown: renderDemoList(entry), json: entry.demos }\n const demo = demoSource(knowledge, entry, positionals[1], framework)\n return { markdown: renderDemo(demo), json: { component: entry.id, framework: demo.framework, ...demo.demo, source: demo.source } }\n }\n case 'token': {\n const result = queryTokens(knowledge, { query: positionals[0], component: str('component') })\n return { markdown: renderTokens(result), json: result.kind === 'component' ? { kind: result.kind, component: result.component.id, tokens: result.tokens } : result }\n }\n case 'parts': {\n const { component } = componentParts(knowledge, requireArg(positionals[0], 'parts <组件>'))\n const { id, parts, requiredParts, dataAttributes, aria, componentTokens } = component\n return { markdown: renderParts(component), json: { id, parts, requiredParts, dataAttributes, aria, componentTokens } }\n }\n case 'design.md':\n case 'design-md': {\n const markdown = knowledge.designMd()\n return { markdown, json: { markdown } }\n }\n case 'changelog': {\n const sections = queryChangelog(knowledge, { from: positionals[0], to: positionals[1], keyword: str('keyword') })\n return { markdown: renderChangelog(sections), json: sections }\n }\n default:\n throw new UsageError(`未知命令:${command}。xihan-ui --help 查看全部命令`)\n }\n}\n\nfunction runSetup(values: Record<string, string | boolean | undefined>, knowledge: Knowledge, out: CliEnvironment): number {\n const client = values.client\n if (typeof client !== 'string' || !CLIENTS.includes(client as Client))\n throw new UsageError(`--client 只能是 ${CLIENTS.join(' / ')}`)\n const mode = (typeof values.mode === 'string' ? values.mode : 'both') as SetupMode\n if (!SETUP_MODES.includes(mode))\n throw new UsageError(`--mode 只能是 ${SETUP_MODES.join(' / ')}`)\n const project = detectProject(out.cwd)\n if (!project.root)\n throw new UsageError('当前目录不在 git 仓库里,向上也找不到 package.json,在项目根目录里运行 setup')\n const version = typeof values.pin === 'string' ? values.pin : project.installedVersion ?? knowledge.meta.version\n const actions = planSetup({ client: client as Client, mode, root: project.root, version, platform: process.platform })\n\n if (values.check) {\n const problems = actions.map(checkAction).filter((p): p is string => p !== undefined)\n if (problems.length) {\n for (const problem of problems)\n out.stderr(`✗ ${problem}`)\n return 1\n }\n out.stdout(`✓ ${client} 的 XiHan.UI 配置已就绪(@xihan-ui/cli@${version})`)\n return 0\n }\n for (const action of actions) {\n if (!values['dry-run'])\n applyAction(action)\n out.stdout(`${values['dry-run'] || action.kind === 'print' ? '' : '✓ '}${describeAction(action)}`)\n }\n return 0\n}\n\n/** 运行一次命令行,返回退出码;mcp 命令在输入流结束后返回。 */\nexport async function runCli(argv: readonly string[], environment: Partial<CliEnvironment> = {}): Promise<number> {\n const out: CliEnvironment = { ...defaultEnvironment, ...environment }\n let parsed\n try {\n parsed = parseArgs({\n args: [...argv],\n allowPositionals: true,\n strict: true,\n options: {\n 'category': { type: 'string' },\n 'query': { type: 'string' },\n 'component': { type: 'string' },\n 'keyword': { type: 'string' },\n 'framework': { type: 'string' },\n 'format': { type: 'string' },\n 'client': { type: 'string' },\n 'mode': { type: 'string' },\n 'pin': { type: 'string' },\n 'dry-run': { type: 'boolean' },\n 'check': { type: 'boolean' },\n 'version': { type: 'boolean', short: 'v' },\n 'help': { type: 'boolean', short: 'h' },\n },\n })\n }\n catch (error) {\n out.stderr(`${(error as Error).message}\\n\\n${HELP}`)\n return 2\n }\n const { values, positionals } = parsed\n const [command, ...rest] = positionals\n\n if (values.help || (!command && !values.version)) {\n out.stdout(HELP)\n return 0\n }\n\n try {\n const knowledge = loadKnowledge(out.dataDir)\n if (values.version) {\n out.stdout(knowledge.meta.version)\n return 0\n }\n const project = detectProject(out.cwd)\n const framework = pickFramework(values.framework, project.framework ?? 'vue')\n const notice = versionNotice(project, knowledge.meta.version)\n\n if (command === 'mcp') {\n const instructions = [\n `XiHan.UI ${knowledge.meta.version} 的离线知识库。写 XiHan.UI 代码前先用 xihan_ui_info 核对组件 API,用 xihan_ui_doc / xihan_ui_demo 取文档与示例,样式只用 xihan_ui_parts 与 xihan_ui_token 查得到的部件选择器与令牌。`,\n `缺省示例写法:${framework}。`,\n ...(notice ? [notice] : []),\n ].join('\\n')\n if (notice)\n out.stderr(notice)\n await serveStdio({ context: { knowledge, framework }, version: knowledge.meta.version, instructions })\n return 0\n }\n if (command === 'setup')\n return runSetup(values, knowledge, out)\n\n const format = values.format ?? 'markdown'\n if (format !== 'markdown' && format !== 'json')\n throw new UsageError(`--format 只能是 markdown / json,收到 ${format}`)\n const result = query(command!, rest, values, knowledge, framework)\n if (notice)\n out.stderr(notice)\n out.stdout(format === 'json' ? JSON.stringify(result.json, null, 2) : result.markdown)\n return 0\n }\n catch (error) {\n if (error instanceof QueryError) {\n out.stderr(error.message)\n if (error.suggestions.length)\n out.stderr(`候选:\\n${error.suggestions.map(s => ` ${s}`).join('\\n')}`)\n return 1\n }\n if (error instanceof UsageError || error instanceof ArgumentError) {\n out.stderr(error.message)\n return 2\n }\n out.stderr((error as Error).message)\n return 1\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,70 @@
1
1
  {
2
2
  "name": "@xihan-ui/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "type": "module",
4
+ "version": "4.2.0",
5
+ "description": "XiHan.UI CLI and MCP server — offline component API, docs, demos, design tokens and design.md for AI coding agents.",
6
+ "author": {
7
+ "name": "XiHanFun",
8
+ "url": "https://github.com/XiHanFun"
9
+ },
10
+ "license": "MIT",
11
+ "homepage": "https://ui.docs.xihanfun.com/ai/cli",
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/XiHanFun/XiHan.UI.git",
15
+ "directory": "ui/packages/tools/cli"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/XiHanFun/XiHan.UI/issues"
19
+ },
20
+ "keywords": [
21
+ "xihan-ui",
22
+ "cli",
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "ai",
26
+ "llms"
27
+ ],
28
+ "sideEffects": false,
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ }
34
+ },
35
+ "main": "./dist/index.js",
36
+ "module": "./dist/index.js",
37
+ "types": "./dist/index.d.ts",
38
+ "bin": {
39
+ "xihan-ui": "./bin/xihan-ui.mjs"
40
+ },
41
+ "files": [
42
+ "CHANGELOG.md",
43
+ "bin",
44
+ "data",
45
+ "dist",
46
+ "skills"
47
+ ],
48
+ "engines": {
49
+ "node": ">=18"
50
+ },
51
+ "publishConfig": {
52
+ "access": "public",
53
+ "registry": "https://registry.npmjs.org/"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^24.10.0",
57
+ "vitest": "^4.1.11",
58
+ "@xihan-ui/build": "0.0.0",
59
+ "@xihan-ui/tokens": "4.2.0",
60
+ "@xihan-ui/tsconfig": "0.0.0",
61
+ "@xihan-ui/vue": "4.2.0",
62
+ "@xihan-ui/headless": "4.2.0",
63
+ "@xihan-ui/styles": "4.2.0"
64
+ },
65
+ "scripts": {
66
+ "build": "node build/build-data.mjs && tsdown",
67
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
68
+ "test": "vitest run"
69
+ }
6
70
  }
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: xihan-ui
3
+ description: 在项目里用 XiHan.UI 写界面:选组件、写 Vue / React / Web Components 代码、改样式与主题。凡是代码里出现 @xihan-ui/*或 Xh 前缀组件、xh-* 自定义元素时使用。
4
+ ---
5
+
6
+ # 在项目里使用 XiHan.UI
7
+
8
+ XiHan.UI 是框架无关的设计系统运行时:组件行为在无头内核里,Vue、React 与 Web Components 三个适配器只把属性铺到元素上,外观来自纯 CSS 皮肤与设计令牌。文档:https://ui.docs.xihanfun.com
9
+
10
+ ## 先查证,再写代码
11
+
12
+ 组件名、部件、Props、事件与令牌都以当前安装版本为准,不要凭记忆或别的组件库的习惯去写。
13
+
14
+ - 配了 MCP 时:`xihan_ui_list` 选组件,`xihan_ui_info` 查 API,`xihan_ui_demo` / `xihan_ui_doc` 取示例与文档,`xihan_ui_parts` 与 `xihan_ui_token` 查样式钩子与令牌。
15
+ - 没有 MCP 时用命令行(数据随包离线):`npx -y @xihan-ui/cli info select`、`demo select 1`、`doc guide/theme`、`token bg-brand`、`parts select`。
16
+ - 版本要对齐:项目装的是哪一版,就用同号的 CLI,如 `npx -y @xihan-ui/cli@<版本> info select`。
17
+ - 也可以读机读文档:https://ui.docs.xihanfun.com/llms.txt(索引)与组件页的 `.md`(如 https://ui.docs.xihanfun.com/components/select.md)。
18
+
19
+ ## 安装与接入
20
+
21
+ - Vue:`@xihan-ui/vue` + `@xihan-ui/styles`;React(只支持 19):`@xihan-ui/react` + `@xihan-ui/styles`;原生页面:`@xihan-ui/web-components` + `@xihan-ui/styles`。全部包同一版本组、始终同号,ESM only。
22
+ - 样式在应用入口引一次:`import "@xihan-ui/styles"`。宿主有无层的 reset / normalize(Tailwind v3 preflight 等)时改引 `@xihan-ui/styles/index.unlayered.css`。
23
+ - Vue 与 React 不需要插件或 provider,按名称 import 即可;Web Components 必须调用一次 `defineXhElements()`(来自 `@xihan-ui/web-components/define`)。
24
+ - 中文界面:Vue 在根组件 `provideXhConfig(zhCN)`,React 用 `<XhConfigProvider config={zhCN}>` 包住应用,语言包从 `@xihan-ui/vue/locale`、`@xihan-ui/react/locale` 取;不要逐个实例传 `translations`。
25
+
26
+ ## 组件写法
27
+
28
+ - 每个部件一个组件:`Xh` + 组件名 + 部件名,如 `XhDialogRoot` / `XhDialogTrigger` / `XhDialogContent`;只有一个部件的组件不带后缀(`XhButton`、`XhSwitch`)。Vue 与 React 同名。
29
+ - 不少组件的 Root 传入 `collection` 等数据即可自动铺出结构(如 `<XhSelectRoot :collection="items" />`),需要自定义时再按部件组合;以 `xihan_ui_info` 的部件与 Props 为准。
30
+ - 值类组件受控优先:Vue 用 `v-model:value` / `v-model:open` / `v-model:checked`,只传 `default*` 为非受控;React 用 `value` + `onValueChange={({ value }) => …}`,回调载荷是明细对象。
31
+ - Web Components 是 Light DOM 行为宿主:结构由作者写,用 `data-xh-part` 标出角色节点(`<xh-dialog><button data-xh-part="trigger">…</button>…</xh-dialog>`)。
32
+ - 视觉轴只有 `size`(sm / md / lg)、`variant`(outline / subtle / ghost,可按下的面多一档 solid)与 `tone`(brand / neutral / danger / warning / success / info)。不存在 `type="primary"`、`bordered`、`plain` 之类的属性。
33
+
34
+ ## 样式与主题
35
+
36
+ - 不改类名、不写内联样式去改组件外观。覆盖写进 `@layer xihan.overrides`,选择器用部件属性:`[data-scope="select"][data-part="trigger"]`,状态用 `data-state`、`data-disabled` 等数据属性。
37
+ - 只用令牌,不写散值:颜色 `--xh-bg-*` / `--xh-fg-*` / `--xh-border-*`,间距 `--xh-space-*`(4px 网格),圆角 `--xh-shape-control` / `--xh-shape-surface` / `--xh-shape-overlay`,控件高 `--xh-control-h-*`,阴影 `--xh-elevation-*`,动效 `--xh-motion-*`。
38
+ - 只改某个组件时用它的覆盖槽 `--xh-<组件>-*`(`xihan_ui_parts` 列出全部),改全局时改语义令牌。
39
+ - 品牌色用 `@xihan-ui/tokens/runtime` 的 `registerBrand` 从一个种子色派生;明暗、密度、对比度、动效偏好用 `createVisualEnvironmentController` 写到根元素上。
40
+ - 设计取舍:中性克制,只有 Button 缺省品牌实心;边界由描边承担,阴影只表达抬升;品牌淡底只表示「选中 / 当前」;状态不能只靠颜色表达。完整规则见 `xihan_ui_design_md` 或 https://ui.docs.xihanfun.com/design.md 。
41
+
42
+ ## 常见错误
43
+
44
+ - 照搬别的组件库的 API(`type="primary"`、`visible`、`onOk`、`dataSource`),或给组件起不存在的名字。
45
+ - 忘了引 `@xihan-ui/styles`,组件渲染成没有样式的裸元素;宿主有无层 reset 却引了有层版本,同样表现为样式失效。
46
+ - Web Components 没调用 `defineXhElements()`,或子节点漏写 `data-xh-part`。
47
+ - 在样式里写 `#1677ff`、`6px`、`box-shadow: 0 2px 8px …` 这类散值,或用 `!important` 压皮肤。
48
+ - 手写 `role`、`aria-expanded` / `aria-controls` 这类状态与关联属性或部件 `id`:它们由 connect 生成,重复写会冲突;可访问名称(`aria-label`)仍由作者提供。