@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.
Files changed (50) hide show
  1. package/README.md +166 -58
  2. package/bin/bkui-knowledge.js +147 -82
  3. package/knowledge/manifest.json +38 -1
  4. package/knowledge/skills/.template/README.md +1 -1
  5. package/knowledge/skills/bk-security-redlines/SKILL.md +47 -0
  6. package/knowledge/skills/bk-security-redlines/references/auth-check.md +73 -0
  7. package/knowledge/skills/bk-security-redlines/references/data-encryption.md +78 -0
  8. package/knowledge/skills/bk-security-redlines/references/input-validation.md +96 -0
  9. package/knowledge/skills/bk-skill-creator/SKILL.md +37 -0
  10. package/knowledge/skills/bk-skill-creator/references/common-mistakes.md +43 -0
  11. package/knowledge/skills/bk-skill-creator/references/quick-start.md +42 -0
  12. package/knowledge/skills/bk-skill-creator/references/skill-checklist.md +93 -0
  13. package/knowledge/skills/bk-skill-creator/references/structure-guide.md +88 -0
  14. package/knowledge/skills/bk-skill-creator/references/writing-tips.md +153 -0
  15. package/knowledge/skills/bkui-quick-start/SKILL.md +52 -0
  16. package/knowledge/skills/bkui-quick-start/references/components-list.md +17 -0
  17. package/knowledge/skills/bkui-quick-start/references/skills-index.md +26 -0
  18. package/knowledge/skills/external/vue-skills/LICENSE +21 -0
  19. package/knowledge/skills/external/vue-skills/README.md +69 -0
  20. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/SKILL.md +42 -0
  21. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/codeactions-save-performance.md +79 -0
  22. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/data-attributes-config.md +74 -0
  23. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/deep-watch-numeric.md +102 -0
  24. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/define-model-update-event.md +79 -0
  25. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/duplicate-plugin-detection.md +102 -0
  26. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/fallthrough-attributes.md +63 -0
  27. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/hmr-vue-ssr.md +124 -0
  28. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/module-resolution-bundler.md +81 -0
  29. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/pinia-store-mocking.md +159 -0
  30. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/script-setup-jsdoc.md +85 -0
  31. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/strict-css-modules.md +68 -0
  32. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/unplugin-auto-import-conflicts.md +97 -0
  33. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/volar-3-breaking-changes.md +66 -0
  34. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-directive-comments.md +73 -0
  35. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-router-typed-params.md +81 -0
  36. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/vue-tsc-strict-templates.md +69 -0
  37. package/knowledge/skills/external/vue-skills/skills/vue-best-practices/rules/with-defaults-union-types.md +102 -0
  38. package/knowledge/skills/web-security-guide/SKILL.md +48 -0
  39. package/knowledge/skills/web-security-guide/references/access-control.md +123 -0
  40. package/knowledge/skills/web-security-guide/references/auth-session.md +99 -0
  41. package/knowledge/skills/web-security-guide/references/csrf.md +59 -0
  42. package/knowledge/skills/web-security-guide/references/data-exposure.md +108 -0
  43. package/knowledge/skills/web-security-guide/references/deserialization.md +59 -0
  44. package/knowledge/skills/web-security-guide/references/injection.md +357 -0
  45. package/knowledge/skills/web-security-guide/references/logging-monitoring.md +47 -0
  46. package/knowledge/skills/web-security-guide/references/security-config.md +73 -0
  47. package/knowledge/skills/web-security-guide/references/ssrf.md +55 -0
  48. package/knowledge/skills/web-security-guide/references/xss.md +134 -0
  49. package/package.json +3 -3
  50. 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
- - ✅ 首次启动自动同步推荐 skills 到 `.cursor/skills/`
26
- - ✅ 自动生成 `.cursor/rules/bkui.mdc`(规则自动注入 AI 上下文)
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 到 `.cursor/skills/`
76
+ 1. **首次启动**:自动同步推荐的 skills
40
77
  2. **后续启动**:检测版本差异,自动增量更新
41
- 3. **同步位置**:
42
- - `.cursor/skills/*.md` - 技能文档
43
- - `.cursor/commands/*.md` - 斜杠指令(可通过 `/skill-id` 调用)
44
- - `.cursor/rules/bkui.mdc` - 规则文件(自动注入 AI 上下文)
45
- - `.cursor/.bkui-knowledge-version` - 版本标记
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
- /BKUI-Knowledge/BKUI-EXPERT
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` | 获取完整索引 | L0 |
99
- | `get_skill` | 获取技能文档 (Markdown + assets) | L1 |
100
- | `get_component_api` | 获取组件 API (JSON) | L2 |
101
- | `batch_load` | 批量加载多个资源 | L1+L2 |
102
- | `sync_skills` | 查看 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` | 设计稿还原专家 | UI 开发 |
128
- | `api-standard` | 统一网络请求 | HTTP 封装 |
129
- | `pinia-setup` | 全局状态管理 | Pinia |
130
- | `permission-directive` | 前端权限控制 (IAM) | 权限管理 |
131
- | `vue-composables` | Vue 3 Composables 最佳实践 | 组合式函数 |
132
- | `vite-migration` | Webpack 到 Vite 迁移 | 构建工具 |
133
- | `bundle-optimization` | Vite 构建优化 | 性能 |
134
- | `virtual-list` | 长列表虚拟滚动 | 性能 |
135
- | `unit-testing` | 组件单元测试 | 质量 |
136
- | `bkui-cheatsheet` | BKUI 组件速查 | 快速参考 |
137
- | `code-review` | 代码评审专家 | 代码审查 |
138
- | `js-security-check` | JavaScript 安全审查 | 安全 |
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` | 表格页 (CRUD) |
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. 编辑核心文档(保持 ≤ 3KB
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
- wc -c knowledge/skills/your-skill-id/SKILL.md
356
+ # 5. 验证规范
357
+ bash scripts/validate-skill.sh your-skill-id
259
358
  ```
260
359
 
261
360
  ### 重要原则
262
361
 
263
- - ✅ **SKILL.md 必须 ≤ 3KB**(核心规则)
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
- A: 让 AI 调用 `get_knowledge_index()`,规则已自动注入到 `.cursor/rules/bkui.mdc`
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
- A: 发布新版本 npm 包后,用户下次启动 Cursor 时 `npx -y` 会自动拉取最新版本
402
+
403
+ A: 发布新版本 npm 包后,用户下次启动 IDE 时 `npx -y` 会自动拉取最新版本
301
404
 
302
405
  ### Q: skills 没有同步成功?
303
- A: 检查 `.cursor/skills/` 目录是否存在,或查看 Cursor 的 MCP 日志
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
- | 全量注入 | ~15,000 | 0 | ~15,000 |
312
- | 纯按需加载 | ~200 | ~3,000 | ~3,200 |
313
- | **渐进式披露** | ~200 | ~2,000 | **~2,200** ✅ |
314
- | **npx 自动同步 skills** | 0 | ~2,000 | **~2,000** ✅✅ |
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
@@ -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 CONFIG = {
30
- skillsDir: '.cursor/skills',
31
- commandsDir: '.cursor/commands',
32
- rulesDir: '.cursor/rules',
33
- versionFile: '.cursor/.bkui-knowledge-version'
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
- * 获取用户项目根目录(cwd)
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, CONFIG.versionFile);
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
- * 生成 Cursor Rules 文件(自动注入 AI 上下文)
142
+ * 递归扫描目录,返回相对路径列表
143
+ * @param {string} dirPath - 目录路径
144
+ * @param {string} relativePath - 相对路径前缀
145
+ * @returns {string[]} 文件相对路径列表
77
146
  */
78
- function generateRules(projectRoot, manifest) {
79
- const rulesDir = path.join(projectRoot, CONFIG.rulesDir);
80
- fs.mkdirSync(rulesDir, { recursive: true });
81
-
82
- const skillList = manifest.skills.items.map(s => `| ${s.id} | ${s.name} |`).join('\n');
83
- const apiPriority = manifest.componentApis.priority.map(n => `bk-${n}`).join(', ');
84
- const allApis = manifest.componentApis.items.map(a => a.id).join(', ');
85
- const recommendedSkills = manifest.recommendedSkills || [];
86
-
87
- const rulesContent = `---
88
- description: BKUI 蓝鲸前端知识库规则(自动注入)
89
- globs: ["**/*.vue", "**/*.ts", "**/*.tsx"]
90
- ---
91
-
92
- # BKUI 蓝鲸前端技术规范
93
-
94
- 你是蓝鲸前端技术专家,拥有团队知识库访问权限。采用**渐进式披露架构**。
95
-
96
- ## ✅ Skills 已自动同步
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
- <bk-navigation :default-open-keys> ✅ default-open
128
- <bk-menu :default-open-keys> :opened-keys
129
- <bk-dialog v-model> v-model:isShow
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
- fs.writeFileSync(path.join(rulesDir, 'bkui.mdc'), rulesContent, 'utf-8');
133
- log(' .cursor/rules/bkui.mdc (规则自动注入)');
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(`同步 skills (v${pkgVersion})...`);
218
+ log(`[${ideConfig.name}] 同步 skills (v${pkgVersion})...`);
160
219
 
161
220
  // 创建目录
162
- const skillsDir = path.join(projectRoot, CONFIG.skillsDir);
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
- const content = fs.readFileSync(skillFilePath, 'utf-8');
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, CONFIG.versionFile)), { recursive: true });
189
- fs.writeFileSync(path.join(projectRoot, CONFIG.versionFile), version, 'utf-8');
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(`同步完成!共 ${count} 个 skills + rules`);
251
+ log(`[${ideConfig.name}] 同步完成!共 ${count} 个 skills`);
192
252
 
193
253
  } catch (error) {
194
- log(`同步失败: ${error.message}(不影响 MCP 服务)`);
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();