@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 +26 -8
- package/bin/bkui-knowledge.js +90 -12
- package/package.json +1 -1
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
|
-
|
|
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 和
|
|
78
|
+
- ✅ 支持 Cursor、CodeBuddy 和 Claude 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:
|
|
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
|
|
package/bin/bkui-knowledge.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
//
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
//
|
|
457
|
+
// 启动 MCP 服务
|
|
380
458
|
await startMcpServer();
|
|
381
459
|
}
|
|
382
460
|
|