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
@@ -5,10 +5,7 @@
5
5
  */
6
6
 
7
7
  const path = require('path');
8
- const createObjectMenu = require('../../../menu/create-object');
9
- const createPageMenu = require('../../../menu/create-page');
10
- const createScriptMenu = require('../../../menu/create-script');
11
- const createSiteMenu = require('../../../menu/create-site');
8
+ const { runCcCommand, buildRunDetail } = require('../../cliRunner');
12
9
 
13
10
  /**
14
11
  * 创建菜单
@@ -46,8 +43,7 @@ async function createMenuTool(params = {}) {
46
43
 
47
44
  const resolvedPath = path.resolve(projectPath || '.');
48
45
 
49
- // 构建参数数组,格式: ['create', 'menu', menuType, path, resourceId, tabName, tabStyle, mobileimg, cloudccservicetab]
50
- const argvs = [
46
+ const args = [
51
47
  'create',
52
48
  'menu',
53
49
  menuType,
@@ -56,30 +52,11 @@ async function createMenuTool(params = {}) {
56
52
  tabName
57
53
  ];
58
54
 
59
- // 根据菜单类型调用不同的创建函数
60
- let result;
61
- let resourceTypeName;
55
+ const runResult = runCcCommand(args, { cwd: resolvedPath });
56
+ const typeNameMap = { object: '对象', page: '页面', script: '脚本', site: '站点' };
57
+ const resourceTypeName = typeNameMap[menuType] || '资源';
62
58
 
63
- switch (menuType) {
64
- case 'object':
65
- result = await createObjectMenu(argvs);
66
- resourceTypeName = '对象';
67
- break;
68
- case 'page':
69
- result = await createPageMenu(argvs);
70
- resourceTypeName = '页面';
71
- break;
72
- case 'script':
73
- result = await createScriptMenu(argvs);
74
- resourceTypeName = '脚本';
75
- break;
76
- case 'site':
77
- result = await createSiteMenu(argvs);
78
- resourceTypeName = '站点';
79
- break;
80
- }
81
-
82
- if (result && result.result) {
59
+ if (runResult.success) {
83
60
  return {
84
61
  content: [{
85
62
  type: 'text',
@@ -90,7 +67,7 @@ async function createMenuTool(params = {}) {
90
67
  return {
91
68
  content: [{
92
69
  type: 'text',
93
- text: `⚠ ${resourceTypeName}菜单创建遇到问题\n\n请检查:\n1. 资源ID是否正确\n2. 标签名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确\n5. 是否有足够的权限创建菜单`
70
+ text: `⚠ ${resourceTypeName}菜单创建遇到问题\n\n${buildRunDetail(runResult) || 'cc 命令执行失败'}\n\n请检查:\n1. 资源ID是否正确\n2. 标签名称是否符合规范\n3. CloudCC服务器连接是否正常\n4. 项目配置是否正确\n5. 是否有足够的权限创建菜单`
94
71
  }]
95
72
  };
96
73
  }
@@ -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 targetPath = projectPath || '.';
19
- const resolvedPath = path.resolve(targetPath);
20
- // 如果 label 包含空格或特殊字符,加双引号保护
21
- const safeLabel = /\s/.test(label) ? `"${label}"` : label;
22
- const command = `npx cc create object ${targetPath} ${safeLabel}`;
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: `✓ 自定义对象创建命令已生成!\n\n对象标签: ${label}\n项目目录(解析后): ${resolvedPath}\n\n请运行以下命令以创建对象:\n\n${command}\n\n创建过程:\n1. 生成对象的 schema 文件\n2. 配置对象权限\n3. 部署到 CloudCC 系统`
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 fieldsCreate = require('../../../fields/create');
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
- let result = null;
23
- const resolvedPath = path.resolve(params.projectPath);
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
- argv = [null, null, resolvedPath, fieldType, objid, nameLabel, lookupObj];
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
- argv = [null, null, resolvedPath, fieldType, objid, nameLabel, ptext];
29
+ args.push(fieldType, objid, nameLabel, ptext);
31
30
  } else {
32
31
  const { objid, fieldType, nameLabel } = params;
33
- argv = [null, null, resolvedPath, fieldType, objid, nameLabel];
32
+ args.push(fieldType, objid, nameLabel);
34
33
  }
35
- result = await fieldsCreate(argv);
34
+ const runResult = runCcCommand(args, { cwd: resolvedPath });
36
35
 
37
- if (result) {
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 fieldsGet = require('../../../fields/get');
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 argv = [null, null, resolvedPath, objprefix];
25
- const res = await fieldsGet(argv, true);
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 objectGet = require('../../../object/get');
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
- // Map our 'both' to no explicit type to get the combined list
18
- const getType = type === 'both' ? undefined : type;
19
-
20
- const argv = [null, null, resolvedPath, getType];
21
- const objList = await objectGet(argv, true);
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 createScheduleModule = require('../../../timer/create');
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 originalCwd = process.cwd();
16
- process.chdir(projectPath);
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 detailModule = require('../../../timer/detail');
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 originalCwd = process.cwd();
18
- process.chdir(projectPath);
19
-
20
- try {
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 getScheduleModule = require('../../../timer/get');
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 originalCwd = process.cwd();
14
- process.chdir(projectPath);
15
-
16
- try {
17
- const result = await getScheduleModule('', projectPath, true);
18
-
19
- if (!result || result.length === 0) {
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
- type: "text",
31
- text: JSON.stringify(result, null, 2)
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 publishScheduleModule = require('../../../timer/publish');
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 originalCwd = process.cwd();
14
- process.chdir(projectPath);
15
-
16
- try {
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 getScheduleModule = require('../../../timer/get');
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 schedulePath = path.join(projectPath, `schedule/${scheduleName}`);
18
- const configPath = path.join(schedulePath, 'config.json');
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 createTriggerModule = require('../../../triggers/create');
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 argvs = ['', '', encodeURI(JSON.stringify(body))];
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 detailModule = require('../../../triggers/detail');
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 originalCwd = process.cwd();
18
- process.chdir(projectPath);
19
-
20
- try {
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 classEditorGuideHandler = require('../Class Editor Guide/handler.js');
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
- // 只是继承的基类不同(CCTrigger vs CCClass vs CCSchedule)
18
- const result = await classEditorGuideHandler.editClass({ topic });
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
- - record_new:新记录列表(insert/update操作)
36
- - record_old:旧记录列表(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
- return result;
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
  }
@@ -3,7 +3,8 @@
3
3
  * 查询触发器列表
4
4
  */
5
5
 
6
- const getTriggerModule = require('../../../triggers/get');
6
+ const path = require('path');
7
+ const { runCcJsonCommand } = require('../../cliRunner');
7
8
 
8
9
  /**
9
10
  * 获取触发器列表
@@ -24,9 +25,16 @@ async function listTriggers({ triggerName = '', targetObjectId = '', projectPath
24
25
  rptorder: ''
25
26
  };
26
27
 
27
- const argvs = ['', '', encodeURI(JSON.stringify(queryBody)), projectPath];
28
-
29
- const result = await getTriggerModule(argvs, true);
28
+ const resolvedPath = path.resolve(projectPath);
29
+ const run = runCcJsonCommand(['get', 'triggers', encodeURI(JSON.stringify(queryBody)), resolvedPath], { cwd: resolvedPath });
30
+ if (!run.success) {
31
+ return {
32
+ content: [
33
+ { type: 'text', text: `获取触发器列表失败: ${run.detail || 'cc 命令执行失败'}` }
34
+ ]
35
+ };
36
+ }
37
+ const result = run.data || [];
30
38
  return {
31
39
  content: [
32
40
  {