@reglow/reui-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,204 @@
1
+ # @reglow/reui-mcp
2
+
3
+ ReUI 组件库的 **MCP 服务器** 与 **Skills 知识包**,形态对标
4
+ [Semi Design MCP/Skills](https://semi.design/zh-CN/start/mcp-skills):
5
+ MCP 负责「查得到」(组件文档 / 示例 / 源码 / 函数实现 / 检索 / 指南),
6
+ Skills 负责「怎么用」(引入方式、主题、国际化、Nuxt、扩展规范与常见陷阱)。
7
+
8
+ ## 什么是 MCP?
9
+
10
+ Model Context Protocol(MCP)是一种标准化协议,用于连接 AI 助手与外部数据源和工具。通过 MCP,AI 助手可以动态发现和调用各种能力,而无需为每个工具单独集成。
11
+ MCP 的核心价值:
12
+
13
+ - 统一接口:提供标准化的方式让 AI 与外部系统交互
14
+ - 动态发现:AI 可以自动发现可用的工具和资源
15
+ - 易于扩展:新增工具只需实现 MCP 协议即可被 AI 使用
16
+
17
+ ## 什么是 Skills?
18
+
19
+ Skills(技能)是一种模块化的能力扩展方式,允许 AI 助手通过添加预定义的指令和工具来增强其功能。每个 Skill 包含详细的说明文档和相关的代码资源,使 AI 能够在特定任务中表现得更加专业和高效。
20
+ Skills 的核心价值:
21
+
22
+ - 领域专长:为 AI 添加特定领域的专业知识和最佳实践
23
+ - 标准化:统一团队的开发流程和规范
24
+ - 可复用:快速复用成功经验和解决方案
25
+
26
+ ## 快速开始
27
+
28
+ ### 0. 一键配置(推荐,Trae / CodeBuddy / Qoder / Cursor / Claude)
29
+
30
+ 一条命令同时写好 MCP 配置并安装 Skills:
31
+
32
+ ```bash
33
+ npx -y -p @reglow/reui-mcp reui-setup # 默认 trae,codebuddy,qoder
34
+ npx -y -p @reglow/reui-mcp reui-setup --tools trae,qoder # 指定工具
35
+ npx -y -p @reglow/reui-mcp reui-setup --tools all --scope user # 全部工具 / 用户级
36
+ npx -y -p @reglow/reui-mcp reui-setup --dry-run # 先预览再执行
37
+ ```
38
+
39
+ 等价写法:`npx -y @reglow/reui-mcp --setup trae,codebuddy,qoder`。
40
+
41
+ 各工具的项目级落地位置与仍需手动完成的步骤:
42
+
43
+ | 工具 | Skills 目录 | MCP 配置文件 | 仍需手动完成 |
44
+ | ---------------------- | ------------------------------------------------ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
45
+ | **Trae** | `.trae/skills/<skill>/` | `.trae/mcp.json` | 设置 → MCP 打开「启用项目级 MCP」;用户级为 `%APPDATA%/Trae/User/mcp.json`(macOS/Linux 见 `--list-tools`) |
46
+ | **CodeBuddy** | `.codebuddy/skills/<skill>/` | `.mcp.json`(JSONC) | IDE 需在对话面板 CodeBuddy Settings → MCP → Add MCP 粘贴同一条目;CLI 直接生效;用户级 `~/.codebuddy/.mcp.json` |
47
+ | **Qoder** | `.qoder/skills/<skill>/` | `.mcp.json`(或 `.qoder/settings.json`) | 项目级 MCP 默认需批准(或 `mcp.enableAllProjectMcpServers: true`);CLI 可 `qoder mcp add reui-mcp -s project -- npx -y @reglow/reui-mcp`;`/mcp reload` |
48
+ | Cursor / Claude / 通用 | `.cursor/skills/`、`.claude/skills/`、`.skills/` | `.cursor/mcp.json`、`.mcp.json` | 见 `reui-setup --list-tools` 输出 |
49
+
50
+ - 写入是**幂等合并**:只增改 `mcpServers["reui-mcp"]`,其它服务器与顶层字段保持不变;
51
+ 配置文件为非法 JSON 时默认报错不改动,`--force` 会先备份为 `*.bak` 再重写。
52
+ - 查看支持的工具与路径:`npx -y @reglow/reui-mcp --list-tools`。
53
+
54
+ ### 1. 手动配置 MCP(任意客户端)
55
+
56
+ 在 Trae / CodeBuddy / Qoder / Cursor / Claude Desktop 等客户端的 `mcpServers` 中加入:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "reui-mcp": {
62
+ "command": "npx",
63
+ "args": ["-y", "@reglow/reui-mcp"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ 命令行方式(Trae / CodeBuddy / Qoder /Claude Code / Qoder CLI 等):
70
+
71
+ ```bash
72
+ claude mcp add reui-mcp -- npx -y @reglow/reui-mcp
73
+ qoder mcp add reui-mcp -s project -- npx -y @reglow/reui-mcp
74
+ ```
75
+
76
+ ### 2. 仅安装 Skills 知识包
77
+
78
+ ```bash
79
+ npx -y -p @reglow/reui-mcp reui-skills # 默认写入 .trae/skills
80
+ npx -y -p @reglow/reui-mcp reui-skills --target qoder # .qoder/skills
81
+ npx -y -p @reglow/reui-mcp reui-skills --target codebuddy # .codebuddy/skills
82
+ npx -y -p @reglow/reui-mcp reui-skills --all # 全部已知工具目录
83
+ npx -y -p @reglow/reui-mcp reui-skills --list # 查看可用目标
84
+ ```
85
+
86
+ 也可通过主命令安装:`npx -y @reglow/reui-mcp --install-skills --target trae`。
87
+
88
+ 安装后在项目中的位置:
89
+
90
+ ```
91
+ <project>/.trae/skills/reui-components/
92
+ ├── SKILL.md 技能入口(何时使用 + 工具速查 + 硬性规则)
93
+ ├── WORKFLOWS.md MCP 工具工作流与完整任务示例
94
+ ├── BEST_PRACTICES.md 引入方式、主题、i18n、Nuxt、扩展与常见陷阱
95
+ └── COMPONENTS.md 按分类的组件选型清单(含官网文档链接)
96
+ ```
97
+
98
+ ## 工具(Tools)
99
+
100
+ | 工具 | 参数 | 用途 |
101
+ | ------------------------ | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
102
+ | `get_reui_document` | `component?` `category?` `version?` `source?` | 不传 `component` 返回按分类的组件总览;传则返回完整文档(README:用法、示例、Props/Events/Slots 表格、Semantic DOM) |
103
+ | `get_reui_code_examples` | `component` `index?` `lang?` `version?` | 提取文档中可复制的 Vue / TS 示例,保留小节标题 |
104
+ | `list_component_files` | `component` `version?` | 组件源码文件清单(路径 / 行数 / 字节) |
105
+ | `get_file_code` | `component` `file` `startLine?` `endLine?` `version?` | 读取组件目录内文件内容(带路径穿越防护) |
106
+ | `get_function_code` | `component` `name` `file?` `version?` | 提取函数 / 常量 / 类 / 接口的完整实现;未命中时返回相近与可用符号 |
107
+ | `search_reui_docs` | `query` `component?` `category?` `limit?` `version?` | 跨组件文档与源码检索(多关键词「全部命中」),返回 `文件:行号 + 上下文 + 文档链接` |
108
+ | `get_reui_guide` | `topic?` `version?` | 库级指南章节:`overview` / `install` / `theme` / `i18n` / `nuxt` / `build` / `conventions` |
109
+
110
+ 所有返回都以「知识源 + 组件库版本」开头(如 `知识源:项目本地已安装包|组件库版本:0.1.10`),
111
+ 当内容来自官方文档站点兜底时会额外标注 ⚠️,避免 AI 误判文档版本。
112
+
113
+ ## 知识来源
114
+
115
+ 按优先级自动选择,均可用 `version` 参数切换:
116
+
117
+ | 来源 | 触发条件 | 内容 |
118
+ | ------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
119
+ | 仓库工作区 | `--root <reui 仓库路径>` 或在本仓库内运行 | 组件 README + 全部源码 + 库级 `guide.md` |
120
+ | 项目本地安装 | 项目已安装 `@reglow/reui`(默认) | 与项目版本完全一致的文档与源码 |
121
+ | 指定 npm 版本 | 工具的 `version` 参数 / 启动参数 `--default-version` | 下载该版本 tarball 到缓存后离线读取:含 `components/**` 时为完整文档与源码;仅有 `dist/**` 时提供 `.d.ts` 类型 API 与编译产物 |
122
+ | 官方文档站点 | 包内缺少 README 时自动兜底(`source: "site"` 可强制) | 抓取 <https://reglow.huoli.tech/components-library/reui> 组件页并转 Markdown |
123
+
124
+ 缓存目录:`os.tmpdir()/reui-mcp-cache/<version>`(可用环境变量 `REUI_MCP_CACHE` 覆盖)。
125
+
126
+ ## CLI 选项
127
+
128
+ | 选项 | 说明 |
129
+ | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
130
+ | `--root <dir>` | 指定 ReUI 仓库工作区(开发组件库时使用) |
131
+ | `--default-version <ver>` | 工具未传 `version` 时默认使用的版本(如 `0.1.10`、`latest`、`^0.1.0`) |
132
+ | `--no-site` | 禁用官方文档站点兜底(完全离线) |
133
+ | `--check` | 自检:打印知识源、版本、组件数量后退出 |
134
+ | `--setup [tools]` | 一键配置 AI 工具(MCP 配置 + Skills),默认 `trae,codebuddy,qoder`;支持 `--scope user`、`--dry-run`、`--force`、`--skills-only`、`--mcp-only` |
135
+ | `--list-tools` | 列出支持的工具、MCP 配置路径(项目级 / 用户级)与 Skills 目录 |
136
+ | `--install-skills` | 安装 Skills 知识包(可配合 `--target` / `--all` / `--force`) |
137
+ | `--print-config` | 打印 MCP 客户端配置片段 |
138
+ | `-v, --version` / `-h, --help` | 版本 / 帮助 |
139
+
140
+ 三个可执行入口(bin):
141
+
142
+ | 命令 | 作用 |
143
+ | ------------- | ------------------------------------------------------------------------------------------------ |
144
+ | `reui-mcp` | MCP stdio 服务器(默认行为);另提供 `--check` / `--setup` / `--install-skills` / `--list-tools` |
145
+ | `reui-setup` | 为 Trae / CodeBuddy / Qoder 等一键写 MCP 配置 + 安装 Skills |
146
+ | `reui-skills` | 仅把 Skills 知识包装到指定工具目录 |
147
+
148
+ ```bash
149
+ # 自检示例
150
+ npx -y @reglow/reui-mcp --check
151
+ # 查看各工具路径
152
+ npx -y @reglow/reui-mcp --list-tools
153
+ ```
154
+
155
+ ## 开发与测试
156
+
157
+ ```bash
158
+ # 安装依赖(SDK 只在本子包内,@reglow/reui 消费方不受影响)
159
+ cd mcp && npm install
160
+
161
+ # 单测(包含直接用 SDK Client 连接真实 stdio 服务器的端到端用例)
162
+ npx vitest run # 在 mcp/ 目录
163
+ npx vitest run --config mcp/vitest.config.mjs # 或在仓库根目录
164
+
165
+ # 需要联网验证「指定版本」链路时
166
+ $env:REUI_MCP_NETWORK_TEST="1"; npx vitest run # PowerShell
167
+ ```
168
+
169
+ 目录结构:
170
+
171
+ ```
172
+ mcp/
173
+ ├── index.mjs bin:reui-mcp(stdio 服务器入口 / --check / --setup / --install-skills)
174
+ ├── server.mjs MCP 服务器与 7 个工具的实现
175
+ ├── knowledge.mjs 知识源:本地 / 指定版本 / 官网兜底 + 符号提取与检索
176
+ ├── catalog.mjs 内置组件目录(按官网分类,含中文说明与文档链接)
177
+ ├── tar.mjs 零依赖 tgz 解包(PAX / GNU 长文件名)
178
+ ├── site.mjs 官网 HTML → Markdown 兜底抓取
179
+ ├── integrations.mjs AI 工具集成规格(Trae / CodeBuddy / Qoder / Cursor / Claude 的 MCP 配置与 Skills 目录)
180
+ ├── setup.mjs bin:reui-setup(一键写 MCP 配置 + 装 Skills,含 JSONC 解析与幂等合并)
181
+ ├── skills.mjs bin:reui-skills(仅安装 Skills 知识包)
182
+ ├── skills/ 内置 Skills 知识包(随包发布)
183
+ └── __tests__/ 单测(knowledge / tar / site / skills / setup / server 端到端)
184
+ ```
185
+
186
+ > ⚠️ stdio 模式下 **stdout 仅供协议通信**,日志一律走 stderr。
187
+
188
+ ## 发布
189
+
190
+ `@reglow/reui-mcp` 与 `@reglow/reui` 是两个独立包(同仓库、可分别发布,互不拖累依赖):
191
+
192
+ ```bash
193
+ cd mcp
194
+ npm version patch # 按需
195
+ npm publish # 需要 npm 登录且有 @reglow 权限
196
+ ```
197
+
198
+ `files` 已包含 `skills/`,因此 Skills 知识包随 MCP 包一起发布,版本一致。
199
+
200
+ ## 相关资源
201
+
202
+ - 官方文档站点:<https://reglow.huoli.tech/components-library/reui>
203
+ - Model Context Protocol:<https://modelcontextprotocol.io/>
204
+ - Agent Skills:<https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview>
package/catalog.mjs ADDED
@@ -0,0 +1,158 @@
1
+ /**
2
+ * ReUI 组件目录(内置于 MCP 服务器)
3
+ *
4
+ * 数据来源:官方文档站点组件总览 https://reglow.huoli.tech/components-library/reui
5
+ * 用途:
6
+ * - 未指定 component 时返回「按分类的组件总览」;
7
+ * - 为每个组件生成官方文档深链(human 可读的权威来源);
8
+ * - 本地 / 指定版本包内缺少文档时,作为回退抓取的路径映射。
9
+ */
10
+
11
+ /** 官方文档站点基地址 */
12
+ export const DOCS_BASE = "https://reglow.huoli.tech/components-library/reui";
13
+
14
+ /** 分类清单:key 为官网路由段,label 为中文分类名 */
15
+ export const CATEGORIES = [
16
+ {
17
+ key: "general",
18
+ label: "通用",
19
+ components: [
20
+ { name: "button", cn: "按钮", desc: "触发操作的基础按钮" },
21
+ { name: "divider", cn: "分割线", desc: "分隔内容区域" },
22
+ { name: "label", cn: "标签", desc: "表单字段文本标签" },
23
+ { name: "spinner", cn: "加载圈", desc: "基础加载指示" },
24
+ { name: "toggle", cn: "开关", desc: "简单布尔值开关" },
25
+ ],
26
+ },
27
+ {
28
+ key: "layout",
29
+ label: "布局",
30
+ components: [
31
+ { name: "border-beam", cn: "边框光束", desc: "边框发光动画" },
32
+ { name: "masonry-grid", cn: "瀑布流", desc: "瀑布流布局" },
33
+ { name: "splitter", cn: "面板分割", desc: "可拖拽分割面板" },
34
+ ],
35
+ },
36
+ {
37
+ key: "navigation",
38
+ label: "导航",
39
+ components: [
40
+ { name: "affix", cn: "固钉", desc: "滚动时固定元素位置" },
41
+ { name: "breadcrumb", cn: "面包屑", desc: "显示页面层级路径" },
42
+ { name: "dropdown-menu", cn: "下拉菜单", desc: "下拉操作菜单" },
43
+ { name: "tabs", cn: "标签页", desc: "多标签内容切换" },
44
+ ],
45
+ },
46
+ {
47
+ key: "data-entry",
48
+ label: "数据录入",
49
+ components: [
50
+ { name: "autocomplete", cn: "自动完成", desc: "输入时自动补全" },
51
+ { name: "cascader", cn: "级联选择", desc: "多级联动选择" },
52
+ { name: "checkbox", cn: "多选框", desc: "多项选择" },
53
+ { name: "combobox", cn: "组合框", desc: "可搜索选择框" },
54
+ { name: "command", cn: "命令面板", desc: "命令式菜单" },
55
+ { name: "date-picker", cn: "日期选择", desc: "选择日期" },
56
+ { name: "editor", cn: "富文本", desc: "富文本编辑器" },
57
+ { name: "input", cn: "输入框", desc: "基础文本输入" },
58
+ { name: "input-password", cn: "密码输入框", desc: "掩码显示与显隐切换" },
59
+ { name: "input-select", cn: "输入选择", desc: "输入与下拉结合" },
60
+ { name: "native-select", cn: "原生选择", desc: "原生下拉框" },
61
+ { name: "radio", cn: "单选框", desc: "单项选择" },
62
+ { name: "rate", cn: "评分", desc: "星级评分" },
63
+ { name: "segmented", cn: "分段控制", desc: "分段选择" },
64
+ { name: "select", cn: "选择器", desc: "下拉选择" },
65
+ { name: "slide-captcha", cn: "滑块验证", desc: "滑块验证码" },
66
+ { name: "switch", cn: "开关", desc: "受控开关" },
67
+ { name: "tags-input", cn: "标签输入", desc: "标签式输入" },
68
+ { name: "textarea", cn: "多行文本", desc: "多行文本输入" },
69
+ { name: "time-picker", cn: "时间选择", desc: "选择时间" },
70
+ { name: "transfer", cn: "穿梭框", desc: "双栏数据穿梭" },
71
+ { name: "treeselect", cn: "树选择", desc: "树形下拉选择" },
72
+ { name: "upload", cn: "上传", desc: "文件上传" },
73
+ ],
74
+ },
75
+ {
76
+ key: "data-display",
77
+ label: "数据展示",
78
+ components: [
79
+ { name: "audio-player", cn: "音频播放", desc: "音频播放器" },
80
+ { name: "avatar", cn: "头像", desc: "头像展示" },
81
+ { name: "badge", cn: "徽标", desc: "角标与状态点" },
82
+ { name: "calendar", cn: "日历", desc: "日历展示" },
83
+ { name: "card", cn: "卡片", desc: "内容容器卡片" },
84
+ { name: "chat", cn: "对话", desc: "对话气泡组件" },
85
+ { name: "collapsible", cn: "折叠面板", desc: "可折叠内容" },
86
+ { name: "empty", cn: "空状态", desc: "空数据占位" },
87
+ { name: "hover-card", cn: "悬停卡片", desc: "悬停展示详情" },
88
+ { name: "image-viewer", cn: "图片预览", desc: "图片放大预览" },
89
+ { name: "popover", cn: "气泡卡片", desc: "悬浮气泡内容" },
90
+ { name: "pricing-table", cn: "价格表", desc: "定价方案对比" },
91
+ { name: "qr-code", cn: "二维码", desc: "二维码生成" },
92
+ { name: "table", cn: "表格", desc: "数据表格" },
93
+ { name: "tag", cn: "标签", desc: "分类标签" },
94
+ { name: "timeline", cn: "时间轴", desc: "时间线展示" },
95
+ { name: "tooltip", cn: "文字提示", desc: "悬浮文字提示" },
96
+ { name: "tree", cn: "树形控件", desc: "树形结构展示" },
97
+ { name: "video-player", cn: "视频播放", desc: "视频播放器" },
98
+ ],
99
+ },
100
+ {
101
+ key: "feedback",
102
+ label: "反馈",
103
+ components: [
104
+ { name: "alert", cn: "警告提示", desc: "页面级警告提示" },
105
+ { name: "alert-dialog", cn: "警告对话框", desc: "强制确认对话框" },
106
+ { name: "dialog", cn: "对话框", desc: "模态对话框" },
107
+ { name: "drawer", cn: "抽屉", desc: "侧边抽屉面板" },
108
+ { name: "feedback", cn: "反馈", desc: "用户反馈组件" },
109
+ { name: "modal", cn: "模态框", desc: "模态窗口" },
110
+ { name: "notification", cn: "通知", desc: "全局通知" },
111
+ { name: "pop-confirm", cn: "气泡确认", desc: "气泡确认框" },
112
+ { name: "skeleton", cn: "骨架屏", desc: "加载骨架占位" },
113
+ { name: "spin", cn: "加载中", desc: "加载状态" },
114
+ { name: "toast", cn: "轻提示", desc: "轻量提示" },
115
+ ],
116
+ },
117
+ {
118
+ key: "others",
119
+ label: "其他",
120
+ components: [
121
+ { name: "backtop", cn: "回到顶部", desc: "一键回到顶部" },
122
+ { name: "config-provider", cn: "全局配置", desc: "语言与主题配置" },
123
+ { name: "cropper", cn: "图片裁切", desc: "图片裁切" },
124
+ { name: "float-button", cn: "悬浮按钮", desc: "悬浮操作按钮" },
125
+ { name: "overlay", cn: "浮层", desc: "浮层层级管理" },
126
+ { name: "tour", cn: "漫游引导", desc: "分步引导" },
127
+ { name: "watermark", cn: "水印", desc: "页面水印" },
128
+ ],
129
+ },
130
+ ];
131
+
132
+ /** 扁平化的组件索引:name → { name, cn, desc, category, categoryLabel, docsUrl } */
133
+ export const CATALOG = CATEGORIES.flatMap((category) =>
134
+ category.components.map((item) => ({
135
+ ...item,
136
+ category: category.key,
137
+ categoryLabel: category.label,
138
+ docsUrl: `${DOCS_BASE}/components/${category.key}/${item.name}`,
139
+ })),
140
+ );
141
+
142
+ const CATALOG_MAP = new Map(CATALOG.map((item) => [item.name, item]));
143
+
144
+ /** 查询目录项(不存在时返回 undefined) */
145
+ export function catalogItem(name) {
146
+ return CATALOG_MAP.get(String(name ?? "").toLowerCase());
147
+ }
148
+
149
+ /** 组件官网文档链接(未收录于官网的组件返回 null) */
150
+ export function docsUrlFor(name) {
151
+ return catalogItem(name)?.docsUrl ?? null;
152
+ }
153
+
154
+ /** 组件中文名(未收录时回退为组件名) */
155
+ export function componentLabel(name) {
156
+ const item = catalogItem(name);
157
+ return item ? `${item.name} ${item.cn}` : String(name ?? "");
158
+ }
package/cli-utils.mjs ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * CLI 通用工具(reui-mcp / reui-setup / reui-skills 共用)
3
+ */
4
+
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ /**
10
+ * 判断当前模块是否被「直接执行」(而非被 import)
11
+ *
12
+ * 兼容性说明:npm 安装的 bin 在软链场景(`npm link`、`npm i <本地目录>`)下,
13
+ * `process.argv[1]` 是软链路径,而 `import.meta.url` 指向真实路径,
14
+ * 直接字符串比较会判定失败并导致 CLI 静默不执行;因此两侧都做 realpath 归一化。
15
+ *
16
+ * @param {string} importMetaUrl 调用方传入的 `import.meta.url`
17
+ */
18
+ export function isEntryModule(importMetaUrl) {
19
+ const entry = process.argv[1];
20
+ if (!entry) return false;
21
+ const self = fileURLToPath(importMetaUrl);
22
+ const resolved = path.resolve(entry);
23
+ if (resolved === self) return true;
24
+ try {
25
+ return fs.realpathSync(resolved) === fs.realpathSync(self);
26
+ } catch {
27
+ return false;
28
+ }
29
+ }
package/index.mjs ADDED
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * reui-mcp —— ReUI 组件库 MCP 服务器(stdio)
4
+ *
5
+ * 让 AI 助手在写 ReUI 代码时「有据可查」:组件文档、代码示例、源码文件、
6
+ * 函数实现、跨库检索与库级指南,全部来自项目本地已安装的 @reglow/reui
7
+ * (或指定 npm 版本 / 官方文档站点兜底)。
8
+ *
9
+ * 用法(客户端 mcpServers 配置中作为 command + args):
10
+ * npx -y @reglow/reui-mcp # 使用项目本地已安装版本
11
+ * npx -y @reglow/reui-mcp --root D:/path/to/reui # 指定工作区(开发组件库时)
12
+ * npx -y @reglow/reui-mcp --default-version 0.1.10 # 固定知识版本
13
+ * npx -y @reglow/reui-mcp --check # 自检:打印知识源与组件数量后退出
14
+ * npx -y @reglow/reui-mcp --setup # 为 Trae/CodeBuddy/Qoder 一键写 MCP 配置 + 装 Skills
15
+ * npx -y @reglow/reui-mcp --install-skills # 仅安装 Skills 知识包(等价于 reui-skills)
16
+ */
17
+
18
+ import fs from "node:fs";
19
+ import path from "node:path";
20
+ import { fileURLToPath } from "node:url";
21
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
22
+ import { createKnowledgeResolver, createServer } from "./server.mjs";
23
+ import { installSkills, mcpConfigSnippet, runSkillsCli } from "./skills.mjs";
24
+ import { DEFAULT_SETUP_TOOLS } from "./integrations.mjs";
25
+ import { renderToolList, runSetupCli } from "./setup.mjs";
26
+
27
+ const PACKAGE_DIR = path.dirname(fileURLToPath(import.meta.url));
28
+ const OWN_PACKAGE = JSON.parse(
29
+ fs.readFileSync(path.join(PACKAGE_DIR, "package.json"), "utf8"),
30
+ );
31
+
32
+ const USAGE = [
33
+ `reui-mcp v${OWN_PACKAGE.version} —— ReUI 组件库 MCP 服务器`,
34
+ "",
35
+ "用法:reui-mcp [选项]",
36
+ "",
37
+ "选项:",
38
+ " --root <dir> ReUI 仓库工作区路径(未指定时自动解析项目本地已安装的 @reglow/reui)",
39
+ " --default-version <ver> 工具未传 version 时默认使用的 @reglow/reui 版本(如 0.1.10、latest)",
40
+ " --no-site 禁用官方文档站点兜底(完全离线)",
41
+ " --check 自检:打印知识源、版本与组件数量后退出",
42
+ ` --setup [tools] 一键配置 AI 工具(MCP 配置 + Skills),默认 ${DEFAULT_SETUP_TOOLS.join(",")}`,
43
+ " 例:--setup trae,codebuddy,qoder / --setup all;支持 --scope user --dry-run --force",
44
+ " --install-skills 仅安装 Skills 知识包(可配合 --target / --all / --force)",
45
+ " --list-tools 列出支持的工具、MCP 配置路径与 Skills 目录",
46
+ " --print-config 打印 MCP 客户端配置片段后退出",
47
+ " -v, --version 打印版本号",
48
+ " -h, --help 显示帮助",
49
+ "",
50
+ "MCP 客户端配置示例(Trae / Cursor / Claude Desktop 的 mcpServers):",
51
+ JSON.stringify(mcpConfigSnippet(), null, 2),
52
+ ].join("\n");
53
+
54
+ function parseArgs(argv) {
55
+ const options = {
56
+ root: undefined,
57
+ defaultVersion: undefined,
58
+ allowSite: true,
59
+ };
60
+ const passthrough = [];
61
+ for (let i = 0; i < argv.length; i += 1) {
62
+ const arg = argv[i];
63
+ if (arg === "--root") options.root = argv[++i];
64
+ else if (arg.startsWith("--root="))
65
+ options.root = arg.slice("--root=".length);
66
+ else if (arg === "--default-version") options.defaultVersion = argv[++i];
67
+ else if (arg.startsWith("--default-version="))
68
+ options.defaultVersion = arg.slice("--default-version=".length);
69
+ else if (arg === "--no-site") options.allowSite = false;
70
+ else if (arg === "--check") options.check = true;
71
+ else if (arg === "--print-config") options.printConfig = true;
72
+ else if (arg === "--help" || arg === "-h") options.help = true;
73
+ else if (arg === "-v" || arg === "--version") options.ownVersion = true;
74
+ else passthrough.push(arg);
75
+ }
76
+ options.passthrough = passthrough;
77
+ return options;
78
+ }
79
+
80
+ async function main() {
81
+ const argv = process.argv.slice(2);
82
+
83
+ // 工具配置命令(`--setup [tools]` / `setup [tools]`)
84
+ if (argv.includes("--setup") || argv[0] === "setup") {
85
+ const index = argv.findIndex((arg) => arg === "--setup" || arg === "setup");
86
+ // 去掉 --setup 本体,其余参数(含位置形式的目标工具清单)原样交给 reui-setup
87
+ process.exitCode = runSetupCli(argv.filter((_, i) => i !== index));
88
+ return;
89
+ }
90
+
91
+ if (argv.includes("--list-tools")) {
92
+ console.log(renderToolList({ cwd: process.cwd() }));
93
+ return;
94
+ }
95
+
96
+ // Skills 安装命令(支持 `--install-skills` 与 `install-skills` 两种写法)
97
+ if (argv.includes("--install-skills") || argv[0] === "install-skills") {
98
+ const rest = argv.filter(
99
+ (arg) => arg !== "--install-skills" && arg !== "install-skills",
100
+ );
101
+ process.exitCode = runSkillsCli(rest);
102
+ return;
103
+ }
104
+
105
+ const options = parseArgs(argv);
106
+ if (options.help) {
107
+ console.log(USAGE);
108
+ return;
109
+ }
110
+ if (options.ownVersion) {
111
+ console.log(OWN_PACKAGE.version);
112
+ return;
113
+ }
114
+ if (options.printConfig) {
115
+ console.log(JSON.stringify(mcpConfigSnippet(), null, 2));
116
+ return;
117
+ }
118
+
119
+ const logger = (message) => console.error(message);
120
+ const resolveKnowledge = createKnowledgeResolver({
121
+ root: options.root,
122
+ logger,
123
+ });
124
+ const knowledge = await resolveKnowledge(options.defaultVersion);
125
+
126
+ if (options.check) {
127
+ const meta = knowledge.meta();
128
+ const components = knowledge.listComponents();
129
+ console.log(
130
+ JSON.stringify(
131
+ {
132
+ package: OWN_PACKAGE.name,
133
+ packageVersion: OWN_PACKAGE.version,
134
+ knowledgeSource: meta.source,
135
+ reuiVersion: meta.version,
136
+ root: meta.root,
137
+ warning: meta.warning,
138
+ componentCount: components.length,
139
+ components: components.map((entry) => entry.name),
140
+ allowSiteFallback: options.allowSite,
141
+ },
142
+ null,
143
+ 2,
144
+ ),
145
+ );
146
+ return;
147
+ }
148
+
149
+ if (options.allowSite === false) {
150
+ logger("[reui-mcp] 已禁用官方文档站点兜底(--no-site)");
151
+ }
152
+ const server = createServer({
153
+ resolveKnowledge,
154
+ defaultKnowledge: knowledge,
155
+ });
156
+ const transport = new StdioServerTransport();
157
+ await server.connect(transport);
158
+ logger(
159
+ `[reui-mcp] 已启动:knowledge=${knowledge.meta().source} version=${knowledge.meta().version} ` +
160
+ `components=${knowledge.listComponents().length}`,
161
+ );
162
+ }
163
+
164
+ main().catch((error) => {
165
+ console.error(`[reui-mcp] 启动失败:${error?.stack ?? error}`);
166
+ process.exitCode = 1;
167
+ });
168
+
169
+ export { installSkills };