@blueking/bkui-knowledge 0.0.1-beta.10 → 0.0.1-beta.12

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 CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 快速开始
10
10
 
11
- 只需添加 MCP 服务配置:
11
+ 只需添加 MCP 服务配置(通过 `--ide` 参数指定目标 IDE,不指定时默认使用 Cursor):
12
12
 
13
13
  ### Cursor(默认)
14
14
 
@@ -36,10 +36,29 @@
36
36
  }
37
37
  ```
38
38
 
39
- > 💡 通过 `--ide` 参数指定目标 IDE,不指定时默认使用 Cursor
39
+ ### Claude Code
40
+
41
+ > Claude Code 支持从 MCP initialize 请求自动获取项目路径,无需手动传入
42
+
43
+ 在 Claude Code 的 MCP 配置文件(`~/.claude/.claude.json` 或项目根目录 `.mcp.json`)中添加:
44
+
45
+ ```json
46
+ {
47
+ "mcpServers": {
48
+ "bkui-knowledge": {
49
+ "command": "npx",
50
+ "args": ["-y", "@blueking/bkui-knowledge", "--ide=claude-code"]
51
+ }
52
+ }
53
+ }
54
+ ```
40
55
 
41
56
  ### 本地开发
42
57
 
58
+ - 必须传递项目路径,否则 skills 无法同步到正确位置
59
+
60
+ - 使用 CodeBuddy 或者 Claude Code 本地开发时,无需 `"${workspaceFolder}"` 参数
61
+
43
62
  ```json
44
63
  {
45
64
  "mcpServers": {
@@ -54,11 +73,9 @@
54
73
  }
55
74
  ```
56
75
 
57
- > ⚠️ 必须传递项目路径,否则 skills 无法同步到正确位置
58
-
59
76
  **特性:**
60
77
 
61
- - ✅ 支持 Cursor 和 CodeBuddy 两种 IDE
78
+ - ✅ 支持 Cursor、CodeBuddyClaude Code 三种 IDE
62
79
  - ✅ 首次启动自动同步推荐 skills
63
80
  - ✅ 自动生成规则文件(自动注入 AI 上下文)
64
81
  - ✅ 自动检测版本更新,增量同步
@@ -81,6 +98,7 @@ MCP 服务启动时,skills 会自动同步到用户项目:
81
98
  | ------------- | -------------------- | ------------------------------------ |
82
99
  | Cursor (默认) | `.cursor/skills/` | `.cursor/.bkui-knowledge-version` |
83
100
  | CodeBuddy | `.codebuddy/skills/` | `.codebuddy/.bkui-knowledge-version` |
101
+ | Claude Code | `.claude/skills/` | `.claude/.bkui-knowledge-version` |
84
102
 
85
103
  **更新机制**:
86
104
 
@@ -404,11 +422,11 @@ A: 发布新版本 npm 包后,用户下次启动 IDE 时 `npx -y` 会自动拉
404
422
 
405
423
  ### Q: skills 没有同步成功?
406
424
 
407
- A: 检查对应 IDE 的 skills 目录是否存在(Cursor: `.cursor/skills/`,CodeBuddy: `.codebuddy/skills/`),或查看 IDE 的 MCP 日志
425
+ A: 检查对应 IDE 的 skills 目录是否存在(Cursor: `.cursor/skills/`,CodeBuddy: `.codebuddy/skills/`,Claude Code: `.claude/skills/`),或查看 IDE 的 MCP 日志
408
426
 
409
- ### Q: 如何切换到 CodeBuddy
427
+ ### Q: 如何切换到其他 IDE
410
428
 
411
- A: 在 MCP 配置的 args 中添加 `--ide=codebuddy` 参数
429
+ A: 在 MCP 配置的 args 中添加 `--ide=codebuddy` 或 `--ide=claude-code` 参数
412
430
 
413
431
  ---
414
432
 
@@ -26,14 +26,23 @@
26
26
  * }
27
27
  * }
28
28
  *
29
+ * Claude Code(无需额外配置,自动从 MCP initialize 请求获取项目路径):
30
+ * {
31
+ * "bkui-knowledge": {
32
+ * "command": "npx",
33
+ * "args": ["-y", "@blueking/bkui-knowledge", "--ide=claude-code"]
34
+ * }
35
+ * }
36
+ *
29
37
  * 参数说明:
30
38
  * - 第一个非 -- 开头的参数: 项目路径
31
- * - --ide=cursor|codebuddy: 指定目标 IDE(默认 cursor)
39
+ * - --ide=cursor|codebuddy|claude-code: 指定目标 IDE(默认 cursor)
32
40
  *
33
41
  * 项目路径传递方式(优先级从高到低):
34
42
  * 1. 命令行参数: npx @blueking/bkui-knowledge /path/to/project
35
43
  * 2. 环境变量: BKUI_PROJECT_ROOT=/path/to/project
36
- * 3. 当前工作目录 (cwd)
44
+ * 3. MCP initialize 请求中的 rootUri(Claude Code 等支持此协议的客户端)
45
+ * 4. 当前工作目录 (cwd)
37
46
  *
38
47
  * 更新机制:
39
48
  * - skills 内置在 npm 包中
@@ -57,9 +66,20 @@ const IDE_CONFIGS = {
57
66
  configDir: '.codebuddy',
58
67
  skillsDir: '.codebuddy/skills',
59
68
  versionFile: '.codebuddy/.bkui-knowledge-version'
69
+ },
70
+ 'claude-code': {
71
+ name: 'Claude Code',
72
+ configDir: '.claude',
73
+ skillsDir: '.claude/skills',
74
+ versionFile: '.claude/.bkui-knowledge-version'
60
75
  }
61
76
  };
62
77
 
78
+ // 用于存储从 MCP initialize 请求获取的项目路径
79
+ let mcpRootUri = null;
80
+ // 标记是否已经同步过 skills
81
+ let skillsSynced = false;
82
+
63
83
  // npm 包根目录
64
84
  const PKG_ROOT = path.join(__dirname, '..');
65
85
 
@@ -95,7 +115,7 @@ function getIDEConfig() {
95
115
 
96
116
  /**
97
117
  * 获取用户项目根目录
98
- * 优先级:命令行参数 > 环境变量 > cwd
118
+ * 优先级:命令行参数 > 环境变量 > MCP rootUri > cwd
99
119
  */
100
120
  function getProjectRoot() {
101
121
  // 1. 命令行参数: node bkui-knowledge.js /path/to/project (过滤掉 -- 开头的参数)
@@ -107,10 +127,34 @@ function getProjectRoot() {
107
127
  if (process.env.BKUI_PROJECT_ROOT) {
108
128
  return process.env.BKUI_PROJECT_ROOT;
109
129
  }
110
- // 3. 默认使用 cwd
130
+ // 3. MCP initialize 请求中的 rootUri
131
+ if (mcpRootUri) {
132
+ return mcpRootUri;
133
+ }
134
+ // 4. 默认使用 cwd
111
135
  return process.cwd();
112
136
  }
113
137
 
138
+ /**
139
+ * 从 file:// URI 提取路径
140
+ * @param {string} uri - file:// URI
141
+ * @returns {string} 文件系统路径
142
+ */
143
+ function uriToPath(uri) {
144
+ if (!uri) return null;
145
+ if (uri.startsWith('file://')) {
146
+ // file:///path/to/dir -> /path/to/dir
147
+ let filePath = uri.slice(7);
148
+ // Windows: file:///C:/path -> C:/path
149
+ if (filePath.match(/^\/[A-Za-z]:\//)) {
150
+ filePath = filePath.slice(1);
151
+ }
152
+ return decodeURIComponent(filePath);
153
+ }
154
+ // 如果不是 file:// URI,直接返回(可能已经是路径)
155
+ return uri;
156
+ }
157
+
114
158
  /**
115
159
  * 获取当前包版本
116
160
  */
@@ -268,6 +312,27 @@ async function startMcpServer() {
268
312
 
269
313
  async function handleMessage(message) {
270
314
  if (message.method === "initialize") {
315
+ // 从 initialize 请求中提取项目路径
316
+ const params = message.params || {};
317
+
318
+ // 尝试从 rootUri 或 workspaceFolders 获取项目路径
319
+ if (params.rootUri) {
320
+ mcpRootUri = uriToPath(params.rootUri);
321
+ log(`从 MCP initialize 获取项目路径: ${mcpRootUri}`);
322
+ } else if (params.workspaceFolders && params.workspaceFolders.length > 0) {
323
+ mcpRootUri = uriToPath(params.workspaceFolders[0].uri);
324
+ log(`从 MCP workspaceFolders 获取项目路径: ${mcpRootUri}`);
325
+ }
326
+
327
+ // 延迟同步 skills(在获取到项目路径后)
328
+ if (!skillsSynced && mcpRootUri) {
329
+ const projectRoot = getProjectRoot();
330
+ const ideConfig = getIDEConfig();
331
+ log(`[延迟同步] 工作目录: ${projectRoot}, IDE: ${ideConfig.name}`);
332
+ syncSkills(projectRoot, ideConfig);
333
+ skillsSynced = true;
334
+ }
335
+
271
336
  return {
272
337
  protocolVersion: "2024-11-05",
273
338
  serverInfo: { name: "bkui-knowledge-server", version: "1.0.0" },
@@ -362,21 +427,34 @@ async function startMcpServer() {
362
427
  log('MCP stdio 服务已启动');
363
428
  }
364
429
 
430
+ /**
431
+ * 检查是否有明确的项目路径(命令行参数或环境变量)
432
+ */
433
+ function hasExplicitProjectPath() {
434
+ const pathArg = process.argv.slice(2).find(arg => !arg.startsWith('-'));
435
+ return !!(pathArg || process.env.BKUI_PROJECT_ROOT);
436
+ }
437
+
365
438
  /**
366
439
  * 主入口
367
440
  */
368
441
  async function main() {
369
- const projectRoot = getProjectRoot();
370
442
  const ideConfig = getIDEConfig();
371
443
 
372
- // 调试:输出实际的工作目录和目标 IDE
373
- log(`工作目录: ${projectRoot}`);
374
- log(`目标 IDE: ${ideConfig.name}`);
375
-
376
- // 1. 同步 skills(同步执行,从 npm 包读取)
377
- syncSkills(projectRoot, ideConfig);
444
+ // 如果有明确的项目路径(命令行参数或环境变量),立即同步
445
+ // 否则等待 MCP initialize 请求获取项目路径
446
+ if (hasExplicitProjectPath()) {
447
+ const projectRoot = getProjectRoot();
448
+ log(`工作目录: ${projectRoot}`);
449
+ log(`目标 IDE: ${ideConfig.name}`);
450
+ syncSkills(projectRoot, ideConfig);
451
+ skillsSynced = true;
452
+ } else {
453
+ log(`等待 MCP initialize 请求获取项目路径...`);
454
+ log(`目标 IDE: ${ideConfig.name}`);
455
+ }
378
456
 
379
- // 2. 启动 MCP 服务
457
+ // 启动 MCP 服务
380
458
  await startMcpServer();
381
459
  }
382
460
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/bkui-knowledge",
3
- "version": "0.0.1-beta.10",
3
+ "version": "0.0.1-beta.12",
4
4
  "description": "蓝鲸前端知识库 MCP 服务 - 自动同步 skills,支持 Cursor/CodeBuddy",
5
5
  "main": "server/mcp-core.js",
6
6
  "bin": {