cloudcc-cli 2.3.4 → 2.3.6

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 (244) hide show
  1. package/.claude/settings.json +22 -1
  2. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +175 -0
  3. package/.cursor/skills/cloudcc-dev-skill/SKILL.md +71 -0
  4. package/README.md +81 -6
  5. package/bin/cc.js +106 -28
  6. package/bin/index.js +54 -55
  7. package/mcp/cliRunner.js +11 -4
  8. package/mcp/index.js +12 -2
  9. package/mcp/tools/Application Creator/handler.js +1 -1
  10. package/mcp/tools/Approval/handler.js +3 -3
  11. package/mcp/tools/Class Creator/handler.js +2 -2
  12. package/mcp/tools/Class Detail Retriever/handler.js +1 -1
  13. package/mcp/tools/Class Editor Guide/handler.js +1 -1
  14. package/mcp/tools/Class List Retriever/handler.js +1 -1
  15. package/mcp/tools/Class Publisher/handler.js +1 -1
  16. package/mcp/tools/Class Puller/handler.js +1 -1
  17. package/mcp/tools/Client Script Detail Retriever/handler.js +1 -1
  18. package/mcp/tools/Client Script Editor Guide/handler.js +1 -1
  19. package/mcp/tools/Client Script List Retriever/handler.js +1 -1
  20. package/mcp/tools/Client Script Publisher/handler.js +1 -1
  21. package/mcp/tools/Client Script Puller/handler.js +2 -2
  22. package/mcp/tools/CloudCC Development Overview/handler.js +2 -2
  23. package/mcp/tools/Component Creator/handler.js +1 -1
  24. package/mcp/tools/Component Detail Retriever/handler.js +1 -1
  25. package/mcp/tools/Component Editor Guide/handler.js +1 -1
  26. package/mcp/tools/Component List Retriever/handler.js +1 -1
  27. package/mcp/tools/Component Publisher/handler.js +2 -2
  28. package/mcp/tools/Component Puller/handler.js +1 -1
  29. package/mcp/tools/Dev Environment Creator/handler.js +1 -1
  30. package/mcp/tools/Dev Environment Validator/handler.js +1 -1
  31. package/mcp/tools/Developer Key Setup Guide/handler.js +1 -1
  32. package/mcp/tools/JSP Migrator/handler.js +46 -0
  33. package/mcp/tools/Menu Creator/handler.js +1 -1
  34. package/mcp/tools/Object Creator/handler.js +2 -2
  35. package/mcp/tools/Object Fields Creator/handler.js +1 -1
  36. package/mcp/tools/Object Fields Retriever/handler.js +1 -1
  37. package/mcp/tools/Object List Retriever/handler.js +1 -1
  38. package/mcp/tools/Scheduled Class Creator/handler.js +1 -1
  39. package/mcp/tools/Scheduled Class Detail Retriever/handler.js +1 -1
  40. package/mcp/tools/Scheduled Class List Retriever/handler.js +1 -1
  41. package/mcp/tools/Scheduled Class Publisher/handler.js +1 -1
  42. package/mcp/tools/Scheduled Class Puller/handler.js +1 -1
  43. package/mcp/tools/Trigger Creator/handler.js +1 -1
  44. package/mcp/tools/Trigger Detail Retriever/handler.js +1 -1
  45. package/mcp/tools/Trigger Editor Guide/handler.js +1 -1
  46. package/mcp/tools/Trigger List Retriever/handler.js +1 -1
  47. package/mcp/tools/Trigger Publisher/handler.js +1 -1
  48. package/mcp/tools/Trigger Puller/handler.js +1 -1
  49. package/package.json +3 -3
  50. package/src/application/create.js +2 -2
  51. package/src/application/delete.js +2 -2
  52. package/src/application/doc.js +2 -2
  53. package/src/application/docs/devguide.md +25 -25
  54. package/src/application/docs/introduction.md +2 -2
  55. package/src/button/create.js +169 -0
  56. package/src/button/delete.js +35 -0
  57. package/src/button/doc.js +36 -0
  58. package/src/button/docs/devguide.md +133 -0
  59. package/src/button/docs/introduction.md +60 -0
  60. package/src/button/get.js +60 -0
  61. package/src/button/index.js +20 -0
  62. package/src/classes/create.js +1 -1
  63. package/src/classes/delete.js +1 -1
  64. package/src/classes/detail.js +1 -1
  65. package/src/classes/doc.js +2 -2
  66. package/src/classes/docs/devguide.md +21 -21
  67. package/src/classes/docs/introduction.md +0 -20
  68. package/src/classes/get.js +1 -1
  69. package/src/classes/publish.js +1 -1
  70. package/src/classes/pull.js +1 -1
  71. package/src/classes/pullList.js +1 -1
  72. package/src/config/doc.js +2 -2
  73. package/src/config/docs/devguide.md +15 -15
  74. package/src/customPage/create.js +2 -2
  75. package/src/customPage/delete.js +2 -2
  76. package/src/customPage/doc.js +2 -2
  77. package/src/customPage/docs/devguide.md +27 -27
  78. package/src/customPage/get.js +1 -1
  79. package/src/customSetting/create.js +1 -1
  80. package/src/customSetting/delete.js +1 -1
  81. package/src/customSetting/deleteCustomSettingField.js +1 -1
  82. package/src/customSetting/detail.js +1 -1
  83. package/src/customSetting/docs/devguide.md +9 -9
  84. package/src/customSetting/editCustomSettingField.js +1 -1
  85. package/src/customSetting/get.js +1 -1
  86. package/src/customSetting/modify.js +1 -1
  87. package/src/customSetting/saveCustomSettingField.js +1 -1
  88. package/src/fields/delete.js +2 -2
  89. package/src/fields/docs/devguide.md +14 -14
  90. package/src/fields/docs/introduction.md +3 -3
  91. package/src/globalSelectList/create.js +1 -1
  92. package/src/globalSelectList/delete.js +1 -1
  93. package/src/globalSelectList/detail.js +1 -1
  94. package/src/globalSelectList/doc.js +2 -2
  95. package/src/globalSelectList/docs/devguide.md +7 -7
  96. package/src/globalSelectList/get.js +1 -1
  97. package/src/identityProvider/create.js +78 -0
  98. package/src/identityProvider/delete.js +61 -0
  99. package/src/identityProvider/doc.js +46 -0
  100. package/src/identityProvider/docs/devguide.md +107 -0
  101. package/src/identityProvider/docs/introduction.md +31 -0
  102. package/src/identityProvider/download.js +105 -0
  103. package/src/identityProvider/get.js +70 -0
  104. package/src/identityProvider/index.js +12 -0
  105. package/src/menu/create-object.js +2 -2
  106. package/src/menu/create-page.js +2 -2
  107. package/src/menu/create-script.js +2 -2
  108. package/src/menu/create-site.js +2 -2
  109. package/src/menu/create.js +11 -11
  110. package/src/menu/delete.js +2 -2
  111. package/src/menu/doc.js +2 -2
  112. package/src/menu/docs/devguide.md +13 -13
  113. package/src/menu/docs/introduction.md +3 -3
  114. package/src/menu/get.js +1 -1
  115. package/src/object/create.js +2 -2
  116. package/src/object/delete.js +2 -2
  117. package/src/object/docs/devguide.md +11 -11
  118. package/src/pagelayout/create.js +6 -6
  119. package/src/pagelayout/delete.js +4 -4
  120. package/src/pagelayout/doc.js +2 -2
  121. package/src/pagelayout/docs/devguide.md +9 -9
  122. package/src/pagelayout/docs/introduction.md +1 -1
  123. package/src/pagelayout/get.js +4 -4
  124. package/src/permission/add.js +164 -0
  125. package/src/permission/assign.js +84 -0
  126. package/src/permission/docs/devguide.md +238 -0
  127. package/src/permission/docs/introduction.md +200 -0
  128. package/src/permission/get.js +107 -0
  129. package/src/permission/index.js +10 -0
  130. package/src/permission/remove.js +145 -0
  131. package/src/plugin/delete.js +2 -2
  132. package/src/plugin/doc.js +2 -2
  133. package/src/plugin/docs/devguide.md +29 -29
  134. package/src/profile/create.js +5 -5
  135. package/src/profile/delete.js +2 -2
  136. package/src/profile/doc.js +2 -2
  137. package/src/profile/docs/devguide.md +8 -8
  138. package/src/profile/docs/introduction.md +12 -12
  139. package/src/profile/get.js +1 -1
  140. package/src/project/docs/devguide.md +9 -8
  141. package/src/recordType/create.js +1 -1
  142. package/src/recordType/delete.js +1 -1
  143. package/src/recordType/doc.js +2 -2
  144. package/src/recordType/docs/devguide.md +10 -10
  145. package/src/recordType/editInfo.js +1 -1
  146. package/src/recordType/editSave.js +1 -1
  147. package/src/recordType/getList.js +1 -1
  148. package/src/recordType/newInfo.js +1 -1
  149. package/src/recordType/validDelete.js +1 -1
  150. package/src/res.md +1 -1
  151. package/src/role/create.js +6 -6
  152. package/src/role/delete.js +2 -2
  153. package/src/role/doc.js +2 -2
  154. package/src/role/docs/devguide.md +9 -9
  155. package/src/role/docs/introduction.md +13 -13
  156. package/src/role/get.js +1 -1
  157. package/src/scheduleJob/doc.js +1 -1
  158. package/src/scheduleJob/docs/devguide.md +6 -6
  159. package/src/scheduleJob/docs/introduction.md +6 -6
  160. package/src/script/docs/devguide.md +18 -18
  161. package/src/singleSignOn/delete.js +61 -0
  162. package/src/singleSignOn/doc.js +46 -0
  163. package/src/singleSignOn/docs/devguide.md +61 -0
  164. package/src/singleSignOn/docs/introduction.md +3 -0
  165. package/src/singleSignOn/get.js +70 -0
  166. package/src/singleSignOn/index.js +10 -0
  167. package/src/staticResource/count.js +1 -1
  168. package/src/staticResource/create.js +1 -1
  169. package/src/staticResource/delete.js +1 -1
  170. package/src/staticResource/detail.js +1 -1
  171. package/src/staticResource/docs/devguide.md +11 -11
  172. package/src/staticResource/docs/introduction.md +44 -1
  173. package/src/staticResource/get.js +1 -1
  174. package/src/timer/create.js +1 -1
  175. package/src/timer/delete.js +1 -1
  176. package/src/timer/detail.js +1 -1
  177. package/src/timer/doc.js +2 -2
  178. package/src/timer/docs/devguide.md +19 -19
  179. package/src/timer/get.js +1 -1
  180. package/src/timer/publish.js +1 -1
  181. package/src/timer/pull.js +1 -1
  182. package/src/timer/pullList.js +1 -1
  183. package/src/triggers/detail.js +1 -1
  184. package/src/triggers/doc.js +2 -2
  185. package/src/triggers/docs/devguide.md +23 -23
  186. package/src/triggers/get.js +1 -1
  187. package/src/triggers/pullList.js +1 -1
  188. package/src/user/create.js +2 -2
  189. package/src/user/delete.js +2 -2
  190. package/src/user/doc.js +2 -2
  191. package/src/user/docs/devguide.md +13 -13
  192. package/src/user/docs/introduction.md +12 -12
  193. package/src/user/get.js +1 -1
  194. package/src/user/update.js +3 -3
  195. package/src/user/view.js +2 -2
  196. package/src/validationRule/create.js +7 -7
  197. package/src/validationRule/delete.js +2 -2
  198. package/src/validationRule/doc.js +2 -2
  199. package/src/validationRule/docs/devguide.md +7 -7
  200. package/src/validationRule/docs/introduction.md +11 -11
  201. package/src/validationRule/get.js +1 -1
  202. package/src/version/actionHelp.js +25 -0
  203. package/src/version/docs.js +26 -0
  204. package/src/version/doctor.js +25 -0
  205. package/src/version/get.js +1 -1
  206. package/src/version/help.js +48 -0
  207. package/src/version/index.js +9 -2
  208. package/src/version/initHelp.js +13 -0
  209. package/src/version/listModuleCommands.js +241 -0
  210. package/src/version/stats.js +44 -0
  211. package/src/version/uninstall.js +30 -0
  212. package/src/version/update.js +13 -0
  213. package/test/application.cli.test.js +1 -1
  214. package/test/classes.cli.test.js +1 -1
  215. package/test/customSetting.cli.test.js +1 -1
  216. package/test/fields.cli.test.js +2 -2
  217. package/test/globalSelectList.cli.test.js +1 -1
  218. package/test/menu-script.cli.test.js +1 -1
  219. package/test/menu.cli.test.js +1 -1
  220. package/test/object.cli.test.js +1 -1
  221. package/test/plugin.cli.test.js +1 -1
  222. package/test/scheduleJob.cli.test.js +1 -1
  223. package/test/script.cli.test.js +1 -1
  224. package/test/staticResource.cli.test.js +1 -1
  225. package/test/timer.cli.test.js +1 -1
  226. package/test/trigger.cli.test.js +1 -1
  227. package/utils/checkVersion.js +27 -2
  228. package/utils/commandStats.js +94 -0
  229. package/utils/formatReleaseNotes.js +312 -0
  230. package/utils/readmeReleases.js +69 -0
  231. package/.cloudcc-cache.json +0 -54
  232. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  233. package/.cursor/skills/cloudcc-dev-usage/SKILL.md +0 -68
  234. package/build/component-cc-cc-dd.common.js +0 -831
  235. package/build/component-cc-cc-dd.common.js.map +0 -1
  236. package/build/component-cc-cc-dd.css +0 -1
  237. package/build/component-cc-cc-dd.umd.js +0 -874
  238. package/build/component-cc-cc-dd.umd.js.map +0 -1
  239. package/build/component-cc-cc-dd.umd.min.js +0 -8
  240. package/build/component-cc-cc-dd.umd.min.js.map +0 -1
  241. package/build/demo.html +0 -1
  242. package/plugins/cc-cc-dd/cc-cc-dd.vue +0 -32
  243. package/plugins/cc-cc-dd/components/HelloWorld.vue +0 -11
  244. package/plugins/cc-cc-dd/config.json +0 -6
@@ -10,7 +10,7 @@ const chalk = require('chalk')
10
10
  */
11
11
  async function create(argvs) {
12
12
  try {
13
- // 命令行参数格式:cc create application <path> <p1> <p2> [duel1]
13
+ // 命令行参数格式:cloudcc create application <path> <p1> <p2> [duel1]
14
14
  // argvs: ['application', 'create', path, p1, p2, duel1]
15
15
  let path = argvs[2];
16
16
  let p1 = argvs[3]; // 应用名称
@@ -21,7 +21,7 @@ async function create(argvs) {
21
21
  if (!p1 || !p2) {
22
22
  console.error();
23
23
  console.error(chalk.red('Error: 缺少必需参数'));
24
- console.error('用法: cc create application <path> <p1> <p2> [duel1]');
24
+ console.error('用法: cloudcc create application <path> <p1> <p2> [duel1]');
25
25
  console.error(' path: 项目路径');
26
26
  console.error(' p1: 应用名称');
27
27
  console.error(' p2: 应用代码');
@@ -4,7 +4,7 @@ const { getPackageJson } = require("../../utils/config");
4
4
 
5
5
  /**
6
6
  * 删除应用(Application)
7
- * 用法:cc delete application <projectPath> <appId>
7
+ * 用法:cloudcc delete application <projectPath> <appId>
8
8
  */
9
9
  async function remove(argvs) {
10
10
  try {
@@ -14,7 +14,7 @@ async function remove(argvs) {
14
14
  if (!appId) {
15
15
  console.error();
16
16
  console.error(chalk.red("Error: 缺少应用 ID"));
17
- console.error(chalk.yellow("用法: cc delete application <projectPath> <appId>"));
17
+ console.error(chalk.yellow("用法: cloudcc delete application <projectPath> <appId>"));
18
18
  console.error();
19
19
  throw new Error("缺少必需参数: appId");
20
20
  }
@@ -21,14 +21,14 @@ function getDevGuideDoc() {
21
21
  }
22
22
 
23
23
  /**
24
- * cc doc application <introduction|devguide>
24
+ * cloudcc doc application <introduction|devguide>
25
25
  * @param {string[]} argvs [doc, type, introduction|devguide, ...]
26
26
  */
27
27
  function doc(argvs) {
28
28
  const subType = argvs[2];
29
29
  const key = String(subType || "").trim().toLowerCase();
30
30
  if (!key) {
31
- throw new Error("cc doc application 需要子命令:introduction 或 devguide");
31
+ throw new Error("cloudcc doc application 需要子命令:introduction 或 devguide");
32
32
  }
33
33
  if (key === "introduction") {
34
34
  const content = getIntroductionDoc();
@@ -4,10 +4,10 @@
4
4
 
5
5
  `application` 模块用于通过 CLI 管理 CloudCC 应用,当前提供:
6
6
 
7
- - 创建应用:`cc create application ...`
8
- - 查询应用:`cc get application ...`
9
- - 删除应用:`cc delete application ...`
10
- - 文档查看:`cc doc application introduction|devguide`
7
+ - 创建应用:`cloudcc create application ...`
8
+ - 查询应用:`cloudcc get application ...`
9
+ - 删除应用:`cloudcc delete application ...`
10
+ - 文档查看:`cloudcc doc application introduction|devguide`
11
11
 
12
12
  ---
13
13
 
@@ -15,7 +15,7 @@
15
15
 
16
16
  执行命令前请确认:
17
17
 
18
- - 已完成 `cc doc project devguide` 的环境初始化
18
+ - 已完成 `cloudcc doc project devguide` 的环境初始化
19
19
  - 项目根目录存在可用配置,且包含 `accessToken`
20
20
  - 已准备应用名称、应用代码
21
21
  - 若需自定义菜单挂载,已准备菜单 ID 列表
@@ -25,10 +25,10 @@
25
25
  ## 3. 命令总览(以代码实现为准)
26
26
 
27
27
  ```bash
28
- cc create application <path> <p1> <p2> [duel1]
29
- cc get application <projectPath> [encodedCondJson]
30
- cc delete application <projectPath> <appId>
31
- cc doc application <introduction|devguide>
28
+ cloudcc create application <path> <p1> <p2> [duel1]
29
+ cloudcc get application <projectPath> [encodedCondJson]
30
+ cloudcc delete application <projectPath> <appId>
31
+ cloudcc doc application <introduction|devguide>
32
32
  ```
33
33
 
34
34
  参数约定:
@@ -45,7 +45,7 @@ cc doc application <introduction|devguide>
45
45
  ## 4. 创建应用
46
46
 
47
47
  ```bash
48
- cc create application <path> <p1> <p2> [duel1]
48
+ cloudcc create application <path> <p1> <p2> [duel1]
49
49
  ```
50
50
 
51
51
  ### 4.1 参数说明
@@ -65,10 +65,10 @@ cc create application <path> <p1> <p2> [duel1]
65
65
 
66
66
  ```bash
67
67
  # 使用默认菜单 ID
68
- cc create application . "销售工作台" sales_workbench
68
+ cloudcc create application . "销售工作台" sales_workbench
69
69
 
70
70
  # 指定菜单 ID(可多个)
71
- cc create application . "销售工作台" sales_workbench "acf000001,a0I9D000000XXXXUAI"
71
+ cloudcc create application . "销售工作台" sales_workbench "acf000001,a0I9D000000XXXXUAI"
72
72
  ```
73
73
 
74
74
  ### 4.4 常见报错
@@ -77,7 +77,7 @@ cc create application . "销售工作台" sales_workbench "acf000001,a0I9D000000
77
77
 
78
78
  ```text
79
79
  Error: 缺少必需参数
80
- 用法: cc create application <path> <p1> <p2> [duel1]
80
+ 用法: cloudcc create application <path> <p1> <p2> [duel1]
81
81
  ```
82
82
 
83
83
  - 角色列表获取失败(依赖 `brief/get`):
@@ -91,7 +91,7 @@ Error: 缺少必需参数
91
91
  ## 5. 查询应用
92
92
 
93
93
  ```bash
94
- cc get application <projectPath> [encodedCondJson]
94
+ cloudcc get application <projectPath> [encodedCondJson]
95
95
  ```
96
96
 
97
97
  说明:
@@ -103,10 +103,10 @@ cc get application <projectPath> [encodedCondJson]
103
103
 
104
104
  ```bash
105
105
  # 查询全部应用
106
- cc get application .
106
+ cloudcc get application .
107
107
 
108
108
  # 按条件查询(示例)
109
- cc get application . '%7B%22appType%22%3A%22app%22%7D'
109
+ cloudcc get application . '%7B%22appType%22%3A%22app%22%7D'
110
110
  ```
111
111
 
112
112
  若条件 JSON 无法解析,会报错:
@@ -120,7 +120,7 @@ Get Application List Failed: encodedCondJson 解析失败,请传 encodeURI(JSO
120
120
  ## 6. 删除应用
121
121
 
122
122
  ```bash
123
- cc delete application <projectPath> <appId>
123
+ cloudcc delete application <projectPath> <appId>
124
124
  ```
125
125
 
126
126
  参数说明:
@@ -131,14 +131,14 @@ cc delete application <projectPath> <appId>
131
131
  示例:
132
132
 
133
133
  ```bash
134
- cc delete application . a0L9D000000XXXXUAI
134
+ cloudcc delete application . a0L9D000000XXXXUAI
135
135
  ```
136
136
 
137
137
  缺少 `appId` 时会报错:
138
138
 
139
139
  ```text
140
140
  Error: 缺少应用 ID
141
- 用法: cc delete application <projectPath> <appId>
141
+ 用法: cloudcc delete application <projectPath> <appId>
142
142
  ```
143
143
 
144
144
  ---
@@ -146,8 +146,8 @@ Error: 缺少应用 ID
146
146
  ## 7. 文档命令
147
147
 
148
148
  ```bash
149
- cc doc application introduction
150
- cc doc application devguide
149
+ cloudcc doc application introduction
150
+ cloudcc doc application devguide
151
151
  ```
152
152
 
153
153
  仅支持 `introduction` 与 `devguide`,其他子命令会抛错。
@@ -158,16 +158,16 @@ cc doc application devguide
158
158
 
159
159
  ```bash
160
160
  # 1) 先查现有应用,避免重名
161
- cc get application .
161
+ cloudcc get application .
162
162
 
163
163
  # 2) 创建应用
164
- cc create application . "销售工作台" sales_workbench
164
+ cloudcc create application . "销售工作台" sales_workbench
165
165
 
166
166
  # 3) 再次查询确认已创建
167
- cc get application .
167
+ cloudcc get application .
168
168
 
169
169
  # 4) 如需回滚,按 appId 删除
170
- cc delete application . <appId>
170
+ cloudcc delete application . <appId>
171
171
  ```
172
172
 
173
173
  ---
@@ -76,6 +76,6 @@
76
76
  ## 8. 相关文档与命令
77
77
 
78
78
  ```bash
79
- cc doc application introduction
80
- cc doc application devguide
79
+ cloudcc doc application introduction
80
+ cloudcc doc application devguide
81
81
  ```
@@ -0,0 +1,169 @@
1
+ /**
2
+ * 自定义按钮 - 新建
3
+ * API: POST {setupSvc}/api/buttonlink/saveButton
4
+ * CLI: cloudcc create button <projectPath> <objid> <label> [name] [btnType] [event]
5
+ *
6
+ * 参数说明:
7
+ * - projectPath : 项目根目录
8
+ * - objid : 对象 ID
9
+ * - label : 按钮标签(必填)
10
+ * - name : 按钮 API 名称(可选,默认同 label)
11
+ * - btnType : 显示类型,detailBtn(详情页面按钮,默认)| listBtn(列表按钮)
12
+ * - event : 按钮类型,template(默认)| lightning-script | lightning-url | url
13
+ *
14
+ * 各类型默认值:
15
+ * - template / lightning-script : functionCode = "alert('hello world')"
16
+ * - lightning-script : h5FunctionCode = "alert('hello world')"
17
+ * - lightning-url / url : functionCode = "www.cloudcc.com"
18
+ * - lightning-url : mobileurl 自动选取自定义页面组件列表第一项
19
+ */
20
+ const chalk = require("chalk");
21
+ const axios = require("axios");
22
+ const https = require("https");
23
+ const http = require("http");
24
+ const { getPackageJson } = require("../../utils/config");
25
+ const { postClass } = require("../../utils/http");
26
+
27
+ // 用户侧 event 名称 -> API 实际 event 值
28
+ const EVENT_MAP = {
29
+ "template": "lightning",
30
+ "lightning-script": "lightning-script",
31
+ "lightning-url": "lightning-url",
32
+ "url": "URL"
33
+ };
34
+
35
+ const httpsAgent = new https.Agent({ rejectUnauthorized: false });
36
+ const httpAgent = new http.Agent({ rejectUnauthorized: false });
37
+
38
+ /**
39
+ * 从 devconsole-svc 获取自定义页面组件列表,返回首个页面对象
40
+ * @param {string} setupSvc 配置中的 setupSvc 地址
41
+ * @param {string} accessToken
42
+ */
43
+ async function fetchFirstCustomPage(setupSvc, accessToken) {
44
+ // 从 setupSvc 移除末尾服务路径,拼 devconsole 路径
45
+ // 例:https://xxx/ccdomaingateway/setup → https://xxx/ccdomaingateway/devconsole/...
46
+ const base = setupSvc.replace(/\/[^/]+$/, "");
47
+ const url = base + "/devconsole/custom/pc/1.0/post/pageCustomPage";
48
+ const res = await axios({
49
+ url,
50
+ method: "post",
51
+ httpsAgent,
52
+ httpAgent,
53
+ timeout: 60000,
54
+ headers: { "Content-Type": "application/json; charset=utf-8" },
55
+ data: {
56
+ head: {
57
+ appType: "lightning-setup",
58
+ appVersion: "0.0.1",
59
+ accessToken,
60
+ source: "lightning-setup",
61
+ version: "public"
62
+ },
63
+ body: {
64
+ pageNo: 1,
65
+ pageSize: 2000000,
66
+ condition: { pageLabel: "", dtBegin: "", dtEnd: "" }
67
+ }
68
+ }
69
+ });
70
+ const list = res.data && res.data.data && res.data.data.list;
71
+ return Array.isArray(list) && list.length > 0 ? list[0] : null;
72
+ }
73
+
74
+ /**
75
+ * 新建自定义按钮
76
+ * @param {string} projectPath
77
+ * @param {string} objid 对象 ID
78
+ * @param {string} label 按钮标签
79
+ * @param {string} name 按钮 API 名称(可选)
80
+ * @param {string} btnType detailBtn | listBtn(默认 detailBtn)
81
+ * @param {string} eventType template | lightning-script | lightning-url | url(默认 template)
82
+ */
83
+ async function create(projectPath = process.cwd(), objid, label, name, btnType = "detailBtn", eventType = "template") {
84
+ if (!objid) throw new Error("Create Button Failed: objid is required");
85
+ if (!label) throw new Error("Create Button Failed: label is required");
86
+
87
+ const resolvedName = name || label;
88
+ const resolvedBtnType = btnType || "detailBtn";
89
+ const resolvedEvent = eventType || "template";
90
+
91
+ const apiEvent = EVENT_MAP[resolvedEvent];
92
+ if (!apiEvent) {
93
+ throw new Error(
94
+ `Create Button Failed: unknown event type "${resolvedEvent}". ` +
95
+ `Must be one of: template, lightning-script, lightning-url, url`
96
+ );
97
+ }
98
+
99
+ const config = await getPackageJson(projectPath);
100
+
101
+ console.error();
102
+ console.error(chalk.green("Creating custom button, please wait..."));
103
+ console.error();
104
+
105
+ // 构建按钮 VO 基础结构
106
+ const tpSysButtonVO = {
107
+ label,
108
+ name: resolvedName,
109
+ btnType: resolvedBtnType,
110
+ event: apiEvent,
111
+ behavior: "self",
112
+ menubar: true,
113
+ functionCode: "",
114
+ remark: "",
115
+ mobileurl: "",
116
+ h5FunctionCode: "",
117
+ category: "CustomButton",
118
+ custompageId: "",
119
+ iscustom: "",
120
+ visible: "1"
121
+ };
122
+
123
+ // 按类型填充默认值
124
+ if (resolvedEvent === "template") {
125
+ // PC 端 JavaScript 代码
126
+ tpSysButtonVO.functionCode = "alert('hello world')";
127
+ } else if (resolvedEvent === "lightning-script") {
128
+ // PC + 移动端均支持
129
+ tpSysButtonVO.functionCode = "alert('hello world')";
130
+ tpSysButtonVO.h5FunctionCode = "alert('hello world')";
131
+ } else if (resolvedEvent === "lightning-url") {
132
+ // PC 端 URL 地址
133
+ tpSysButtonVO.functionCode = "www.cloudcc.com";
134
+ // 移动端:自动取自定义页面组件列表第一项
135
+ try {
136
+ const firstPage = await fetchFirstCustomPage(config.setupSvc, config.accessToken);
137
+ if (firstPage) {
138
+ tpSysButtonVO.mobileurl = `__UNI__110007E/#/pages/index/index?pageApi=${firstPage.pageApi}`;
139
+ tpSysButtonVO.custompageId = firstPage.id;
140
+ console.error(chalk.cyan(`Using custom page: ${firstPage.pageLabel} (pageApi: ${firstPage.pageApi})`));
141
+ } else {
142
+ console.error(chalk.yellow("Warning: No custom page found, mobileurl will be empty."));
143
+ }
144
+ } catch (e) {
145
+ console.error(chalk.yellow(`Warning: Could not fetch custom page list: ${e.message}`));
146
+ }
147
+ } else if (resolvedEvent === "url") {
148
+ // PC 端 URL(仅 PC 支持)
149
+ tpSysButtonVO.functionCode = "www.cloudcc.com";
150
+ }
151
+
152
+ const body = { objid, tpSysButtonVO };
153
+
154
+ const res = await postClass(
155
+ config.setupSvc + "/api/buttonlink/saveButton",
156
+ body,
157
+ config.accessToken
158
+ );
159
+
160
+ if (res && res.result) {
161
+ console.error(chalk.green(`Success! Custom button "${label}" created.`));
162
+ console.error();
163
+ return res;
164
+ }
165
+
166
+ throw new Error("Create Button Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
167
+ }
168
+
169
+ module.exports = create;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 自定义按钮 - 删除
3
+ * API: POST {setupSvc}/api/buttonlink/deleteButton
4
+ * CLI: cloudcc delete button <projectPath> <id>
5
+ *
6
+ * 参数说明:
7
+ * - projectPath : 项目根目录
8
+ * - id : 自定义按钮 ID
9
+ */
10
+ const chalk = require("chalk");
11
+ const { getPackageJson } = require("../../utils/config");
12
+ const { postClass } = require("../../utils/http");
13
+
14
+ async function remove(projectPath = process.cwd(), id) {
15
+ if (!id) {
16
+ throw new Error("Delete Button Failed: id is required");
17
+ }
18
+ const config = await getPackageJson(projectPath);
19
+ console.error();
20
+ console.error(chalk.green(`Deleting button (${id}), please wait...`));
21
+ console.error();
22
+ const res = await postClass(
23
+ config.setupSvc + "/api/buttonlink/deleteButton",
24
+ { id },
25
+ config.accessToken
26
+ );
27
+ if (res && res.result) {
28
+ console.error(chalk.green("Success! Button deleted."));
29
+ console.error();
30
+ return res;
31
+ }
32
+ throw new Error("Delete Button Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
33
+ }
34
+
35
+ module.exports = remove;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * button 文档统一入口
3
+ */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+
7
+ const DOCS_DIR = path.join(__dirname, "docs");
8
+
9
+ function readDocFile(basename) {
10
+ return fs.readFileSync(path.join(DOCS_DIR, `${basename}.md`), "utf8");
11
+ }
12
+
13
+ /**
14
+ * cloudcc doc button <introduction|devguide>
15
+ * @param {string[]} argvs [doc, type, introduction|devguide, ...]
16
+ */
17
+ function doc(argvs) {
18
+ const subType = argvs[2];
19
+ const key = String(subType || "").trim().toLowerCase();
20
+ if (!key) {
21
+ throw new Error("cloudcc doc button 需要子命令:introduction 或 devguide");
22
+ }
23
+ if (key === "introduction") {
24
+ const content = readDocFile("introduction");
25
+ console.log(content);
26
+ return content;
27
+ }
28
+ if (key === "devguide") {
29
+ const content = readDocFile("devguide");
30
+ console.log(content);
31
+ return content;
32
+ }
33
+ throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
34
+ }
35
+
36
+ module.exports = doc;
@@ -0,0 +1,133 @@
1
+ # CloudCC 按钮与链接操作指南
2
+
3
+ ---
4
+
5
+ ## 1. 入口与列表页
6
+
7
+ 进入路径:`对象管理 → 选择对象 → 按钮和链接` 标签页
8
+
9
+ 列表页分为两个 Tab:
10
+ - **标准按钮和链接**:系统内置,不可删除
11
+ - **自定义按钮和链接**:开发者自定义
12
+
13
+ 列表展示字段:标签 / 名称 / 显示类型
14
+
15
+ ---
16
+
17
+ ## 2. 查询按钮列表
18
+
19
+ ```bash
20
+ cloudcc get button . <prefix>
21
+ ```
22
+
23
+ - `<prefix>`:对象的 prefix,可从对象管理页或对象 API 名称前缀获取(如 `a75`)
24
+
25
+ 返回结构:
26
+
27
+ ```json
28
+ {
29
+ "objname": "玫瑰花不带刺",
30
+ "objid": "202646FC67ACF24D39sG",
31
+ "standbutton": [
32
+ {
33
+ "id": "adc20262A1F4957UmT0l",
34
+ "label": "提交待审批",
35
+ "name": "Submit",
36
+ "btnType": "detailBtn",
37
+ "category": "StandardButton",
38
+ "event": "URL",
39
+ "behavior": "self",
40
+ "url": null,
41
+ "functionCode": null,
42
+ "mobileurl": ""
43
+ }
44
+ ],
45
+ "custbutton": []
46
+ }
47
+ ```
48
+
49
+ | 字段 | 说明 |
50
+ |---------------|---------------------------------------------|
51
+ | `standbutton` | 标准按钮列表 |
52
+ | `custbutton` | 自定义按钮列表 |
53
+ | `btnType` | `detailBtn` 详情页按钮 / `listBtn` 列表按钮 |
54
+ | `category` | `StandardButton` 标准 / `CustomButton` 自定义 |
55
+ | `event` | `URL` 跳转 / `JavaScript` 执行脚本 |
56
+ | `behavior` | 打开方式:`self` 当前页 / `newWindow` 新窗口 |
57
+
58
+ ---
59
+
60
+ ## 3. 新建自定义按钮
61
+
62
+ ```bash
63
+ cloudcc create button . <objid> <label> [name] [btnType] [event]
64
+ ```
65
+
66
+ | 参数 | 必填 | 说明 |
67
+ |-------------|------|-----------------------------------------------------------------------------|
68
+ | `objid` | ✅ | 所属对象 ID |
69
+ | `label` | ✅ | 按钮标签(显示名称) |
70
+ | `name` | ❌ | 按钮 API 名称,默认同 `label` |
71
+ | `btnType` | ❌ | 显示类型:`detailBtn`(详情页按钮,默认)/ `listBtn`(列表按钮) |
72
+ | `event` | ❌ | 按钮类型,见下表,默认 `template` |
73
+
74
+ ### 按钮类型(event)
75
+
76
+ | 取值 | 平台支持 | 说明 |
77
+ |-------------------|------------------|-----------------------------------------------------------|
78
+ | `template` | 仅 PC | PC 端 JavaScript 代码,默认代码 `alert('hello world')` |
79
+ | `lightning-script`| PC + 移动端 | PC 和移动端各需要 JS 代码,默认均为 `alert('hello world')` |
80
+ | `lightning-url` | PC + 移动端 | PC 端填 URL,移动端自动选取自定义页面组件列表第一项 |
81
+ | `url` | 仅 PC | PC 端 URL 地址,默认 `www.cloudcc.com` |
82
+
83
+ ### 示例
84
+
85
+ ```bash
86
+ # 新建 template 类型按钮(默认)
87
+ cloudcc create button . 202646FC67ACF24D39sG "我的按钮"
88
+
89
+ # 指定名称和显示类型
90
+ cloudcc create button . 202646FC67ACF24D39sG "我的按钮" myBtn detailBtn
91
+
92
+ # lightning-script 类型,列表按钮
93
+ cloudcc create button . 202646FC67ACF24D39sG "脚本按钮" scriptBtn listBtn lightning-script
94
+
95
+ # lightning-url 类型(移动端自动取第一个自定义页面组件)
96
+ cloudcc create button . 202646FC67ACF24D39sG "跳转按钮" urlBtn detailBtn lightning-url
97
+
98
+ # url 类型
99
+ cloudcc create button . 202646FC67ACF24D39sG "外链按钮" linkBtn detailBtn url
100
+ ```
101
+
102
+ > **注意:** 各类型代码/URL 默认值仅供快速创建使用,创建后请在页面上编辑替换为实际内容。
103
+
104
+ ---
105
+
106
+ ## 4. 删除自定义按钮
107
+
108
+ ```bash
109
+ cloudcc delete button . <id>
110
+ ```
111
+
112
+ | 参数 | 必填 | 说明 |
113
+ |-------|------|--------------------|
114
+ | `id` | ✅ | 自定义按钮 ID |
115
+
116
+ > **注意:** 仅支持删除自定义按钮,标准按钮不可删除。
117
+
118
+ ### 示例
119
+
120
+ ```bash
121
+ cloudcc delete button . adc202642BBED6BFlu6D
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 5. 查看文档
127
+
128
+ ```bash
129
+ cloudcc doc button introduction # 能力与适用场景说明
130
+ cloudcc doc button devguide # 本操作指南
131
+ ```
132
+
133
+ ---
@@ -0,0 +1,60 @@
1
+ # CloudCC 按钮与链接能力说明
2
+
3
+ ## 1. 什么是按钮与链接
4
+
5
+ 按钮和链接有助于将 CloudCC 数据与外部 URL、应用程序、公司内部网或其他后端办公系统集成在一起。
6
+
7
+ 按钮可以显示在以下位置:
8
+ - **详细信息页**:记录详情页面上的操作按钮
9
+ - **相关列表**:对象关联子列表区域的操作按钮
10
+ - **列表视图**:搜索/列表布局中的批量操作按钮
11
+
12
+ ---
13
+
14
+ ## 2. 按钮分类
15
+
16
+ ### 2.1 标准按钮(Standard Button)
17
+
18
+ 系统内置的标准操作按钮,不可删除,可控制显示/隐藏。
19
+
20
+ | 标签 | 名称 | 显示类型 |
21
+ |------------|----------------|-----------------|
22
+ | 提交待审批 | Submit | 详细信息页按钮 |
23
+ | 编辑 | Edit | 详细信息页按钮 |
24
+ | 新建 | New | 列表按钮 |
25
+ | 批量转移 | Batch Transfer | 列表按钮 |
26
+ | 删除 | Delete | 详细信息页按钮 |
27
+ | 批量新增 | Batch Added | 列表按钮 |
28
+ | 复制 | Clone | 详细信息页按钮 |
29
+ | 共享 | Share | 详细信息页按钮 |
30
+ | 批量删除 | Batch Delete | 列表按钮 |
31
+ | 批量编辑 | Batch Editor | 列表按钮 |
32
+ | 合并 | Merge | 列表按钮 |
33
+
34
+ ### 2.2 自定义按钮(Custom Button)
35
+
36
+ 开发者自定义的按钮或链接,支持配置跳转 URL、执行脚本、调用自定义类等行为。
37
+
38
+ ---
39
+
40
+ ## 3. 按钮类型(btnType)
41
+
42
+ | 值 | 说明 |
43
+ |-------------|----------------|
44
+ | `detailBtn` | 详细信息页按钮 |
45
+ | `listBtn` | 列表按钮 |
46
+
47
+ ## 4. 按钮行为(event)
48
+
49
+ | 值 | 说明 |
50
+ |---------------|------------------------|
51
+ | `URL` | 跳转到指定 URL |
52
+ | `JavaScript` | 执行 JavaScript 代码 |
53
+
54
+ ---
55
+
56
+ ## 5. 如何将按钮添加到页面
57
+
58
+ - **详细信息页**:编辑页面布局,将按钮拖入布局
59
+ - **相关列表**:在页面布局中找到相关列表,编辑其属性
60
+ - **列表视图**:在"搜索布局"中编辑列表视图布局