apifox-workspace-mcp 1.0.0
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/CHANGELOG.md +65 -0
- package/LICENSE +22 -0
- package/README.md +380 -0
- package/config/apifox-mcp.json.example +5 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +42 -0
- package/dist/__tests__/logger.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +30 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/url-parser.test.d.ts +2 -0
- package/dist/__tests__/url-parser.test.d.ts.map +1 -0
- package/dist/__tests__/url-parser.test.js +27 -0
- package/dist/__tests__/url-parser.test.js.map +1 -0
- package/dist/core/client/apifox.d.ts +62 -0
- package/dist/core/client/apifox.d.ts.map +1 -0
- package/dist/core/client/apifox.js +87 -0
- package/dist/core/client/apifox.js.map +1 -0
- package/dist/core/client/index.d.ts +6 -0
- package/dist/core/client/index.d.ts.map +1 -0
- package/dist/core/client/index.js +6 -0
- package/dist/core/client/index.js.map +1 -0
- package/dist/core/client/mcp-bridge.d.ts +55 -0
- package/dist/core/client/mcp-bridge.d.ts.map +1 -0
- package/dist/core/client/mcp-bridge.js +345 -0
- package/dist/core/client/mcp-bridge.js.map +1 -0
- package/dist/core/config/index.d.ts +5 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +5 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/config/manager.d.ts +132 -0
- package/dist/core/config/manager.d.ts.map +1 -0
- package/dist/core/config/manager.js +298 -0
- package/dist/core/config/manager.js.map +1 -0
- package/dist/core/context-store.d.ts +46 -0
- package/dist/core/context-store.d.ts.map +1 -0
- package/dist/core/context-store.js +82 -0
- package/dist/core/context-store.js.map +1 -0
- package/dist/core/generator/artifact.d.ts +20 -0
- package/dist/core/generator/artifact.d.ts.map +1 -0
- package/dist/core/generator/artifact.js +127 -0
- package/dist/core/generator/artifact.js.map +1 -0
- package/dist/core/generator/index.d.ts +6 -0
- package/dist/core/generator/index.d.ts.map +1 -0
- package/dist/core/generator/index.js +5 -0
- package/dist/core/generator/index.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/intent.d.ts +14 -0
- package/dist/core/intent.d.ts.map +1 -0
- package/dist/core/intent.js +80 -0
- package/dist/core/intent.js.map +1 -0
- package/dist/core/parser/index.d.ts +6 -0
- package/dist/core/parser/index.d.ts.map +1 -0
- package/dist/core/parser/index.js +5 -0
- package/dist/core/parser/index.js.map +1 -0
- package/dist/core/parser/url.d.ts +76 -0
- package/dist/core/parser/url.d.ts.map +1 -0
- package/dist/core/parser/url.js +232 -0
- package/dist/core/parser/url.js.map +1 -0
- package/dist/lib/env.d.ts +17 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +98 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/errors.d.ts +39 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +59 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +12 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logger.d.ts +27 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +79 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/project-root.d.ts +8 -0
- package/dist/lib/project-root.d.ts.map +1 -0
- package/dist/lib/project-root.js +46 -0
- package/dist/lib/project-root.js.map +1 -0
- package/dist/server/handlers/assistant.d.ts +20 -0
- package/dist/server/handlers/assistant.d.ts.map +1 -0
- package/dist/server/handlers/assistant.js +71 -0
- package/dist/server/handlers/assistant.js.map +1 -0
- package/dist/server/handlers/generate-artifacts.d.ts +31 -0
- package/dist/server/handlers/generate-artifacts.d.ts.map +1 -0
- package/dist/server/handlers/generate-artifacts.js +75 -0
- package/dist/server/handlers/generate-artifacts.js.map +1 -0
- package/dist/server/handlers/get-interface-detail.d.ts +28 -0
- package/dist/server/handlers/get-interface-detail.d.ts.map +1 -0
- package/dist/server/handlers/get-interface-detail.js +59 -0
- package/dist/server/handlers/get-interface-detail.js.map +1 -0
- package/dist/server/handlers/index.d.ts +11 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +13 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/list-projects.d.ts +12 -0
- package/dist/server/handlers/list-projects.d.ts.map +1 -0
- package/dist/server/handlers/list-projects.js +37 -0
- package/dist/server/handlers/list-projects.js.map +1 -0
- package/dist/server/handlers/parse-and-add-project.d.ts +28 -0
- package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -0
- package/dist/server/handlers/parse-and-add-project.js +224 -0
- package/dist/server/handlers/parse-and-add-project.js.map +1 -0
- package/dist/server/handlers/query-interfaces.d.ts +30 -0
- package/dist/server/handlers/query-interfaces.d.ts.map +1 -0
- package/dist/server/handlers/query-interfaces.js +67 -0
- package/dist/server/handlers/query-interfaces.js.map +1 -0
- package/dist/server/handlers/utils.d.ts +51 -0
- package/dist/server/handlers/utils.d.ts.map +1 -0
- package/dist/server/handlers/utils.js +79 -0
- package/dist/server/handlers/utils.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +248 -0
- package/dist/server/index.js.map +1 -0
- package/dist/types/index.d.ts +119 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 项目配置结构(新格式)
|
|
3
|
+
*/
|
|
4
|
+
export interface ProjectConfig {
|
|
5
|
+
/** 项目 ID */
|
|
6
|
+
id: string;
|
|
7
|
+
/** 分享 URL */
|
|
8
|
+
shareUrl?: string;
|
|
9
|
+
/** llms.txt 链接 */
|
|
10
|
+
llmsUrl?: string;
|
|
11
|
+
/** 最后更新时间 */
|
|
12
|
+
lastUpdated?: string;
|
|
13
|
+
/** 接口列表(可选) */
|
|
14
|
+
interfaces?: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 配置文件类型:支持旧格式(字符串)和新格式(对象)
|
|
18
|
+
*/
|
|
19
|
+
export type ApifoxConfig = Record<string, string | ProjectConfig>;
|
|
20
|
+
/**
|
|
21
|
+
* 配置文件管理器
|
|
22
|
+
* 负责读取和更新 apifox-mcp.json
|
|
23
|
+
* APIFOX_ACCESS_TOKEN 从环境变量中获取(MCP Server 的 env 配置)
|
|
24
|
+
*/
|
|
25
|
+
export declare class ConfigManager {
|
|
26
|
+
private projectRoot;
|
|
27
|
+
private apifoxConfigPath;
|
|
28
|
+
constructor(projectRoot: string);
|
|
29
|
+
/**
|
|
30
|
+
* 初始化配置文件
|
|
31
|
+
* 检查并创建缺失的配置文件
|
|
32
|
+
* @returns 初始化结果
|
|
33
|
+
*/
|
|
34
|
+
initializeConfig(): {
|
|
35
|
+
apifoxConfigExists: boolean;
|
|
36
|
+
apifoxConfigCreated: boolean;
|
|
37
|
+
errors: string[];
|
|
38
|
+
projectRoot: string;
|
|
39
|
+
configPath: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* 从环境变量中获取 APIFOX_ACCESS_TOKEN
|
|
43
|
+
* @returns access token 或 null
|
|
44
|
+
*/
|
|
45
|
+
getAccessToken(): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* 检查配置文件状态
|
|
48
|
+
* @returns 配置文件状态信息
|
|
49
|
+
*/
|
|
50
|
+
checkConfigStatus(): {
|
|
51
|
+
apifoxConfigExists: boolean;
|
|
52
|
+
hasAccessToken: boolean;
|
|
53
|
+
projectCount: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* 检查配置值是否为旧格式(字符串)
|
|
57
|
+
*/
|
|
58
|
+
private isLegacyFormat;
|
|
59
|
+
/**
|
|
60
|
+
* 将旧格式转换为新格式
|
|
61
|
+
*/
|
|
62
|
+
private migrateLegacyConfig;
|
|
63
|
+
/**
|
|
64
|
+
* 读取 apifox-mcp.json 配置
|
|
65
|
+
* @returns 项目配置对象(支持新旧格式)
|
|
66
|
+
*/
|
|
67
|
+
getApifoxConfig(): ApifoxConfig;
|
|
68
|
+
/**
|
|
69
|
+
* 获取项目配置(新格式)
|
|
70
|
+
*/
|
|
71
|
+
private getProjectConfig;
|
|
72
|
+
/**
|
|
73
|
+
* 更新 apifox-mcp.json 配置(兼容旧方法)
|
|
74
|
+
* @param projectName 项目名称
|
|
75
|
+
* @param projectId 项目 ID
|
|
76
|
+
* @returns 是否成功添加(如果已存在则返回 false)
|
|
77
|
+
*/
|
|
78
|
+
addProject(projectName: string, projectId: string): {
|
|
79
|
+
success: boolean;
|
|
80
|
+
message: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* 添加或更新项目配置
|
|
84
|
+
* @param projectName 项目名称
|
|
85
|
+
* @param projectConfig 项目配置
|
|
86
|
+
* @returns 操作结果,包含是否为新项目
|
|
87
|
+
*/
|
|
88
|
+
upsertProject(projectName: string, projectConfig: Partial<ProjectConfig> & {
|
|
89
|
+
id: string;
|
|
90
|
+
}): {
|
|
91
|
+
success: boolean;
|
|
92
|
+
message: string;
|
|
93
|
+
isNew: boolean;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* 更新项目的 llms.txt 链接
|
|
97
|
+
* @param projectName 项目名称
|
|
98
|
+
* @param llmsUrl llms.txt 链接
|
|
99
|
+
* @returns 是否成功更新
|
|
100
|
+
*/
|
|
101
|
+
updateProjectLlmsUrl(projectName: string, llmsUrl: string): {
|
|
102
|
+
success: boolean;
|
|
103
|
+
message: string;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* 根据项目名称获取项目 ID
|
|
107
|
+
* @param projectName 项目名称
|
|
108
|
+
* @returns 项目 ID 或 null
|
|
109
|
+
*/
|
|
110
|
+
getProjectId(projectName: string): string | null;
|
|
111
|
+
/**
|
|
112
|
+
* 根据项目 ID 获取项目名称
|
|
113
|
+
* @param projectId 项目 ID
|
|
114
|
+
* @returns 项目名称或 null
|
|
115
|
+
*/
|
|
116
|
+
getProjectName(projectId: string): string | null;
|
|
117
|
+
/**
|
|
118
|
+
* 列出所有项目
|
|
119
|
+
* @returns 项目列表 [{ name, id }]
|
|
120
|
+
*/
|
|
121
|
+
listProjects(): Array<{
|
|
122
|
+
name: string;
|
|
123
|
+
id: string;
|
|
124
|
+
}>;
|
|
125
|
+
getProjectShareUrl(projectName: string): string | null;
|
|
126
|
+
/**
|
|
127
|
+
* 获取 apifox-mcp.json 文件路径
|
|
128
|
+
* @returns 文件路径
|
|
129
|
+
*/
|
|
130
|
+
getApifoxConfigPath(): string;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC;AAElE;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;gBAErB,WAAW,EAAE,MAAM;IAK/B;;;;OAIG;IACH,gBAAgB,IAAI;QAClB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB;IAqCD;;;OAGG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAO/B;;;OAGG;IACH,iBAAiB,IAAI;QACnB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;KACtB;IAYD;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;OAGG;IACH,eAAe,IAAI,YAAY;IAyB/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;OAKG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAMzF;;;;;OAKG;IACH,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACrD;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE;IAwDxD;;;;;OAKG;IACH,oBAAoB,CAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAoCxC;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAShD;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAShD;;;OAGG;IACH,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAQnD,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAStD;;;OAGG;IACH,mBAAmB,IAAI,MAAM;CAG9B"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* 配置文件管理器
|
|
5
|
+
* 负责读取和更新 apifox-mcp.json
|
|
6
|
+
* APIFOX_ACCESS_TOKEN 从环境变量中获取(MCP Server 的 env 配置)
|
|
7
|
+
*/
|
|
8
|
+
export class ConfigManager {
|
|
9
|
+
projectRoot;
|
|
10
|
+
apifoxConfigPath;
|
|
11
|
+
constructor(projectRoot) {
|
|
12
|
+
this.projectRoot = projectRoot;
|
|
13
|
+
this.apifoxConfigPath = join(projectRoot, 'apifox-mcp.json');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 初始化配置文件
|
|
17
|
+
* 检查并创建缺失的配置文件
|
|
18
|
+
* @returns 初始化结果
|
|
19
|
+
*/
|
|
20
|
+
initializeConfig() {
|
|
21
|
+
const result = {
|
|
22
|
+
apifoxConfigExists: existsSync(this.apifoxConfigPath),
|
|
23
|
+
apifoxConfigCreated: false,
|
|
24
|
+
errors: [],
|
|
25
|
+
projectRoot: this.projectRoot,
|
|
26
|
+
configPath: this.apifoxConfigPath,
|
|
27
|
+
};
|
|
28
|
+
// 创建 apifox-mcp.json 文件(如果不存在)
|
|
29
|
+
if (!result.apifoxConfigExists) {
|
|
30
|
+
try {
|
|
31
|
+
// 输出调试信息
|
|
32
|
+
console.error(`📁 项目根目录: ${this.projectRoot}`);
|
|
33
|
+
console.error(`📄 配置文件路径: ${this.apifoxConfigPath}`);
|
|
34
|
+
console.error(`🔄 尝试创建 apifox-mcp.json 文件...`);
|
|
35
|
+
const defaultConfigContent = JSON.stringify({}, null, 2);
|
|
36
|
+
writeFileSync(this.apifoxConfigPath, defaultConfigContent, 'utf-8');
|
|
37
|
+
result.apifoxConfigCreated = true;
|
|
38
|
+
console.error(`✅ 成功创建 apifox-mcp.json 文件: ${this.apifoxConfigPath}`);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const errorMsg = `无法创建 apifox-mcp.json 文件: ${error instanceof Error ? error.message : String(error)}`;
|
|
42
|
+
result.errors.push(errorMsg);
|
|
43
|
+
console.error(`❌ ${errorMsg}`);
|
|
44
|
+
console.error(` 项目根目录: ${this.projectRoot}`);
|
|
45
|
+
console.error(` 配置文件路径: ${this.apifoxConfigPath}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.error(`✅ apifox-mcp.json 文件已存在: ${this.apifoxConfigPath}`);
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 从环境变量中获取 APIFOX_ACCESS_TOKEN
|
|
55
|
+
* @returns access token 或 null
|
|
56
|
+
*/
|
|
57
|
+
getAccessToken() {
|
|
58
|
+
const token = process.env.APIFOX_ACCESS_TOKEN;
|
|
59
|
+
// 如果 token 为空字符串或未定义,返回 null
|
|
60
|
+
return token && token.trim() !== '' ? token : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 检查配置文件状态
|
|
64
|
+
* @returns 配置文件状态信息
|
|
65
|
+
*/
|
|
66
|
+
checkConfigStatus() {
|
|
67
|
+
const apifoxConfigExists = existsSync(this.apifoxConfigPath);
|
|
68
|
+
const accessToken = this.getAccessToken();
|
|
69
|
+
const projects = this.listProjects();
|
|
70
|
+
return {
|
|
71
|
+
apifoxConfigExists,
|
|
72
|
+
hasAccessToken: accessToken !== null && accessToken.trim() !== '',
|
|
73
|
+
projectCount: projects.length,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 检查配置值是否为旧格式(字符串)
|
|
78
|
+
*/
|
|
79
|
+
isLegacyFormat(value) {
|
|
80
|
+
return typeof value === 'string';
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 将旧格式转换为新格式
|
|
84
|
+
*/
|
|
85
|
+
migrateLegacyConfig(config) {
|
|
86
|
+
const migrated = {};
|
|
87
|
+
for (const [key, value] of Object.entries(config)) {
|
|
88
|
+
if (this.isLegacyFormat(value)) {
|
|
89
|
+
// 旧格式:字符串 projectId
|
|
90
|
+
migrated[key] = {
|
|
91
|
+
id: value,
|
|
92
|
+
lastUpdated: new Date().toISOString(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// 已经是新格式
|
|
97
|
+
migrated[key] = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return migrated;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 读取 apifox-mcp.json 配置
|
|
104
|
+
* @returns 项目配置对象(支持新旧格式)
|
|
105
|
+
*/
|
|
106
|
+
getApifoxConfig() {
|
|
107
|
+
try {
|
|
108
|
+
if (!existsSync(this.apifoxConfigPath)) {
|
|
109
|
+
return {};
|
|
110
|
+
}
|
|
111
|
+
const content = readFileSync(this.apifoxConfigPath, 'utf-8');
|
|
112
|
+
const config = JSON.parse(content);
|
|
113
|
+
// 检查是否需要迁移
|
|
114
|
+
const needsMigration = Object.values(config).some((v) => this.isLegacyFormat(v));
|
|
115
|
+
if (needsMigration) {
|
|
116
|
+
const migrated = this.migrateLegacyConfig(config);
|
|
117
|
+
// 自动保存迁移后的配置
|
|
118
|
+
writeFileSync(this.apifoxConfigPath, JSON.stringify(migrated, null, 2), 'utf-8');
|
|
119
|
+
return migrated;
|
|
120
|
+
}
|
|
121
|
+
return config;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error('读取 apifox-mcp.json 失败:', error);
|
|
125
|
+
return {};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 获取项目配置(新格式)
|
|
130
|
+
*/
|
|
131
|
+
getProjectConfig(projectName) {
|
|
132
|
+
const config = this.getApifoxConfig();
|
|
133
|
+
const value = config[projectName];
|
|
134
|
+
if (!value) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (this.isLegacyFormat(value)) {
|
|
138
|
+
return { id: value };
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 更新 apifox-mcp.json 配置(兼容旧方法)
|
|
144
|
+
* @param projectName 项目名称
|
|
145
|
+
* @param projectId 项目 ID
|
|
146
|
+
* @returns 是否成功添加(如果已存在则返回 false)
|
|
147
|
+
*/
|
|
148
|
+
addProject(projectName, projectId) {
|
|
149
|
+
return this.upsertProject(projectName, {
|
|
150
|
+
id: projectId,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 添加或更新项目配置
|
|
155
|
+
* @param projectName 项目名称
|
|
156
|
+
* @param projectConfig 项目配置
|
|
157
|
+
* @returns 操作结果,包含是否为新项目
|
|
158
|
+
*/
|
|
159
|
+
upsertProject(projectName, projectConfig) {
|
|
160
|
+
try {
|
|
161
|
+
const config = this.getApifoxConfig();
|
|
162
|
+
// 检查是否已存在相同的 projectId(但项目名称不同)
|
|
163
|
+
const existingByProjectId = Object.entries(config).find(([name, value]) => {
|
|
164
|
+
if (name === projectName)
|
|
165
|
+
return false;
|
|
166
|
+
const existingId = this.isLegacyFormat(value) ? value : value.id;
|
|
167
|
+
return existingId === projectConfig.id;
|
|
168
|
+
});
|
|
169
|
+
if (existingByProjectId) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
message: `项目 ID ${projectConfig.id} 已存在,对应项目名称: ${existingByProjectId[0]}`,
|
|
173
|
+
isNew: false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// 检查是否已存在相同的项目名称
|
|
177
|
+
const existing = config[projectName];
|
|
178
|
+
const isNew = !existing;
|
|
179
|
+
// 合并配置
|
|
180
|
+
const existingConfig = existing && !this.isLegacyFormat(existing)
|
|
181
|
+
? existing
|
|
182
|
+
: { id: this.isLegacyFormat(existing) ? existing : projectConfig.id };
|
|
183
|
+
const updatedConfig = {
|
|
184
|
+
...existingConfig,
|
|
185
|
+
...projectConfig,
|
|
186
|
+
id: projectConfig.id, // 确保 id 被更新
|
|
187
|
+
lastUpdated: new Date().toISOString(),
|
|
188
|
+
};
|
|
189
|
+
config[projectName] = updatedConfig;
|
|
190
|
+
writeFileSync(this.apifoxConfigPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
message: isNew
|
|
194
|
+
? `成功添加项目: ${projectName} (${projectConfig.id})`
|
|
195
|
+
: `成功更新项目: ${projectName} (${projectConfig.id})`,
|
|
196
|
+
isNew,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.error('更新 apifox-mcp.json 失败:', error);
|
|
201
|
+
return {
|
|
202
|
+
success: false,
|
|
203
|
+
message: `更新配置失败: ${error instanceof Error ? error.message : String(error)}`,
|
|
204
|
+
isNew: false,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 更新项目的 llms.txt 链接
|
|
210
|
+
* @param projectName 项目名称
|
|
211
|
+
* @param llmsUrl llms.txt 链接
|
|
212
|
+
* @returns 是否成功更新
|
|
213
|
+
*/
|
|
214
|
+
updateProjectLlmsUrl(projectName, llmsUrl) {
|
|
215
|
+
try {
|
|
216
|
+
const config = this.getApifoxConfig();
|
|
217
|
+
const existing = config[projectName];
|
|
218
|
+
if (!existing) {
|
|
219
|
+
return {
|
|
220
|
+
success: false,
|
|
221
|
+
message: `项目 ${projectName} 不存在`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const existingConfig = this.isLegacyFormat(existing) ? { id: existing } : existing;
|
|
225
|
+
const updatedConfig = {
|
|
226
|
+
...existingConfig,
|
|
227
|
+
llmsUrl,
|
|
228
|
+
lastUpdated: new Date().toISOString(),
|
|
229
|
+
};
|
|
230
|
+
config[projectName] = updatedConfig;
|
|
231
|
+
writeFileSync(this.apifoxConfigPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
232
|
+
return {
|
|
233
|
+
success: true,
|
|
234
|
+
message: `成功更新项目 ${projectName} 的 llms.txt 链接`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
console.error('更新 llms.txt 链接失败:', error);
|
|
239
|
+
return {
|
|
240
|
+
success: false,
|
|
241
|
+
message: `更新失败: ${error instanceof Error ? error.message : String(error)}`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 根据项目名称获取项目 ID
|
|
247
|
+
* @param projectName 项目名称
|
|
248
|
+
* @returns 项目 ID 或 null
|
|
249
|
+
*/
|
|
250
|
+
getProjectId(projectName) {
|
|
251
|
+
const config = this.getApifoxConfig();
|
|
252
|
+
const value = config[projectName];
|
|
253
|
+
if (!value) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return this.isLegacyFormat(value) ? value : value.id;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* 根据项目 ID 获取项目名称
|
|
260
|
+
* @param projectId 项目 ID
|
|
261
|
+
* @returns 项目名称或 null
|
|
262
|
+
*/
|
|
263
|
+
getProjectName(projectId) {
|
|
264
|
+
const config = this.getApifoxConfig();
|
|
265
|
+
const entry = Object.entries(config).find(([_, value]) => {
|
|
266
|
+
const id = this.isLegacyFormat(value) ? value : value.id;
|
|
267
|
+
return id === projectId;
|
|
268
|
+
});
|
|
269
|
+
return entry ? entry[0] : null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 列出所有项目
|
|
273
|
+
* @returns 项目列表 [{ name, id }]
|
|
274
|
+
*/
|
|
275
|
+
listProjects() {
|
|
276
|
+
const config = this.getApifoxConfig();
|
|
277
|
+
return Object.entries(config).map(([name, value]) => ({
|
|
278
|
+
name,
|
|
279
|
+
id: this.isLegacyFormat(value) ? value : value.id,
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
getProjectShareUrl(projectName) {
|
|
283
|
+
const config = this.getApifoxConfig();
|
|
284
|
+
const value = config[projectName];
|
|
285
|
+
if (!value || this.isLegacyFormat(value)) {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
return value.shareUrl || null;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* 获取 apifox-mcp.json 文件路径
|
|
292
|
+
* @returns 文件路径
|
|
293
|
+
*/
|
|
294
|
+
getApifoxConfigPath() {
|
|
295
|
+
return this.apifoxConfigPath;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/config/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAuB5B;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAChB,WAAW,CAAS;IACpB,gBAAgB,CAAS;IAEjC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QAOd,MAAM,MAAM,GAAG;YACb,kBAAkB,EAAE,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACrD,mBAAmB,EAAE,KAAK;YAC1B,MAAM,EAAE,EAAc;YACtB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,gBAAgB;SAClC,CAAC;QAEF,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,SAAS;gBACT,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACrD,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAE/C,MAAM,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACzD,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;gBACpE,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,4BACf,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,CAAC;gBACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAE9C,6BAA6B;QAC7B,OAAO,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,iBAAiB;QAKf,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAErC,OAAO;YACL,kBAAkB;YAClB,cAAc,EAAE,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE;YACjE,YAAY,EAAE,QAAQ,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAA6B;QAClD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,MAAoB;QAC9C,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,oBAAoB;gBACpB,QAAQ,CAAC,GAAG,CAAC,GAAG;oBACd,EAAE,EAAE,KAAK;oBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACtC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,SAAS;gBACT,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACvC,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;YAEnD,WAAW;YACX,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAClD,aAAa;gBACb,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBACjF,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,WAAmB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,WAAmB,EAAE,SAAiB;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;YACrC,EAAE,EAAE,SAAS;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,aAAa,CACX,WAAmB,EACnB,aAAsD;QAEtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAEtC,gCAAgC;YAChC,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;gBACxE,IAAI,IAAI,KAAK,WAAW;oBAAE,OAAO,KAAK,CAAC;gBACvC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjE,OAAO,UAAU,KAAK,aAAa,CAAC,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,SAAS,aAAa,CAAC,EAAE,gBAAgB,mBAAmB,CAAC,CAAC,CAAC,EAAE;oBAC1E,KAAK,EAAE,KAAK;iBACb,CAAC;YACJ,CAAC;YAED,iBAAiB;YACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC;YAExB,OAAO;YACP,MAAM,cAAc,GAClB,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;gBACxC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YAE1E,MAAM,aAAa,GAAkB;gBACnC,GAAG,cAAc;gBACjB,GAAG,aAAa;gBAChB,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,YAAY;gBAClC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;YACpC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAE/E,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK;oBACZ,CAAC,CAAC,WAAW,WAAW,KAAK,aAAa,CAAC,EAAE,GAAG;oBAChD,CAAC,CAAC,WAAW,WAAW,KAAK,aAAa,CAAC,EAAE,GAAG;gBAClD,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC5E,KAAK,EAAE,KAAK;aACb,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,oBAAoB,CAClB,WAAmB,EACnB,OAAe;QAEf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAErC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,MAAM,WAAW,MAAM;iBACjC,CAAC;YACJ,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAEnF,MAAM,aAAa,GAAkB;gBACnC,GAAG,cAAc;gBACjB,OAAO;gBACP,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;YACpC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAE/E,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,UAAU,WAAW,gBAAgB;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,SAAS,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aAC3E,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,WAAmB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,SAAiB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,KAAK,SAAS,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI;YACJ,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;SAClD,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kBAAkB,CAAC,WAAmB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface InterfaceSummary {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
method: string;
|
|
5
|
+
path: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SavedSelection {
|
|
9
|
+
projectId?: string;
|
|
10
|
+
projectName?: string;
|
|
11
|
+
selected: Array<{
|
|
12
|
+
id: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
}>;
|
|
15
|
+
savedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class ContextStore {
|
|
18
|
+
private projectRoot;
|
|
19
|
+
private contextPath;
|
|
20
|
+
private selectionPath;
|
|
21
|
+
constructor(projectRoot: string);
|
|
22
|
+
private readContext;
|
|
23
|
+
private writeContext;
|
|
24
|
+
setLastProject(projectName: string, projectId: string): void;
|
|
25
|
+
getLastProject(): {
|
|
26
|
+
projectId: string;
|
|
27
|
+
projectName: string;
|
|
28
|
+
} | null;
|
|
29
|
+
saveInterfaceList(projectName: string, projectId: string, list: InterfaceSummary[]): void;
|
|
30
|
+
getLastInterfaceList(): {
|
|
31
|
+
projectName?: string;
|
|
32
|
+
projectId?: string;
|
|
33
|
+
list: InterfaceSummary[];
|
|
34
|
+
savedAt: string;
|
|
35
|
+
} | null;
|
|
36
|
+
saveSelections(payload: {
|
|
37
|
+
projectId?: string;
|
|
38
|
+
projectName?: string;
|
|
39
|
+
selected: Array<{
|
|
40
|
+
id: string;
|
|
41
|
+
name?: string;
|
|
42
|
+
}>;
|
|
43
|
+
}): void;
|
|
44
|
+
getSelections(): SavedSelection | null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=context-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-store.d.ts","sourceRoot":"","sources":["../../src/core/context-store.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAaD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IAIX,OAAO,CAAC,WAAW;IAH/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;gBAEV,WAAW,EAAE,MAAM;IASvC,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAQpB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAOrD,cAAc;;;;IAWd,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAWlF,oBAAoB;sBA3EJ,MAAM;oBACR,MAAM;cACZ,gBAAgB,EAAE;iBACf,MAAM;;IA6EjB,cAAc,CAAC,OAAO,EAAE;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChD;IAeD,aAAa,IAAI,cAAc,GAAG,IAAI;CAUvC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
export class ContextStore {
|
|
4
|
+
projectRoot;
|
|
5
|
+
contextPath;
|
|
6
|
+
selectionPath;
|
|
7
|
+
constructor(projectRoot) {
|
|
8
|
+
this.projectRoot = projectRoot;
|
|
9
|
+
const cursorTmpDir = join(this.projectRoot, '.cursor', 'tmp');
|
|
10
|
+
if (!existsSync(cursorTmpDir)) {
|
|
11
|
+
mkdirSync(cursorTmpDir, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
this.contextPath = join(cursorTmpDir, 'apifox-context.json');
|
|
14
|
+
this.selectionPath = join(cursorTmpDir, 'apifox-selected.json');
|
|
15
|
+
}
|
|
16
|
+
readContext() {
|
|
17
|
+
try {
|
|
18
|
+
if (!existsSync(this.contextPath)) {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
return JSON.parse(readFileSync(this.contextPath, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return {};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
writeContext(data) {
|
|
28
|
+
const dir = dirname(this.contextPath);
|
|
29
|
+
if (!existsSync(dir)) {
|
|
30
|
+
mkdirSync(dir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
writeFileSync(this.contextPath, JSON.stringify(data, null, 2), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
setLastProject(projectName, projectId) {
|
|
35
|
+
const ctx = this.readContext();
|
|
36
|
+
ctx.lastProjectName = projectName;
|
|
37
|
+
ctx.lastProjectId = projectId;
|
|
38
|
+
this.writeContext(ctx);
|
|
39
|
+
}
|
|
40
|
+
getLastProject() {
|
|
41
|
+
const ctx = this.readContext();
|
|
42
|
+
if (ctx.lastProjectId && ctx.lastProjectName) {
|
|
43
|
+
return {
|
|
44
|
+
projectId: ctx.lastProjectId,
|
|
45
|
+
projectName: ctx.lastProjectName,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
saveInterfaceList(projectName, projectId, list) {
|
|
51
|
+
const ctx = this.readContext();
|
|
52
|
+
ctx.lastInterfaceList = {
|
|
53
|
+
projectId,
|
|
54
|
+
projectName,
|
|
55
|
+
list,
|
|
56
|
+
savedAt: new Date().toISOString(),
|
|
57
|
+
};
|
|
58
|
+
this.writeContext(ctx);
|
|
59
|
+
}
|
|
60
|
+
getLastInterfaceList() {
|
|
61
|
+
const ctx = this.readContext();
|
|
62
|
+
return ctx.lastInterfaceList || null;
|
|
63
|
+
}
|
|
64
|
+
saveSelections(payload) {
|
|
65
|
+
writeFileSync(this.selectionPath, JSON.stringify({
|
|
66
|
+
...payload,
|
|
67
|
+
savedAt: new Date().toISOString(),
|
|
68
|
+
}, null, 2), 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
getSelections() {
|
|
71
|
+
try {
|
|
72
|
+
if (!existsSync(this.selectionPath)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return JSON.parse(readFileSync(this.selectionPath, 'utf-8'));
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=context-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-store.js","sourceRoot":"","sources":["../../src/core/context-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ApiRequestSpec, ApiResponseSpec } from '../../types/index.js';
|
|
2
|
+
export interface ArtifactInput {
|
|
3
|
+
interfaceDetail: {
|
|
4
|
+
id: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
method?: string;
|
|
7
|
+
path?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
request?: ApiRequestSpec;
|
|
10
|
+
response?: ApiResponseSpec;
|
|
11
|
+
};
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GeneratedArtifact {
|
|
15
|
+
title: string;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
export type ArtifactType = 'ts_types' | 'mock_data' | 'request_wrappers' | 'test_scripts';
|
|
19
|
+
export declare function generateArtifact(type: ArtifactType, payload: ArtifactInput): GeneratedArtifact;
|
|
20
|
+
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/core/generator/artifact.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvE,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,cAAc,CAAC;QACzB,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAW9F"}
|