@blueking/bkui-knowledge 0.0.1-beta.1 → 0.0.1-beta.10
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 +166 -58
- package/bin/bkui-knowledge.js +147 -82
- package/knowledge/manifest.json +38 -1
- package/knowledge/skills/.template/README.md +1 -1
- package/knowledge/skills/bk-security-redlines/SKILL.md +47 -0
- package/knowledge/skills/bk-security-redlines/references/auth-check.md +73 -0
- package/knowledge/skills/bk-security-redlines/references/data-encryption.md +78 -0
- package/knowledge/skills/bk-security-redlines/references/input-validation.md +96 -0
- package/knowledge/skills/bk-skill-creator/SKILL.md +37 -0
- package/knowledge/skills/bk-skill-creator/references/common-mistakes.md +43 -0
- package/knowledge/skills/bk-skill-creator/references/quick-start.md +42 -0
- package/knowledge/skills/bk-skill-creator/references/skill-checklist.md +93 -0
- package/knowledge/skills/bk-skill-creator/references/structure-guide.md +88 -0
- package/knowledge/skills/bk-skill-creator/references/writing-tips.md +153 -0
- package/knowledge/skills/bkui-quick-start/SKILL.md +52 -0
- package/knowledge/skills/bkui-quick-start/references/components-list.md +17 -0
- package/knowledge/skills/bkui-quick-start/references/skills-index.md +26 -0
- package/knowledge/skills/external/vue-skills/LICENSE +21 -0
- package/knowledge/skills/external/vue-skills/README.md +69 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/SKILL.md +42 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/codeactions-save-performance.md +79 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/data-attributes-config.md +74 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/deep-watch-numeric.md +102 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/define-model-update-event.md +79 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/duplicate-plugin-detection.md +102 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/fallthrough-attributes.md +63 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/hmr-vue-ssr.md +124 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/module-resolution-bundler.md +81 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/pinia-store-mocking.md +159 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/script-setup-jsdoc.md +85 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/strict-css-modules.md +68 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/unplugin-auto-import-conflicts.md +97 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/volar-3-breaking-changes.md +66 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-directive-comments.md +73 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-router-typed-params.md +81 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-tsc-strict-templates.md +69 -0
- package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/with-defaults-union-types.md +102 -0
- package/knowledge/skills/web-security-guide/SKILL.md +48 -0
- package/knowledge/skills/web-security-guide/references/access-control.md +123 -0
- package/knowledge/skills/web-security-guide/references/auth-session.md +99 -0
- package/knowledge/skills/web-security-guide/references/csrf.md +59 -0
- package/knowledge/skills/web-security-guide/references/data-exposure.md +108 -0
- package/knowledge/skills/web-security-guide/references/deserialization.md +59 -0
- package/knowledge/skills/web-security-guide/references/injection.md +357 -0
- package/knowledge/skills/web-security-guide/references/logging-monitoring.md +47 -0
- package/knowledge/skills/web-security-guide/references/security-config.md +73 -0
- package/knowledge/skills/web-security-guide/references/ssrf.md +55 -0
- package/knowledge/skills/web-security-guide/references/xss.md +134 -0
- package/package.json +3 -3
- package/server/mcp-core.js +48 -33
package/README.md
CHANGED
|
@@ -10,20 +10,57 @@
|
|
|
10
10
|
|
|
11
11
|
只需添加 MCP 服务配置:
|
|
12
12
|
|
|
13
|
+
### Cursor(默认)
|
|
14
|
+
|
|
13
15
|
```json
|
|
14
16
|
{
|
|
15
17
|
"mcpServers": {
|
|
16
18
|
"bkui-knowledge": {
|
|
17
19
|
"command": "npx",
|
|
18
|
-
"args": ["-y", "@blueking/bkui-knowledge"]
|
|
20
|
+
"args": ["-y", "@blueking/bkui-knowledge", "${workspaceFolder}"]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### CodeBuddy
|
|
27
|
+
|
|
28
|
+
在 CodeBuddy 设置 > MCP 标签页中添加:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"bkui-knowledge": {
|
|
33
|
+
"command": "npx",
|
|
34
|
+
"args": ["-y", "@blueking/bkui-knowledge", "--ide=codebuddy"]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> 💡 通过 `--ide` 参数指定目标 IDE,不指定时默认使用 Cursor
|
|
40
|
+
|
|
41
|
+
### 本地开发
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"mcpServers": {
|
|
46
|
+
"bkui-knowledge": {
|
|
47
|
+
"command": "node",
|
|
48
|
+
"args": [
|
|
49
|
+
"/path/to/bkui-knowledge/bin/bkui-knowledge.js",
|
|
50
|
+
"${workspaceFolder}"
|
|
51
|
+
]
|
|
19
52
|
}
|
|
20
53
|
}
|
|
21
54
|
}
|
|
22
55
|
```
|
|
23
56
|
|
|
57
|
+
> ⚠️ 必须传递项目路径,否则 skills 无法同步到正确位置
|
|
58
|
+
|
|
24
59
|
**特性:**
|
|
25
|
-
|
|
26
|
-
- ✅
|
|
60
|
+
|
|
61
|
+
- ✅ 支持 Cursor 和 CodeBuddy 两种 IDE
|
|
62
|
+
- ✅ 首次启动自动同步推荐 skills
|
|
63
|
+
- ✅ 自动生成规则文件(自动注入 AI 上下文)
|
|
27
64
|
- ✅ 自动检测版本更新,增量同步
|
|
28
65
|
- ✅ 零 Token 消耗(skills 不经过 AI 上下文)
|
|
29
66
|
- ✅ 离线可用(skills 已在本地)
|
|
@@ -36,15 +73,17 @@
|
|
|
36
73
|
|
|
37
74
|
MCP 服务启动时,skills 会自动同步到用户项目:
|
|
38
75
|
|
|
39
|
-
1. **首次启动**:自动同步推荐的 skills
|
|
76
|
+
1. **首次启动**:自动同步推荐的 skills
|
|
40
77
|
2. **后续启动**:检测版本差异,自动增量更新
|
|
41
|
-
3.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
78
|
+
3. **同步位置**(根据 `--ide` 参数):
|
|
79
|
+
|
|
80
|
+
| IDE | Skills | Version |
|
|
81
|
+
| ------------- | -------------------- | ------------------------------------ |
|
|
82
|
+
| Cursor (默认) | `.cursor/skills/` | `.cursor/.bkui-knowledge-version` |
|
|
83
|
+
| CodeBuddy | `.codebuddy/skills/` | `.codebuddy/.bkui-knowledge-version` |
|
|
46
84
|
|
|
47
85
|
**更新机制**:
|
|
86
|
+
|
|
48
87
|
- skills 内置在 npm 包中
|
|
49
88
|
- 更新时:修改代码 → `npm publish` 发布新版本
|
|
50
89
|
- 用户使用 `npx -y` 会自动拉取最新版本
|
|
@@ -55,14 +94,15 @@ MCP 服务启动时,skills 会自动同步到用户项目:
|
|
|
55
94
|
|
|
56
95
|
## 使用方式
|
|
57
96
|
|
|
58
|
-
### 推荐:@BKUI-EXPERT (设计稿还原 / 写组件)
|
|
97
|
+
### 推荐:@bkui-knowledge/BKUI-EXPERT 或 /bkui-knowledge/BKUI-EXPERT (设计稿还原 / 写组件)
|
|
59
98
|
|
|
60
99
|
```
|
|
61
100
|
[粘贴设计稿图片 或 描述需求]
|
|
62
|
-
/
|
|
101
|
+
/bkui-knowledge/BKUI-EXPERT
|
|
63
102
|
```
|
|
64
103
|
|
|
65
104
|
**效果:**
|
|
105
|
+
|
|
66
106
|
1. 自动加载 `bkui-builder` 规则
|
|
67
107
|
2. 自动获取相关组件的 API
|
|
68
108
|
3. 按规范生成代码
|
|
@@ -70,9 +110,9 @@ MCP 服务启动时,skills 会自动同步到用户项目:
|
|
|
70
110
|
|
|
71
111
|
### @ 方式 (Prompts)
|
|
72
112
|
|
|
73
|
-
| 命令
|
|
74
|
-
|
|
75
|
-
| `@BKUI-EXPERT` | 设计稿还原专家模式,引导 AI 按步骤执行 | **写组件 / 还原设计稿** |
|
|
113
|
+
| 命令 | 作用 | 推荐场景 |
|
|
114
|
+
| -------------------------------------------------------------- | -------------------------------------- | ----------------------- |
|
|
115
|
+
| `@bkui-knowledge/BKUI-EXPERT` or `/bkui-knowledge/BKUI-EXPERT` | 设计稿还原专家模式,引导 AI 按步骤执行 | **写组件 / 还原设计稿** |
|
|
76
116
|
|
|
77
117
|
### 直接对话 + 明确指定
|
|
78
118
|
|
|
@@ -93,13 +133,13 @@ MCP 服务启动时,skills 会自动同步到用户项目:
|
|
|
93
133
|
|
|
94
134
|
### 工具 (Tools)
|
|
95
135
|
|
|
96
|
-
| 工具
|
|
97
|
-
|
|
98
|
-
| `get_knowledge_index` | 获取完整索引
|
|
99
|
-
| `get_skill`
|
|
100
|
-
| `get_component_api`
|
|
101
|
-
| `batch_load`
|
|
102
|
-
| `sync_skills`
|
|
136
|
+
| 工具 | 作用 | 层级 |
|
|
137
|
+
| --------------------- | -------------------------------- | ----- |
|
|
138
|
+
| `get_knowledge_index` | 获取完整索引 | L0 |
|
|
139
|
+
| `get_skill` | 获取技能文档 (Markdown + assets) | L1 |
|
|
140
|
+
| `get_component_api` | 获取组件 API (JSON) | L2 |
|
|
141
|
+
| `batch_load` | 批量加载多个资源 | L1+L2 |
|
|
142
|
+
| `sync_skills` | 查看 skills 同步状态和信息 | - |
|
|
103
143
|
|
|
104
144
|
### 组件示例 (Resources) - L3 层
|
|
105
145
|
|
|
@@ -122,33 +162,37 @@ AI: [获取 resource: example://table/basic]
|
|
|
122
162
|
|
|
123
163
|
### 技能 (Skills)
|
|
124
164
|
|
|
125
|
-
| ID
|
|
126
|
-
|
|
127
|
-
| `bkui-builder`
|
|
128
|
-
| `api-standard`
|
|
129
|
-
| `pinia-setup`
|
|
130
|
-
| `permission-directive`
|
|
131
|
-
| `vue-composables`
|
|
132
|
-
| `vite-migration`
|
|
133
|
-
| `bundle-optimization`
|
|
134
|
-
| `virtual-list`
|
|
135
|
-
| `unit-testing`
|
|
136
|
-
| `bkui-cheatsheet`
|
|
137
|
-
| `code-review`
|
|
138
|
-
| `js-security-check`
|
|
139
|
-
| `nodejs-security-check` | Node.js 安全审查
|
|
165
|
+
| ID | 名称 | 场景 |
|
|
166
|
+
| ----------------------- | -------------------------- | ------------------------ |
|
|
167
|
+
| `bkui-builder` | 设计稿还原专家 | UI 开发 |
|
|
168
|
+
| `api-standard` | 统一网络请求 | HTTP 封装 |
|
|
169
|
+
| `pinia-setup` | 全局状态管理 | Pinia |
|
|
170
|
+
| `permission-directive` | 前端权限控制 (IAM) | 权限管理 |
|
|
171
|
+
| `vue-composables` | Vue 3 Composables 最佳实践 | 组合式函数 |
|
|
172
|
+
| `vite-migration` | Webpack 到 Vite 迁移 | 构建工具 |
|
|
173
|
+
| `bundle-optimization` | Vite 构建优化 | 性能 |
|
|
174
|
+
| `virtual-list` | 长列表虚拟滚动 | 性能 |
|
|
175
|
+
| `unit-testing` | 组件单元测试 | 质量 |
|
|
176
|
+
| `bkui-cheatsheet` | BKUI 组件速查 | 快速参考 |
|
|
177
|
+
| `code-review` | 代码评审专家 | 代码审查 |
|
|
178
|
+
| `js-security-check` | JavaScript 安全审查 | 安全 |
|
|
179
|
+
| `nodejs-security-check` | Node.js 安全审查 | 安全 |
|
|
180
|
+
| `vue-best-practices` | Vue 3 开发最佳实践 (外部) | TypeScript/Volar/vue-tsc |
|
|
181
|
+
| `bk-skill-creator` | Skill 创建指南 | 知识沉淀 |
|
|
182
|
+
| `bk-security-redlines` | 蓝鲸代码安全三大红线 | 安全审查 |
|
|
183
|
+
| `web-security-guide` | Web 安全漏洞学习指南 | OWASP 十大漏洞 |
|
|
140
184
|
|
|
141
185
|
### 页面模版 (在 bkui-builder 的 assets/ 中)
|
|
142
186
|
|
|
143
|
-
| 文件
|
|
144
|
-
|
|
187
|
+
| 文件 | 描述 |
|
|
188
|
+
| ------------------------------- | ------------------- |
|
|
145
189
|
| `layouts/admin-layout-left.vue` | 左右布局 (管理后台) |
|
|
146
|
-
| `layouts/admin-layout-top.vue`
|
|
147
|
-
| `layouts/admin-layout-dark.vue` | 暗色主题布局
|
|
148
|
-
| `pages/table-page.vue`
|
|
149
|
-
| `pages/dashboard-page.vue`
|
|
150
|
-
| `pages/detail-page.vue`
|
|
151
|
-
| `pages/wizard-form.vue`
|
|
190
|
+
| `layouts/admin-layout-top.vue` | 上下布局 (门户页) |
|
|
191
|
+
| `layouts/admin-layout-dark.vue` | 暗色主题布局 |
|
|
192
|
+
| `pages/table-page.vue` | 表格页 (CRUD) |
|
|
193
|
+
| `pages/dashboard-page.vue` | 仪表盘 |
|
|
194
|
+
| `pages/detail-page.vue` | 详情页 |
|
|
195
|
+
| `pages/wizard-form.vue` | 分步表单 |
|
|
152
196
|
|
|
153
197
|
> 调用 `get_skill({ skillId: 'bkui-builder' })` 时会自动列出可用模版
|
|
154
198
|
|
|
@@ -165,11 +209,13 @@ AI: [获取 resource: example://table/basic]
|
|
|
165
209
|
工具描述中已包含以下规则,AI 会自动遵守:
|
|
166
210
|
|
|
167
211
|
### 强制规范
|
|
212
|
+
|
|
168
213
|
- 组件库: `bkui-vue` (前缀 `bk-`)
|
|
169
214
|
- 语法: Vue 3 `<script setup lang="ts">`
|
|
170
215
|
- 样式: MagicBox 原子类 (`mt10`, `mb20`, `flex-row`)
|
|
171
216
|
|
|
172
217
|
### 常见错误 (必须避免)
|
|
218
|
+
|
|
173
219
|
```
|
|
174
220
|
❌ <bk-navigation :default-open-keys> → ✅ default-open
|
|
175
221
|
❌ <bk-menu :default-open-keys> → ✅ :opened-keys
|
|
@@ -235,17 +281,70 @@ bkui-knowledge/
|
|
|
235
281
|
|
|
236
282
|
---
|
|
237
283
|
|
|
284
|
+
## 外部技能 (External Skills)
|
|
285
|
+
|
|
286
|
+
本项目集成了社区优秀的 Agent Skills 作为外部依赖:
|
|
287
|
+
|
|
288
|
+
| 技能 | 来源 | 描述 |
|
|
289
|
+
| -------------------- | ----------------------------------------------------- | --------------------------------------------------- |
|
|
290
|
+
| `vue-best-practices` | [hyf0/vue-skills](https://github.com/hyf0/vue-skills) | Vue 3 TypeScript/vue-tsc/Volar 最佳实践 (17 条规则) |
|
|
291
|
+
|
|
292
|
+
### 更新外部技能
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# 使用脚本更新
|
|
296
|
+
./scripts/update-external-skills.sh
|
|
297
|
+
|
|
298
|
+
# 或手动更新
|
|
299
|
+
git submodule update --remote --merge
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 首次克隆项目
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
# 克隆时初始化子模块
|
|
306
|
+
git clone --recurse-submodules https://github.com/xxx/bkui-knowledge.git
|
|
307
|
+
|
|
308
|
+
# 或克隆后初始化
|
|
309
|
+
git submodule init
|
|
310
|
+
git submodule update
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
238
315
|
## 贡献知识
|
|
239
316
|
|
|
240
317
|
欢迎团队成员一起沉淀知识!所有贡献的内容都会自动遵循渐进式披露架构。
|
|
241
318
|
|
|
242
|
-
###
|
|
319
|
+
### 使用 bk-skill-creator(推荐)
|
|
320
|
+
|
|
321
|
+
在 Cursor 中直接让 AI 帮你创建 skill:
|
|
322
|
+
|
|
323
|
+
```
|
|
324
|
+
用户: 我想创建一个关于 [主题] 的 skill
|
|
325
|
+
AI: [自动加载 bk-skill-creator 技能,引导你完成创建流程]
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
或者显式调用:
|
|
329
|
+
|
|
330
|
+
```
|
|
331
|
+
用户: 调用 get_skill 获取 bk-skill-creator,然后帮我创建一个新的 skill
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**bk-skill-creator 会自动:**
|
|
335
|
+
|
|
336
|
+
- 引导你使用正确的模板
|
|
337
|
+
- 确保 SKILL.md ≤ 2KB
|
|
338
|
+
- 提醒更新 manifest.json 和 README.md
|
|
339
|
+
- 执行验证脚本检查规范
|
|
340
|
+
|
|
341
|
+
### 手动创建
|
|
243
342
|
|
|
244
343
|
```bash
|
|
245
344
|
# 1. 使用模板创建新 Skill
|
|
246
345
|
cp -r knowledge/skills/.template knowledge/skills/your-skill-id
|
|
247
346
|
|
|
248
|
-
# 2. 编辑核心文档(保持 ≤
|
|
347
|
+
# 2. 编辑核心文档(保持 ≤ 2KB)
|
|
249
348
|
vim knowledge/skills/your-skill-id/SKILL.md
|
|
250
349
|
|
|
251
350
|
# 3. 添加详细内容到 references/
|
|
@@ -254,13 +353,13 @@ vim knowledge/skills/your-skill-id/references/advanced.md
|
|
|
254
353
|
# 4. 更新索引
|
|
255
354
|
vim knowledge/manifest.json
|
|
256
355
|
|
|
257
|
-
# 5.
|
|
258
|
-
|
|
356
|
+
# 5. 验证规范
|
|
357
|
+
bash scripts/validate-skill.sh your-skill-id
|
|
259
358
|
```
|
|
260
359
|
|
|
261
360
|
### 重要原则
|
|
262
361
|
|
|
263
|
-
- ✅ **SKILL.md 必须 ≤
|
|
362
|
+
- ✅ **SKILL.md 必须 ≤ 2KB**(核心规则)
|
|
264
363
|
- ✅ **详细内容放 references/**(按需加载)
|
|
265
364
|
- ✅ **代码资产放 assets/**(用户确认后加载)
|
|
266
365
|
|
|
@@ -282,6 +381,7 @@ npm run test:server # 测试 MCP 服务器功能
|
|
|
282
381
|
```
|
|
283
382
|
|
|
284
383
|
**注意**:
|
|
384
|
+
|
|
285
385
|
- `npm test` 是运行测试套件(自动完成),用于验证规范
|
|
286
386
|
|
|
287
387
|
详细说明见:[tests/README.md](./tests/README.md)
|
|
@@ -291,26 +391,34 @@ npm run test:server # 测试 MCP 服务器功能
|
|
|
291
391
|
## 常见问题
|
|
292
392
|
|
|
293
393
|
### Q: 如何查看所有可用资源?
|
|
294
|
-
|
|
394
|
+
|
|
395
|
+
A: 让 AI 调用 `get_knowledge_index()`,规则已自动注入到对应 IDE 的 rules 目录
|
|
295
396
|
|
|
296
397
|
### Q: 设计稿还原效果不好?
|
|
398
|
+
|
|
297
399
|
A: 使用 `@BKUI-EXPERT`,它会引导 AI 按完整流程执行
|
|
298
400
|
|
|
299
401
|
### Q: 知识库更新了怎么办?
|
|
300
|
-
|
|
402
|
+
|
|
403
|
+
A: 发布新版本 npm 包后,用户下次启动 IDE 时 `npx -y` 会自动拉取最新版本
|
|
301
404
|
|
|
302
405
|
### Q: skills 没有同步成功?
|
|
303
|
-
|
|
406
|
+
|
|
407
|
+
A: 检查对应 IDE 的 skills 目录是否存在(Cursor: `.cursor/skills/`,CodeBuddy: `.codebuddy/skills/`),或查看 IDE 的 MCP 日志
|
|
408
|
+
|
|
409
|
+
### Q: 如何切换到 CodeBuddy?
|
|
410
|
+
|
|
411
|
+
A: 在 MCP 配置的 args 中添加 `--ide=codebuddy` 参数
|
|
304
412
|
|
|
305
413
|
---
|
|
306
414
|
|
|
307
415
|
## Token 消耗对比
|
|
308
416
|
|
|
309
|
-
| 方案
|
|
310
|
-
|
|
311
|
-
| 全量注入
|
|
312
|
-
| 纯按需加载
|
|
313
|
-
| **渐进式披露**
|
|
314
|
-
| **npx 自动同步 skills** | 0
|
|
417
|
+
| 方案 | 初始化 | 按需加载 | 总计 |
|
|
418
|
+
| ----------------------- | ------- | -------- | --------------- |
|
|
419
|
+
| 全量注入 | ~15,000 | 0 | ~15,000 |
|
|
420
|
+
| 纯按需加载 | ~200 | ~3,000 | ~3,200 |
|
|
421
|
+
| **渐进式披露** | ~200 | ~2,000 | **~2,200** ✅ |
|
|
422
|
+
| **npx 自动同步 skills** | 0 | ~2,000 | **~2,000** ✅✅ |
|
|
315
423
|
|
|
316
424
|
> 💡 使用 npx 模式时,推荐的 skills 自动同步到本地,AI 无需读取内容,节省更多 token
|
package/bin/bkui-knowledge.js
CHANGED
|
@@ -7,15 +7,34 @@
|
|
|
7
7
|
* 2. 启动 MCP stdio 服务
|
|
8
8
|
*
|
|
9
9
|
* 用法(用户只需配置一次):
|
|
10
|
+
*
|
|
11
|
+
* Cursor(默认):
|
|
10
12
|
* {
|
|
11
13
|
* "mcpServers": {
|
|
12
14
|
* "bkui-knowledge": {
|
|
13
15
|
* "command": "npx",
|
|
14
|
-
* "args": ["-y", "@blueking/bkui-knowledge"]
|
|
16
|
+
* "args": ["-y", "@blueking/bkui-knowledge", "${workspaceFolder}"]
|
|
15
17
|
* }
|
|
16
18
|
* }
|
|
17
19
|
* }
|
|
18
20
|
*
|
|
21
|
+
* CodeBuddy:
|
|
22
|
+
* {
|
|
23
|
+
* "bkui-knowledge": {
|
|
24
|
+
* "command": "npx",
|
|
25
|
+
* "args": ["-y", "@blueking/bkui-knowledge", "--ide=codebuddy"]
|
|
26
|
+
* }
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* 参数说明:
|
|
30
|
+
* - 第一个非 -- 开头的参数: 项目路径
|
|
31
|
+
* - --ide=cursor|codebuddy: 指定目标 IDE(默认 cursor)
|
|
32
|
+
*
|
|
33
|
+
* 项目路径传递方式(优先级从高到低):
|
|
34
|
+
* 1. 命令行参数: npx @blueking/bkui-knowledge /path/to/project
|
|
35
|
+
* 2. 环境变量: BKUI_PROJECT_ROOT=/path/to/project
|
|
36
|
+
* 3. 当前工作目录 (cwd)
|
|
37
|
+
*
|
|
19
38
|
* 更新机制:
|
|
20
39
|
* - skills 内置在 npm 包中
|
|
21
40
|
* - 更新 skills 时:修改代码 → npm publish
|
|
@@ -25,12 +44,20 @@
|
|
|
25
44
|
const fs = require('fs');
|
|
26
45
|
const path = require('path');
|
|
27
46
|
|
|
28
|
-
//
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
47
|
+
// IDE 配置映射
|
|
48
|
+
const IDE_CONFIGS = {
|
|
49
|
+
cursor: {
|
|
50
|
+
name: 'Cursor',
|
|
51
|
+
configDir: '.cursor',
|
|
52
|
+
skillsDir: '.cursor/skills',
|
|
53
|
+
versionFile: '.cursor/.bkui-knowledge-version'
|
|
54
|
+
},
|
|
55
|
+
codebuddy: {
|
|
56
|
+
name: 'CodeBuddy',
|
|
57
|
+
configDir: '.codebuddy',
|
|
58
|
+
skillsDir: '.codebuddy/skills',
|
|
59
|
+
versionFile: '.codebuddy/.bkui-knowledge-version'
|
|
60
|
+
}
|
|
34
61
|
};
|
|
35
62
|
|
|
36
63
|
// npm 包根目录
|
|
@@ -42,9 +69,45 @@ function log(msg) {
|
|
|
42
69
|
}
|
|
43
70
|
|
|
44
71
|
/**
|
|
45
|
-
*
|
|
72
|
+
* 解析 --ide 参数,获取目标 IDE
|
|
73
|
+
* @returns {string} IDE 标识符 (cursor | codebuddy)
|
|
74
|
+
*/
|
|
75
|
+
function getTargetIDE() {
|
|
76
|
+
const ideArg = process.argv.find(arg => arg.startsWith('--ide='));
|
|
77
|
+
if (ideArg) {
|
|
78
|
+
const ide = ideArg.split('=')[1].toLowerCase();
|
|
79
|
+
if (IDE_CONFIGS[ide]) {
|
|
80
|
+
return ide;
|
|
81
|
+
}
|
|
82
|
+
log(`警告: 未知 IDE "${ide}",使用默认值 cursor`);
|
|
83
|
+
}
|
|
84
|
+
return 'cursor'; // 默认使用 Cursor
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* 获取当前 IDE 配置
|
|
89
|
+
* @returns {object} IDE 配置对象
|
|
90
|
+
*/
|
|
91
|
+
function getIDEConfig() {
|
|
92
|
+
const ide = getTargetIDE();
|
|
93
|
+
return IDE_CONFIGS[ide];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 获取用户项目根目录
|
|
98
|
+
* 优先级:命令行参数 > 环境变量 > cwd
|
|
46
99
|
*/
|
|
47
100
|
function getProjectRoot() {
|
|
101
|
+
// 1. 命令行参数: node bkui-knowledge.js /path/to/project (过滤掉 -- 开头的参数)
|
|
102
|
+
const pathArg = process.argv.slice(2).find(arg => !arg.startsWith('-'));
|
|
103
|
+
if (pathArg) {
|
|
104
|
+
return pathArg;
|
|
105
|
+
}
|
|
106
|
+
// 2. 环境变量: BKUI_PROJECT_ROOT=/path/to/project
|
|
107
|
+
if (process.env.BKUI_PROJECT_ROOT) {
|
|
108
|
+
return process.env.BKUI_PROJECT_ROOT;
|
|
109
|
+
}
|
|
110
|
+
// 3. 默认使用 cwd
|
|
48
111
|
return process.cwd();
|
|
49
112
|
}
|
|
50
113
|
|
|
@@ -62,9 +125,12 @@ function getPackageVersion() {
|
|
|
62
125
|
|
|
63
126
|
/**
|
|
64
127
|
* 检查是否需要同步
|
|
128
|
+
* @param {string} projectRoot - 项目根目录
|
|
129
|
+
* @param {string} currentVersion - 当前版本
|
|
130
|
+
* @param {object} ideConfig - IDE 配置
|
|
65
131
|
*/
|
|
66
|
-
function needsSync(projectRoot, currentVersion) {
|
|
67
|
-
const versionFile = path.join(projectRoot,
|
|
132
|
+
function needsSync(projectRoot, currentVersion, ideConfig) {
|
|
133
|
+
const versionFile = path.join(projectRoot, ideConfig.versionFile);
|
|
68
134
|
if (!fs.existsSync(versionFile)) {
|
|
69
135
|
return true;
|
|
70
136
|
}
|
|
@@ -73,70 +139,63 @@ function needsSync(projectRoot, currentVersion) {
|
|
|
73
139
|
}
|
|
74
140
|
|
|
75
141
|
/**
|
|
76
|
-
*
|
|
142
|
+
* 递归扫描目录,返回相对路径列表
|
|
143
|
+
* @param {string} dirPath - 目录路径
|
|
144
|
+
* @param {string} relativePath - 相对路径前缀
|
|
145
|
+
* @returns {string[]} 文件相对路径列表
|
|
77
146
|
*/
|
|
78
|
-
function
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
推荐的 skills 已自动同步到 \`.cursor/skills/\` 目录:
|
|
99
|
-
${recommendedSkills.map(id => `- ${id}`).join('\n')}
|
|
100
|
-
|
|
101
|
-
## 可用资源索引
|
|
102
|
-
|
|
103
|
-
### Skills (调用 get_skill 获取详情)
|
|
104
|
-
| ID | 名称 |
|
|
105
|
-
|----|------|
|
|
106
|
-
${skillList}
|
|
107
|
-
|
|
108
|
-
> 💡 bkui-builder 包含布局模版和页面模版 (assets/)
|
|
109
|
-
|
|
110
|
-
### Component APIs (调用 get_component_api 获取文档)
|
|
111
|
-
⚠️ **高优先级 (必须先查询):** ${apiPriority}
|
|
112
|
-
|
|
113
|
-
全部组件: ${allApis}
|
|
114
|
-
|
|
115
|
-
## 工作流程
|
|
116
|
-
1. 分析需求 → 确定需要哪些资源
|
|
117
|
-
2. 使用布局组件? → get_component_api({ componentName: 'navigation' })
|
|
118
|
-
3. 需要模板代码? → get_skill({ skillId: 'bkui-builder' })
|
|
119
|
-
4. 批量获取? → batch_load({ skillIds: [...], componentNames: [...] })
|
|
120
|
-
|
|
121
|
-
## 强制规范
|
|
122
|
-
- 组件库: bkui-vue (前缀 bk-)
|
|
123
|
-
- 语法: Vue 3 <script setup lang="ts">
|
|
124
|
-
- 布局: 必须使用 bk-navigation
|
|
147
|
+
function scanSkillDir(dirPath, relativePath) {
|
|
148
|
+
const results = [];
|
|
149
|
+
try {
|
|
150
|
+
const items = fs.readdirSync(dirPath);
|
|
151
|
+
for (const item of items) {
|
|
152
|
+
const fullPath = path.join(dirPath, item);
|
|
153
|
+
const relPath = relativePath ? `${relativePath}/${item}` : item;
|
|
154
|
+
const stat = fs.statSync(fullPath);
|
|
155
|
+
if (stat.isDirectory()) {
|
|
156
|
+
results.push(...scanSkillDir(fullPath, relPath));
|
|
157
|
+
} else {
|
|
158
|
+
results.push(relPath);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
} catch (e) {
|
|
162
|
+
// 忽略错误
|
|
163
|
+
}
|
|
164
|
+
return results;
|
|
165
|
+
}
|
|
125
166
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
167
|
+
/**
|
|
168
|
+
* 生成 skill 的可用资源列表
|
|
169
|
+
* @param {string} skillDir - skill 目录路径
|
|
170
|
+
* @param {string} skillId - skill ID
|
|
171
|
+
* @returns {string} 资源列表 Markdown
|
|
172
|
+
*/
|
|
173
|
+
function generateResourcesList(skillDir, skillId) {
|
|
174
|
+
const subDirs = ['scripts', 'references', 'assets', 'rules'];
|
|
175
|
+
const resources = [];
|
|
176
|
+
|
|
177
|
+
subDirs.forEach(dir => {
|
|
178
|
+
const dirPath = path.join(skillDir, dir);
|
|
179
|
+
if (fs.existsSync(dirPath)) {
|
|
180
|
+
const files = scanSkillDir(dirPath, '');
|
|
181
|
+
files.forEach(file => {
|
|
182
|
+
resources.push(`- \`skill://${skillId}/${dir}/${file}\``);
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
});
|
|
131
186
|
|
|
132
|
-
|
|
133
|
-
|
|
187
|
+
if (resources.length > 0) {
|
|
188
|
+
return `\n\n---\n## 📦 可用资源\n\n${resources.join('\n')}\n\n> 根据 SKILL.md 中的 IF-THEN 规则判断是否需要加载\n`;
|
|
189
|
+
}
|
|
190
|
+
return '';
|
|
134
191
|
}
|
|
135
192
|
|
|
136
193
|
/**
|
|
137
194
|
* 同步 skills 到用户项目(从 npm 包内置的 knowledge 目录)
|
|
195
|
+
* @param {string} projectRoot - 项目根目录
|
|
196
|
+
* @param {object} ideConfig - IDE 配置
|
|
138
197
|
*/
|
|
139
|
-
function syncSkills(projectRoot) {
|
|
198
|
+
function syncSkills(projectRoot, ideConfig) {
|
|
140
199
|
try {
|
|
141
200
|
const manifestPath = path.join(PKG_ROOT, 'knowledge/manifest.json');
|
|
142
201
|
|
|
@@ -151,18 +210,16 @@ function syncSkills(projectRoot) {
|
|
|
151
210
|
const version = `${pkgVersion}-${manifest.updated_at || 'unknown'}`;
|
|
152
211
|
|
|
153
212
|
// 检查是否需要同步
|
|
154
|
-
if (!needsSync(projectRoot, version)) {
|
|
155
|
-
log(`skills 已是最新版本 (v${pkgVersion})`);
|
|
213
|
+
if (!needsSync(projectRoot, version, ideConfig)) {
|
|
214
|
+
log(`[${ideConfig.name}] skills 已是最新版本 (v${pkgVersion})`);
|
|
156
215
|
return;
|
|
157
216
|
}
|
|
158
217
|
|
|
159
|
-
log(
|
|
218
|
+
log(`[${ideConfig.name}] 同步 skills (v${pkgVersion})...`);
|
|
160
219
|
|
|
161
220
|
// 创建目录
|
|
162
|
-
const skillsDir = path.join(projectRoot,
|
|
163
|
-
const commandsDir = path.join(projectRoot, CONFIG.commandsDir);
|
|
221
|
+
const skillsDir = path.join(projectRoot, ideConfig.skillsDir);
|
|
164
222
|
fs.mkdirSync(skillsDir, { recursive: true });
|
|
165
|
-
fs.mkdirSync(commandsDir, { recursive: true });
|
|
166
223
|
|
|
167
224
|
// 同步推荐的 skills
|
|
168
225
|
let count = 0;
|
|
@@ -173,25 +230,28 @@ function syncSkills(projectRoot) {
|
|
|
173
230
|
const skillFilePath = path.join(PKG_ROOT, 'knowledge', manifest.skills.base_path, skill.path);
|
|
174
231
|
if (!fs.existsSync(skillFilePath)) continue;
|
|
175
232
|
|
|
176
|
-
|
|
233
|
+
// 读取原始内容
|
|
234
|
+
let content = fs.readFileSync(skillFilePath, 'utf-8');
|
|
235
|
+
|
|
236
|
+
// 生成并附加资源列表(与 mcp-core.js 的 get_skill 逻辑一致)
|
|
237
|
+
const skillDir = path.dirname(skillFilePath);
|
|
238
|
+
const resourcesList = generateResourcesList(skillDir, skillId);
|
|
239
|
+
content += resourcesList;
|
|
240
|
+
|
|
177
241
|
fs.writeFileSync(path.join(skillsDir, `${skillId}.md`), content, 'utf-8');
|
|
178
|
-
fs.writeFileSync(path.join(commandsDir, `${skillId}.md`), `请加载使用 ${skillId} skill`, 'utf-8');
|
|
179
242
|
|
|
180
243
|
log(` ✓ ${skillId}`);
|
|
181
244
|
count++;
|
|
182
245
|
}
|
|
183
246
|
|
|
184
|
-
// 生成 Cursor Rules 文件
|
|
185
|
-
generateRules(projectRoot, manifest);
|
|
186
|
-
|
|
187
247
|
// 保存版本信息
|
|
188
|
-
fs.mkdirSync(path.dirname(path.join(projectRoot,
|
|
189
|
-
fs.writeFileSync(path.join(projectRoot,
|
|
248
|
+
fs.mkdirSync(path.dirname(path.join(projectRoot, ideConfig.versionFile)), { recursive: true });
|
|
249
|
+
fs.writeFileSync(path.join(projectRoot, ideConfig.versionFile), version, 'utf-8');
|
|
190
250
|
|
|
191
|
-
log(
|
|
251
|
+
log(`[${ideConfig.name}] 同步完成!共 ${count} 个 skills`);
|
|
192
252
|
|
|
193
253
|
} catch (error) {
|
|
194
|
-
log(
|
|
254
|
+
log(`[${ideConfig.name}] 同步失败: ${error.message}(不影响 MCP 服务)`);
|
|
195
255
|
}
|
|
196
256
|
}
|
|
197
257
|
|
|
@@ -307,9 +367,14 @@ async function startMcpServer() {
|
|
|
307
367
|
*/
|
|
308
368
|
async function main() {
|
|
309
369
|
const projectRoot = getProjectRoot();
|
|
370
|
+
const ideConfig = getIDEConfig();
|
|
371
|
+
|
|
372
|
+
// 调试:输出实际的工作目录和目标 IDE
|
|
373
|
+
log(`工作目录: ${projectRoot}`);
|
|
374
|
+
log(`目标 IDE: ${ideConfig.name}`);
|
|
310
375
|
|
|
311
376
|
// 1. 同步 skills(同步执行,从 npm 包读取)
|
|
312
|
-
syncSkills(projectRoot);
|
|
377
|
+
syncSkills(projectRoot, ideConfig);
|
|
313
378
|
|
|
314
379
|
// 2. 启动 MCP 服务
|
|
315
380
|
await startMcpServer();
|