cloudcc-cli 2.2.2 → 2.2.4

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 (174) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/README.md +47 -0
  3. package/bin/cc.js +11 -35
  4. package/bin/index.js +33 -0
  5. package/bin/mcp-svc.js +13 -0
  6. package/bin/mcp.js +18 -0
  7. package/java/com/cloudcc/core/TriggerInvoker.java +17 -1
  8. package/package.json +16 -7
  9. package/pom.xml +1 -0
  10. package/prompt/DevelopmentEnvironmentConstruction.ts +133 -0
  11. package/prompt/ccdk.ts +1190 -0
  12. package/prompt/ccprompt.ts +8 -0
  13. package/prompt/cloudccdev.ts +109 -0
  14. package/prompt/index.ts +52 -0
  15. package/prompt/objectInfo.ts +94 -0
  16. package/prompt/objectList.ts +25 -0
  17. package/prompt/openapi.ts +310 -0
  18. package/prompt/system.ts +14 -0
  19. package/prompt/vscodeExtension.ts +27 -0
  20. package/src/approval/approve.js +105 -0
  21. package/src/approval/get.js +245 -0
  22. package/src/approval/index.js +11 -0
  23. package/src/approval/reject.js +105 -0
  24. package/src/brief/get.js +51 -0
  25. package/src/brief/index.js +7 -0
  26. package/src/config/get.js +1 -1
  27. package/src/fields/create.js +204 -0
  28. package/src/fields/fields/A.js +23 -0
  29. package/src/fields/fields/AD.js +25 -0
  30. package/src/fields/fields/B.js +28 -0
  31. package/src/fields/fields/C.js +28 -0
  32. package/src/fields/fields/D.js +27 -0
  33. package/src/fields/fields/E.js +28 -0
  34. package/src/fields/fields/ENC.js +28 -0
  35. package/src/fields/fields/ENCD.js +28 -0
  36. package/src/fields/fields/F.js +27 -0
  37. package/src/fields/fields/FL.js +25 -0
  38. package/src/fields/fields/H.js +27 -0
  39. package/src/fields/fields/IMG.js +27 -0
  40. package/src/fields/fields/J.js +26 -0
  41. package/src/fields/fields/L.js +32 -0
  42. package/src/fields/fields/LT.js +28 -0
  43. package/src/fields/fields/M.js +29 -0
  44. package/src/fields/fields/MR.js +24 -0
  45. package/src/fields/fields/N.js +30 -0
  46. package/src/fields/fields/P.js +28 -0
  47. package/src/fields/fields/Q.js +35 -0
  48. package/src/fields/fields/S.js +30 -0
  49. package/src/fields/fields/SCORE.js +24 -0
  50. package/src/fields/fields/T.js +27 -0
  51. package/src/fields/fields/U.js +28 -0
  52. package/src/fields/fields/X.js +28 -0
  53. package/src/fields/fields/Y.js +33 -0
  54. package/src/fields/get.js +36 -0
  55. package/src/fields/index.js +9 -0
  56. package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +8 -0
  57. package/src/mcp/index-sse-svc.js +126 -0
  58. package/src/mcp/index-streamable-svc.js +180 -0
  59. package/src/mcp/index.js +631 -0
  60. package/src/mcp/readme.md +137 -0
  61. package/src/mcp/tools/Approval/handler.js +349 -0
  62. package/src/mcp/tools/Class Creator/handler.js +37 -0
  63. package/src/mcp/tools/Class Detail Retriever/handler.js +33 -0
  64. package/src/mcp/tools/Class Detail Retriever/prompt.js +37 -0
  65. package/src/mcp/tools/Class Editor Guide/handler.js +72 -0
  66. package/src/mcp/tools/Class Editor Guide/prompt.js +468 -0
  67. package/src/mcp/tools/Class List Retriever/handler.js +36 -0
  68. package/src/mcp/tools/Class Publisher/handler.js +29 -0
  69. package/src/mcp/tools/Class Publisher/prompt.js +40 -0
  70. package/src/mcp/tools/Class Puller/handler.js +86 -0
  71. package/src/mcp/tools/Class Puller/prompt.js +49 -0
  72. package/src/mcp/tools/Client Script Creator/handler.js +179 -0
  73. package/src/mcp/tools/Client Script Detail Retriever/handler.js +53 -0
  74. package/src/mcp/tools/Client Script Editor Guide/handler.js +633 -0
  75. package/src/mcp/tools/Client Script List Retriever/handler.js +68 -0
  76. package/src/mcp/tools/Client Script Publisher/handler.js +54 -0
  77. package/src/mcp/tools/Client Script Puller/handler.js +73 -0
  78. package/src/mcp/tools/CloudCC Development Overview/handler.js +48 -0
  79. package/src/mcp/tools/CloudCC Development Overview/prompt.js +870 -0
  80. package/src/mcp/tools/Component Creator/handler.js +44 -0
  81. package/src/mcp/tools/Component Detail Retriever/handler.js +38 -0
  82. package/src/mcp/tools/Component Editor Guide/handler.js +76 -0
  83. package/src/mcp/tools/Component Editor Guide/prompt.js +519 -0
  84. package/src/mcp/tools/Component List Retriever/handler.js +43 -0
  85. package/src/mcp/tools/Component Publisher/handler.js +18 -0
  86. package/src/mcp/tools/Component Publisher/prompt.js +659 -0
  87. package/src/mcp/tools/Component Puller/handler.js +63 -0
  88. package/src/mcp/tools/Dev Environment Creator/fetcher.js +500 -0
  89. package/src/mcp/tools/Dev Environment Creator/handler.js +92 -0
  90. package/src/mcp/tools/Dev Environment Creator/prompt.js +273 -0
  91. package/src/mcp/tools/Dev Environment Validator/handler.js +88 -0
  92. package/src/mcp/tools/Dev Environment Validator/prompt.js +193 -0
  93. package/src/mcp/tools/Developer Key Setup Guide/fetcher.js +278 -0
  94. package/src/mcp/tools/Developer Key Setup Guide/handler.js +43 -0
  95. package/src/mcp/tools/Developer Key Setup Guide/prompt.js +71 -0
  96. package/src/mcp/tools/Object Creator/handler.js +34 -0
  97. package/src/mcp/tools/Object Fields Creator/handler.js +64 -0
  98. package/src/mcp/tools/Object Fields Retriever/handler.js +37 -0
  99. package/src/mcp/tools/Object Fields Retriever/prompt.js +10 -0
  100. package/src/mcp/tools/Object List Retriever/handler.js +43 -0
  101. package/src/mcp/tools/Object List Retriever/prompt.js +10 -0
  102. package/src/mcp/tools/Scheduled Class Creator/handler.js +37 -0
  103. package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +34 -0
  104. package/src/mcp/tools/Scheduled Class List Retriever/handler.js +52 -0
  105. package/src/mcp/tools/Scheduled Class Publisher/handler.js +30 -0
  106. package/src/mcp/tools/Scheduled Class Puller/handler.js +92 -0
  107. package/src/mcp/tools/Trigger Creator/handler.js +53 -0
  108. package/src/mcp/tools/Trigger Detail Retriever/handler.js +33 -0
  109. package/src/mcp/tools/Trigger Editor Guide/handler.js +58 -0
  110. package/src/mcp/tools/Trigger List Retriever/handler.js +49 -0
  111. package/src/mcp/tools/Trigger Publisher/handler.js +34 -0
  112. package/src/mcp/tools/Trigger Puller/handler.js +40 -0
  113. package/src/mcp/tools/ccdk/fetcher.js +18 -0
  114. package/src/mcp/tools/ccdk/handler.js +98 -0
  115. package/src/mcp/tools/ccdk/prompt.js +453 -0
  116. package/src/mcp/tools/index.js +23 -0
  117. package/src/object/create.js +105 -0
  118. package/src/object/get.js +43 -4
  119. package/src/object/index.js +2 -1
  120. package/src/plugin/create.js +1 -2
  121. package/src/plugin/create1.js +9 -9
  122. package/src/plugin/detail.js +91 -0
  123. package/src/plugin/get.js +79 -0
  124. package/src/plugin/index.js +4 -1
  125. package/src/plugin/publish.js +13 -13
  126. package/src/plugin/publish1.js +33 -24
  127. package/src/plugin/pull.js +173 -0
  128. package/src/project/create.js +9 -9
  129. package/src/project/create1.js +31 -17
  130. package/src/recordType/get.js +4 -2
  131. package/src/script/create.js +7 -7
  132. package/src/script/detail.js +95 -0
  133. package/src/script/get.js +4 -2
  134. package/src/script/index.js +1 -0
  135. package/src/script/publish.js +14 -14
  136. package/src/script/pull.js +12 -12
  137. package/src/script/pullList.js +5 -3
  138. package/src/timer/create.js +7 -7
  139. package/src/timer/detail.js +84 -0
  140. package/src/timer/get.js +6 -3
  141. package/src/timer/publish.js +7 -7
  142. package/src/timer/pull.js +8 -8
  143. package/src/timer/pullList.js +5 -3
  144. package/src/token/get.js +1 -1
  145. package/src/triggers/create.js +7 -7
  146. package/src/triggers/detail.js +90 -0
  147. package/src/triggers/get.js +4 -2
  148. package/src/triggers/index.js +1 -0
  149. package/src/triggers/publish.js +7 -7
  150. package/src/triggers/pull.js +8 -8
  151. package/src/triggers/pullList.js +5 -3
  152. package/src/version/get.js +3 -3
  153. package/target/ccopenapi-0.0.3-classes.jar +0 -0
  154. package/target/ccopenapi-0.0.3.jar +0 -0
  155. package/target/maven-archiver/pom.properties +3 -0
  156. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +18 -0
  157. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +19 -0
  158. package/template/Appvue +452 -12
  159. package/template/index.js +30 -19
  160. package/tool/branch/index.js +1 -1
  161. package/tool/checkLange/checkLang.js +6 -6
  162. package/tool/checkLange/clearLang.js +1 -1
  163. package/utils/accessClass.js +23 -0
  164. package/utils/checkVersion.js +22 -20
  165. package/utils/config.js +18 -3
  166. package/utils/http.js +10 -10
  167. package/utils/utils.js +128 -40
  168. package/java/com/cloudcc/core/CCTriggerDemo.java +0 -25
  169. package/src/classes/create.js +0 -65
  170. package/src/classes/get.js +0 -21
  171. package/src/classes/index.js +0 -11
  172. package/src/classes/publish.js +0 -50
  173. package/src/classes/pull.js +0 -54
  174. package/src/classes/pullList.js +0 -44
@@ -0,0 +1,173 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const chalk = require('chalk');
4
+ const { getPackageJson } = require("../../utils/config");
5
+ const { post } = require("../../utils/http");
6
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
7
+
8
+ /**
9
+ * 从服务器拉取自定义组件到本地
10
+ * 支持通过组件名或ID拉取:
11
+ * - 如果传入组件名,会从本地 config.json 读取 id 后拉取
12
+ * - 如果传入 ID,直接通过 ID 拉取
13
+ */
14
+ async function pull(argvs) {
15
+ const input = argvs[2];
16
+ const projectPath = argvs[3] || process.cwd();
17
+
18
+ if (!input) {
19
+ throw new Error('Plugin name or ID is required');
20
+ }
21
+
22
+ // 判断输入是组件名还是ID
23
+ // 先尝试作为组件名处理:检查本地是否存在该组件的 config.json
24
+ const pluginPath = path.join(projectPath, `plugins/${input}/`);
25
+ const configPath = path.join(pluginPath, 'config.json');
26
+
27
+ if (fs.existsSync(configPath)) {
28
+ // 本地存在组件文件夹,尝试读取 config.json 获取 id
29
+ try {
30
+ const configContent = JSON.parse(fs.readFileSync(configPath, 'utf8'));
31
+ if (configContent.id) {
32
+ // 找到 id,使用 id 拉取
33
+ await pullById(configContent.id, projectPath);
34
+ return;
35
+ }
36
+ } catch (error) {
37
+ // 读取 config.json 失败,继续作为 ID 处理
38
+ console.warn(chalk.yellow(`Warning: Failed to read config.json, treating input as ID: ${error.message}`));
39
+ }
40
+ }
41
+
42
+ // 作为 ID 处理(可能是 ID,或者组件名但本地不存在或没有 id)
43
+ await pullById(input, projectPath);
44
+ }
45
+
46
+ /**
47
+ * 通过ID拉取组件
48
+ */
49
+ async function pullById(pluginId, projectPath) {
50
+ const config = await getPackageJson(projectPath);
51
+ if (!config || !config.accessToken) {
52
+ throw new Error('Configuration not found or accessToken is missing');
53
+ }
54
+ const devSvcDispatch = config.devSvcDispatch || '/devconsole';
55
+ const baseUrl = config.baseUrl || BaseUrl;
56
+ const header = {
57
+ "appType": "lightning-setup",
58
+ "appVersion": "0.0.1",
59
+ "accessToken": config.accessToken,
60
+ "source": "lightning-setup",
61
+ "version": "public"
62
+ };
63
+ const body = {
64
+ "id": pluginId
65
+ };
66
+ const res = await post(
67
+ `${baseUrl}${devSvcDispatch}/custom/pc/1.0/post/detailCustomComp`,
68
+ body,
69
+ header
70
+ );
71
+
72
+ if (!res || !res.result || !res.data) {
73
+ throw new Error('Pull Plugin Failed: ' + (res?.returnInfo || 'Unknown error'));
74
+ }
75
+
76
+ const pluginData = res.data;
77
+
78
+ // 从服务器数据中获取组件名称
79
+ // 优先使用 compUniName,如果没有则使用 name,最后使用 component
80
+ const pluginName = pluginData.compUniName || pluginData.name || pluginData.component;
81
+ if (!pluginName) {
82
+ throw new Error('Cannot determine plugin name from server data');
83
+ }
84
+
85
+ // 处理组件名称:如果包含 component- 前缀,去掉它
86
+ const normalizedPluginName = pluginName.replace(/^component-/, '');
87
+ const pluginPath = path.join(projectPath, `plugins/${normalizedPluginName}/`);
88
+
89
+ // 确保目录存在(recursive: true 会自动处理已存在的情况)
90
+ fs.mkdirSync(pluginPath, { recursive: true });
91
+
92
+ // 处理 compContentVue:解析 JSON 并保存所有文件(排除 package.json 和 cloudcc-cli.config.js)
93
+ if (pluginData.compContentVue) {
94
+ try {
95
+ // 解析 compContentVue JSON 字符串
96
+ const contentMap = JSON.parse(pluginData.compContentVue);
97
+
98
+ // 需要排除的文件
99
+ const excludedFiles = ['package.json', 'cloudcc-cli.config.js'];
100
+
101
+ // 遍历所有文件并保存
102
+ Object.entries(contentMap).forEach(([filePath, content]) => {
103
+ // 获取文件名(不包含路径)
104
+ const fileName = path.basename(filePath);
105
+
106
+ // 跳过排除的文件
107
+ if (excludedFiles.includes(fileName)) {
108
+ return;
109
+ }
110
+
111
+ // 处理文件路径:去掉组件名称前缀
112
+ // 例如:cc-ttt/cc-ttt.vue -> cc-ttt.vue
113
+ // cc-ttt/components/HelloWorld.vue -> components/HelloWorld.vue
114
+ // cc-demo/cc-demo.vue -> cc-demo.vue (当组件名是 component-cc-demo-cc 时)
115
+ let relativePath = filePath;
116
+
117
+ // 提取文件路径的第一个目录名
118
+ const firstDir = filePath.split('/')[0];
119
+
120
+ // 尝试匹配并移除前缀
121
+ // 优先级:1. normalizedPluginName 2. pluginName 3. 第一个目录名(如果路径包含多个部分)
122
+ let prefixToRemove = '';
123
+ if (filePath.startsWith(`${normalizedPluginName}/`)) {
124
+ prefixToRemove = `${normalizedPluginName}/`;
125
+ } else if (filePath.startsWith(`${pluginName}/`)) {
126
+ prefixToRemove = `${pluginName}/`;
127
+ } else if (firstDir && filePath.includes('/')) {
128
+ // 如果路径包含斜杠,说明有目录结构,移除第一个目录
129
+ // 例如:cc-demo/cc-demo.vue -> cc-demo.vue
130
+ prefixToRemove = `${firstDir}/`;
131
+ }
132
+
133
+ if (prefixToRemove) {
134
+ relativePath = filePath.substring(prefixToRemove.length);
135
+ }
136
+
137
+ // 构建完整路径并写入文件
138
+ const fullPath = path.join(pluginPath, relativePath);
139
+ const dir = path.dirname(fullPath);
140
+
141
+ // 确保目录存在(recursive: true 会自动处理已存在的情况)
142
+ fs.mkdirSync(dir, { recursive: true });
143
+ fs.writeFileSync(fullPath, content, 'utf8');
144
+ });
145
+ } catch (error) {
146
+ // 如果解析失败,尝试作为普通字符串处理(向后兼容)
147
+ console.warn(chalk.yellow(`Warning: Failed to parse compContentVue as JSON, treating as plain text: ${error.message}`));
148
+ const vueFilePath = path.join(pluginPath, `${normalizedPluginName}.vue`);
149
+ fs.writeFileSync(vueFilePath, pluginData.compContentVue, 'utf8');
150
+ }
151
+ } else if (pluginData.source) {
152
+ // 向后兼容:如果没有 compContentVue,使用 source
153
+ const vueFilePath = path.join(pluginPath, `${normalizedPluginName}.vue`);
154
+ fs.writeFileSync(vueFilePath, pluginData.source, 'utf8');
155
+ }
156
+
157
+ // 更新config.json
158
+ const configPath = path.join(pluginPath, 'config.json');
159
+ const configContent = {
160
+ component: pluginData.compUniName || pluginData.component || `component-${normalizedPluginName}`,
161
+ compName: pluginData.compLabel || pluginData.compName || normalizedPluginName,
162
+ compDesc: pluginData.compDesc || '',
163
+ id: pluginId,
164
+ bizType: pluginData.bizType || '',
165
+ category: pluginData.category || '',
166
+ loadModel: pluginData.loadModel || 'lazy'
167
+ };
168
+ fs.writeFileSync(configPath, JSON.stringify(configContent, null, 2), 'utf8');
169
+
170
+ console.error(chalk.green(`Success! Plugin "${normalizedPluginName}" (ID: ${pluginId}) pulled from server.`));
171
+ }
172
+
173
+ module.exports = pull;
@@ -19,13 +19,13 @@ class Creator {
19
19
  }
20
20
 
21
21
  async init(name) {
22
- console.log()
23
- console.log(chalk.green('Welcome CloudCC-CLI'));
24
- console.log()
22
+ console.error()
23
+ console.error(chalk.green('Welcome CloudCC-CLI'));
24
+ console.error()
25
25
  if (!name) {
26
26
  this.ask().then(answers => {
27
27
  this.options = Object.assign({}, this.options, answers);
28
- console.log(this.options);
28
+ console.error(JSON.stringify(this.options));
29
29
  this.write();
30
30
  })
31
31
  } else {
@@ -57,13 +57,13 @@ class Creator {
57
57
  }
58
58
 
59
59
  write() {
60
- console.log();
61
- console.log(chalk.green("Starting construction, please wait"));
60
+ console.error();
61
+ console.error(chalk.green("Starting construction, please wait"));
62
62
  const tplBuilder = require("../../template/index");
63
63
  tplBuilder(this, this.options, () => {
64
- console.log();
65
- console.log(chalk.green('Build completed, please install dependencies before running'))
66
- console.log();
64
+ console.error();
65
+ console.error(chalk.green('Build completed, please install dependencies before running'))
66
+ console.error();
67
67
  })
68
68
  }
69
69
 
@@ -21,13 +21,13 @@ class Creator {
21
21
  }
22
22
 
23
23
  async init(name) {
24
- console.log()
25
- console.log(chalk.green('Welcome CloudCC-CLI'));
26
- console.log()
24
+ console.error()
25
+ console.error(chalk.green('Welcome CloudCC-CLI'));
26
+ console.error()
27
27
  if (!name) {
28
28
  this.ask().then(answers => {
29
29
  this.options = Object.assign({}, this.options, answers);
30
- console.log(this.options);
30
+ console.error(JSON.stringify(this.options));
31
31
  this.write();
32
32
  })
33
33
  } else {
@@ -36,6 +36,14 @@ class Creator {
36
36
  }
37
37
  }
38
38
 
39
+ getTargetPath() {
40
+ // 当 name 是 '.' 或 '' 时,直接使用当前目录
41
+ if (this.options.name === '.' || this.options.name === '') {
42
+ return process.cwd();
43
+ }
44
+ return path.join(process.cwd(), this.options.name);
45
+ }
46
+
39
47
  ask() {
40
48
  const prompt = [];
41
49
 
@@ -44,6 +52,11 @@ class Creator {
44
52
  name: "name",
45
53
  message: "Please enter the project name",
46
54
  validate(input) {
55
+ // 允许 '.' 或 '' 表示在当前目录创建
56
+ if (input === '.' || input === '') {
57
+ return true;
58
+ }
59
+
47
60
  if (!input) {
48
61
  return "Please enter the project name"
49
62
  }
@@ -59,13 +72,14 @@ class Creator {
59
72
  }
60
73
 
61
74
  write() {
62
- console.log();
63
- console.log(chalk.green("Starting construction, please wait"));
75
+ console.error();
76
+ console.error(chalk.green("Starting construction, please wait"));
77
+ const targetPath = this.getTargetPath();
64
78
  tplBuilder(this, this.options, () => {
65
- console.log();
66
- this.initGit(path.join(process.cwd(), this.options.name))
67
- console.log(chalk.green('Build completed, please install dependencies before running'))
68
- console.log();
79
+ console.error();
80
+ this.initGit(targetPath)
81
+ console.error(chalk.green('Build completed, please install dependencies before running'))
82
+ console.error();
69
83
  })
70
84
  }
71
85
 
@@ -88,14 +102,14 @@ class Creator {
88
102
  execSync(`git -C ${path} init`)
89
103
  execSync(`git -C ${path} add .`)
90
104
  execSync(`git -C ${path} commit -m 'init'`)
91
- console.log(`${chalk.grey(`Git repository initialization completed`)} ${chalk.green('✔ ')}`);
92
- console.log();
93
- console.log(`${chalk.yellow(`Please set the warehouse address: git remote add origin [remote repository address]`)}`);
94
- console.log();
105
+ console.error(`${chalk.grey(`Git repository initialization completed`)} ${chalk.green('✔ ')}`);
106
+ console.error();
107
+ console.error(`${chalk.yellow(`Please set the warehouse address: git remote add origin [remote repository address]`)}`);
108
+ console.error();
95
109
  } catch (error) {
96
- console.log();
97
- console.log(chalk.red('git repository initialization exception'))
98
- console.log();
110
+ console.error();
111
+ console.error(chalk.red('git repository initialization exception'))
112
+ console.error();
99
113
  }
100
114
  }
101
115
  }
@@ -1,10 +1,12 @@
1
1
  const { postClass } = require("../../utils/http")
2
2
  const { getPackageJson } = require("../../utils/config")
3
3
 
4
- async function get(path, prefix) {
4
+ async function get(path, prefix, isMcp = false) {
5
5
  let config = await getPackageJson();
6
6
  let res = await postClass(config.apiSvc + "/api/batch/getRecordType", { prefix: prefix }, config.accessToken)
7
- console.log(JSON.stringify(res.data.recordTypeList))
7
+ if (!isMcp) {
8
+ console.log(JSON.stringify(res.data.recordTypeList))
9
+ }
8
10
  return res.data
9
11
  }
10
12
 
@@ -17,17 +17,17 @@ async function create(argvs) {
17
17
 
18
18
  const fileTmp =
19
19
  `function main($CCDK, obj){
20
- console.log("hello World")
20
+ console.error("hello World")
21
21
  }`
22
22
  fs.writeFileSync(path.join(filePath, body.scriptName + ".js"), fileTmp)
23
23
  fs.writeFileSync(path.join(filePath, "config.json"), JSON.stringify(body))
24
- console.log()
25
- console.log(chalk.green("Successfully Created:" + body.scriptName))
26
- console.log()
24
+ console.error()
25
+ console.error(chalk.green("Successfully Created:" + body.scriptName))
26
+ console.error()
27
27
  } catch (e) {
28
- console.log()
29
- console.log(chalk.red("Creation Client Script Failed:" + e))
30
- console.log()
28
+ console.error()
29
+ console.error(chalk.red("Creation Client Script Failed:" + e))
30
+ console.error()
31
31
  }
32
32
  }
33
33
  }
@@ -0,0 +1,95 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { getPackageJson } = require("../../utils/config");
4
+ const { post } = require("../../utils/http");
5
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
6
+
7
+ /**
8
+ * 获取客户端脚本详情
9
+ * - 如果提供了 scriptPath,从本地查询
10
+ * - 如果提供了 scriptId,从线上查询
11
+ * - 如果都没有,返回错误
12
+ */
13
+ async function detail(argvs) {
14
+ const scriptPath = argvs[2]; // "objName/scriptName"
15
+ const scriptId = argvs[3];
16
+ const projectPath = argvs[4] || process.cwd();
17
+
18
+ // 如果提供了 scriptPath,从本地查询
19
+ if (scriptPath && scriptPath !== '') {
20
+ const [objName, scriptName] = scriptPath.split('/');
21
+ if (!objName || !scriptName) {
22
+ throw new Error('Script path format error, should be "objName/scriptName"');
23
+ }
24
+
25
+ const scriptDirPath = path.join(projectPath, `script/${objName}/${scriptName}`);
26
+ const configPath = path.join(scriptDirPath, 'config.json');
27
+ const scriptFilePath = path.join(scriptDirPath, `${scriptName}.js`);
28
+
29
+ // 检查本地文件是否存在
30
+ if (!fs.existsSync(configPath) || !fs.existsSync(scriptFilePath)) {
31
+ throw new Error(`Script not found in local directory: ${scriptDirPath}`);
32
+ }
33
+
34
+ try {
35
+ const configContent = JSON.parse(fs.readFileSync(configPath, 'utf8'));
36
+ const scriptContent = fs.readFileSync(scriptFilePath, 'utf8');
37
+
38
+ return {
39
+ scriptName,
40
+ objName,
41
+ id: configContent.id || null,
42
+ scriptContent,
43
+ config: configContent,
44
+ published: !!configContent.id,
45
+ fromLocal: true,
46
+ path: scriptPath
47
+ };
48
+ } catch (e) {
49
+ throw new Error(`Failed to read script files: ${e.message}`);
50
+ }
51
+ }
52
+
53
+ // 如果提供了 scriptId,从线上查询
54
+ if (scriptId && scriptId !== '') {
55
+ try {
56
+ const config = await getPackageJson(projectPath);
57
+ if (!config || !config.accessToken) {
58
+ throw new Error('Configuration not found or accessToken is missing');
59
+ }
60
+
61
+ const configContent = {
62
+ pageSize: 20,
63
+ pageNo: 1,
64
+ condition: {
65
+ id: scriptId,
66
+ pageLabel: '',
67
+ objName: ''
68
+ }
69
+ };
70
+
71
+ const res = await post(
72
+ (config.baseUrl || BaseUrl) + "/devconsole/script/pageClientScript",
73
+ configContent,
74
+ config
75
+ );
76
+
77
+ if (res && res.result && res.data && res.data.list && res.data.list.length > 0) {
78
+ return {
79
+ ...res.data.list[0],
80
+ fromLocal: false
81
+ };
82
+ } else {
83
+ throw new Error('Get Script Details Failed: ' + (res?.returnInfo || 'Unknown error'));
84
+ }
85
+ } catch (error) {
86
+ throw new Error('Get Script Details Failed: ' + error.message);
87
+ }
88
+ }
89
+
90
+ // 既没有 scriptPath 也没有 scriptId,报错
91
+ throw new Error('Either script path or script id must be provided');
92
+ }
93
+
94
+ module.exports = detail;
95
+
package/src/script/get.js CHANGED
@@ -4,7 +4,7 @@ const { getPackageJson } = require("../../utils/config.js")
4
4
  const BaseUrl = "https://developer.apis.cloudcc.cn"
5
5
 
6
6
 
7
- async function get(argvs) {
7
+ async function get(argvs, isMcp = false) {
8
8
  let configContent = JSON.parse(decodeURI(argvs[2]))
9
9
  let devConsoleConfig = await getPackageJson(argvs[3]);
10
10
  let res = await post((devConsoleConfig.baseUrl || BaseUrl) + "/devconsole/script/pageClientScript", configContent, devConsoleConfig)
@@ -14,7 +14,9 @@ async function get(argvs) {
14
14
  id: item.id,
15
15
  name: item.scriptName
16
16
  }))
17
- console.log(JSON.stringify(simpleList))
17
+ if (!isMcp) {
18
+ console.log(JSON.stringify(simpleList))
19
+ }
18
20
  return simpleList
19
21
  } else {
20
22
  console.error('error:', res.message);
@@ -4,6 +4,7 @@ cc.publish = require("./publish")
4
4
  cc.pull = require("./pull")
5
5
  cc.get = require("./get")
6
6
  cc.pullList = require("./pullList")
7
+ cc.detail = require("./detail")
7
8
  function main(action, argvs) {
8
9
  cc[action](argvs)
9
10
  }
@@ -20,9 +20,9 @@ async function publish(argvs) {
20
20
  const srcPath = path.join(process.cwd(), `script/${namePath}/`);
21
21
  let scriptContent = fs.readFileSync(srcPath + `${name}.js`, 'utf8');
22
22
  if (!checkMainFunctionExists(scriptContent)) {
23
- console.log();
24
- console.log(chalk.red('Warning: No valid main function definition found in file'));
25
- console.log();
23
+ console.error();
24
+ console.error(chalk.red('Warning: No valid main function definition found in file'));
25
+ console.error();
26
26
  return null;
27
27
  }
28
28
  const executableCode = `
@@ -41,28 +41,28 @@ async function publish(argvs) {
41
41
  let devConsoleConfig = await getPackageJson()
42
42
  const now = new Date();
43
43
  const timeStr = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0') + ' ' + String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0') + ':' + String(now.getSeconds()).padStart(2, '0');
44
- console.log(chalk.green(timeStr));
45
- console.log(chalk.green('Posting, please wait...'));
44
+ console.error(chalk.green(timeStr));
45
+ console.error(chalk.green('Posting, please wait...'));
46
46
  configContent.scriptContent = scriptContent.trim()
47
47
  let res = await post((devConsoleConfig.baseUrl || BaseUrl) + "/devconsole/script/saveClientScript", configContent, devConsoleConfig)
48
48
  if (res.result) {
49
- console.log();
50
- console.log(chalk.green('Success!'));
51
- console.log();
49
+ console.error();
50
+ console.error(chalk.green('Success!'));
51
+ console.error();
52
52
 
53
53
  if (!configContentOld.id) {
54
54
  configContentOld.id = res.data
55
55
  fs.writeFileSync(path.join(srcPath, "config.json"), JSON.stringify(configContentOld))
56
56
  }
57
57
  } else {
58
- console.log();
59
- console.log(chalk.red('Publish Client Scirpt Failed:' + res.returnInfo));
60
- console.log();
58
+ console.error();
59
+ console.error(chalk.red('Publish Client Scirpt Failed:' + res.returnInfo));
60
+ console.error();
61
61
  }
62
62
  } else {
63
- console.log();
64
- console.log(chalk.red('Invalid Script Content'));
65
- console.log();
63
+ console.error();
64
+ console.error(chalk.red('Invalid Script Content'));
65
+ console.error();
66
66
  }
67
67
  }
68
68
  }
@@ -18,11 +18,11 @@ async function pull(argvs) {
18
18
  let devConsoleConfig = await getPackageJson()
19
19
  const now = new Date();
20
20
  const timeStr = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0') + ' ' + String(now.getHours()).padStart(2, '0') + ':' + String(now.getMinutes()).padStart(2, '0') + ':' + String(now.getSeconds()).padStart(2, '0');
21
- console.log(chalk.green(timeStr));
22
- console.log(chalk.green('Pulling, please wait...'));
21
+ console.error(chalk.green(timeStr));
22
+ console.error(chalk.green('Pulling, please wait...'));
23
23
  let configContent = JSON.parse(fs.readFileSync(srcPath + "config.json", 'utf8'));
24
24
  if (!configContent.id) {
25
- console.log(chalk.red('Script ID is not exist, please publish first!'));
25
+ console.error(chalk.red('Script ID is not exist, please publish first!'));
26
26
  return;
27
27
  }
28
28
  configContent = {
@@ -36,23 +36,23 @@ async function pull(argvs) {
36
36
  }
37
37
  let res = await post((devConsoleConfig.baseUrl || BaseUrl) + "/devconsole/script/pageClientScript", configContent, devConsoleConfig)
38
38
  if (res.result) {
39
- console.log();
40
- console.log(chalk.green('Success!'));
41
- console.log();
39
+ console.error();
40
+ console.error(chalk.green('Success!'));
41
+ console.error();
42
42
 
43
43
  let newContent = `function main($CCDK, obj){
44
44
  ${res.data.list[0].scriptContent}
45
45
  }`
46
46
  fs.writeFileSync(srcPath + `${name}.js`, newContent);
47
47
  } else {
48
- console.log();
49
- console.log(chalk.red('Pull Client Scirpt Failed' + res.returnInfo));
50
- console.log();
48
+ console.error();
49
+ console.error(chalk.red('Pull Client Scirpt Failed' + res.returnInfo));
50
+ console.error();
51
51
  }
52
52
  } else {
53
- console.log();
54
- console.log(chalk.red('Invalid Script Content'));
55
- console.log();
53
+ console.error();
54
+ console.error(chalk.red('Invalid Script Content'));
55
+ console.error();
56
56
  }
57
57
  }
58
58
 
@@ -5,7 +5,7 @@ const fs = require('fs');
5
5
  const path = require('path');
6
6
 
7
7
 
8
- async function pullList(argvs) {
8
+ async function pullList(argvs, isMcp = false) {
9
9
  let devConsoleConfig = await getPackageJson(argvs[3]);
10
10
  let body = {
11
11
  "pageSize": 20,
@@ -54,10 +54,12 @@ async function pullList(argvs) {
54
54
  const scriptPath = path.join(dirPath, `${data.scriptName}.js`);
55
55
  const scriptTemplate = `function main($CCDK, obj) {\n${data.scriptContent || ''}\n}`;
56
56
  fs.writeFileSync(scriptPath, scriptTemplate, 'utf-8');
57
- console.log("true");
57
+ if (!isMcp) {
58
+ console.log("true");
59
+ }
58
60
  }
59
61
  } catch (e) {
60
- console.log(`Error occurred while processing timer id: ${argvs[2]}, message: ${e.message}${JSON.stringify(res)}}`);
62
+ console.error(`Error occurred while processing timer id: ${argvs[2]}, message: ${e.message}${JSON.stringify(res)}}`);
61
63
  }
62
64
  }
63
65
  }
@@ -7,6 +7,7 @@ const { getPackageJson } = require("../../utils/config.js")
7
7
  async function create(name) {
8
8
  let res = await checkUpdate();
9
9
  if (!res) {
10
+ let config = await getPackageJson();
10
11
  const timerPath = path.join(process.cwd(), "schedule/" + name);
11
12
  try {
12
13
  fs.mkdirSync(timerPath, { recursive: true })
@@ -24,15 +25,14 @@ public class ${name} extends CCSchedule {
24
25
  }
25
26
  }`
26
27
  fs.writeFileSync(path.join(timerPath, name + ".java"), javaTmp)
27
- let config = await getPackageJson();
28
28
  fs.writeFileSync(path.join(timerPath, "config.json"), `{"name":"${name}","version":"${config.extandVersion || '2'}"}`)
29
- console.log()
30
- console.log(chalk.green("Successfully Created:" + name))
31
- console.log()
29
+ console.error()
30
+ console.error(chalk.green("Successfully Created:" + name))
31
+ console.error()
32
32
  } catch (e) {
33
- console.log()
34
- console.log(chalk.red("Creation Schedule Failed:" + e))
35
- console.log()
33
+ console.error()
34
+ console.error(chalk.red("Creation Schedule Failed:" + e))
35
+ console.error()
36
36
  }
37
37
  }
38
38
  }