@xihan-ui/cli 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/data/changelog.md +22 -0
- package/data/components.json +1 -1
- package/data/demos.json +1 -1
- package/data/design.md +28 -26
- package/data/meta.json +1 -1
- package/data/pages.json +1 -1
- package/data/tokens.json +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1304 -2
- package/dist/index.js.map +1 -1
- package/dist/surface.generated.json +3802 -0
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +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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"}
|
|
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/migrate.ts","../src/migrations/v2.ts","../src/migrations/v3.ts","../src/migrations/v4.ts","../src/migrations/v5.ts","../src/migrations/index.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// migrate 命令的改写引擎:按每个 major 的规则改源码里的导入、组件、属性、事件、部件、元素、CSS 变量与关键帧,\n// 改不了的(规则里的 manual 与本 major 删掉的名字)报出位置。\n//\n// 只按文本改,不跑类型检查:组件标签按最长的组件标识前缀归属(XhContextMenuRoot 归 context-menu),\n// 属性与事件只在归属对上的标签里改;名字够独特的(Xh 开头的组件、--xh- 开头的变量)全文按整词改。\n// 不碰不认识的文件:没提到 @xihan-ui、Xh 组件、xh- 元素、--xh- 变量与 data-scope 的文件原样跳过。\n\nimport type { MajorMigration, MigrationRules, SurfaceDiff } from './migrations'\nimport type { ComponentRename, ElementRename, EventRename, PropRename, ScopedRename } from './migrations/types'\nimport { readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { join, relative, resolve, sep } from 'node:path'\n\nexport type Dialect = 'vue' | 'jsx' | 'html' | 'css' | 'script'\n\nexport interface MigrationFinding {\n readonly line: number\n readonly message: string\n}\n\nexport interface SourceMigration {\n readonly text: string\n /** 改了几处。 */\n readonly edits: number\n /** 要人工处理的地方,按行号排列。 */\n readonly findings: readonly MigrationFinding[]\n}\n\nconst DIALECTS: Readonly<Record<string, Dialect>> = {\n '.vue': 'vue',\n '.tsx': 'jsx',\n '.jsx': 'jsx',\n '.html': 'html',\n '.htm': 'html',\n '.css': 'css',\n '.scss': 'css',\n '.sass': 'css',\n '.less': 'css',\n '.ts': 'script',\n '.mts': 'script',\n '.cts': 'script',\n '.js': 'script',\n '.mjs': 'script',\n '.cjs': 'script',\n}\n\n/** 按扩展名认写法;不认识的扩展名返回 undefined,迁移时跳过。 */\nexport function dialectOf(file: string): Dialect | undefined {\n const dot = file.lastIndexOf('.')\n return dot < 0 ? undefined : DIALECTS[file.slice(dot).toLowerCase()]\n}\n\nconst LIBRARY = /@xihan-ui\\/|\\bXh[A-Z]|<xh-|['\"`]xh-|--xh-|data-scope|data-xh-|xh-scope-/\n\nconst escape = (text: string): string => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\nconst kebab = (name: string): string => name.replace(/[A-Z]/g, (char, index: number) => `${index > 0 ? '-' : ''}${char.toLowerCase()}`)\nconst camel = (name: string): string => name.replace(/-([a-z0-9])/g, (_, char: string) => char.toUpperCase())\nconst pascal = (name: string): string => camel(name).replace(/^[a-z]/, char => char.toUpperCase())\n\n/** 改写过程的状态:当前文本、改了几处、报了哪些。 */\nclass Draft {\n edits = 0\n private readonly found = new Map<string, MigrationFinding>()\n\n constructor(public text: string) {}\n\n /** 全文按正则替换,计数。 */\n replace(pattern: RegExp, replacer: (match: RegExpExecArray) => string | undefined): void {\n let out = ''\n let last = 0\n for (const match of this.text.matchAll(pattern)) {\n const next = replacer(match as RegExpExecArray)\n if (next === undefined || next === match[0])\n continue\n out += this.text.slice(last, match.index) + next\n last = match.index! + match[0].length\n this.edits++\n }\n if (last > 0)\n this.text = out + this.text.slice(last)\n }\n\n /** 按区间改:区间互不重叠,从后往前套用。 */\n splice(edits: Array<{ start: number, end: number, text: string }>): void {\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n this.text = this.text.slice(0, edit.start) + edit.text + this.text.slice(edit.end)\n this.edits++\n }\n }\n\n report(index: number, message: string): void {\n const line = this.text.slice(0, index).split('\\n').length\n this.found.set(`${line}\\u0000${message}`, { line, message })\n }\n\n get findings(): MigrationFinding[] {\n return [...this.found.values()].sort((a, b) => a.line - b.line)\n }\n}\n\n// —— 标签与属性 ——\n\ninterface Attribute {\n readonly start: number\n readonly end: number\n readonly name: string\n /** 值的原文(不含引号与花括号);没写值时 undefined。 */\n readonly value?: string\n readonly quoted: boolean\n readonly braced: boolean\n}\n\ninterface Tag {\n readonly start: number\n readonly end: number\n readonly name: string\n readonly attributes: readonly Attribute[]\n}\n\n/** 从 open 处的开括号走到配对的闭括号,跳过字符串。 */\nfunction skipBalanced(text: string, open: number, close: string, start: string): number {\n let depth = 0\n for (let i = open; i < text.length; i++) {\n const char = text[i]!\n if (char === '\"' || char === '\\'' || char === '`') {\n i = text.indexOf(char, i + 1)\n if (i < 0)\n return text.length\n continue\n }\n if (char === start)\n depth++\n else if (char === close && --depth === 0)\n return i\n }\n return text.length\n}\n\nfunction parseAttributes(text: string, from: number, to: number): Attribute[] {\n const out: Attribute[] = []\n let i = from\n while (i < to) {\n const char = text[i]!\n if (/\\s|\\//.test(char)) {\n i++\n continue\n }\n if (char === '{') {\n i = skipBalanced(text, i, '}', '{') + 1\n continue\n }\n const name = /^[^\\s=>/'\"{}]+/.exec(text.slice(i, to))\n if (!name) {\n i++\n continue\n }\n const start = i\n i += name[0].length\n let j = i\n while (j < to && /\\s/.test(text[j]!)) j++\n if (text[j] !== '=') {\n out.push({ start, end: i, name: name[0], quoted: false, braced: false })\n continue\n }\n j++\n while (j < to && /\\s/.test(text[j]!)) j++\n const quote = text[j]\n if (quote === '\"' || quote === '\\'') {\n const close = text.indexOf(quote, j + 1)\n const end = close < 0 ? to : close + 1\n out.push({ start, end, name: name[0], value: text.slice(j + 1, end - 1), quoted: true, braced: false })\n i = end\n }\n else if (quote === '{') {\n const close = skipBalanced(text, j, '}', '{')\n out.push({ start, end: close + 1, name: name[0], value: text.slice(j + 1, close).trim(), quoted: false, braced: true })\n i = close + 1\n }\n else {\n const bare = /^[^\\s>]*/.exec(text.slice(j, to))![0]\n out.push({ start, end: j + bare.length, name: name[0], value: bare, quoted: false, braced: false })\n i = j + bare.length\n }\n }\n return out\n}\n\n/** 文本里的 Xh 组件标签与 xh- 元素标签(开标签)。 */\nfunction scanTags(text: string): Tag[] {\n const out: Tag[] = []\n for (const match of text.matchAll(/<(Xh[A-Z][\\w.]*|xh-[a-z][\\w-]*)/g)) {\n const start = match.index!\n const nameEnd = start + match[0].length\n if (!/[\\s/>]/.test(text[nameEnd] ?? ''))\n continue\n let end = nameEnd\n for (; end < text.length; end++) {\n const char = text[end]!\n if (char === '\"' || char === '\\'') {\n const close = text.indexOf(char, end + 1)\n end = close < 0 ? text.length : close\n }\n else if (char === '{') {\n end = skipBalanced(text, end, '}', '{')\n }\n else if (char === '>' || char === '<') {\n break\n }\n }\n out.push({ start, end, name: match[1]!, attributes: parseAttributes(text, nameEnd, end) })\n }\n return out\n}\n\n/** 标签归到组件:Xh 组件按短横线写法、xh- 元素去掉前缀,取最长的组件标识前缀。 */\nfunction scopeOf(tag: string, scopes: ReadonlySet<string>): string | undefined {\n const words = (tag.startsWith('Xh') ? kebab(tag.slice(2)) : tag.slice(3)).split('-')\n for (let size = words.length; size > 0; size--) {\n const candidate = words.slice(0, size).join('-')\n if (scopes.has(candidate))\n return candidate\n }\n return undefined\n}\n\n/** 属性名拆成前缀(: v-bind: @ v-on:)、本名与修饰符。 */\nfunction splitName(name: string): { prefix: string, base: string, modifiers: string } {\n const match = /^(:|v-bind:|@|v-on:)?([^.]+)(\\..*)?$/.exec(name)\n return { prefix: match?.[1] ?? '', base: match?.[2] ?? name, modifiers: match?.[3] ?? '' }\n}\n\nconst isEventPrefix = (prefix: string): boolean => prefix === '@' || prefix === 'v-on:'\n\n/** 新属性名按原写法的风格出:原来是短横线或在模板与 HTML 里就写短横线,JSX 里写驼峰。 */\nfunction styled(base: string, to: string, dialect: Dialect): string {\n if (base.includes('-'))\n return kebab(to)\n if (/[A-Z]/.test(base))\n return to\n return dialect === 'jsx' ? to : kebab(to)\n}\n\n/** 属性改名;名字对上了就返回 true(改了或报了),后面不再按删除清单报它。 */\nfunction rewriteProp(rule: PropRename, attribute: Attribute, dialect: Dialect, draft: Draft, edits: Array<{ start: number, end: number, text: string }>): boolean {\n const { prefix, base } = splitName(attribute.name)\n if (isEventPrefix(prefix) || camel(base) !== rule.from)\n return false\n const name = styled(base, rule.to, dialect)\n if (rule.booleanTo === undefined) {\n edits.push({ start: attribute.start, end: attribute.start + prefix.length + base.length, text: prefix + name })\n return true\n }\n const raw = attribute.value?.trim()\n const truthy = raw === undefined\n || (attribute.braced && raw === 'true')\n || (prefix === ':' || prefix === 'v-bind:' ? raw === 'true' : !attribute.braced)\n const falsy = (attribute.braced || prefix !== '') && raw === 'false'\n if (falsy) {\n // 连前面那个空白一起去掉,不留双空格\n const start = /\\s/.test(draft.text[attribute.start - 1] ?? '') ? attribute.start - 1 : attribute.start\n edits.push({ start, end: attribute.end, text: '' })\n return true\n }\n if (!truthy) {\n draft.report(attribute.start, `${rule.from} 写了表达式:改成 ${rule.to},开着时取 ${JSON.stringify(rule.booleanTo)},关着时不写`)\n return true\n }\n const value = rule.booleanTo\n const text = typeof value === 'string'\n ? `${name}=\"${value}\"`\n : dialect === 'jsx' ? `${name}={${value}}` : dialect === 'vue' ? `:${name}=\"${value}\"` : `${name}=\"${value}\"`\n edits.push({ start: attribute.start, end: attribute.end, text })\n return true\n}\n\n/** 事件改名;名字对上了就返回 true。 */\nfunction rewriteEvent(rule: EventRename, attribute: Attribute, edits: Array<{ start: number, end: number, text: string }>): boolean {\n const { prefix, base, modifiers } = splitName(attribute.name)\n if (isEventPrefix(prefix) && kebab(camel(base)) === rule.from) {\n edits.push({ start: attribute.start, end: attribute.start + attribute.name.length, text: `${prefix}${base.includes('-') || base === base.toLowerCase() ? rule.to : camel(rule.to)}${modifiers}` })\n return true\n }\n if (prefix === '' && base === `on${pascal(rule.from)}`) {\n edits.push({ start: attribute.start, end: attribute.start + base.length, text: `on${pascal(rule.to)}` })\n return true\n }\n return false\n}\n\n/** 标签里的属性与事件改名,顺带报出本 major 删掉的属性。 */\nfunction rewriteTags(draft: Draft, dialect: Dialect, rules: MigrationRules, surface: SurfaceDiff): void {\n const scopes = new Set(surface.scopes)\n const elementTags = new Set(surface.tags)\n const edits: Array<{ start: number, end: number, text: string }> = []\n for (const tag of scanTags(draft.text)) {\n const scope = scopeOf(tag.name, scopes)\n if (!scope)\n continue\n const isElement = elementTags.has(tag.name)\n // JSX 里写的 xh- 元素按 HTML 的 attribute 写法\n const tagDialect: Dialect = tag.name.startsWith('xh-') && dialect !== 'vue' ? 'html' : dialect\n const removedProps = new Set(surface.removed.props[scope] ?? [])\n const removedAttributes = new Set(isElement ? surface.removed.elementAttributes[tag.name] ?? [] : [])\n for (const attribute of tag.attributes) {\n let handled = false\n for (const rule of rules.props ?? []) {\n if (!rule.components.includes(scope))\n continue\n if (rule.only === 'web-components' && !(isElement && dialect !== 'vue'))\n continue\n handled = rewriteProp(rule, attribute, tagDialect, draft, edits) || handled\n }\n for (const rule of rules.events ?? []) {\n if (rule.components.includes(scope))\n handled = rewriteEvent(rule, attribute, edits) || handled\n }\n if (handled)\n continue\n const { prefix, base } = splitName(attribute.name)\n const asProp = isEventPrefix(prefix) ? `on${pascal(base)}` : camel(base)\n if (removedProps.has(asProp) || removedAttributes.has(base))\n draft.report(attribute.start, `${scope} 的 ${attribute.name} 在 ${rules.major}.0 删除了,按更新日志改写`)\n }\n }\n draft.splice(edits)\n}\n\n// —— 导入 ——\n\ninterface ImportSpecifier {\n readonly type: boolean\n readonly name: string\n readonly alias?: string\n}\n\nfunction parseSpecifiers(list: string): ImportSpecifier[] {\n return list.split(',').map(part => part.trim()).filter(Boolean).map((part) => {\n const match = /^(type\\s+)?([\\w$]+)(?:\\s+as\\s+([\\w$]+))?$/.exec(part)\n return match ? { type: Boolean(match[1]), name: match[2]!, alias: match[3] } : { type: false, name: part }\n })\n}\n\nconst printSpecifier = (spec: ImportSpecifier): string => `${spec.type ? 'type ' : ''}${spec.name}${spec.alias ? ` as ${spec.alias}` : ''}`\n\n/** 一组名字从一个模块搬到另一个模块:改导入语句,没起别名的顺带改文件里的用处。 */\nfunction moveImports(draft: Draft, from: string, to: string, names: Readonly<Record<string, string | true>>): void {\n const locals = new Map<string, string>()\n const pattern = /import\\s+(type\\s+)?\\{([^}]*)\\}\\s*from\\s*(['\"])([^'\"]+)\\3(\\s*;)?/g\n draft.replace(pattern, (match) => {\n if (match[4] !== from)\n return undefined\n const specifiers = parseSpecifiers(match[2]!)\n const moving = specifiers.filter(spec => Object.hasOwn(names, spec.name))\n if (moving.length === 0)\n return undefined\n const staying = specifiers.filter(spec => !moving.includes(spec))\n const moved = moving.map((spec) => {\n const renamed = names[spec.name] === true ? spec.name : names[spec.name] as string\n if (!spec.alias && renamed !== spec.name)\n locals.set(spec.name, renamed)\n return { ...spec, name: renamed }\n })\n const keyword = match[1] ?? ''\n const quote = match[3]!\n const semi = match[5] ?? ''\n const statement = (specs: ImportSpecifier[], module: string): string => `import ${keyword}{ ${specs.map(printSpecifier).join(', ')} } from ${quote}${module}${quote}${semi}`\n return staying.length > 0 ? `${statement(staying, from)}\\n${statement(moved, to)}` : statement(moved, to)\n })\n for (const [name, renamed] of locals)\n draft.replace(new RegExp(`(?<![\\\\w$.])${escape(name)}(?![\\\\w$])`, 'g'), () => renamed)\n}\n\n/** 从 @xihan-ui 各包导入的名字(导入时的原名)。 */\nfunction libraryImports(text: string): Set<string> {\n const out = new Set<string>()\n for (const match of text.matchAll(/import\\s+(?:type\\s+)?\\{([^}]*)\\}\\s*from\\s*['\"]@xihan-ui\\/[^'\"]+['\"]/g)) {\n for (const spec of parseSpecifiers(match[1]!)) out.add(spec.name)\n }\n return out\n}\n\n// —— 一个 major ——\n\nfunction migrateMajor(draft: Draft, dialect: Dialect, { rules, surface }: MajorMigration): void {\n for (const check of rules.manual ?? []) {\n for (const match of draft.text.matchAll(new RegExp(check.pattern.source, `${check.pattern.flags.replace('g', '')}g`)))\n draft.report(match.index!, check.message)\n }\n\n const modules = Object.entries(rules.modules ?? {}).sort(([a], [b]) => b.length - a.length)\n for (const [from, to] of modules)\n draft.replace(new RegExp(`(['\"\\`])${escape(from)}(?=(?:/[^'\"\\`]*)?\\\\1)`, 'g'), match => `${match[1]}${to}`)\n\n for (const moved of rules.imports ?? [])\n moveImports(draft, moved.from, moved.to, moved.names)\n\n if (dialect !== 'css')\n rewriteTags(draft, dialect, rules, surface)\n\n const identifiers: Record<string, string | ComponentRename> = { ...surface.renamed.identifiers, ...rules.identifiers }\n const imported = libraryImports(draft.text)\n for (const [from, rename] of Object.entries(identifiers)) {\n const to = typeof rename === 'string' ? rename : rename.to\n const attrs = typeof rename === 'string' ? undefined : rename.attrs\n // Xh 开头的组件在模板里可以不经导入(自动引入、全量注册);其余名字(TimeValue 这类)只在从库里导入了它的文件里改\n if (!from.startsWith('Xh') && !imported.has(from))\n continue\n if (from.startsWith('Xh')) {\n // 开标签补属性;Vue 模板里的短横线写法一起改\n for (const [old, next] of [[from, to], [`xh-${kebab(from.slice(2))}`, `xh-${kebab(to.slice(2))}`]] as const) {\n draft.replace(new RegExp(`<${escape(old)}(?=[\\\\s/>])`, 'g'), () => `<${next}${attrs ? ` ${attrs}` : ''}`)\n draft.replace(new RegExp(`</${escape(old)}(?=\\\\s*>)`, 'g'), () => `</${next}`)\n }\n }\n draft.replace(new RegExp(`(?<![\\\\w$])${escape(from)}(?![\\\\w$])`, 'g'), () => to)\n }\n\n const elements: ElementRename[] = [\n ...Object.entries(surface.renamed.elements).map(([from, to]) => ({ from, to })),\n ...rules.elements ?? [],\n ]\n for (const element of elements)\n renameElement(draft, dialect, element)\n\n for (const rename of rules.parts ?? [])\n renamePart(draft, rename)\n\n for (const rule of rules.events ?? [])\n rewriteListeners(draft, rule)\n\n const cssVariables = { ...surface.renamed.cssVariables, ...rules.cssVariables }\n for (const [from, to] of Object.entries(cssVariables))\n draft.replace(new RegExp(`${escape(from)}(?![\\\\w-])`, 'g'), () => to)\n for (const [from, to] of [...Object.entries(rules.keyframes ?? {}), ...Object.entries(rules.dataAttributes ?? {})])\n draft.replace(new RegExp(`(?<![\\\\w-])${escape(from)}(?![\\\\w-])`, 'g'), () => to)\n\n reportRemoved(draft, rules.major, surface)\n}\n\n/** 元素改名:先改元素里的部件,再改开闭标签、字符串里的元素名与样式表里的元素选择器。 */\nfunction renameElement(draft: Draft, dialect: Dialect, { from, to, attrs, parts }: ElementRename): void {\n if (parts)\n renamePartsInside(draft, from, parts)\n draft.replace(new RegExp(`<${escape(from)}(?=[\\\\s/>])`, 'g'), () => `<${to}${attrs ? ` ${attrs}` : ''}`)\n draft.replace(new RegExp(`</${escape(from)}(?=\\\\s*>)`, 'g'), () => `</${to}`)\n draft.replace(new RegExp(`(['\"\\`])${escape(from)}\\\\1`, 'g'), match => `${match[1]}${to}${match[1]}`)\n if (dialect === 'css' || dialect === 'vue' || dialect === 'html')\n draft.replace(new RegExp(`(?<![\\\\w-])${escape(from)}(?=[\\\\s.:#\\\\[{,>+~)])`, 'g'), () => to)\n}\n\n/** 元素块(开标签到同名闭标签)里的 data-xh-part 改名。 */\nfunction renamePartsInside(draft: Draft, tag: string, parts: Readonly<Record<string, string>>): void {\n const block = new RegExp(`<${escape(tag)}(?=[\\\\s/>])[\\\\s\\\\S]*?</${escape(tag)}\\\\s*>`, 'g')\n draft.replace(block, match => match[0].replace(/data-xh-part=([\"'])([\\w-]+)\\1/g, (whole, quote: string, part: string) => {\n const next = parts[part]\n return next ? `data-xh-part=${quote}${next}${quote}` : whole\n }))\n}\n\n/** 部件改名:自写皮肤里 [data-scope][data-part] 与挂载类的写法,Web Components 元素里的 data-xh-part。 */\nfunction renamePart(draft: Draft, { components, from, to }: ScopedRename): void {\n for (const scope of components) {\n const part = `(\\\\[data-part=(['\"]?))${escape(from)}(\\\\2\\\\])`\n draft.replace(new RegExp(`(\\\\[data-scope=(['\"]?)${escape(scope)}\\\\2\\\\]|\\\\.xh-scope-${escape(scope)}(?![\\\\w-]))${part}`, 'g'), match => `${match[1]}${match[3]}${to}${match[5]}`)\n renamePartsInside(draft, `xh-${scope}`, { [from]: to })\n }\n}\n\n/** Web Components 的事件监听:够独特的事件直接改名,与原生事件同名的只报出来。 */\nfunction rewriteListeners(draft: Draft, rule: EventRename): void {\n const pattern = new RegExp(`((?:add|remove)EventListener\\\\(\\\\s*)(['\"\\`])${escape(rule.from)}\\\\2`, 'g')\n if (rule.distinctive) {\n draft.replace(pattern, match => `${match[1]}${match[2]}${rule.to}${match[2]}`)\n return\n }\n const uses = new RegExp(rule.components.map(scope => `<xh-${escape(scope)}(?=[\\\\s/>])|['\"\\`]xh-${escape(scope)}['\"\\`]|Xh${pascal(scope)}Element`).join('|'))\n if (!uses.test(draft.text))\n return\n for (const match of draft.text.matchAll(pattern))\n draft.report(match.index!, `${rule.components.join('、')} 的 ${rule.from} 事件改名 ${rule.to};这里监听的若是这些元素,改成 '${rule.to}'`)\n}\n\n/** 本 major 删掉、迁移后仍出现的名字逐个报出来。 */\nfunction reportRemoved(draft: Draft, major: number, surface: SurfaceDiff): void {\n const { removed } = surface\n const text = draft.text\n const words = new Map<string, number>()\n for (const match of text.matchAll(/[A-Z_$][\\w$]*/gi)) {\n if (!words.has(match[0]))\n words.set(match[0], match.index!)\n }\n // 名字 → 从哪些模块导入。只报确实从删掉它的那个包导入的名字(搬去别处的已经改了导入);\n // Xh 组件在模板里可以不经导入,没被任何导入认领时按出现的位置报\n const importedFrom = new Map<string, string[]>()\n for (const match of text.matchAll(/import\\s+(?:type\\s+)?\\{([^}]*)\\}\\s*from\\s*['\"]([^'\"]+)['\"]/g)) {\n for (const spec of parseSpecifiers(match[1]!))\n importedFrom.set(spec.name, [...importedFrom.get(spec.name) ?? [], match[2]!])\n }\n for (const [pkg, names] of Object.entries(removed.exports)) {\n for (const name of names) {\n const at = words.get(name)\n const modules = importedFrom.get(name)\n const fromPackage = modules?.some(module => module === pkg || module.startsWith(`${pkg}/`))\n if (at !== undefined && (fromPackage || (!modules && name.startsWith('Xh'))))\n draft.report(at, `${name}(${pkg})在 ${major}.0 删除了,按更新日志改写`)\n }\n }\n for (const subpath of removed.subpaths) {\n const at = text.search(new RegExp(`['\"]${escape(subpath)}['\"]`))\n if (at >= 0)\n draft.report(at, `子入口 ${subpath} 在 ${major}.0 删除了`)\n }\n const tokens = (pattern: RegExp): Map<string, number> => {\n const out = new Map<string, number>()\n for (const match of text.matchAll(pattern)) {\n if (!out.has(match[1]!))\n out.set(match[1]!, match.index!)\n }\n return out\n }\n const variables = tokens(/(--xh-[\\w-]+)/g)\n for (const name of removed.cssVariables) {\n const at = variables.get(name)\n if (at !== undefined)\n draft.report(at, `${name} 在 ${major}.0 删除了,按更新日志改写`)\n }\n const kebabWords = tokens(/(?<![\\w-])((?:xh|data)-[\\w-]+)/g)\n for (const name of [...removed.keyframes, ...removed.dataAttributes]) {\n const at = kebabWords.get(name)\n if (at !== undefined)\n draft.report(at, `${name} 在 ${major}.0 删除了,按更新日志改写`)\n }\n for (const element of removed.elements) {\n const at = text.search(new RegExp(`<${escape(element)}(?=[\\\\s/>])|['\"\\`]${escape(element)}['\"\\`]`))\n if (at >= 0)\n draft.report(at, `<${element}> 在 ${major}.0 删除了,按更新日志改写`)\n }\n for (const [scope, parts] of Object.entries(removed.parts)) {\n for (const part of parts) {\n const at = text.search(new RegExp(`(?:\\\\[data-scope=(['\"]?)${escape(scope)}\\\\1\\\\]|\\\\.xh-scope-${escape(scope)}(?![\\\\w-]))\\\\[data-part=(['\"]?)${escape(part)}\\\\2\\\\]`))\n if (at >= 0)\n draft.report(at, `${scope} 的部件 ${part} 在 ${major}.0 删除了,按更新日志改写选择器`)\n }\n }\n}\n\n/** 按从低到高的几套规则改一份源码。 */\nexport function migrateSource(text: string, dialect: Dialect, migrations: readonly MajorMigration[]): SourceMigration {\n if (!LIBRARY.test(text))\n return { text, edits: 0, findings: [] }\n const draft = new Draft(text)\n for (const migration of migrations)\n migrateMajor(draft, dialect, migration)\n return { text: draft.text, edits: draft.edits, findings: draft.findings }\n}\n\n// —— 整个项目 ——\n\n/** 不进去的目录:依赖、产物与点开头的目录(.git、.nuxt 一类)。 */\nconst SKIP_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage', 'out'])\n\nexport interface FileMigration {\n /** 相对 cwd 的路径,斜杠分隔。 */\n readonly file: string\n readonly edits: number\n readonly findings: readonly MigrationFinding[]\n}\n\nexport interface MigrateReport {\n readonly from: number\n readonly to: number\n /** 依次套用了哪几个 major 的规则。 */\n readonly majors: readonly number[]\n /** 改了或有要人工处理的文件。 */\n readonly files: readonly FileMigration[]\n /** 各 major 升级须知里改不了代码的那几条。 */\n readonly notes: ReadonlyArray<{ readonly major: number, readonly notes: readonly string[] }>\n /** 是否写回了文件。 */\n readonly written: boolean\n}\n\nexport interface MigrateOptions {\n readonly migrations: readonly MajorMigration[]\n readonly from: number\n readonly to: number\n /** 要迁移的文件或目录,相对 cwd。 */\n readonly paths: readonly string[]\n readonly cwd: string\n readonly write: boolean\n}\n\nfunction* sourceFiles(entry: string): Generator<string> {\n let stat\n try {\n stat = statSync(entry)\n }\n catch {\n return\n }\n if (stat.isFile()) {\n if (dialectOf(entry))\n yield entry\n return\n }\n for (const dirent of readdirSync(entry, { withFileTypes: true })) {\n if (dirent.name.startsWith('.') || SKIP_DIRS.has(dirent.name))\n continue\n yield* sourceFiles(join(entry, dirent.name))\n }\n}\n\n/** 迁移一组文件或目录;write 为假时只算不写。 */\nexport function migrateProject(options: MigrateOptions): MigrateReport {\n const files: FileMigration[] = []\n for (const path of options.paths) {\n for (const file of sourceFiles(resolve(options.cwd, path))) {\n const text = readFileSync(file, 'utf8')\n const result = migrateSource(text, dialectOf(file)!, options.migrations)\n if (result.edits === 0 && result.findings.length === 0)\n continue\n if (options.write && result.text !== text)\n writeFileSync(file, result.text)\n files.push({ file: relative(options.cwd, file).split(sep).join('/'), edits: result.edits, findings: result.findings })\n }\n }\n return {\n from: options.from,\n to: options.to,\n majors: options.migrations.map(({ rules }) => rules.major),\n files: files.sort((a, b) => a.file.localeCompare(b.file)),\n notes: options.migrations.map(({ rules }) => ({ major: rules.major, notes: rules.notes })),\n written: options.write,\n }\n}\n\n/** 迁移结果写成给人看的 markdown。 */\nexport function renderMigration(report: MigrateReport): string {\n const changed = report.files.filter(file => file.edits > 0)\n const edits = changed.reduce((sum, file) => sum + file.edits, 0)\n const lines = [\n `# 迁移 ${report.from}.x → ${report.to}.0`,\n '',\n `依次套用 ${report.majors.map(major => `${major}.0`).join('、')} 的规则:${changed.length > 0 ? `改写 ${changed.length} 个文件,共 ${edits} 处` : '没有要改的地方'}${report.written || changed.length === 0 ? '' : '(未写回)'}。`,\n ]\n if (changed.length > 0)\n lines.push('', ...changed.map(file => `- ${file.file}:${file.edits} 处`))\n const findings = report.files.flatMap(file => file.findings.map(finding => `- ${file.file}:${finding.line} ${finding.message}`))\n if (findings.length > 0)\n lines.push('', `## 要人工处理(${findings.length} 处)`, '', ...findings)\n for (const { major, notes } of report.notes) {\n if (notes.length > 0)\n lines.push('', `## ${major}.0 升级须知里改不了代码的`, '', ...notes.map(note => `- ${note}`))\n }\n return lines.join('\\n')\n}\n\nexport type { MajorMigration, ScopedRename }\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// 1.x → 2.0。取自更新日志 v2.0.0 的「升级须知」:三个底层包并入 core,八个组件改名,部件、属性与事件改名。\n// 组件改名只写名字片段,逐个导出名、元素名与覆盖槽的对照由生成脚本按两版公开面展开并核对。\n\nimport type { MigrationRules } from './types'\n\nconst EXPANDED_VALUE = ['json-viewer', 'side-nav', 'table', 'tree', 'tree-select']\n\nexport const V2: MigrationRules = {\n major: 2,\n modules: {\n '@xihan-ui/kernel/metadata': '@xihan-ui/core/metadata',\n '@xihan-ui/kernel/skin-check': '@xihan-ui/core/skin-check',\n '@xihan-ui/kernel/vite': '@xihan-ui/core/vite',\n '@xihan-ui/machine/vanilla': '@xihan-ui/core/vanilla',\n '@xihan-ui/behavior/presence': '@xihan-ui/core/presence',\n '@xihan-ui/kernel': '@xihan-ui/core',\n '@xihan-ui/machine': '@xihan-ui/core',\n '@xihan-ui/behavior': '@xihan-ui/core',\n },\n components: {\n Ellipsis: 'Truncate',\n DynamicInput: 'FieldArray',\n Time: 'Timestamp',\n QrCode: 'MatrixCode',\n Calendar: 'CalendarPicker',\n Result: 'EmptyState',\n Space: 'Flex',\n Countdown: 'Timer',\n },\n props: [\n { components: ['password-input'], from: 'visible', to: 'revealed' },\n { components: ['password-input'], from: 'defaultVisible', to: 'defaultRevealed' },\n { components: ['resizable', 'floating-panel'], from: 'size', to: 'dimensions' },\n { components: ['resizable', 'floating-panel'], from: 'defaultSize', to: 'defaultDimensions' },\n { components: ['floating-panel'], from: 'stage', to: 'windowState' },\n { components: ['floating-panel'], from: 'defaultStage', to: 'defaultWindowState' },\n { components: ['table'], from: 'expanded', to: 'expandedValue' },\n { components: ['table'], from: 'defaultExpanded', to: 'defaultExpandedValue' },\n { components: ['steps', 'tour'], from: 'step', to: 'value' },\n { components: ['steps', 'tour'], from: 'defaultStep', to: 'defaultValue' },\n { components: ['mention'], from: 'prefix', to: 'triggerPrefix' },\n { components: ['image-viewer'], from: 'items', to: 'collection' },\n { components: ['toast'], from: 'type', to: 'tone' },\n { components: ['listbox'], from: 'multiple', to: 'selectionMode', booleanTo: 'multiple' },\n ],\n events: [\n { components: ['password-input'], from: 'visibility-change', to: 'revealed-change', distinctive: true },\n { components: ['back-top'], from: 'visible-change', to: 'visibility-change', distinctive: true },\n { components: ['resizable', 'floating-panel'], from: 'size-change', to: 'dimensions-change', distinctive: true },\n { components: ['resizable'], from: 'size-change-end', to: 'dimensions-change-end', distinctive: true },\n { components: ['floating-panel'], from: 'stage-change', to: 'window-state-change', distinctive: true },\n { components: EXPANDED_VALUE, from: 'expanded-change', to: 'expanded-value-change', distinctive: true },\n { components: ['steps', 'tour'], from: 'step-change', to: 'value-change' },\n { components: ['number-animation'], from: 'finish', to: 'complete' },\n { components: ['virtualizer'], from: 'change', to: 'range-change' },\n ],\n parts: [\n { components: ['alert', 'empty-state'], from: 'icon', to: 'indicator' },\n { components: ['avatar-group'], from: 'overflow', to: 'overflow-item' },\n { components: ['checkbox-group'], from: 'trigger', to: 'select-all-trigger' },\n { components: ['clipboard'], from: 'trigger', to: 'copy-trigger' },\n { components: ['combobox', 'listbox'], from: 'item-group', to: 'group' },\n { components: ['combobox', 'listbox'], from: 'item-group-label', to: 'group-label' },\n { components: ['date-picker', 'time-picker'], from: 'presets', to: 'preset-group' },\n { components: ['fieldset'], from: 'helper-text', to: 'description' },\n { components: ['file-upload'], from: 'item-group', to: 'list' },\n { components: ['floating-panel'], from: 'stage-trigger', to: 'window-state-trigger' },\n { components: ['heatmap'], from: 'week-day-label', to: 'week-day' },\n { components: ['page-header'], from: 'subtitle', to: 'description' },\n { components: ['pagination'], from: 'ellipsis', to: 'ellipsis-trigger' },\n { components: ['signature-pad'], from: 'segment', to: 'path' },\n { components: ['skeleton'], from: 'bone', to: 'item' },\n { components: ['slider'], from: 'mark', to: 'tick' },\n { components: ['slider'], from: 'mark-label', to: 'tick-label' },\n { components: ['slider'], from: 'marks', to: 'tick-group' },\n { components: ['sortable'], from: 'item-handle', to: 'item-drag-trigger' },\n { components: ['table'], from: 'loading-state', to: 'loading' },\n { components: ['timer'], from: 'area', to: 'display' },\n { components: ['card'], from: 'body', to: 'content' },\n ],\n dataAttributes: {\n 'data-affixed': 'data-fixed',\n 'data-stage': 'data-window-state',\n 'data-target-stage': 'data-target-window-state',\n },\n manual: [\n { pattern: /\\bdata-borderless\\b/, message: 'data-borderless 删除,改认 data-bordered,取值反转' },\n { pattern: /\\bdata-type\\b/, message: 'data-type 拆分为 data-value-type、data-severity、data-select-mode、data-reveal-mode、data-format,按组件改认' },\n { pattern: /\\bdata-(?:phase|status)\\b/, message: 'data-phase 与六个组件的生命周期 data-status 并入 data-state' },\n { pattern: /\\b(?:XhThread|XhComposer|XhCodeBlock)\\w*|<xh-(?:thread|composer|code-block)\\b/, message: 'thread、composer、code-block 删除,分别改用 message-feed(配合 log)、prompt-input、code-view' },\n { pattern: /\\bXhPopselect\\w*|<xh-popselect\\b/, message: 'popselect 退役:随表单提交的场景改用 select,仅切换视图参数的场景改用 popover 组合 listbox' },\n { pattern: /\\bXhSpace\\b|<xh-space\\b/, message: 'space 并入 flex:XhSpace 未写 gap 时缺省有间距,XhFlex 缺省为 0,迁移后显式写 gap=\"md\"' },\n { pattern: /\\bXhResult\\w*|<xh-result\\b/, message: 'result 并入 empty-state:live 缺省为 polite、缺省尺寸小一号,保持原样写 live=\"off\" 与 size=\"lg\"' },\n { pattern: /(?:\\bXhFlex|<xh-flex\\b)[^>]*\\s:?direction=/, message: 'flex 的 direction 别名删除,只保留 orientation' },\n { pattern: /(?:\\bXh(?:Descriptions|List|Layout|PageHeader)|<xh-(?:descriptions|list|layout|page-header)\\b)[^>]*\\s:?bordered\\b|(?:\\bXhTable|<xh-table\\b)[^>]*\\s:?borderless\\b/, message: 'descriptions、list、layout、page-header 的 bordered 与 table 的 borderless 改为 variant 形态轴' },\n { pattern: /\\b(?:XhConfig|xhConfig)\\b[\\s\\S]{1,80}\\bmotion\\b/, message: 'XhConfig.motion 的隐式全局覆盖移除,视觉环境统一由 createVisualEnvironmentController 管理' },\n { pattern: /\\bXhFormFieldGroup\\b[^>]*\\b:?value=/, message: 'XhFormFieldGroup 的 value 改名为 name(表单字段标识统一为 FormPath)' },\n ],\n notes: [\n '@xihan-ui/kernel、machine、behavior 合并为 @xihan-ui/core,旧包不再发布:导入路径已改,package.json 里的依赖换成 @xihan-ui/core',\n '@xihan-ui/code-highlight 改为可选 peer 依赖,用代码着色的项目自行安装',\n 'select、tags-input、tag-group 的标签统一改用 tag 组件渲染:item-delete-trigger、item-preview、item-text 对应 tag 的 root / label / close-trigger',\n '部件上同名事件处理器统一为使用者的先执行;pin-input 按顺序录入;combobox 等的原生表单提交改为每个值一个同名隐藏字段',\n '读屏文案只接受函数;kbd 的单键与组合键统一为 keys 数组;grid 的 cols / span / offset 增加取值范围校验',\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// 2.x → 3.0。取自更新日志 v3.0.0 的「升级须知」:Toast 并入 Notification、Segmented 并入 RadioGroup,\n// 令牌、组件覆盖槽与关键帧的改名。IconWrapper、GradientText 改写成另一种结构,只报不改。\n\nimport type { MigrationRules } from './types'\n\nexport const V3: MigrationRules = {\n major: 3,\n identifiers: {\n // 轻提示并入通知:组件写 preset=\"toast\"\n XhToastRoot: { to: 'XhNotificationItem', attrs: 'preset=\"toast\"' },\n XhToastRootProps: 'XhNotificationItemProps',\n XhToastIndicator: 'XhNotificationItemIndicator',\n XhToastIndicatorProps: 'XhNotificationItemIndicatorProps',\n XhToastContent: 'XhNotificationItemContent',\n XhToastContentProps: 'XhNotificationItemContentProps',\n XhToastTitle: 'XhNotificationItemTitle',\n XhToastTitleProps: 'XhNotificationItemTitleProps',\n XhToastDescription: 'XhNotificationItemDescription',\n XhToastDescriptionProps: 'XhNotificationItemDescriptionProps',\n XhToastActionTrigger: 'XhNotificationItemActionTrigger',\n XhToastActionTriggerProps: 'XhNotificationItemActionTriggerProps',\n XhToastProgress: 'XhNotificationItemProgress',\n XhToastProgressProps: 'XhNotificationItemProgressProps',\n XhToastCloseTrigger: 'XhNotificationItemCloseTrigger',\n XhToastCloseTriggerProps: 'XhNotificationItemCloseTriggerProps',\n useToast: 'useNotificationItem',\n ToastContext: 'NotificationItemContext',\n useToastContext: 'useNotificationItemContext',\n ToastRootSlotProps: 'NotificationItemSlotProps',\n createToastService: 'createNotificationService',\n ToastService: 'NotificationService',\n ToastServiceOptions: 'NotificationServiceOptions',\n ToastCreateOptions: 'NotificationCreateOptions',\n ToastMessageOptions: 'NotificationMessageOptions',\n ToastPromiseOptions: 'NotificationPromiseOptions',\n withToastSound: 'withNotificationSound',\n ToastSoundOptions: 'NotificationSoundOptions',\n withToastSoundService: 'withNotificationSoundService',\n ToastSoundServicePort: 'NotificationSoundServicePort',\n ToastSoundServiceOptions: 'NotificationSoundServiceOptions',\n ToastSoundKey: 'NotificationSoundKey',\n toastMachine: 'notificationItemMachine',\n ToastSchema: 'NotificationItemSchema',\n ToastApi: 'NotificationItemApi',\n connectToast: 'connectNotificationItem',\n toastAnatomy: 'notificationAnatomy',\n toastKeyboard: 'notificationKeyboard',\n toastMeta: 'notificationMeta',\n resolveToastId: 'resolveNotificationItemId',\n ToastTone: 'NotificationTone',\n ToastRecord: 'NotificationRecord',\n ToastTranslations: 'NotificationTranslations',\n ToastActionDetails: 'NotificationActionDetails',\n ToastPauseSource: 'NotificationPauseSource',\n ToastPressedPart: 'NotificationPressedPart',\n ToastStatusChangeDetails: 'NotificationStatusChangeDetails',\n // 分段控件并入单选组:组件写 variant=\"segmented\"\n XhSegmentedRoot: { to: 'XhRadioGroupRoot', attrs: 'variant=\"segmented\"' },\n XhSegmentedRootProps: 'XhRadioGroupRootProps',\n XhSegmentedIndicator: 'XhRadioGroupThumb',\n XhSegmentedIndicatorProps: 'XhRadioGroupThumbProps',\n XhSegmentedItem: 'XhRadioGroupItem',\n XhSegmentedItemProps: 'XhRadioGroupItemProps',\n XhSegmentedItemText: 'XhRadioGroupItemText',\n XhSegmentedItemTextProps: 'XhRadioGroupItemTextProps',\n useSegmented: 'useRadioGroup',\n useSegmentedContext: 'useRadioGroupContext',\n useSegmentedItemContext: 'useRadioGroupItemContext',\n SegmentedContext: 'RadioGroupContext',\n // 时间列算子收为共享的一份(入参 step 改为 timeStep,见 manual)\n timePickerColumns: 'timeColumns',\n timePickerColumnsFor: 'timeColumnsFor',\n timePickerItemValue: 'timeItemValue',\n TimePickerColumnsOptions: 'TimeColumnsOptions',\n },\n elements: [\n {\n from: 'xh-toast',\n to: 'xh-notification-item',\n attrs: 'preset=\"toast\"',\n parts: {\n 'root': 'item',\n 'indicator': 'item-indicator',\n 'content': 'item-content',\n 'title': 'item-title',\n 'description': 'item-description',\n 'action-trigger': 'item-action-trigger',\n 'progress': 'item-progress',\n 'close-trigger': 'item-close-trigger',\n },\n },\n { from: 'xh-segmented', to: 'xh-radio-group', attrs: 'variant=\"segmented\"', parts: { indicator: 'thumb' } },\n ],\n cssVariables: {\n '--xh-spin-duration': '--xh-motion-loop-spin',\n '--xh-caret-duration': '--xh-motion-loop-caret',\n '--xh-shimmer-duration': '--xh-motion-loop-shimmer',\n '--xh-toast-icon-fg': '--xh-notification-indicator-fg',\n '--xh-toast-scale-collapsed': '--xh-notification-stack-scale',\n '--xh-segmented-bg': '--xh-radio-group-track-bg',\n '--xh-segmented-bg-disabled': '--xh-radio-group-track-bg-disabled',\n '--xh-segmented-border': '--xh-radio-group-track-border',\n '--xh-segmented-border-invalid': '--xh-radio-group-track-border-invalid',\n '--xh-segmented-radius': '--xh-radio-group-track-radius',\n '--xh-segmented-track-padding': '--xh-radio-group-track-padding',\n '--xh-segmented-item-bg-hover': '--xh-radio-group-segment-bg-hover',\n '--xh-segmented-item-bg-pressed': '--xh-radio-group-segment-bg-pressed',\n '--xh-segmented-item-fg': '--xh-radio-group-segment-fg',\n '--xh-segmented-item-fg-checked': '--xh-radio-group-segment-fg-checked',\n '--xh-segmented-item-fg-checked-disabled': '--xh-radio-group-segment-fg-checked-disabled',\n '--xh-segmented-item-fg-hover': '--xh-radio-group-segment-fg-hover',\n '--xh-segmented-item-font-weight': '--xh-radio-group-segment-font-weight',\n '--xh-segmented-item-h': '--xh-radio-group-segment-h',\n '--xh-segmented-item-px': '--xh-radio-group-segment-px',\n '--xh-segmented-item-radius': '--xh-radio-group-segment-radius',\n '--xh-segmented-indicator-bg': '--xh-radio-group-thumb-bg',\n '--xh-segmented-indicator-border': '--xh-radio-group-thumb-border',\n '--xh-segmented-indicator-radius': '--xh-radio-group-thumb-radius',\n '--xh-segmented-indicator-shadow': '--xh-radio-group-thumb-shadow',\n '--xh-segmented-indicator-shadow-disabled': '--xh-radio-group-thumb-shadow-disabled',\n '--xh-icon-wrapper-size': '--xh-icon-frame-size',\n '--xh-icon-wrapper-glyph-size': '--xh-icon-frame-glyph-size',\n '--xh-icon-wrapper-radius': '--xh-icon-frame-radius',\n '--xh-icon-wrapper-bg': '--xh-icon-frame-bg',\n '--xh-icon-wrapper-shadow': '--xh-icon-frame-shadow',\n '--xh-gradient-text-from': '--xh-typography-gradient-from',\n '--xh-gradient-text-to': '--xh-typography-gradient-to',\n },\n keyframes: {\n 'xh-toast-in': 'xh-notification-stack-in',\n 'xh-toast-out': 'xh-notification-stack-out',\n 'xh-spinner-rotate': 'xh-spin',\n 'xh-popconfirm-rotate': 'xh-spin',\n 'xh-switch-rotate': 'xh-spin',\n 'xh-toast-spin': 'xh-spin',\n 'xh-approval-rotate': 'xh-spin',\n 'xh-clipboard-rotate': 'xh-spin',\n 'xh-download-trigger-rotate': 'xh-spin',\n 'xh-notification-spin': 'xh-spin',\n 'xh-reasoning-shimmer': 'xh-shimmer',\n 'xh-tool-call-shimmer': 'xh-shimmer',\n 'xh-skeleton-shimmer': 'xh-shimmer',\n 'xh-approval-in': 'xh-item-in',\n 'xh-message-feed-item-in': 'xh-item-in',\n 'xh-question-flow-in': 'xh-item-in',\n 'xh-tool-call-enter': 'xh-item-in',\n 'xh-approval-result-in': 'xh-pop-in',\n 'xh-message-feed-button-in': 'xh-pop-in',\n 'xh-question-flow-result-in': 'xh-pop-in',\n 'xh-log-button-in': 'xh-pop-in',\n 'xh-reasoning-fade-in': 'xh-fade-in',\n 'xh-clipboard-loading-reveal': 'xh-fade-in',\n 'xh-download-trigger-loading-reveal': 'xh-fade-in',\n 'xh-clipboard-loading-hide': 'xh-fade-out',\n 'xh-diff-view-reveal': 'xh-drop-in',\n 'xh-form-summary-enter': 'xh-drop-in',\n 'xh-dialog-in': 'xh-sheet-in',\n 'xh-dialog-out': 'xh-sheet-out',\n 'xh-notification-in': 'xh-sheet-in',\n 'xh-notification-out': 'xh-sheet-out',\n 'xh-drawer-in-top': 'xh-slide-in',\n 'xh-drawer-in-right': 'xh-slide-in',\n 'xh-drawer-in-bottom': 'xh-slide-in',\n 'xh-drawer-in-left': 'xh-slide-in',\n 'xh-drawer-out-top': 'xh-slide-out',\n 'xh-drawer-out-right': 'xh-slide-out',\n 'xh-drawer-out-bottom': 'xh-slide-out',\n 'xh-drawer-out-left': 'xh-slide-out',\n },\n manual: [\n { pattern: /\\bcreateToastService\\s*\\(/, message: 'createToastService(options) 改为 createNotificationService({ preset: \\'toast\\', ...options }):名字已改,补上 preset: \\'toast\\',否则是两层卡片' },\n { pattern: /\\btoastTranslations\\b/, message: '通知服务的选项 toastTranslations 改为 translations;全局配置的文案桶 translations.toast 改为 translations.notification' },\n { pattern: /\\bresolveToastDuration\\b/, message: 'resolveToastDuration(loading, duration) 改为 resolveNotificationDuration(loading, duration, preset)' },\n { pattern: /\\b(?:removeDelay|remove-delay|TOAST_REMOVE_DELAY)\\b/, message: 'Toast 与 Notification 删除了固定退场窗口 removeDelay,改为等退场动画播完再卸载;要调时长覆盖 --xh-motion-duration-exit' },\n { pattern: /\\bXhIconWrapper\\b|<xh-icon-wrapper\\b/, message: 'IconWrapper 并入 Icon:底框写在图标自己身上,variant 改名 frame,如 <XhIcon :icon=\"FolderIcon\" frame=\"subtle\" tone=\"brand\" size=\"lg\" />' },\n { pattern: /\\bXhGradientText\\b|<xh-gradient-text\\b/, message: 'GradientText 并入 Typography:写成 XhTypographyRoot 里的 XhTypographyText variant=\"gradient\",from / to / direction 改为 --xh-typography-gradient-* 覆盖槽' },\n { pattern: /\\bXhSegmentedHiddenInput\\b/, message: '分段控件并入单选组后每个条目一份原生 radio,不再有整组的 hidden-input,删掉这个部件' },\n { pattern: /\\bscrollElement\\b|\\bscroll-element\\b|\\bgetScrollEl\\b/, message: 'Anchor 的滚动容器 scrollElement 改名 target(与 Affix、BackTop 一致),Headless refs getScrollEl 改为 getTargetEl' },\n { pattern: /(?:\\bXhTime(?:Range)?Picker|<xh-time(?:-range)?-picker\\b)[^>]*\\s:?step=/, message: 'TimePicker / TimeRangePicker 删除 step,改为按单位的 timeStep:step={15} 改为 timeStep={{ minute: 15 }}(Web Components time-step=\\'{\"minute\":15}\\')' },\n { pattern: /\\bisTimeUnavailable\\b/, message: 'isTimeUnavailable 改为 (value, unit, context):时列的 value 恒按 24 小时制,TimeRangePicker 原第三个参数 index 挪进 context.index' },\n { pattern: /\\b(?:TOAST|NOTIFICATION)_(?:DURATION|GAP|MAX|PLACEMENT)\\b/, message: '轻提示与通知的缺省常量改读 NOTIFICATION_PRESETS.<preset> 或 notificationPresetOf(preset)' },\n { pattern: /\\[data-scope=['\"]?toast['\"]?\\]/, message: '[data-scope=\\'toast\\'][data-part=\\'root\\'] 改认 [data-scope=\\'notification\\'][data-part=\\'item\\'][data-preset=\\'toast\\'],其余部件改认 item-<部件>' },\n { pattern: /\\[data-scope=['\"]?segmented['\"]?\\]/, message: '分段控件的选择器改认 [data-scope=\\'radio-group\\'][data-variant=\\'segmented\\'],指示块改认 thumb 部件' },\n ],\n notes: [\n 'Notification、Toast 的叠放测量槽(--xh-toast-offset-collapsed、--xh-toast-height 等)不再公开,叠放收拢比例改由 --xh-motion-scale-stack 逐层计算',\n '键盘统一为 APG 单选组:segmented 形态按 Enter 不再选中,Home / End 不再跳到首末段',\n '缺省值与外观:减弱动效改为去掉位移、保留淡变;Select、Combobox、TreeSelect 的候选面板与字段盒等宽;Tooltip 新增接替窗口 skipDelayDuration',\n 'Headless 的 Badge、EmptyState、Marquee、Skeleton、Spinner、Timestamp、Watermark 改由状态机驱动:connectX(props, normalize) 改为 connectX(service, normalize)',\n '@xihan-ui/motion 的缓动表删除 decelerate 与 accelerate,resolveEasing 认不出写法时抛 TypeError',\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// 3.x → 4.0。本版没有导出、属性、事件与部件的改名;删掉的 60 个组件覆盖槽由删除清单逐个报出。\n\nimport type { MigrationRules } from './types'\n\nexport const V4: MigrationRules = {\n major: 4,\n notes: [\n '缺省值:Accordion variant 改为 outline、Tree variant 改为 ghost、Badge tone 改为 danger,日历的 weekdayFormat 改为 narrow;要保持原样请显式传值',\n 'Fieldset 的禁用会压到整棵子树;Web Components 的字段族宿主缺省 display: contents,写在宿主上的宽度与外边距改写到 root 或用 --xh-control-w',\n '令牌:控件高 sm / md / lg 为 28 / 32 / 36px,圆角 2 / 4 / 8px,--xh-motion-scale-press 为 1(主题写回 0.97 可恢复按下回弹)',\n '删掉的组件覆盖槽集中在字段聚焦环、Dialog、Slider 与日期时间面板,下面逐个报出写到它们的地方',\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// 4.x → 5.0。取自更新日志 v5.0.0 的「升级须知」:能机改的写成规则,其余列进 notes 与 manual。\n\nimport type { MigrationRules } from './types'\n\nconst MENU_FAMILY = ['menu', 'context-menu', 'menubar', 'command', 'mention']\n\nexport const V5: MigrationRules = {\n major: 5,\n imports: [\n {\n from: '@xihan-ui/headless',\n to: '@xihan-ui/core/color',\n names: {\n colorCss: true,\n colorHexToRgba: true,\n colorHslaToRgba: true,\n colorHsvaToRgba: true,\n colorNormalizeHsva: true,\n colorNormalizeRgba: true,\n colorOklchToRgba: true,\n colorParse: true,\n colorRgbaToHex: true,\n colorRgbaToHsla: true,\n colorRgbaToHsva: true,\n colorRgbaToOklch: true,\n colorSameColor: true,\n colorSameRgba: true,\n colorToString: true,\n ColorFormat: true,\n ColorHsla: true,\n ColorHsva: true,\n ColorOklch: true,\n ColorRgba: true,\n },\n },\n {\n from: '@xihan-ui/headless',\n to: '@xihan-ui/core/hotkey',\n names: {\n detectKbdPlatform: true,\n formatHotkey: true,\n matchesHotkey: true,\n resolveKbdPlatform: true,\n HotkeySegment: true,\n KbdPlatform: true,\n KbdResolvedPlatform: true,\n },\n },\n {\n from: '@xihan-ui/tokens',\n to: '@xihan-ui/core/color',\n names: {\n srgbToLinear: 'colorSrgbToLinear',\n linearToSrgb: 'colorLinearToSrgb',\n linearRgbToOklch: 'colorLinearRgbToOklch',\n oklchToLinearRgb: 'colorOklchToLinearRgb',\n parseColorToOklch: 'colorParseOklch',\n inSrgbGamut: 'colorInSrgbGamut',\n clampChroma: 'colorClampChroma',\n formatOklch: 'colorFormatOklch',\n Oklch: 'ColorOklch',\n },\n },\n ],\n identifiers: {\n HeatmapCellDetails: 'HeatmapDatumDetails',\n MenuSelectDetails: 'MenuItemSelectDetails',\n ContextMenuSelectDetails: 'ContextMenuItemSelectDetails',\n MenubarSelectDetails: 'MenubarItemSelectDetails',\n CommandSelectDetails: 'CommandItemSelectDetails',\n MentionSelectDetails: 'MentionItemSelectDetails',\n },\n props: [\n { components: ['tree'], from: 'multiple', to: 'selectionMode', booleanTo: 'multiple' },\n { components: ['table'], from: 'footer', to: 'footerRows', booleanTo: 1 },\n { components: ['dialog', 'drawer'], from: 'role', to: 'dialogRole', only: 'web-components' },\n { components: ['notification'], from: 'title', to: 'titleText', only: 'web-components' },\n ],\n events: [\n { components: ['heatmap'], from: 'cell-press', to: 'datum-press', distinctive: true },\n { components: ['heatmap'], from: 'cell-active', to: 'datum-active', distinctive: true },\n { components: MENU_FAMILY, from: 'select', to: 'item-select' },\n { components: ['popconfirm'], from: 'cancel', to: 'cancel-press' },\n ],\n manual: [\n { pattern: /\\bbuildPeriodGrid\\b[\\s\\S]{0,200}?\\.cells\\b/, message: '日历族的周、月、季度、年视图改为按行渲染:buildPeriodGrid 的 cells 改为 rows,自备格子列表用 calendarPeriodRows(periods, view) 切行' },\n { pattern: /\\bgetFooterRowProps\\(\\s*\\)/, message: '表格的 getFooterRowProps() 改为 getFooterRowProps({ level }),多行表尾每行写 level' },\n { pattern: /\\b(?:getTitleEl|getDescriptionEl|setTitleEl|setDescriptionEl)\\b/, message: 'HoverCard 删去了标题、说明的 refs:自写的标题、说明部件改为经 parts 报告在场' },\n { pattern: /\\bopenSource\\b/, message: 'Citation 的语言包删除了 openSource、source,覆盖过的直接去掉' },\n ],\n notes: [\n '菜单族的 item-indicator 只当对号、只在勾选与单选条目上出现;当图标用的改写 item-icon(ItemIcon)',\n 'Web Components FileUpload 的条目改按 allFiles 对应(远程附件在前、本地文件在后),用了 remoteFiles 的改按 allFiles 铺行',\n '表单校验:只含空白的字符串与元素全为空的数组算空,min / max 对字符串改按字素计数',\n 'React Card:XhCardRoot 的 title、content 改为卡片的标题与正文,不再作为原生属性写到根上',\n 'Web Components 布尔属性改为三态:显式写 =\"false\" 为假,不写交给组件缺省',\n '缺省结构:根组件不写子内容时铺出整套部件;渲染成 <button> 的部件清掉了浏览器缺省样式',\n 'ColorPicker 单选给空数组改为未选,要黑色的改写 [\\'#000000\\']',\n 'headless 直接用状态机的:菜单族的 onSelect 改为 onItemSelect,Popconfirm 的 onCancel 改为 onCancelPress',\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// 各 major 的迁移规则与公开面差异,按 major 升序。\n\nimport type { MigrationRules, SurfaceDiff } from './types'\nimport { readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { V2 } from './v2'\nimport { V3 } from './v3'\nimport { V4 } from './v4'\nimport { V5 } from './v5'\n\nexport interface MajorMigration {\n readonly rules: MigrationRules\n readonly surface: SurfaceDiff\n}\n\nconst RULES: readonly MigrationRules[] = [V2, V3, V4, V5]\n\n/** 有迁移规则的最新 major。 */\nexport const LATEST_MAJOR = RULES.at(-1)!.major\n\n/**\n * 公开面差异有一百多 kB,不打进包:源码里它与本文件同目录,构建时 tsdown 把它拷到 dist/,\n * 与打包后的本模块同目录。只在跑 migrate 时读一次。\n */\nconst SURFACE_FILE = 'surface.generated.json'\nlet diffs: readonly SurfaceDiff[] | undefined\n\nfunction surfaceOf(major: number): SurfaceDiff {\n diffs ??= JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), SURFACE_FILE), 'utf8')) as readonly SurfaceDiff[]\n const surface = diffs.find(diff => diff.major === major)\n if (!surface)\n throw new Error(`${SURFACE_FILE} 里没有 ${major} 的差异,先跑 node build/gen-migrations.mjs`)\n return surface\n}\n\n/** 从 from 迁到 to 要依次套用的几套规则:from 之后、to 及之前的每个 major。 */\nexport function migrationsBetween(from: number, to: number): readonly MajorMigration[] {\n return RULES\n .filter(rules => rules.major > from && rules.major <= to)\n .map(rules => ({ rules, surface: surfaceOf(rules.major) }))\n}\n\nexport type { MigrationRules, SurfaceDiff } from './types'\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 { migrateProject, renderMigration } from './migrate'\nimport { LATEST_MAJOR, migrationsBetween } from './migrations'\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 migrate <从版本> <到版本> [<路径>...] 按每个 major 的规则改写源码:导入、组件、属性、事件、部件、元素、\n [--dry-run] [--check] CSS 变量与关键帧的改名;改不了的报出位置。路径缺省为当前目录,\n --dry-run 只列出不写回,--check 有要改的就以 1 退出\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\n/** 版本写法(4、4.2.0、v4、^4.2.0)取 major。 */\nfunction majorOf(version: string | undefined, usage: string): number {\n const match = /^\\D*(\\d+)/.exec(requireArg(version, usage))\n if (!match)\n throw new UsageError(`版本写法认不出:${version}。用法:xihan-ui ${usage}`)\n return Number(match[1])\n}\n\nfunction runMigrate(positionals: readonly string[], values: Record<string, string | boolean | undefined>, out: CliEnvironment): number {\n const usage = 'migrate <从版本> <到版本> [<路径>...]'\n const from = majorOf(positionals[0], usage)\n const to = majorOf(positionals[1], usage)\n const latest = LATEST_MAJOR\n if (to <= from)\n throw new UsageError(`到版本(${to})要比从版本(${from})新`)\n if (to > latest)\n throw new UsageError(`最新的一套迁移规则是 ${latest}.0,没有到 ${to}.0 的规则`)\n const migrations = migrationsBetween(from, to)\n const report = migrateProject({\n migrations,\n from,\n to,\n paths: positionals.length > 2 ? positionals.slice(2) : ['.'],\n cwd: out.cwd ?? process.cwd(),\n write: !values['dry-run'] && !values.check,\n })\n out.stdout(values.format === 'json' ? JSON.stringify(report, null, 2) : renderMigration(report))\n return values.check && report.files.some(file => file.edits > 0) ? 1 : 0\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 // 迁移只读规则,不读离线知识库\n if (command === 'migrate') {\n if (values.format !== undefined && values.format !== 'markdown' && values.format !== 'json')\n throw new UsageError(`--format 只能是 markdown / json,收到 ${values.format}`)\n return runMigrate(rest, values, out)\n }\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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"}
|