apifox-workspace-mcp 2.0.7 → 2.0.8
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.
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 查找项目根目录
|
|
3
|
-
*
|
|
3
|
+
* 查找当前使用 MCP Server 的业务项目根目录(不是 MCP Server 项目本身的根目录)
|
|
4
4
|
*
|
|
5
5
|
* 查找优先级:
|
|
6
6
|
* 1. 环境变量 CURSOR_WORKSPACE_ROOT(如果 Cursor 传递了工作区路径)
|
|
7
|
-
* 2. 从 .cursor/mcp.json
|
|
8
|
-
* 3.
|
|
9
|
-
* 4.
|
|
7
|
+
* 2. 从 .cursor/mcp.json 的位置推断(最可靠的方法,但排除 MCP Server 项目本身)
|
|
8
|
+
* 3. 从当前工作目录向上查找 package.json 或 .git(排除 MCP Server 项目本身)
|
|
9
|
+
* 4. 如果都找不到,使用当前工作目录(但会警告)
|
|
10
10
|
*
|
|
11
11
|
* @param startDir 起始目录,默认为当前工作目录
|
|
12
|
-
* @returns
|
|
12
|
+
* @returns 业务项目根目录路径
|
|
13
13
|
*/
|
|
14
14
|
export declare function findProjectRoot(startDir?: string): string;
|
|
15
15
|
//# sourceMappingURL=project-root.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/lib/project-root.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-root.d.ts","sourceRoot":"","sources":["../../src/lib/project-root.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA6GzD"}
|
package/dist/lib/project-root.js
CHANGED
|
@@ -1,76 +1,115 @@
|
|
|
1
|
-
import { existsSync } from 'fs';
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
2
|
import { dirname, join, resolve } from 'path';
|
|
3
3
|
import { cwd, env } from 'process';
|
|
4
4
|
import { logger } from './logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* 检查指定目录是否是 MCP Server 项目本身
|
|
7
|
+
* 通过检查 package.json 中的 name 字段来判断
|
|
8
|
+
*/
|
|
9
|
+
function isMcpServerProject(dir) {
|
|
10
|
+
try {
|
|
11
|
+
const packageJsonPath = join(dir, 'package.json');
|
|
12
|
+
if (existsSync(packageJsonPath)) {
|
|
13
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
14
|
+
return packageJson.name === 'apifox-workspace-mcp';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// 忽略错误,继续查找
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
5
22
|
/**
|
|
6
23
|
* 查找项目根目录
|
|
7
|
-
*
|
|
24
|
+
* 查找当前使用 MCP Server 的业务项目根目录(不是 MCP Server 项目本身的根目录)
|
|
8
25
|
*
|
|
9
26
|
* 查找优先级:
|
|
10
27
|
* 1. 环境变量 CURSOR_WORKSPACE_ROOT(如果 Cursor 传递了工作区路径)
|
|
11
|
-
* 2. 从 .cursor/mcp.json
|
|
12
|
-
* 3.
|
|
13
|
-
* 4.
|
|
28
|
+
* 2. 从 .cursor/mcp.json 的位置推断(最可靠的方法,但排除 MCP Server 项目本身)
|
|
29
|
+
* 3. 从当前工作目录向上查找 package.json 或 .git(排除 MCP Server 项目本身)
|
|
30
|
+
* 4. 如果都找不到,使用当前工作目录(但会警告)
|
|
14
31
|
*
|
|
15
32
|
* @param startDir 起始目录,默认为当前工作目录
|
|
16
|
-
* @returns
|
|
33
|
+
* @returns 业务项目根目录路径
|
|
17
34
|
*/
|
|
18
35
|
export function findProjectRoot(startDir) {
|
|
19
36
|
// 优先级 1: 使用环境变量(如果 Cursor 传递了工作区路径)
|
|
20
37
|
if (env.CURSOR_WORKSPACE_ROOT) {
|
|
21
38
|
const workspaceRoot = resolve(env.CURSOR_WORKSPACE_ROOT);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
39
|
+
// 检查是否是 MCP Server 项目本身,如果是则继续查找
|
|
40
|
+
if (!isMcpServerProject(workspaceRoot)) {
|
|
41
|
+
logger.info(`[findProjectRoot] 使用环境变量 CURSOR_WORKSPACE_ROOT: ${workspaceRoot}`);
|
|
42
|
+
logger.debug(`[findProjectRoot] 缓存文件将位于: ${join(workspaceRoot, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
43
|
+
return workspaceRoot;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
logger.debug(`[findProjectRoot] CURSOR_WORKSPACE_ROOT 指向 MCP Server 项目本身,继续查找业务项目`);
|
|
47
|
+
}
|
|
25
48
|
}
|
|
49
|
+
// 确定起始目录
|
|
50
|
+
const searchStartDir = startDir ? resolve(startDir) : resolve(cwd());
|
|
51
|
+
logger.debug(`[findProjectRoot] 查找业务项目根目录,起始目录: ${searchStartDir}`);
|
|
52
|
+
logger.debug(`[findProjectRoot] 当前工作目录 (cwd): ${cwd()}`);
|
|
26
53
|
// 优先级 2: 从 .cursor/mcp.json 的位置推断项目根目录
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
54
|
+
// 如果业务项目中有 .cursor/mcp.json,说明该目录就是项目根目录
|
|
55
|
+
// 但要排除 MCP Server 项目本身的 .cursor/mcp.json
|
|
56
|
+
let currentDir = searchStartDir;
|
|
57
|
+
const root = resolve('/');
|
|
58
|
+
while (currentDir !== root) {
|
|
59
|
+
const mcpConfigPath = join(currentDir, '.cursor', 'mcp.json');
|
|
60
|
+
if (existsSync(mcpConfigPath)) {
|
|
61
|
+
// 检查这个目录是否是 MCP Server 项目本身
|
|
62
|
+
if (!isMcpServerProject(currentDir)) {
|
|
63
|
+
logger.info(`[findProjectRoot] 从 .cursor/mcp.json 找到业务项目根目录: ${currentDir}`);
|
|
35
64
|
logger.debug(`[findProjectRoot] 缓存文件将位于: ${join(currentDir, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
36
65
|
return currentDir;
|
|
37
66
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
break;
|
|
67
|
+
else {
|
|
68
|
+
logger.debug(`[findProjectRoot] 跳过 MCP Server 项目本身的 .cursor/mcp.json,继续向上查找`);
|
|
41
69
|
}
|
|
42
|
-
currentDir = parentDir;
|
|
43
70
|
}
|
|
44
|
-
|
|
45
|
-
|
|
71
|
+
const parentDir = dirname(currentDir);
|
|
72
|
+
if (parentDir === currentDir) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
currentDir = parentDir;
|
|
46
76
|
}
|
|
47
77
|
// 优先级 3: 从起始目录向上查找 package.json 或 .git
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const startDirResolved = resolve(startDir);
|
|
51
|
-
logger.debug(`[findProjectRoot] 查找项目根目录,起始目录: ${startDirResolved}`);
|
|
52
|
-
logger.debug(`[findProjectRoot] 当前工作目录 (cwd): ${cwd()}`);
|
|
78
|
+
// 但要排除 MCP Server 项目本身的目录
|
|
79
|
+
currentDir = searchStartDir;
|
|
53
80
|
while (currentDir !== root) {
|
|
54
81
|
const packageJsonPath = join(currentDir, 'package.json');
|
|
55
82
|
const gitPath = join(currentDir, '.git');
|
|
56
83
|
const nodeModulesPath = join(currentDir, 'node_modules');
|
|
57
|
-
// 如果存在 package.json 或 .git
|
|
84
|
+
// 如果存在 package.json 或 .git,检查是否是 MCP Server 项目本身
|
|
58
85
|
if (existsSync(packageJsonPath) || existsSync(gitPath)) {
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
logger.
|
|
86
|
+
// 排除 MCP Server 项目本身
|
|
87
|
+
if (!isMcpServerProject(currentDir)) {
|
|
88
|
+
logger.info(`[findProjectRoot] 找到业务项目根目录: ${currentDir}`);
|
|
89
|
+
if (existsSync(packageJsonPath)) {
|
|
90
|
+
logger.debug(`[findProjectRoot] - 找到 package.json: ${packageJsonPath}`);
|
|
91
|
+
}
|
|
92
|
+
if (existsSync(gitPath)) {
|
|
93
|
+
logger.debug(`[findProjectRoot] - 找到 .git: ${gitPath}`);
|
|
94
|
+
}
|
|
95
|
+
logger.debug(`[findProjectRoot] 缓存文件将位于: ${join(currentDir, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
96
|
+
return currentDir;
|
|
62
97
|
}
|
|
63
|
-
|
|
64
|
-
logger.debug(`[findProjectRoot]
|
|
98
|
+
else {
|
|
99
|
+
logger.debug(`[findProjectRoot] 跳过 MCP Server 项目本身,继续向上查找`);
|
|
65
100
|
}
|
|
66
|
-
logger.debug(`[findProjectRoot] 缓存文件将位于: ${join(currentDir, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
67
|
-
return currentDir;
|
|
68
101
|
}
|
|
69
|
-
// 如果遇到 node_modules
|
|
102
|
+
// 如果遇到 node_modules,检查其父目录
|
|
70
103
|
if (existsSync(nodeModulesPath)) {
|
|
71
104
|
const projectRoot = dirname(nodeModulesPath);
|
|
72
|
-
|
|
73
|
-
|
|
105
|
+
if (!isMcpServerProject(projectRoot)) {
|
|
106
|
+
logger.info(`[findProjectRoot] 找到业务项目根目录(通过 node_modules): ${projectRoot}`);
|
|
107
|
+
logger.debug(`[findProjectRoot] 缓存文件将位于: ${join(projectRoot, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
108
|
+
return projectRoot;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
logger.debug(`[findProjectRoot] 跳过 MCP Server 项目本身的 node_modules,继续向上查找`);
|
|
112
|
+
}
|
|
74
113
|
}
|
|
75
114
|
const parentDir = dirname(currentDir);
|
|
76
115
|
if (parentDir === currentDir) {
|
|
@@ -79,8 +118,9 @@ export function findProjectRoot(startDir) {
|
|
|
79
118
|
currentDir = parentDir;
|
|
80
119
|
}
|
|
81
120
|
// 优先级 4: 如果都找不到,使用起始目录(但会警告)
|
|
82
|
-
logger.warn(`[findProjectRoot]
|
|
83
|
-
logger.warn(`[findProjectRoot] 缓存文件将位于: ${join(
|
|
84
|
-
|
|
121
|
+
logger.warn(`[findProjectRoot] 未找到业务项目标识文件,使用起始目录: ${searchStartDir}`);
|
|
122
|
+
logger.warn(`[findProjectRoot] 缓存文件将位于: ${join(searchStartDir, '.cursor', 'tmp', 'apifox-interfaces-cache.json')}`);
|
|
123
|
+
logger.warn(`[findProjectRoot] 提示: 确保在业务项目目录中打开 Cursor,或设置 CURSOR_WORKSPACE_ROOT 环境变量`);
|
|
124
|
+
return searchStartDir;
|
|
85
125
|
}
|
|
86
126
|
//# sourceMappingURL=project-root.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/lib/project-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/lib/project-root.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED