cloudcc-cli 2.2.6 → 2.2.7

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 (117) hide show
  1. package/.cloudcc-cache.json +24 -20
  2. package/README.md +12 -0
  3. package/bin/cc.js +7 -0
  4. package/java/com/cloudcc/core/BaseException.java +100 -0
  5. package/java/com/cloudcc/core/BusiException.java +43 -0
  6. package/java/com/cloudcc/core/CCService.java +3 -1
  7. package/java/com/cloudcc/core/StringUtils.java +7 -0
  8. package/java/com/cloudcc/core/TimeUtil.java +33 -0
  9. package/java/com/cloudcc/core/UserInfo.java +9 -0
  10. package/package.json +7 -1
  11. package/pom.xml +1 -1
  12. package/skill/BACKEND_CODE.md +114 -0
  13. package/skill/CLI_CHEATSHEET.md +90 -0
  14. package/skill/INSTALL_AND_BOOTSTRAP.md +59 -0
  15. package/skill/OBJECTS_AND_FIELDS.md +120 -0
  16. package/skill/REQUIREMENTS_BREAKDOWN.md +98 -0
  17. package/skill/SKILL.md +33 -0
  18. package/skill/VUE_CUSTOM_COMPONENT.md +50 -0
  19. package/src/api/backend-sdk-java.md +427 -0
  20. package/src/api/ccdk-sdk.md +1039 -0
  21. package/src/classes/doc.js +486 -0
  22. package/src/classes/index.js +1 -0
  23. package/src/mcp/cliRunner.js +61 -0
  24. package/src/mcp/index.js +41 -3
  25. package/src/mcp/tools/Application Creator/handler.js +7 -9
  26. package/src/mcp/tools/Approval/handler.js +34 -151
  27. package/src/mcp/tools/Class Creator/handler.js +18 -15
  28. package/src/mcp/tools/Class Detail Retriever/handler.js +8 -9
  29. package/src/mcp/tools/Class Editor Guide/handler.js +5 -19
  30. package/src/mcp/tools/Class List Retriever/handler.js +8 -3
  31. package/src/mcp/tools/Class Publisher/handler.js +7 -9
  32. package/src/mcp/tools/Class Puller/handler.js +6 -65
  33. package/src/mcp/tools/Client Script Detail Retriever/handler.js +12 -18
  34. package/src/mcp/tools/Client Script Editor Guide/handler.js +9 -605
  35. package/src/mcp/tools/Client Script List Retriever/handler.js +30 -33
  36. package/src/mcp/tools/Client Script Publisher/handler.js +12 -11
  37. package/src/mcp/tools/Client Script Puller/handler.js +23 -30
  38. package/src/mcp/tools/CloudCC Development Overview/handler.js +11 -5
  39. package/src/mcp/tools/Component Creator/handler.js +12 -11
  40. package/src/mcp/tools/Component Detail Retriever/handler.js +12 -9
  41. package/src/mcp/tools/Component Editor Guide/handler.js +5 -22
  42. package/src/mcp/tools/Component List Retriever/handler.js +21 -18
  43. package/src/mcp/tools/Component Publisher/handler.js +25 -3
  44. package/src/mcp/tools/Component Puller/handler.js +13 -16
  45. package/src/mcp/tools/Dev Environment Creator/handler.js +5 -72
  46. package/src/mcp/tools/Dev Environment Validator/handler.js +5 -66
  47. package/src/mcp/tools/Developer Key Setup Guide/handler.js +11 -20
  48. package/src/mcp/tools/JSP Migrator/handler.js +842 -0
  49. package/src/mcp/tools/Menu Creator/handler.js +7 -30
  50. package/src/mcp/tools/Object Creator/handler.js +14 -6
  51. package/src/mcp/tools/Object Fields Creator/handler.js +9 -10
  52. package/src/mcp/tools/Object Fields Retriever/handler.js +6 -3
  53. package/src/mcp/tools/Object List Retriever/handler.js +10 -7
  54. package/src/mcp/tools/Scheduled Class Creator/handler.js +12 -16
  55. package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +7 -9
  56. package/src/mcp/tools/Scheduled Class List Retriever/handler.js +21 -23
  57. package/src/mcp/tools/Scheduled Class Publisher/handler.js +7 -9
  58. package/src/mcp/tools/Scheduled Class Puller/handler.js +6 -70
  59. package/src/mcp/tools/Trigger Creator/handler.js +12 -20
  60. package/src/mcp/tools/Trigger Detail Retriever/handler.js +7 -9
  61. package/src/mcp/tools/Trigger Editor Guide/handler.js +10 -35
  62. package/src/mcp/tools/Trigger List Retriever/handler.js +12 -4
  63. package/src/mcp/tools/Trigger Publisher/handler.js +8 -11
  64. package/src/mcp/tools/Trigger Puller/handler.js +12 -17
  65. package/src/plugin/doc.js +801 -0
  66. package/src/plugin/index.js +1 -0
  67. package/src/project/doc.js +378 -0
  68. package/src/project/index.js +1 -0
  69. package/src/script/doc.js +259 -0
  70. package/src/script/index.js +1 -0
  71. package/src/timer/index.js +1 -0
  72. package/src/triggers/doc.js +342 -0
  73. package/src/triggers/index.js +5 -0
  74. package/target/classes/com/cloudcc/core/BaseException.class +0 -0
  75. package/target/classes/com/cloudcc/core/BusiException.class +0 -0
  76. package/target/classes/com/cloudcc/core/CCService.class +0 -0
  77. package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
  78. package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
  79. package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
  80. package/template/lib/ccopenapi-0.0.4.jar +0 -0
  81. package/test/application.cli.test.js +30 -0
  82. package/test/classes.cli.test.js +121 -0
  83. package/test/fields.cli.test.js +69 -0
  84. package/test/mcp.cli.test.js +21 -0
  85. package/test/menu.cli.test.js +41 -0
  86. package/test/object.cli.test.js +64 -0
  87. package/test/plugin.cli.test.js +109 -0
  88. package/test/script.cli.test.js +101 -0
  89. package/test/timer.cli.test.js +107 -0
  90. package/test/trigger.cli.test.js +146 -0
  91. package/.vscode/settings.json +0 -3
  92. package/bin/mcp-svc.js +0 -13
  93. package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +0 -8
  94. package/src/mcp/index-sse-svc.js +0 -126
  95. package/src/mcp/index-streamable-svc.js +0 -180
  96. package/src/mcp/tools/Class Detail Retriever/prompt.js +0 -37
  97. package/src/mcp/tools/Class Editor Guide/prompt.js +0 -468
  98. package/src/mcp/tools/Class Publisher/prompt.js +0 -40
  99. package/src/mcp/tools/Class Puller/prompt.js +0 -49
  100. package/src/mcp/tools/Client Script Creator/handler.js +0 -179
  101. package/src/mcp/tools/CloudCC Development Overview/prompt.js +0 -871
  102. package/src/mcp/tools/Component Editor Guide/prompt.js +0 -519
  103. package/src/mcp/tools/Component Publisher/prompt.js +0 -659
  104. package/src/mcp/tools/Dev Environment Creator/prompt.js +0 -273
  105. package/src/mcp/tools/Dev Environment Validator/prompt.js +0 -193
  106. package/src/mcp/tools/Developer Key Setup Guide/prompt.js +0 -71
  107. package/src/mcp/tools/Object Fields Retriever/prompt.js +0 -10
  108. package/src/mcp/tools/Object List Retriever/prompt.js +0 -10
  109. package/src/mcp/tools/ccdk/fetcher.js +0 -18
  110. package/src/mcp/tools/ccdk/handler.js +0 -98
  111. package/src/mcp/tools/ccdk/prompt.js +0 -453
  112. package/target/ccopenapi-0.0.3-classes.jar +0 -0
  113. package/target/ccopenapi-0.0.3.jar +0 -0
  114. package/target/maven-archiver/pom.properties +0 -3
  115. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -18
  116. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
  117. package/template/lib/ccopenapi-0.0.3.jar +0 -0
@@ -1,151 +1,5 @@
1
- /**
2
- * Approval 工具处理器
3
- * 提供审批相关的功能:拉取待审批记录、审批通过、拒绝审批
4
- */
5
-
6
1
  const { z } = require('zod');
7
- const axios = require('axios');
8
-
9
- const service = axios.create({
10
- timeout: 60000,
11
- headers: {
12
- 'Content-Type': 'application/json; charset=utf-8',
13
- },
14
- });
15
-
16
- const postClass = (url, data = {}, accessToken) => {
17
- if (accessToken) {
18
- return service({
19
- url,
20
- method: 'post',
21
- headers: { accessToken },
22
- data
23
- });
24
- }
25
- console.error();
26
- console.error('Failed: \nOpenAPI Token is null. \nPlease provide token via参数.');
27
- console.error();
28
- };
29
-
30
- // 统一校验 token 与 apiSvc,完全依赖入参便于迁移
31
- async function loadConfig(token, apiSvcOverride) {
32
- const apiSvc = apiSvcOverride;
33
- const accessToken = token;
34
- if (!apiSvc) {
35
- throw new Error('缺少 apiSvc,请通过参数传入接口域名');
36
- }
37
- if (!accessToken) {
38
- throw new Error('缺少访问 token,请通过参数传入');
39
- }
40
- return { accessToken, apiSvc };
41
- }
42
-
43
- async function requestPendingApprovals(queryParams, token, apiSvcOverride) {
44
- const { accessToken, apiSvc } = await loadConfig(token, apiSvcOverride);
45
- const requestBody = {
46
- approvalProjectType: queryParams.approvalProjectType || "0",
47
- approvalProcessStatus: queryParams.approvalProcessStatus || "",
48
- startTime: queryParams.startTime || "",
49
- endTime: queryParams.endTime || "",
50
- actor: queryParams.actor || "",
51
- related: queryParams.related || "",
52
- type: queryParams.type || "",
53
- pageNum: queryParams.pageNum || 1,
54
- pageSize: queryParams.pageSize || 10
55
- };
56
-
57
- const url = `${apiSvc}/api/approval/getAllApprovalHistoryPendingList`;
58
- const response = await postClass(url, requestBody, accessToken);
59
-
60
- if (response.result) {
61
- const { list = [], zylist = [], allpage } = response.data;
62
- const zhaiyaoMap = {};
63
- zylist.forEach(item => {
64
- zhaiyaoMap[item.id] = item.zhaiyao;
65
- });
66
-
67
- const enrichedList = list.map(record => ({
68
- ...record,
69
- zhaiyao: zhaiyaoMap[record.workItemid] || null
70
- }));
71
-
72
- return {
73
- list: enrichedList,
74
- allpage,
75
- total: list.length
76
- };
77
- }
78
-
79
- throw new Error('获取待审批记录失败: ' + (response.returnInfo || response.message || '未知错误'));
80
- }
81
-
82
- async function approveRequest(approvalParams, token, apiSvcOverride) {
83
- const { accessToken, apiSvc } = await loadConfig(token, apiSvcOverride);
84
- const { relatedId, workItemId } = approvalParams;
85
-
86
- const getPermissionById = await postClass(
87
- `${apiSvc}/api/objectdetail/getPermissionById`,
88
- { id: relatedId },
89
- accessToken
90
- );
91
- const { objectApi } = getPermissionById.data;
92
-
93
- const requestBody = {
94
- data: JSON.stringify([{ id: relatedId }]),
95
- relatedId,
96
- comments: '',
97
- workItemId,
98
- actionType: 'Approved',
99
- objectApiName: objectApi,
100
- };
101
-
102
- const url = `${apiSvc}/api/approval/updateApprovalProcessOperation`;
103
- const response = await postClass(url, requestBody, accessToken);
104
-
105
- if (response.result) {
106
- return {
107
- success: true,
108
- message: response.returnInfo || '审批通过成功',
109
- data: response.data
110
- };
111
- }
112
-
113
- throw new Error('审批通过失败: ' + (response.returnInfo || response.message || '未知错误'));
114
- }
115
-
116
- async function rejectRequest(approvalParams, token, apiSvcOverride) {
117
- const { accessToken, apiSvc } = await loadConfig(token, apiSvcOverride);
118
- const { relatedId, workItemId, comments } = approvalParams;
119
-
120
- const getPermissionById = await postClass(
121
- `${apiSvc}/api/objectdetail/getPermissionById`,
122
- { id: relatedId },
123
- accessToken
124
- );
125
- const { objectApi } = getPermissionById.data;
126
-
127
- const requestBody = {
128
- data: JSON.stringify([{ id: relatedId }]),
129
- relatedId,
130
- comments,
131
- workItemId,
132
- actionType: 'Rejected',
133
- objectApiName: objectApi,
134
- };
135
-
136
- const url = `${apiSvc}/api/approval/updateApprovalProcessOperation`;
137
- const response = await postClass(url, requestBody, accessToken);
138
-
139
- if (response.result) {
140
- return {
141
- success: true,
142
- message: response.returnInfo || '审批拒绝成功',
143
- data: response.data
144
- };
145
- }
146
-
147
- throw new Error('审批拒绝失败: ' + (response.returnInfo || response.message || '未知错误'));
148
- }
2
+ const { runCcJsonCommand } = require('../../cliRunner');
149
3
 
150
4
  /**
151
5
  * 拉取所有的待审批的记录
@@ -186,11 +40,19 @@ async function getPendingApprovals({
186
40
  pageNum,
187
41
  pageSize
188
42
  };
189
- const result = await requestPendingApprovals(queryParams, token, apiSvc);
43
+ const encoded = encodeURI(JSON.stringify(queryParams));
44
+ const run = runCcJsonCommand(['get', 'approval', process.cwd(), encoded]);
45
+ if (!run.success) {
46
+ return {
47
+ content: [{ type: 'text', text: `✗ 拉取待审批记录失败: ${run.detail || 'cc 命令执行失败'}` }]
48
+ };
49
+ }
50
+ const result = run.data || {};
51
+ const warn = (token || apiSvc) ? '\n\n提示: 当前已切换为 CLI 调用,token/apiSvc 参数不会覆盖本地配置。' : '';
190
52
 
191
53
  return {
192
54
  content: [
193
- { type: 'text', text: "将以下结果转换为markdown表格的模式展示:" + JSON.stringify(result, null, 2) }
55
+ { type: 'text', text: "将以下结果转换为markdown表格的模式展示:" + JSON.stringify(result, null, 2) + warn }
194
56
  ]
195
57
  };
196
58
  } catch (error) {
@@ -211,6 +73,7 @@ async function approveRecord({
211
73
  confirm,
212
74
  objid,
213
75
  workItemId,
76
+ token = '',
214
77
  apiSvc = ''
215
78
  }) {
216
79
  try {
@@ -233,7 +96,17 @@ async function approveRecord({
233
96
  relatedId: objid,
234
97
  workItemId,
235
98
  };
236
- const result = await approveRequest(approvalParams, token, apiSvc);
99
+ const encoded = encodeURI(JSON.stringify(approvalParams));
100
+ const run = runCcJsonCommand(['approve', 'approval', process.cwd(), encoded]);
101
+ if (!run.success) {
102
+ return {
103
+ content: [{ type: 'text', text: `✗ 审批通过失败: ${run.detail || 'cc 命令执行失败'}` }]
104
+ };
105
+ }
106
+ const result = run.data || { success: true };
107
+ if (token || apiSvc) {
108
+ result.warning = '当前已切换为 CLI 调用,token/apiSvc 参数不会覆盖本地配置。';
109
+ }
237
110
 
238
111
  return {
239
112
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
@@ -276,7 +149,17 @@ async function rejectRecord({ confirm, objid, comment = '', workItemId, token =
276
149
  workItemId,
277
150
  comments: comment
278
151
  };
279
- const result = await rejectRequest(approvalParams, token, apiSvc);
152
+ const encoded = encodeURI(JSON.stringify(approvalParams));
153
+ const run = runCcJsonCommand(['reject', 'approval', process.cwd(), encoded]);
154
+ if (!run.success) {
155
+ return {
156
+ content: [{ type: 'text', text: `✗ 拒绝审批失败: ${run.detail || 'cc 命令执行失败'}` }]
157
+ };
158
+ }
159
+ const result = run.data || { success: true };
160
+ if (token || apiSvc) {
161
+ result.warning = '当前已切换为 CLI 调用,token/apiSvc 参数不会覆盖本地配置。';
162
+ }
280
163
 
281
164
  return {
282
165
  content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
@@ -4,29 +4,32 @@
4
4
  */
5
5
 
6
6
  const path = require('path');
7
- const createClassModule = require('../../../classes/create');
7
+ const { runCcCommand } = require('../../cliRunner');
8
8
 
9
9
  /**
10
10
  * 创建自定义类
11
11
  */
12
12
  async function createClass({ className, projectPath = process.cwd() }) {
13
13
  try {
14
- // 临时改变工作目录以兼容原有模块
15
- const originalCwd = process.cwd();
16
- process.chdir(projectPath);
14
+ if (!className || !className.trim()) {
15
+ return { content: [{ type: 'text', text: '✗ 参数缺失: className 必须提供' }] };
16
+ }
17
+
18
+ const resolvedPath = path.resolve(projectPath);
19
+ const runResult = runCcCommand(['create', 'classes', className], { cwd: resolvedPath });
17
20
 
18
- try {
19
- await createClassModule(className);
20
- const classPath = path.join(projectPath, `classes/${className}`);
21
- return {
22
- content: [{
23
- type: 'text',
24
- text: `✓ 创建成功!\n\n类路径: ${classPath}\n生成的文件:\n - ${className}.java (主类文件)\n - ${className}Test.java (测试类文件)\n - config.json (配置文件)`
25
- }]
26
- };
27
- } finally {
28
- process.chdir(originalCwd);
21
+ if (!runResult.success) {
22
+ const detail = [runResult.error, runResult.stderr, runResult.stdout].filter(Boolean).join('\n');
23
+ return { content: [{ type: 'text', text: `✗ 创建失败: ${detail || 'cc 命令执行失败'}` }] };
29
24
  }
25
+
26
+ const classPath = path.join(resolvedPath, `classes/${className}`);
27
+ return {
28
+ content: [{
29
+ type: 'text',
30
+ text: `✓ 创建成功!\n\n调用命令: cc create classes ${className}\n执行目录: ${resolvedPath}\n类路径: ${classPath}\n生成的文件:\n - ${className}.java (主类文件)\n - ${className}Test.java (测试类文件)\n - config.json (配置文件)`
31
+ }]
32
+ };
30
33
  } catch (error) {
31
34
  return { content: [{ type: 'text', text: `✗ 创建失败: ${error.message}` }] };
32
35
  }
@@ -3,7 +3,8 @@
3
3
  * 获取自定义类的详细信息
4
4
  */
5
5
 
6
- const detailModule = require('../../../classes/detail');
6
+ const path = require('path');
7
+ const { runCcJsonCommand } = require('../../cliRunner');
7
8
 
8
9
  /**
9
10
  * 获取类详细信息
@@ -14,15 +15,13 @@ const detailModule = require('../../../classes/detail');
14
15
  */
15
16
  async function getClassDetail({ className, classId, projectPath = process.cwd() }) {
16
17
  try {
17
- const originalCwd = process.cwd();
18
- process.chdir(projectPath);
19
-
20
- try {
21
- const detail = await detailModule(className, classId);
22
- return { content: [{ type: 'text', text: JSON.stringify(detail, null, 2) }] };
23
- } finally {
24
- process.chdir(originalCwd);
18
+ const resolvedPath = path.resolve(projectPath);
19
+ const args = ['detail', 'classes', className || '', classId || ''];
20
+ const run = runCcJsonCommand(args, { cwd: resolvedPath });
21
+ if (!run.success) {
22
+ return { content: [{ type: 'text', text: `✗ 获取失败: ${run.detail || 'cc 命令执行失败'}` }] };
25
23
  }
24
+ return { content: [{ type: 'text', text: JSON.stringify(run.data, null, 2) }] };
26
25
  } catch (error) {
27
26
  return { content: [{ type: 'text', text: `✗ 获取失败: ${error.message}` }] };
28
27
  }
@@ -7,7 +7,7 @@
7
7
  * 2. 需要详细信息时再查询具体API类
8
8
  */
9
9
 
10
- const prompt = require('./prompt');
10
+ const { runCcCommand, buildRunDetail } = require('../../cliRunner');
11
11
 
12
12
  /**
13
13
  * 获取编辑指南
@@ -27,34 +27,20 @@ const prompt = require('./prompt');
27
27
  */
28
28
  async function editClass({ topic = 'overview' } = {}) {
29
29
  try {
30
- // 验证 topic 参数
31
- const validTopics = [
32
- 'overview', // 规范 + 最佳实践 + API概要
33
- 'ccservice', // CCService 详细文档
34
- 'object', // CCObject 详细文档
35
- 'email', // SendEmail 详细文档
36
- 'time', // TimeUtil 详细文档
37
- 'user', // UserInfo 详细文档
38
- 'logger', // DevLogger 详细文档
39
- 'scenarios' // 常见场景
40
- ];
41
-
42
- if (topic && !validTopics.includes(topic)) {
30
+ const run = runCcCommand(['doc', 'classes', topic]);
31
+ if (!run.success) {
43
32
  return {
44
33
  content: [{
45
34
  type: 'text',
46
- text: `✗ 无效的主题: "${topic}"\n\n支持的主题:\n${validTopics.map(t => `- ${t}`).join('\n')}`
35
+ text: `✗ 获取编辑指南失败: ${buildRunDetail(run) || 'cc 命令执行失败'}`
47
36
  }]
48
37
  };
49
38
  }
50
39
 
51
- // 获取指定主题的编辑指南
52
- const result = prompt.getEditGuide(topic);
53
-
54
40
  return {
55
41
  content: [{
56
42
  type: 'text',
57
- text: result
43
+ text: run.stdout || ''
58
44
  }]
59
45
  };
60
46
  } catch (error) {
@@ -3,15 +3,20 @@
3
3
  * 提供自定义类的查询功能
4
4
  */
5
5
 
6
- const getClassModule = require('../../../classes/get');
6
+ const path = require('path');
7
+ const { runCcJsonCommand } = require('../../cliRunner');
7
8
 
8
9
  /**
9
10
  * 获取类列表
10
11
  */
11
12
  async function listClasses({ projectPath = process.cwd() }) {
12
13
  try {
13
-
14
- let classList = await getClassModule('', projectPath, true);
14
+ const resolvedPath = path.resolve(projectPath);
15
+ const run = runCcJsonCommand(['get', 'classes'], { cwd: resolvedPath });
16
+ if (!run.success) {
17
+ return { content: [{ type: 'text', text: `✗ 查询失败: ${run.detail || 'cc 命令执行失败'}` }] };
18
+ }
19
+ const classList = run.data || [];
15
20
 
16
21
  if (!classList || classList.length === 0) {
17
22
  return { content: [{ type: 'text', text: '未找到任何类' }] };
@@ -3,22 +3,20 @@
3
3
  * 发布自定义类到服务器
4
4
  */
5
5
 
6
- const publishClassModule = require('../../../classes/publish');
6
+ const path = require('path');
7
+ const { runCcCommand, buildRunDetail } = require('../../cliRunner');
7
8
 
8
9
  /**
9
10
  * 发布类到服务器
10
11
  */
11
12
  async function publishClass({ className, projectPath = process.cwd() }) {
12
13
  try {
13
- const originalCwd = process.cwd();
14
- process.chdir(projectPath);
15
-
16
- try {
17
- await publishClassModule(className);
18
- return { content: [{ type: 'text', text: `✓ 发布成功!类 ${className} 已发布到服务器` }] };
19
- } finally {
20
- process.chdir(originalCwd);
14
+ const resolvedPath = path.resolve(projectPath);
15
+ const run = runCcCommand(['publish', 'classes', className], { cwd: resolvedPath });
16
+ if (!run.success) {
17
+ return { content: [{ type: 'text', text: `✗ 发布失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
21
18
  }
19
+ return { content: [{ type: 'text', text: `✓ 发布成功!类 ${className} 已发布到服务器` }] };
22
20
  } catch (error) {
23
21
  return { content: [{ type: 'text', text: `✗ 发布失败: ${error.message}` }] };
24
22
  }
@@ -3,79 +3,20 @@
3
3
  * 从服务器拉取自定义类
4
4
  */
5
5
 
6
- const fs = require('fs');
7
6
  const path = require('path');
8
- const getClassModule = require('../../../classes/get');
9
- const pullClassModule = require('../../../classes/pull');
10
- const pullListModule = require('../../../classes/pullList');
7
+ const { runCcCommand, buildRunDetail } = require('../../cliRunner');
11
8
 
12
9
  /**
13
10
  * 从服务器拉取类
14
11
  */
15
12
  async function pullClass({ className, projectPath = process.cwd() }) {
16
13
  try {
17
- const classPath = path.join(projectPath, `classes/${className}`);
18
- const configPath = path.join(classPath, 'config.json');
19
-
20
- // 检查本地是否存在该类
21
- if (!fs.existsSync(configPath)) {
22
- // 本地不存在,查询服务器
23
- try {
24
- const queryString = encodeURI(JSON.stringify({
25
- name: className
26
- }));
27
- const classList = await getClassModule(queryString, projectPath, true);
28
-
29
- if (!classList || classList.length === 0) {
30
- return {
31
- content: [{
32
- type: 'text',
33
- text: `✗ 拉取失败: 服务器上不存在类 ${className}`
34
- }]
35
- };
36
- }
37
-
38
- // 找到匹配的类
39
- const targetClass = classList.find(item => item.name === className || item.apiname === className);
40
- if (!targetClass) {
41
- return {
42
- content: [{
43
- type: 'text',
44
- text: `✗ 拉取失败: 服务器上未找到类 ${className}`
45
- }]
46
- };
47
- }
48
-
49
- // 使用 ID 从服务器拉取并在本地创建
50
- const originalCwd = process.cwd();
51
- process.chdir(projectPath);
52
-
53
- try {
54
- await pullListModule(targetClass.id, projectPath, true);
55
- return {
56
- content: [{
57
- type: 'text',
58
- text: `✓ 拉取成功!已从服务器拉取类 ${className} 并在本地创建\n\n本地路径: classes/${className}/`
59
- }]
60
- };
61
- } finally {
62
- process.chdir(originalCwd);
63
- }
64
- } catch (error) {
65
- return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
66
- }
67
- }
68
-
69
- // 本地存在,直接更新
70
- const originalCwd = process.cwd();
71
- process.chdir(projectPath);
72
-
73
- try {
74
- await pullClassModule(className);
75
- return { content: [{ type: 'text', text: `✓ 拉取成功!本地文件已更新: classes/${className}/${className}.java` }] };
76
- } finally {
77
- process.chdir(originalCwd);
14
+ const resolvedPath = path.resolve(projectPath);
15
+ const run = runCcCommand(['pull', 'classes', className], { cwd: resolvedPath });
16
+ if (!run.success) {
17
+ return { content: [{ type: 'text', text: `✗ 拉取失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
78
18
  }
19
+ return { content: [{ type: 'text', text: `✓ 拉取成功!本地文件已更新: classes/${className}/${className}.java` }] };
79
20
  } catch (error) {
80
21
  return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
81
22
  }
@@ -3,7 +3,8 @@
3
3
  * 获取客户端脚本的详细信息
4
4
  */
5
5
 
6
- const detailScriptModule = require('../../../script/detail');
6
+ const path = require('path');
7
+ const { runCcJsonCommand } = require('../../cliRunner');
7
8
 
8
9
  /**
9
10
  * 获取客户端脚本详细信息
@@ -14,29 +15,22 @@ const detailScriptModule = require('../../../script/detail');
14
15
  */
15
16
  async function getClientScriptDetail({ scriptPath, scriptId, projectPath = process.cwd() }) {
16
17
  try {
17
- const originalCwd = process.cwd();
18
- process.chdir(projectPath);
19
-
20
- try {
21
- // 调用 detail.js 模块
22
- const detail = await detailScriptModule(['detail', 'script', scriptPath, scriptId, projectPath]);
23
-
24
- return {
25
- content: [{
26
- type: 'text',
27
- text: JSON.stringify(detail, null, 2)
28
- }]
29
- };
30
- } catch (error) {
18
+ const resolvedPath = path.resolve(projectPath);
19
+ const run = runCcJsonCommand(['detail', 'script', scriptPath || '', scriptId || '', resolvedPath], { cwd: resolvedPath });
20
+ if (!run.success) {
31
21
  return {
32
22
  content: [{
33
23
  type: 'text',
34
- text: `✗ 获取失败: ${error.message}`
24
+ text: `✗ 获取失败: ${run.detail || 'cc 命令执行失败'}`
35
25
  }]
36
26
  };
37
- } finally {
38
- process.chdir(originalCwd);
39
27
  }
28
+ return {
29
+ content: [{
30
+ type: 'text',
31
+ text: JSON.stringify(run.data, null, 2)
32
+ }]
33
+ };
40
34
  } catch (error) {
41
35
  return {
42
36
  content: [{