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.
Files changed (125) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +22 -0
  3. package/README.md +380 -0
  4. package/config/apifox-mcp.json.example +5 -0
  5. package/dist/__tests__/logger.test.d.ts +2 -0
  6. package/dist/__tests__/logger.test.d.ts.map +1 -0
  7. package/dist/__tests__/logger.test.js +42 -0
  8. package/dist/__tests__/logger.test.js.map +1 -0
  9. package/dist/__tests__/types.test.d.ts +2 -0
  10. package/dist/__tests__/types.test.d.ts.map +1 -0
  11. package/dist/__tests__/types.test.js +30 -0
  12. package/dist/__tests__/types.test.js.map +1 -0
  13. package/dist/__tests__/url-parser.test.d.ts +2 -0
  14. package/dist/__tests__/url-parser.test.d.ts.map +1 -0
  15. package/dist/__tests__/url-parser.test.js +27 -0
  16. package/dist/__tests__/url-parser.test.js.map +1 -0
  17. package/dist/core/client/apifox.d.ts +62 -0
  18. package/dist/core/client/apifox.d.ts.map +1 -0
  19. package/dist/core/client/apifox.js +87 -0
  20. package/dist/core/client/apifox.js.map +1 -0
  21. package/dist/core/client/index.d.ts +6 -0
  22. package/dist/core/client/index.d.ts.map +1 -0
  23. package/dist/core/client/index.js +6 -0
  24. package/dist/core/client/index.js.map +1 -0
  25. package/dist/core/client/mcp-bridge.d.ts +55 -0
  26. package/dist/core/client/mcp-bridge.d.ts.map +1 -0
  27. package/dist/core/client/mcp-bridge.js +345 -0
  28. package/dist/core/client/mcp-bridge.js.map +1 -0
  29. package/dist/core/config/index.d.ts +5 -0
  30. package/dist/core/config/index.d.ts.map +1 -0
  31. package/dist/core/config/index.js +5 -0
  32. package/dist/core/config/index.js.map +1 -0
  33. package/dist/core/config/manager.d.ts +132 -0
  34. package/dist/core/config/manager.d.ts.map +1 -0
  35. package/dist/core/config/manager.js +298 -0
  36. package/dist/core/config/manager.js.map +1 -0
  37. package/dist/core/context-store.d.ts +46 -0
  38. package/dist/core/context-store.d.ts.map +1 -0
  39. package/dist/core/context-store.js +82 -0
  40. package/dist/core/context-store.js.map +1 -0
  41. package/dist/core/generator/artifact.d.ts +20 -0
  42. package/dist/core/generator/artifact.d.ts.map +1 -0
  43. package/dist/core/generator/artifact.js +127 -0
  44. package/dist/core/generator/artifact.js.map +1 -0
  45. package/dist/core/generator/index.d.ts +6 -0
  46. package/dist/core/generator/index.d.ts.map +1 -0
  47. package/dist/core/generator/index.js +5 -0
  48. package/dist/core/generator/index.js.map +1 -0
  49. package/dist/core/index.d.ts +11 -0
  50. package/dist/core/index.d.ts.map +1 -0
  51. package/dist/core/index.js +16 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/core/intent.d.ts +14 -0
  54. package/dist/core/intent.d.ts.map +1 -0
  55. package/dist/core/intent.js +80 -0
  56. package/dist/core/intent.js.map +1 -0
  57. package/dist/core/parser/index.d.ts +6 -0
  58. package/dist/core/parser/index.d.ts.map +1 -0
  59. package/dist/core/parser/index.js +5 -0
  60. package/dist/core/parser/index.js.map +1 -0
  61. package/dist/core/parser/url.d.ts +76 -0
  62. package/dist/core/parser/url.d.ts.map +1 -0
  63. package/dist/core/parser/url.js +232 -0
  64. package/dist/core/parser/url.js.map +1 -0
  65. package/dist/lib/env.d.ts +17 -0
  66. package/dist/lib/env.d.ts.map +1 -0
  67. package/dist/lib/env.js +98 -0
  68. package/dist/lib/env.js.map +1 -0
  69. package/dist/lib/errors.d.ts +39 -0
  70. package/dist/lib/errors.d.ts.map +1 -0
  71. package/dist/lib/errors.js +59 -0
  72. package/dist/lib/errors.js.map +1 -0
  73. package/dist/lib/index.d.ts +9 -0
  74. package/dist/lib/index.d.ts.map +1 -0
  75. package/dist/lib/index.js +12 -0
  76. package/dist/lib/index.js.map +1 -0
  77. package/dist/lib/logger.d.ts +27 -0
  78. package/dist/lib/logger.d.ts.map +1 -0
  79. package/dist/lib/logger.js +79 -0
  80. package/dist/lib/logger.js.map +1 -0
  81. package/dist/lib/project-root.d.ts +8 -0
  82. package/dist/lib/project-root.d.ts.map +1 -0
  83. package/dist/lib/project-root.js +46 -0
  84. package/dist/lib/project-root.js.map +1 -0
  85. package/dist/server/handlers/assistant.d.ts +20 -0
  86. package/dist/server/handlers/assistant.d.ts.map +1 -0
  87. package/dist/server/handlers/assistant.js +71 -0
  88. package/dist/server/handlers/assistant.js.map +1 -0
  89. package/dist/server/handlers/generate-artifacts.d.ts +31 -0
  90. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -0
  91. package/dist/server/handlers/generate-artifacts.js +75 -0
  92. package/dist/server/handlers/generate-artifacts.js.map +1 -0
  93. package/dist/server/handlers/get-interface-detail.d.ts +28 -0
  94. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -0
  95. package/dist/server/handlers/get-interface-detail.js +59 -0
  96. package/dist/server/handlers/get-interface-detail.js.map +1 -0
  97. package/dist/server/handlers/index.d.ts +11 -0
  98. package/dist/server/handlers/index.d.ts.map +1 -0
  99. package/dist/server/handlers/index.js +13 -0
  100. package/dist/server/handlers/index.js.map +1 -0
  101. package/dist/server/handlers/list-projects.d.ts +12 -0
  102. package/dist/server/handlers/list-projects.d.ts.map +1 -0
  103. package/dist/server/handlers/list-projects.js +37 -0
  104. package/dist/server/handlers/list-projects.js.map +1 -0
  105. package/dist/server/handlers/parse-and-add-project.d.ts +28 -0
  106. package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -0
  107. package/dist/server/handlers/parse-and-add-project.js +224 -0
  108. package/dist/server/handlers/parse-and-add-project.js.map +1 -0
  109. package/dist/server/handlers/query-interfaces.d.ts +30 -0
  110. package/dist/server/handlers/query-interfaces.d.ts.map +1 -0
  111. package/dist/server/handlers/query-interfaces.js +67 -0
  112. package/dist/server/handlers/query-interfaces.js.map +1 -0
  113. package/dist/server/handlers/utils.d.ts +51 -0
  114. package/dist/server/handlers/utils.d.ts.map +1 -0
  115. package/dist/server/handlers/utils.js +79 -0
  116. package/dist/server/handlers/utils.js.map +1 -0
  117. package/dist/server/index.d.ts +3 -0
  118. package/dist/server/index.d.ts.map +1 -0
  119. package/dist/server/index.js +248 -0
  120. package/dist/server/index.js.map +1 -0
  121. package/dist/types/index.d.ts +119 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/types/index.js +19 -0
  124. package/dist/types/index.js.map +1 -0
  125. 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":"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"}
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA4BrC,MAAM,OAAO,YAAY;IAIH;IAHZ,WAAW,CAAS;IACpB,aAAa,CAAS;IAE9B,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IAClE,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,IAAiB;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,cAAc,CAAC,WAAmB,EAAE,SAAiB;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,GAAG,CAAC,eAAe,GAAG,WAAW,CAAC;QAClC,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;gBACL,SAAS,EAAE,GAAG,CAAC,aAAa;gBAC5B,WAAW,EAAE,GAAG,CAAC,eAAe;aACjC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iBAAiB,CAAC,WAAmB,EAAE,SAAiB,EAAE,IAAwB;QAChF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,GAAG,CAAC,iBAAiB,GAAG;YACtB,SAAS;YACT,WAAW;YACX,IAAI;YACJ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,oBAAoB;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,OAId;QACC,aAAa,CACX,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,SAAS,CACZ;YACE,GAAG,OAAO;YACV,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAClC,EACD,IAAI,EACJ,CAAC,CACF,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,aAAa;QACX,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -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"}