cloudcc-cli 2.2.5 → 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 +38 -0
- package/README.md +1435 -522
- package/bin/cc.js +7 -2
- package/bin/index.js +4 -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/application/create.js +114 -0
- package/src/application/get.js +13 -0
- package/src/application/index.js +8 -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 +84 -12
- package/src/mcp/readme.md +6 -3
- package/src/mcp/tools/Application Creator/handler.js +78 -0
- 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 +86 -0
- 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/menu/common.js +16 -0
- package/src/menu/create-object.js +94 -0
- package/src/menu/create-page.js +108 -0
- package/src/menu/create-script.js +108 -0
- package/src/menu/create-site.js +108 -0
- package/src/menu/create.js +54 -0
- package/src/menu/index.js +7 -0
- package/src/plugin/doc.js +801 -0
- package/src/plugin/index.js +1 -0
- package/src/plugin/pull.js +3 -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 -870
- 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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Menu Creator Handler
|
|
3
|
+
* 提供创建菜单(标签页)的 MCP 工具实现
|
|
4
|
+
* 支持类型:object(自定义对象)、page(自定义页面)、script(自定义脚本)、site(站点)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 创建菜单
|
|
12
|
+
* @param {{
|
|
13
|
+
* menuType: 'object' | 'page' | 'script' | 'site',
|
|
14
|
+
* resourceId: string,
|
|
15
|
+
* tabName: string,
|
|
16
|
+
* projectPath?: string
|
|
17
|
+
* }} params
|
|
18
|
+
*/
|
|
19
|
+
async function createMenuTool(params = {}) {
|
|
20
|
+
try {
|
|
21
|
+
const { menuType, resourceId, tabName, projectPath } = params;
|
|
22
|
+
|
|
23
|
+
// 验证必需参数
|
|
24
|
+
if (!menuType || !resourceId || !tabName) {
|
|
25
|
+
return {
|
|
26
|
+
content: [{
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: '✗ 参数缺失: menuType (菜单类型)、resourceId (资源ID) 和 tabName (标签名称) 必须提供\n\n支持的菜单类型:\n- object: 自定义对象菜单\n- page: 自定义页面菜单\n- script: 自定义脚本菜单\n- site: 站点菜单'
|
|
29
|
+
}]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 验证菜单类型
|
|
34
|
+
const validTypes = ['object', 'page', 'script', 'site'];
|
|
35
|
+
if (!validTypes.includes(menuType)) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{
|
|
38
|
+
type: 'text',
|
|
39
|
+
text: `✗ 无效的菜单类型: ${menuType}\n\n支持的菜单类型:\n- object: 自定义对象菜单\n- page: 自定义页面菜单\n- script: 自定义脚本菜单\n- site: 站点菜单`
|
|
40
|
+
}]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const resolvedPath = path.resolve(projectPath || '.');
|
|
45
|
+
|
|
46
|
+
const args = [
|
|
47
|
+
'create',
|
|
48
|
+
'menu',
|
|
49
|
+
menuType,
|
|
50
|
+
resolvedPath,
|
|
51
|
+
resourceId,
|
|
52
|
+
tabName
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const runResult = runCcCommand(args, { cwd: resolvedPath });
|
|
56
|
+
const typeNameMap = { object: '对象', page: '页面', script: '脚本', site: '站点' };
|
|
57
|
+
const resourceTypeName = typeNameMap[menuType] || '资源';
|
|
58
|
+
|
|
59
|
+
if (runResult.success) {
|
|
60
|
+
return {
|
|
61
|
+
content: [{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: `✓ 自定义${resourceTypeName}菜单创建成功!\n\n菜单类型: ${menuType}\n资源ID: ${resourceId}\n标签名称: ${tabName}\n项目目录: ${resolvedPath}\n\n菜单已成功创建并配置到 CloudCC 系统中。`
|
|
64
|
+
}]
|
|
65
|
+
};
|
|
66
|
+
} else {
|
|
67
|
+
return {
|
|
68
|
+
content: [{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: `⚠ ${resourceTypeName}菜单创建遇到问题\n\n${buildRunDetail(runResult) || 'cc 命令执行失败'}\n\n请检查:\n1. 资源ID是否正确\n2. 标签名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确\n5. 是否有足够的权限创建菜单`
|
|
71
|
+
}]
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
} catch (error) {
|
|
75
|
+
return {
|
|
76
|
+
content: [{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: `✗ 菜单创建失败: ${error.message}\n\n错误详情:\n${error.stack || '无详细信息'}\n\n请检查:\n1. 资源ID是否正确\n2. 项目路径是否正确\n3. CloudCC服务器连接是否正常\n4. 项目配置文件是否存在\n5. 菜单类型是否支持`
|
|
79
|
+
}]
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = {
|
|
85
|
+
createMenuTool
|
|
86
|
+
};
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
+
const { runCcCommand } = require('../../cliRunner');
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* 创建自定义对象
|
|
@@ -15,16 +16,23 @@ async function createCustomObject(params = {}) {
|
|
|
15
16
|
return { content: [{ type: 'text', text: '✗ 参数缺失: label (对象标签) 必须提供' }] };
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
const resolvedPath = path.resolve(projectPath || '.');
|
|
20
|
+
const runResult = runCcCommand(['create', 'object', resolvedPath, label], { cwd: resolvedPath });
|
|
21
|
+
|
|
22
|
+
if (!runResult.success) {
|
|
23
|
+
const detail = [runResult.error, runResult.stderr, runResult.stdout].filter(Boolean).join('\n');
|
|
24
|
+
return {
|
|
25
|
+
content: [{
|
|
26
|
+
type: 'text',
|
|
27
|
+
text: `✗ 自定义对象创建失败: ${detail || 'cc 命令执行失败'}`
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
}
|
|
23
31
|
|
|
24
32
|
return {
|
|
25
33
|
content: [{
|
|
26
34
|
type: 'text',
|
|
27
|
-
text: `✓
|
|
35
|
+
text: `✓ 自定义对象创建成功!\n\n调用命令: cc create object ${resolvedPath} ${label}\n项目目录: ${resolvedPath}\n对象标签: ${label}\n\n创建过程:\n1. 生成对象的 schema 文件\n2. 配置对象权限\n3. 部署到 CloudCC 系统`
|
|
28
36
|
}]
|
|
29
37
|
};
|
|
30
38
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const
|
|
7
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 创建对象字段
|
|
@@ -19,22 +19,21 @@ const fieldsCreate = require('../../../fields/create');
|
|
|
19
19
|
*/
|
|
20
20
|
async function createObjectField(params = {}) {
|
|
21
21
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
let argv = null;
|
|
22
|
+
const resolvedPath = path.resolve(params.projectPath || '.');
|
|
23
|
+
let args = ['create', 'fields', resolvedPath];
|
|
25
24
|
if ("Y" == params.fieldType || "MR" == params.fieldType || "M" == params.fieldType) {
|
|
26
25
|
const { objid, fieldType, nameLabel, lookupObj } = params;
|
|
27
|
-
|
|
26
|
+
args.push(fieldType, objid, nameLabel, lookupObj);
|
|
28
27
|
} else if ("L" == params.fieldType || "Q" == params.fieldType) {
|
|
29
28
|
const { objid, fieldType, nameLabel, ptext } = params;
|
|
30
|
-
|
|
29
|
+
args.push(fieldType, objid, nameLabel, ptext);
|
|
31
30
|
} else {
|
|
32
31
|
const { objid, fieldType, nameLabel } = params;
|
|
33
|
-
|
|
32
|
+
args.push(fieldType, objid, nameLabel);
|
|
34
33
|
}
|
|
35
|
-
|
|
34
|
+
const runResult = runCcCommand(args, { cwd: resolvedPath });
|
|
36
35
|
|
|
37
|
-
if (
|
|
36
|
+
if (runResult.success) {
|
|
38
37
|
return {
|
|
39
38
|
content: [{
|
|
40
39
|
type: 'text',
|
|
@@ -45,7 +44,7 @@ async function createObjectField(params = {}) {
|
|
|
45
44
|
return {
|
|
46
45
|
content: [{
|
|
47
46
|
type: 'text',
|
|
48
|
-
text: `⚠ 字段创建遇到问题\n\n请检查:\n1. 对象ID是否正确\n2. 字段名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确`
|
|
47
|
+
text: `⚠ 字段创建遇到问题\n\n${buildRunDetail(runResult) || 'cc 命令执行失败'}\n\n请检查:\n1. 对象ID是否正确\n2. 字段名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确`
|
|
49
48
|
}]
|
|
50
49
|
};
|
|
51
50
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const
|
|
7
|
+
const { runCcJsonCommand } = require('../../cliRunner');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 获取对象字段
|
|
@@ -21,8 +21,11 @@ async function getFields(params = {}) {
|
|
|
21
21
|
return { content: [{ type: 'text', text: '✗ 缺少参数: 需要 objprefix' }] };
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
const
|
|
25
|
-
|
|
24
|
+
const run = runCcJsonCommand(['get', 'fields', resolvedPath, objprefix], { cwd: resolvedPath });
|
|
25
|
+
if (!run.success) {
|
|
26
|
+
return { content: [{ type: 'text', text: `✗ 查询失败: ${run.detail || 'cc 命令执行失败'}` }] };
|
|
27
|
+
}
|
|
28
|
+
const res = run.data;
|
|
26
29
|
|
|
27
30
|
if (!res || (Array.isArray(res) && res.length === 0)) {
|
|
28
31
|
return { content: [{ type: 'text', text: '未找到任何字段' }] };
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const
|
|
7
|
+
const { runCcJsonCommand } = require('../../cliRunner');
|
|
8
8
|
/**
|
|
9
9
|
* 列出对象
|
|
10
10
|
* @param {{ type?: 'standard'|'custom'|'both', projectPath?: string }} params
|
|
@@ -13,12 +13,15 @@ async function listObjects(params = {}) {
|
|
|
13
13
|
try {
|
|
14
14
|
const { type = 'both', projectPath = process.cwd() } = params;
|
|
15
15
|
const resolvedPath = path.resolve(projectPath);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
16
|
+
const args = ['get', 'object', resolvedPath];
|
|
17
|
+
if (type !== 'both') {
|
|
18
|
+
args.push(type);
|
|
19
|
+
}
|
|
20
|
+
const run = runCcJsonCommand(args, { cwd: resolvedPath });
|
|
21
|
+
if (!run.success) {
|
|
22
|
+
return { content: [{ type: 'text', text: `✗ 查询失败: ${run.detail || 'cc 命令执行失败'}` }] };
|
|
23
|
+
}
|
|
24
|
+
const objList = run.data || [];
|
|
22
25
|
if (!objList || objList.length === 0) {
|
|
23
26
|
return { content: [{ type: 'text', text: '未找到任何对象' }] };
|
|
24
27
|
}
|
|
@@ -4,29 +4,25 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const
|
|
7
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 创建定时类
|
|
11
11
|
*/
|
|
12
12
|
async function createSchedule({ scheduleName, projectPath = process.cwd() }) {
|
|
13
13
|
try {
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
await createScheduleModule(scheduleName);
|
|
20
|
-
const schedulePath = path.resolve(projectPath, `schedule/${scheduleName}`);
|
|
21
|
-
return {
|
|
22
|
-
content: [{
|
|
23
|
-
type: 'text',
|
|
24
|
-
text: `✓ 创建成功!\n\n定时类路径: ${schedulePath}\n生成的文件:\n - ${scheduleName}.java (主类文件,继承 CCSchedule)\n - config.json (配置文件)\n\n定时类与自定义类的区别:\n - 定时类继承 CCSchedule,用于定时任务执行\n - 代码写在构造函数中,系统会按设定的时间调度执行`
|
|
25
|
-
}]
|
|
26
|
-
};
|
|
27
|
-
} finally {
|
|
28
|
-
process.chdir(originalCwd);
|
|
14
|
+
const resolvedPath = path.resolve(projectPath);
|
|
15
|
+
const run = runCcCommand(['create', 'schedule', scheduleName], { cwd: resolvedPath });
|
|
16
|
+
if (!run.success) {
|
|
17
|
+
return { content: [{ type: 'text', text: `✗ 创建失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
|
|
29
18
|
}
|
|
19
|
+
const schedulePath = path.resolve(projectPath, `schedule/${scheduleName}`);
|
|
20
|
+
return {
|
|
21
|
+
content: [{
|
|
22
|
+
type: 'text',
|
|
23
|
+
text: `✓ 创建成功!\n\n定时类路径: ${schedulePath}\n生成的文件:\n - ${scheduleName}.java (主类文件,继承 CCSchedule)\n - config.json (配置文件)\n\n定时类与自定义类的区别:\n - 定时类继承 CCSchedule,用于定时任务执行\n - 代码写在构造函数中,系统会按设定的时间调度执行`
|
|
24
|
+
}]
|
|
25
|
+
};
|
|
30
26
|
} catch (error) {
|
|
31
27
|
return { content: [{ type: 'text', text: `✗ 创建失败: ${error.message}` }] };
|
|
32
28
|
}
|
|
@@ -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,12 @@ const detailModule = require('../../../timer/detail');
|
|
|
14
15
|
*/
|
|
15
16
|
async function getScheduleDetail({ scheduleName, scheduleId, projectPath = process.cwd() }) {
|
|
16
17
|
try {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const detail = await detailModule(scheduleName, scheduleId);
|
|
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 run = runCcJsonCommand(['detail', 'schedule', scheduleName || '', scheduleId || ''], { cwd: resolvedPath });
|
|
20
|
+
if (!run.success) {
|
|
21
|
+
return { content: [{ type: 'text', text: `✗ 获取失败: ${run.detail || 'cc 命令执行失败'}` }] };
|
|
25
22
|
}
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(run.data, null, 2) }] };
|
|
26
24
|
} catch (error) {
|
|
27
25
|
return { content: [{ type: 'text', text: `✗ 获取失败: ${error.message}` }] };
|
|
28
26
|
}
|
|
@@ -3,38 +3,36 @@
|
|
|
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 listSchedules({ projectPath = process.cwd() }) {
|
|
12
13
|
try {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
content: [{
|
|
22
|
-
type: 'text',
|
|
23
|
-
text: '未找到任何定时器类\n\n提示:使用 create_schedule 创建新定时器类'
|
|
24
|
-
}]
|
|
25
|
-
};
|
|
26
|
-
}
|
|
14
|
+
const resolvedPath = path.resolve(projectPath);
|
|
15
|
+
const run = runCcJsonCommand(['get', 'schedule'], { cwd: resolvedPath });
|
|
16
|
+
if (!run.success) {
|
|
17
|
+
return { content: [{ type: 'text', text: `获取定时类列表失败: ${run.detail || 'cc 命令执行失败'}` }] };
|
|
18
|
+
}
|
|
19
|
+
const result = run.data || [];
|
|
20
|
+
if (!result.length) {
|
|
27
21
|
return {
|
|
28
|
-
content: [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
]
|
|
22
|
+
content: [{
|
|
23
|
+
type: 'text',
|
|
24
|
+
text: '未找到任何定时器类\n\n提示:使用 create_schedule 创建新定时器类'
|
|
25
|
+
}]
|
|
34
26
|
};
|
|
35
|
-
} finally {
|
|
36
|
-
process.chdir(originalCwd);
|
|
37
27
|
}
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: JSON.stringify(result, null, 2)
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
};
|
|
38
36
|
} catch (error) {
|
|
39
37
|
return {
|
|
40
38
|
content: [
|
|
@@ -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 publishSchedule({ scheduleName, projectPath = process.cwd() }) {
|
|
12
13
|
try {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
await publishScheduleModule(scheduleName);
|
|
18
|
-
return { content: [{ type: 'text', text: `✓ 发布成功!定时类 ${scheduleName} 已发布到服务器` }] };
|
|
19
|
-
} finally {
|
|
20
|
-
process.chdir(originalCwd);
|
|
14
|
+
const resolvedPath = path.resolve(projectPath);
|
|
15
|
+
const run = runCcCommand(['publish', 'schedule', scheduleName], { cwd: resolvedPath });
|
|
16
|
+
if (!run.success) {
|
|
17
|
+
return { content: [{ type: 'text', text: `✗ 发布失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
|
|
21
18
|
}
|
|
19
|
+
return { content: [{ type: 'text', text: `✓ 发布成功!定时类 ${scheduleName} 已发布到服务器` }] };
|
|
22
20
|
} catch (error) {
|
|
23
21
|
return { content: [{ type: 'text', text: `✗ 发布失败: ${error.message}` }] };
|
|
24
22
|
}
|
|
@@ -3,84 +3,20 @@
|
|
|
3
3
|
* 从服务器拉取定时类
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const fs = require('fs');
|
|
7
6
|
const path = require('path');
|
|
8
|
-
const
|
|
9
|
-
const pullScheduleModule = require('../../../timer/pull');
|
|
10
|
-
const pullListModule = require('../../../timer/pullList');
|
|
7
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
11
8
|
|
|
12
9
|
/**
|
|
13
10
|
* 从服务器拉取定时类
|
|
14
11
|
*/
|
|
15
12
|
async function pullSchedule({ scheduleName, 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
|
-
shownum: "2000",
|
|
26
|
-
showpage: "1",
|
|
27
|
-
fid: "",
|
|
28
|
-
sname: scheduleName,
|
|
29
|
-
rptcond: '',
|
|
30
|
-
rptorder: ''
|
|
31
|
-
}));
|
|
32
|
-
const scheduleList = await getScheduleModule(queryString, projectPath);
|
|
33
|
-
|
|
34
|
-
if (!scheduleList || scheduleList.length === 0) {
|
|
35
|
-
return {
|
|
36
|
-
content: [{
|
|
37
|
-
type: 'text',
|
|
38
|
-
text: `✗ 拉取失败: 服务器上不存在定时类 ${scheduleName}`
|
|
39
|
-
}]
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// 找到匹配的定时类
|
|
44
|
-
const targetSchedule = scheduleList.find(item => item.name === scheduleName || item.apiname === scheduleName);
|
|
45
|
-
if (!targetSchedule) {
|
|
46
|
-
return {
|
|
47
|
-
content: [{
|
|
48
|
-
type: 'text',
|
|
49
|
-
text: `✗ 拉取失败: 服务器上未找到定时类 ${scheduleName}`
|
|
50
|
-
}]
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// 使用 ID 从服务器拉取并在本地创建
|
|
55
|
-
const originalCwd = process.cwd();
|
|
56
|
-
process.chdir(projectPath);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
await pullListModule(targetSchedule.id, projectPath);
|
|
60
|
-
return {
|
|
61
|
-
content: [{
|
|
62
|
-
type: 'text',
|
|
63
|
-
text: `✓ 拉取成功!已从服务器拉取定时类 ${scheduleName} 并在本地创建\n\n本地路径: schedule/${scheduleName}/`
|
|
64
|
-
}]
|
|
65
|
-
};
|
|
66
|
-
} finally {
|
|
67
|
-
process.chdir(originalCwd);
|
|
68
|
-
}
|
|
69
|
-
} catch (error) {
|
|
70
|
-
return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// 本地存在,直接更新
|
|
75
|
-
const originalCwd = process.cwd();
|
|
76
|
-
process.chdir(projectPath);
|
|
77
|
-
|
|
78
|
-
try {
|
|
79
|
-
await pullScheduleModule(scheduleName);
|
|
80
|
-
return { content: [{ type: 'text', text: `✓ 拉取成功!本地文件已更新: schedule/${scheduleName}/${scheduleName}.java` }] };
|
|
81
|
-
} finally {
|
|
82
|
-
process.chdir(originalCwd);
|
|
14
|
+
const resolvedPath = path.resolve(projectPath);
|
|
15
|
+
const run = runCcCommand(['pull', 'schedule', scheduleName], { cwd: resolvedPath });
|
|
16
|
+
if (!run.success) {
|
|
17
|
+
return { content: [{ type: 'text', text: `✗ 拉取失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
|
|
83
18
|
}
|
|
19
|
+
return { content: [{ type: 'text', text: `✓ 拉取成功!本地文件已更新: schedule/${scheduleName}/${scheduleName}.java` }] };
|
|
84
20
|
} catch (error) {
|
|
85
21
|
return { content: [{ type: 'text', text: `✗ 拉取失败: ${error.message}` }] };
|
|
86
22
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const path = require('path');
|
|
7
|
-
const
|
|
7
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* 创建触发器
|
|
@@ -17,32 +17,24 @@ const createTriggerModule = require('../../../triggers/create');
|
|
|
17
17
|
*/
|
|
18
18
|
async function createTrigger({ triggerName, objectName, targetObjectId, triggerTime, projectPath = process.cwd() }) {
|
|
19
19
|
try {
|
|
20
|
-
// 构造传递给底层模块的参数
|
|
21
20
|
const body = {
|
|
22
21
|
name: triggerName,
|
|
23
22
|
schemetableName: objectName,
|
|
24
23
|
targetObjectId: targetObjectId,
|
|
25
24
|
triggerTime: triggerTime
|
|
26
25
|
};
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const originalCwd = process.cwd();
|
|
32
|
-
process.chdir(projectPath);
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
await createTriggerModule(argvs);
|
|
36
|
-
const triggerPath = path.resolve(projectPath, `triggers/${objectName.toLowerCase()}/${triggerName}`);
|
|
37
|
-
return {
|
|
38
|
-
content: [{
|
|
39
|
-
type: 'text',
|
|
40
|
-
text: `✓ 创建成功!\n\n触发器路径: ${triggerPath}\n生成的文件:\n - ${triggerName}.java (主类文件,继承 CCTrigger)\n - config.json (配置文件)\n\n触发器说明:\n - 触发器继承 CCTrigger,用于在对象操作时执行特定逻辑\n - 对象:${objectName}\n - 触发时间:${triggerTime}\n - 代码写在构造函数中,系统会在指定时机自动执行`
|
|
41
|
-
}]
|
|
42
|
-
};
|
|
43
|
-
} finally {
|
|
44
|
-
process.chdir(originalCwd);
|
|
26
|
+
const resolvedPath = path.resolve(projectPath);
|
|
27
|
+
const run = runCcCommand(['create', 'triggers', encodeURI(JSON.stringify(body))], { cwd: resolvedPath });
|
|
28
|
+
if (!run.success) {
|
|
29
|
+
return { content: [{ type: 'text', text: `✗ 创建失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
|
|
45
30
|
}
|
|
31
|
+
const triggerPath = path.resolve(projectPath, `triggers/${objectName.toLowerCase()}/${triggerName}`);
|
|
32
|
+
return {
|
|
33
|
+
content: [{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `✓ 创建成功!\n\n触发器路径: ${triggerPath}\n生成的文件:\n - ${triggerName}.java (主类文件,继承 CCTrigger)\n - config.json (配置文件)\n\n触发器说明:\n - 触发器继承 CCTrigger,用于在对象操作时执行特定逻辑\n - 对象:${objectName}\n - 触发时间:${triggerTime}\n - 代码写在构造函数中,系统会在指定时机自动执行`
|
|
36
|
+
}]
|
|
37
|
+
};
|
|
46
38
|
} catch (error) {
|
|
47
39
|
return { content: [{ type: 'text', text: `✗ 创建失败: ${error.message}` }] };
|
|
48
40
|
}
|
|
@@ -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,12 @@ const detailModule = require('../../../triggers/detail');
|
|
|
14
15
|
*/
|
|
15
16
|
async function getTriggerDetail({ triggerPath, triggerId, projectPath = process.cwd() }) {
|
|
16
17
|
try {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const detail = await detailModule(triggerPath, triggerId);
|
|
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 run = runCcJsonCommand(['detail', 'triggers', triggerPath || '', triggerId || ''], { cwd: resolvedPath });
|
|
20
|
+
if (!run.success) {
|
|
21
|
+
return { content: [{ type: 'text', text: `✗ 获取失败: ${run.detail || 'cc 命令执行失败'}` }] };
|
|
25
22
|
}
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(run.data, null, 2) }] };
|
|
26
24
|
} catch (error) {
|
|
27
25
|
return { content: [{ type: 'text', text: `✗ 获取失败: ${error.message}` }] };
|
|
28
26
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 提供触发器编辑指南,使用与自定义类和定时类相同的知识库
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const { runCcCommand, buildRunDetail } = require('../../cliRunner');
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* 获取触发器编辑指南
|
|
@@ -13,41 +13,16 @@ const classEditorGuideHandler = require('../Class Editor Guide/handler.js');
|
|
|
13
13
|
*/
|
|
14
14
|
async function editTrigger({ topic = 'overview' }) {
|
|
15
15
|
try {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// 在结果前添加触发器特定说明
|
|
21
|
-
if (result.content && result.content[0]) {
|
|
22
|
-
const triggerNote = `
|
|
23
|
-
📌 触发器特别说明:
|
|
24
|
-
------------------
|
|
25
|
-
触发器继承 CCTrigger 类,用于在对象操作时自动执行特定逻辑。
|
|
26
|
-
|
|
27
|
-
触发器与自定义类/定时类的主要区别:
|
|
28
|
-
1. 继承基类:extends CCTrigger
|
|
29
|
-
2. 触发时机:通过 triggerTime 配置(beforeInsert, beforeUpdate, beforeUpsert, beforeDelete, afterInsert, afterUpdate, afterUpsert, afterDelete, afterInsertCommit, afterUpdateCommit, afterUpsertCommit, afterDeleteCommit, approval, beforeBatch, afterBatch, commitBatch)
|
|
30
|
-
3. 关联对象:触发器与特定对象绑定(targetObjectId)
|
|
31
|
-
4. 执行时机:在对象操作时自动触发,无需手动调用
|
|
32
|
-
5. 常见用途:数据验证、字段自动填充、关联数据更新、业务规则检查等
|
|
33
|
-
|
|
34
|
-
触发器中可访问的特殊变量:
|
|
35
|
-
- newList:新记录列表(insert/update操作)
|
|
36
|
-
- oldList:旧记录列表(update/delete操作)
|
|
37
|
-
- trigger.isInsert:是否为插入操作
|
|
38
|
-
- trigger.isUpdate:是否为更新操作
|
|
39
|
-
- trigger.isDelete:是否为删除操作
|
|
40
|
-
- trigger.isBefore:是否为before触发器
|
|
41
|
-
- trigger.isAfter:是否为after触发器
|
|
42
|
-
|
|
43
|
-
以下是触发器开发的通用API文档(与自定义类、定时类共享):
|
|
44
|
-
==========================================
|
|
45
|
-
|
|
46
|
-
`;
|
|
47
|
-
result.content[0].text = triggerNote + result.content[0].text;
|
|
16
|
+
const run = runCcCommand(['doc', 'triggers', topic]);
|
|
17
|
+
if (!run.success) {
|
|
18
|
+
return { content: [{ type: 'text', text: `✗ 获取触发器编辑指南失败: ${buildRunDetail(run) || 'cc 命令执行失败'}` }] };
|
|
48
19
|
}
|
|
49
|
-
|
|
50
|
-
|
|
20
|
+
return {
|
|
21
|
+
content: [{
|
|
22
|
+
type: 'text',
|
|
23
|
+
text: run.stdout || ''
|
|
24
|
+
}]
|
|
25
|
+
};
|
|
51
26
|
} catch (error) {
|
|
52
27
|
return { content: [{ type: 'text', text: `✗ 获取触发器编辑指南失败: ${error.message}` }] };
|
|
53
28
|
}
|