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.
- package/.cloudcc-cache.json +24 -20
- package/README.md +12 -0
- package/bin/cc.js +7 -0
- package/java/com/cloudcc/core/BaseException.java +100 -0
- package/java/com/cloudcc/core/BusiException.java +43 -0
- package/java/com/cloudcc/core/CCService.java +3 -1
- package/java/com/cloudcc/core/StringUtils.java +7 -0
- package/java/com/cloudcc/core/TimeUtil.java +33 -0
- package/java/com/cloudcc/core/UserInfo.java +9 -0
- package/package.json +7 -1
- package/pom.xml +1 -1
- package/skill/BACKEND_CODE.md +114 -0
- package/skill/CLI_CHEATSHEET.md +90 -0
- package/skill/INSTALL_AND_BOOTSTRAP.md +59 -0
- package/skill/OBJECTS_AND_FIELDS.md +120 -0
- package/skill/REQUIREMENTS_BREAKDOWN.md +98 -0
- package/skill/SKILL.md +33 -0
- package/skill/VUE_CUSTOM_COMPONENT.md +50 -0
- package/src/api/backend-sdk-java.md +427 -0
- package/src/api/ccdk-sdk.md +1039 -0
- package/src/classes/doc.js +486 -0
- package/src/classes/index.js +1 -0
- package/src/mcp/cliRunner.js +61 -0
- package/src/mcp/index.js +41 -3
- package/src/mcp/tools/Application Creator/handler.js +7 -9
- package/src/mcp/tools/Approval/handler.js +34 -151
- package/src/mcp/tools/Class Creator/handler.js +18 -15
- package/src/mcp/tools/Class Detail Retriever/handler.js +8 -9
- package/src/mcp/tools/Class Editor Guide/handler.js +5 -19
- package/src/mcp/tools/Class List Retriever/handler.js +8 -3
- package/src/mcp/tools/Class Publisher/handler.js +7 -9
- package/src/mcp/tools/Class Puller/handler.js +6 -65
- package/src/mcp/tools/Client Script Detail Retriever/handler.js +12 -18
- package/src/mcp/tools/Client Script Editor Guide/handler.js +9 -605
- package/src/mcp/tools/Client Script List Retriever/handler.js +30 -33
- package/src/mcp/tools/Client Script Publisher/handler.js +12 -11
- package/src/mcp/tools/Client Script Puller/handler.js +23 -30
- package/src/mcp/tools/CloudCC Development Overview/handler.js +11 -5
- package/src/mcp/tools/Component Creator/handler.js +12 -11
- package/src/mcp/tools/Component Detail Retriever/handler.js +12 -9
- package/src/mcp/tools/Component Editor Guide/handler.js +5 -22
- package/src/mcp/tools/Component List Retriever/handler.js +21 -18
- package/src/mcp/tools/Component Publisher/handler.js +25 -3
- package/src/mcp/tools/Component Puller/handler.js +13 -16
- package/src/mcp/tools/Dev Environment Creator/handler.js +5 -72
- package/src/mcp/tools/Dev Environment Validator/handler.js +5 -66
- package/src/mcp/tools/Developer Key Setup Guide/handler.js +11 -20
- package/src/mcp/tools/JSP Migrator/handler.js +842 -0
- package/src/mcp/tools/Menu Creator/handler.js +7 -30
- package/src/mcp/tools/Object Creator/handler.js +14 -6
- package/src/mcp/tools/Object Fields Creator/handler.js +9 -10
- package/src/mcp/tools/Object Fields Retriever/handler.js +6 -3
- package/src/mcp/tools/Object List Retriever/handler.js +10 -7
- package/src/mcp/tools/Scheduled Class Creator/handler.js +12 -16
- package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +7 -9
- package/src/mcp/tools/Scheduled Class List Retriever/handler.js +21 -23
- package/src/mcp/tools/Scheduled Class Publisher/handler.js +7 -9
- package/src/mcp/tools/Scheduled Class Puller/handler.js +6 -70
- package/src/mcp/tools/Trigger Creator/handler.js +12 -20
- package/src/mcp/tools/Trigger Detail Retriever/handler.js +7 -9
- package/src/mcp/tools/Trigger Editor Guide/handler.js +10 -35
- package/src/mcp/tools/Trigger List Retriever/handler.js +12 -4
- package/src/mcp/tools/Trigger Publisher/handler.js +8 -11
- package/src/mcp/tools/Trigger Puller/handler.js +12 -17
- package/src/plugin/doc.js +801 -0
- package/src/plugin/index.js +1 -0
- package/src/project/doc.js +378 -0
- package/src/project/index.js +1 -0
- package/src/script/doc.js +259 -0
- package/src/script/index.js +1 -0
- package/src/timer/index.js +1 -0
- package/src/triggers/doc.js +342 -0
- package/src/triggers/index.js +5 -0
- package/target/classes/com/cloudcc/core/BaseException.class +0 -0
- package/target/classes/com/cloudcc/core/BusiException.class +0 -0
- package/target/classes/com/cloudcc/core/CCService.class +0 -0
- package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
- package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
- package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
- package/template/lib/ccopenapi-0.0.4.jar +0 -0
- package/test/application.cli.test.js +30 -0
- package/test/classes.cli.test.js +121 -0
- package/test/fields.cli.test.js +69 -0
- package/test/mcp.cli.test.js +21 -0
- package/test/menu.cli.test.js +41 -0
- package/test/object.cli.test.js +64 -0
- package/test/plugin.cli.test.js +109 -0
- package/test/script.cli.test.js +101 -0
- package/test/timer.cli.test.js +107 -0
- package/test/trigger.cli.test.js +146 -0
- package/.vscode/settings.json +0 -3
- package/bin/mcp-svc.js +0 -13
- package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +0 -8
- package/src/mcp/index-sse-svc.js +0 -126
- package/src/mcp/index-streamable-svc.js +0 -180
- package/src/mcp/tools/Class Detail Retriever/prompt.js +0 -37
- package/src/mcp/tools/Class Editor Guide/prompt.js +0 -468
- package/src/mcp/tools/Class Publisher/prompt.js +0 -40
- package/src/mcp/tools/Class Puller/prompt.js +0 -49
- package/src/mcp/tools/Client Script Creator/handler.js +0 -179
- package/src/mcp/tools/CloudCC Development Overview/prompt.js +0 -871
- package/src/mcp/tools/Component Editor Guide/prompt.js +0 -519
- package/src/mcp/tools/Component Publisher/prompt.js +0 -659
- package/src/mcp/tools/Dev Environment Creator/prompt.js +0 -273
- package/src/mcp/tools/Dev Environment Validator/prompt.js +0 -193
- package/src/mcp/tools/Developer Key Setup Guide/prompt.js +0 -71
- package/src/mcp/tools/Object Fields Retriever/prompt.js +0 -10
- package/src/mcp/tools/Object List Retriever/prompt.js +0 -10
- package/src/mcp/tools/ccdk/fetcher.js +0 -18
- package/src/mcp/tools/ccdk/handler.js +0 -98
- package/src/mcp/tools/ccdk/prompt.js +0 -453
- package/target/ccopenapi-0.0.3-classes.jar +0 -0
- package/target/ccopenapi-0.0.3.jar +0 -0
- package/target/maven-archiver/pom.properties +0 -3
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -18
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
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
|
-
|
|
31
|
-
|
|
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: `✗
|
|
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:
|
|
43
|
+
text: run.stdout || ''
|
|
58
44
|
}]
|
|
59
45
|
};
|
|
60
46
|
} catch (error) {
|
|
@@ -3,15 +3,20 @@
|
|
|
3
3
|
* 提供自定义类的查询功能
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
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
|
|
18
|
-
const
|
|
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
|
|
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
|
|
18
|
-
|
|
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: `✗ 获取失败: ${
|
|
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: [{
|