cloudcc-cli 2.3.1 → 2.3.3

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 (232) hide show
  1. package/.claude/settings.json +25 -0
  2. package/.cloudcc-cache.json +21 -4
  3. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  4. package/.cursor/skills/cloudcc-cli-usage/SKILL.md +68 -0
  5. package/README.md +22 -0
  6. package/bin/cc.js +13 -8
  7. package/bin/index.js +9 -2
  8. package/bin/mcp.js +1 -1
  9. package/build/component-CCPlugin1774500425584.common.js +831 -0
  10. package/build/component-CCPlugin1774500425584.common.js.map +1 -0
  11. package/build/component-CCPlugin1774500425584.css +1 -0
  12. package/build/component-CCPlugin1774500425584.umd.js +874 -0
  13. package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
  14. package/build/component-CCPlugin1774500425584.umd.min.js +8 -0
  15. package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
  16. package/build/demo.html +1 -0
  17. package/{src/mcp → mcp}/tools/Class Editor Guide/handler.js +12 -4
  18. package/{src/mcp → mcp}/tools/Component Editor Guide/handler.js +15 -14
  19. package/{src/mcp → mcp}/tools/Trigger Editor Guide/handler.js +8 -2
  20. package/package.json +3 -2
  21. package/src/application/doc.js +46 -0
  22. package/src/application/docs/devguide.md +173 -0
  23. package/src/application/docs/introduction.md +81 -0
  24. package/src/application/index.js +1 -0
  25. package/src/brief/get.js +1 -1
  26. package/src/classes/create.js +6 -1
  27. package/src/classes/delete.js +7 -1
  28. package/src/classes/detail.js +8 -1
  29. package/src/classes/doc.js +49 -472
  30. package/src/classes/docs/devguide.md +541 -0
  31. package/src/classes/get.js +9 -2
  32. package/src/classes/index.js +2 -1
  33. package/src/classes/publish.js +6 -1
  34. package/src/classes/pull.js +6 -1
  35. package/src/classes/pullList.js +6 -3
  36. package/src/config/doc.js +31 -0
  37. package/src/config/docs/devguide.md +100 -0
  38. package/src/config/index.js +5 -0
  39. package/src/customPage/create.js +52 -19
  40. package/src/customPage/doc.js +46 -0
  41. package/src/customPage/docs/devguide.md +200 -0
  42. package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/351/241/265/351/235/242.md → src/customPage/docs/introduction.md} +1 -5
  43. package/src/customPage/index.js +1 -0
  44. package/src/customSetting/create.js +9 -0
  45. package/src/customSetting/delete.js +10 -1
  46. package/src/customSetting/deleteCustomSettingField.js +43 -0
  47. package/src/customSetting/detail.js +10 -1
  48. package/src/customSetting/doc.js +22 -179
  49. package/src/customSetting/docs/devguide.md +181 -0
  50. package/src/customSetting/docs/introduction.md +3 -0
  51. package/src/customSetting/editCustomSettingField.js +34 -0
  52. package/src/customSetting/get.js +9 -0
  53. package/src/customSetting/index.js +6 -1
  54. package/src/customSetting/modify.js +30 -0
  55. package/src/customSetting/saveCustomSettingField.js +46 -0
  56. package/src/fields/doc.js +45 -0
  57. package/src/fields/docs/devguide.md +224 -0
  58. package/src/fields/docs/introduction.md +217 -0
  59. package/src/fields/index.js +1 -0
  60. package/src/globalSelectList/create.js +51 -0
  61. package/src/globalSelectList/delete.js +56 -0
  62. package/src/globalSelectList/detail.js +45 -0
  63. package/src/globalSelectList/doc.js +52 -0
  64. package/src/globalSelectList/docs/devguide.md +153 -0
  65. package/src/globalSelectList/docs/introduction.md +82 -0
  66. package/src/globalSelectList/get.js +31 -0
  67. package/src/globalSelectList/index.js +16 -0
  68. package/src/menu/create-page.js +43 -6
  69. package/src/menu/create-script.js +67 -19
  70. package/src/menu/doc.js +57 -0
  71. package/src/menu/docs/devguide.md +129 -0
  72. package/src/menu/docs/introduction.md +99 -0
  73. package/src/menu/index.js +1 -0
  74. package/src/menu/validator.js +80 -0
  75. package/src/object/doc.js +45 -0
  76. package/src/object/docs/devguide.md +112 -0
  77. package/src/object/docs/introduction.md +187 -0
  78. package/src/object/get.js +1 -23
  79. package/src/object/index.js +1 -0
  80. package/src/pagelayout/create.js +123 -0
  81. package/src/pagelayout/delete.js +57 -0
  82. package/src/pagelayout/doc.js +46 -0
  83. package/src/pagelayout/docs/devguide.md +83 -0
  84. package/src/pagelayout/docs/introduction.md +44 -0
  85. package/src/pagelayout/get.js +46 -0
  86. package/src/pagelayout/index.js +10 -0
  87. package/src/plugin/doc.js +43 -863
  88. package/src/plugin/docs/devguide.md +996 -0
  89. package/src/profile/create.js +108 -0
  90. package/src/profile/delete.js +59 -0
  91. package/src/profile/doc.js +46 -0
  92. package/src/profile/docs/devguide.md +77 -0
  93. package/src/profile/docs/introduction.md +123 -0
  94. package/src/profile/get.js +55 -0
  95. package/src/profile/index.js +14 -0
  96. package/src/project/doc.js +39 -372
  97. package/src/project/docs/devguide.md +359 -0
  98. package/src/project/docs/introduction.md +3 -0
  99. package/src/recordType/create.js +77 -0
  100. package/src/recordType/delete.js +52 -0
  101. package/src/recordType/doc.js +36 -0
  102. package/src/recordType/docs/devguide.md +160 -0
  103. package/src/recordType/docs/introduction.md +53 -0
  104. package/src/recordType/editInfo.js +39 -0
  105. package/src/recordType/editSave.js +47 -0
  106. package/src/recordType/getList.js +31 -0
  107. package/src/recordType/index.js +16 -3
  108. package/src/recordType/newInfo.js +39 -0
  109. package/src/recordType/validDelete.js +91 -0
  110. package/src/res.md +66 -0
  111. package/src/role/create.js +153 -0
  112. package/src/role/delete.js +59 -0
  113. package/src/role/doc.js +46 -0
  114. package/src/role/docs/devguide.md +81 -0
  115. package/src/role/docs/introduction.md +124 -0
  116. package/src/role/get.js +57 -0
  117. package/src/role/index.js +10 -0
  118. package/src/scheduleJob/doc.js +49 -0
  119. package/src/scheduleJob/docs/devguide.md +79 -0
  120. package/src/scheduleJob/docs/introduction.md +101 -0
  121. package/src/scheduleJob/index.js +5 -0
  122. package/src/script/delete.js +112 -0
  123. package/src/script/doc.js +31 -245
  124. package/src/script/docs/devguide.md +290 -0
  125. package/src/script/docs/introduction.md +48 -0
  126. package/src/script/index.js +1 -0
  127. package/src/staticResource/count.js +31 -10
  128. package/src/staticResource/create.js +97 -0
  129. package/src/staticResource/delete.js +30 -8
  130. package/src/staticResource/detail.js +32 -10
  131. package/src/staticResource/doc.js +21 -88
  132. package/src/staticResource/docs/devguide.md +157 -0
  133. package/src/staticResource/docs/introduction.md +3 -0
  134. package/src/staticResource/get.js +31 -8
  135. package/src/staticResource/index.js +2 -1
  136. package/src/timer/create.js +6 -1
  137. package/src/timer/delete.js +7 -1
  138. package/src/timer/detail.js +5 -5
  139. package/src/timer/doc.js +57 -0
  140. package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md → src/timer/docs/devguide.md} +83 -1
  141. package/src/timer/get.js +7 -1
  142. package/src/timer/index.js +3 -1
  143. package/src/timer/publish.js +6 -1
  144. package/src/timer/pull.js +6 -1
  145. package/src/timer/pullList.js +5 -3
  146. package/src/triggers/detail.js +5 -5
  147. package/src/triggers/doc.js +49 -364
  148. package/src/triggers/docs/devguide.md +442 -0
  149. package/src/triggers/get.js +7 -3
  150. package/src/triggers/index.js +1 -4
  151. package/src/triggers/pullList.js +7 -7
  152. package/src/user/create.js +50 -0
  153. package/src/user/delete.js +59 -0
  154. package/src/user/doc.js +46 -0
  155. package/src/user/docs/devguide.md +122 -0
  156. package/src/user/docs/introduction.md +124 -0
  157. package/src/user/get.js +112 -0
  158. package/src/user/index.js +12 -0
  159. package/src/user/update.js +96 -0
  160. package/src/user/view.js +60 -0
  161. package/test/classes.cli.test.js +7 -4
  162. package/test/customPage.cli.test.js +96 -0
  163. package/test/globalSelectList.cli.test.js +94 -0
  164. package/test/menu-script.cli.test.js +147 -0
  165. package/test/menu.cli.test.js +8 -1
  166. package/test/plugin.cli.test.js +5 -3
  167. package/test/timer.cli.test.js +15 -8
  168. package/test/trigger.cli.test.js +5 -3
  169. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
  170. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
  171. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
  172. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
  173. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
  174. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
  175. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
  176. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
  177. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
  178. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
  179. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  180. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
  181. package/src/approval/approve.js +0 -105
  182. package/src/approval/get.js +0 -245
  183. package/src/approval/index.js +0 -11
  184. package/src/approval/reject.js +0 -105
  185. package/src/plugin/readme.md +0 -7
  186. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  187. /package/{src/mcp → mcp}/index.js +0 -0
  188. /package/{src/mcp → mcp}/readme.md +0 -0
  189. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  190. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  191. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  192. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  193. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  194. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  195. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  196. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  197. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  198. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  199. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  200. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  201. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  202. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  203. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  204. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  205. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  206. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  207. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  208. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  209. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  210. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  211. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  212. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  213. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  214. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  215. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  216. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  217. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  218. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  219. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  220. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  221. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  222. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  223. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  224. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  225. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  226. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  227. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  228. /package/{src/mcp → mcp}/tools/index.js +0 -0
  229. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/207/252/345/256/232/344/271/211/347/261/273.md" → src/classes/docs/introduction.md} +0 -0
  230. /package/{.cursor/skills/cloudcc-cli-dev/docs/CloudCC/350/207/252/345/256/232/344/271/211/347/273/204/344/273/266/344/275/277/347/224/250/350/257/264/346/230/216.md" → src/plugin/docs/introduction.md} +0 -0
  231. /package/{.cursor/skills/cloudcc-cli-dev/docs/cloudcc/345/256/232/346/227/266/347/261/273.md" → src/timer/docs/introduction.md} +0 -0
  232. /package/{.cursor/skills/cloudcc-cli-dev/docs//350/247/246/345/217/221/345/231/250/347/261/273.md" → src/triggers/docs/introduction.md} +0 -0
@@ -0,0 +1,122 @@
1
+ # CloudCC 用户 CLI 命令说明
2
+
3
+ ## 支持的命令
4
+
5
+ | 操作 | 说明 |
6
+ |------|------|
7
+ | `create` | 创建新用户 |
8
+ | `get` | 查询用户列表 |
9
+ | `view` | 查看单个用户详情 |
10
+ | `update` | 编辑/禁用用户 |
11
+ | `delete` | 删除用户 |
12
+
13
+ ## CLI 命令详解
14
+
15
+ ### 创建用户
16
+
17
+ ```bash
18
+ cc create user <path> <userName> <profileId> [email]
19
+ ```
20
+
21
+ **参数说明:**
22
+
23
+ | 参数 | 必填 | 说明 |
24
+ |------|------|------|
25
+ | `path` | 是 | 项目路径,`.` 表示当前目录 |
26
+ | `userName` | 是 | 用户名称 |
27
+ | `profileId` | 是 | 关联简档 ID |
28
+ | `email` | 否 | 用户邮箱 |
29
+
30
+ **示例:**
31
+
32
+ ```bash
33
+ # 创建用户
34
+ cc create user . "张三" a0I9D000000XXXXUAI
35
+
36
+ # 创建带邮箱的用户
37
+ cc create user . "李四" a0I9D000000XXXXUAI "lisi@example.com"
38
+ ```
39
+
40
+ ### 查询用户列表
41
+
42
+ ```bash
43
+ cc get user <projectPath> [encodedCondJson]
44
+ ```
45
+
46
+ **参数说明:**
47
+
48
+ | 参数 | 必填 | 说明 |
49
+ |------|------|------|
50
+ | `projectPath` | 否 | 项目路径,默认当前目录 |
51
+ | `encodedCondJson` | 否 | URI 编码后的查询条件 JSON |
52
+
53
+ **查询条件参数:**
54
+
55
+ | 参数名 | 类型 | 说明 |
56
+ |--------|------|------|
57
+ | `start` | number | 起始位置,默认 0 |
58
+ | `limit` | number | 每页条数,默认 30 |
59
+ | `keyword` | string | 搜索关键词 |
60
+
61
+ **示例:**
62
+
63
+ ```bash
64
+ # 获取所有用户
65
+ cc get user .
66
+
67
+ # 带查询条件(搜索关键词)
68
+ cc get user . '%7B%22keyword%22%3A%22张三%22%2C%22limit%22%3A50%7D'
69
+ ```
70
+
71
+ ### 查看单个用户详情
72
+
73
+ ```bash
74
+ cc view user <projectPath> <userId>
75
+ ```
76
+
77
+ **示例:**
78
+
79
+ ```bash
80
+ cc view user . 00520260C00C6FEfsMnT
81
+ ```
82
+
83
+ ### 编辑/禁用用户
84
+
85
+ ```bash
86
+ cc update user <projectPath> <userDataJson>
87
+ ```
88
+
89
+ **userDataJson 关键字段:**
90
+
91
+ | 字段名 | 说明 |
92
+ |--------|------|
93
+ | `id` | 用户 ID(必填)|
94
+ | `loginName` | 登录名(必填)|
95
+ | `isusing` | 是否启用:`true`/`false` |
96
+ | `lastName` | 姓 |
97
+ | `email` | 邮箱 |
98
+ | `mobile` | 手机 |
99
+ | `profileId` | 简档 ID |
100
+ | `role` | 角色 ID |
101
+
102
+ **示例:**
103
+
104
+ ```bash
105
+ # 禁用用户
106
+ cc update user . '%7B%22id%22%3A%22xxx%22%2C%22loginName%22%3A%22test%40cloudcc.com%22%2C%22isusing%22%3A%22false%22%7D'
107
+
108
+ # 启用用户
109
+ cc update user . '%7B%22id%22%3A%22xxx%22%2C%22loginName%22%3A%22test%40cloudcc.com%22%2C%22isusing%22%3A%22true%22%7D'
110
+ ```
111
+
112
+ ### 删除用户
113
+
114
+ ```bash
115
+ cc delete user <projectPath> <userId>
116
+ ```
117
+
118
+ **示例:**
119
+
120
+ ```bash
121
+ cc delete user . 00520260C00C6FEfsMnT
122
+ ```
@@ -0,0 +1,124 @@
1
+ # CloudCC 用户使用总结
2
+
3
+ 用户(User)用于定义 CloudCC 系统中的登录账号,每个用户都关联一个简档以确定其权限。
4
+
5
+ ---
6
+
7
+ ## 快速开始(CLI 命令)
8
+
9
+ ### 支持的用户操作
10
+
11
+ | 操作 | 说明 |
12
+ |------|------|
13
+ | `create` | 创建新用户 |
14
+ | `get` | 查询用户列表 |
15
+ | `delete` | 删除用户 |
16
+
17
+ ---
18
+
19
+ ## CLI 命令详解
20
+
21
+ ### 创建用户
22
+
23
+ 创建一个新的 CloudCC 用户。
24
+
25
+ ```bash
26
+ cc create user <path> <userName> <profileId> [email]
27
+ ```
28
+
29
+ **参数说明:**
30
+
31
+ | 参数 | 必填 | 说明 |
32
+ |------|------|------|
33
+ | `path` | 是 | 项目路径,`.` 表示当前目录 |
34
+ | `userName` | 是 | 用户名称 |
35
+ | `profileId` | 是 | 关联简档 ID |
36
+ | `email` | 否 | 用户邮箱 |
37
+
38
+ **示例:**
39
+
40
+ ```bash
41
+ # 创建用户
42
+ cc create user . "张三" a0I9D000000XXXXUAI
43
+
44
+ # 创建带邮箱的用户
45
+ cc create user . "李四" a0I9D000000XXXXUAI "lisi@example.com"
46
+ ```
47
+
48
+ ---
49
+
50
+ ### 查询用户列表
51
+
52
+ 获取当前环境中的所有用户列表。
53
+
54
+ ```bash
55
+ cc get user <projectPath> [encodedCondJson]
56
+ ```
57
+
58
+ **参数说明:**
59
+
60
+ | 参数 | 必填 | 说明 |
61
+ |------|------|------|
62
+ | `projectPath` | 否 | 项目路径,默认当前目录 |
63
+ | `encodedCondJson` | 否 | URI 编码后的查询条件 JSON |
64
+
65
+ **示例:**
66
+
67
+ ```bash
68
+ # 获取所有用户
69
+ cc get user .
70
+
71
+ # 带查询条件
72
+ cc get user . '%7B%22status%22%3A%22active%22%7D'
73
+ ```
74
+
75
+ ---
76
+
77
+ ### 删除用户
78
+
79
+ 删除指定的用户。
80
+
81
+ ```bash
82
+ cc delete user <projectPath> <userId>
83
+ ```
84
+
85
+ **参数说明:**
86
+
87
+ | 参数 | 必填 | 说明 |
88
+ |------|------|------|
89
+ | `projectPath` | 否 | 项目路径,默认当前目录 |
90
+ | `userId` | 是 | 用户 ID |
91
+
92
+ **示例:**
93
+
94
+ ```bash
95
+ # 删除指定用户
96
+ cc delete user . a0I9D000000XXXXUAI
97
+ ```
98
+
99
+ ---
100
+
101
+ ## 完整工作流示例
102
+
103
+ ### 场景:为新员工创建 CloudCC 账号
104
+
105
+ ```bash
106
+ # 1. 确认项目已初始化(有 cloudcc-cli.config.js)
107
+ cat cloudcc-cli.config.js
108
+
109
+ # 2. 查询可用简档,确定要分配的权限
110
+ cc get profile .
111
+
112
+ # 3. 创建新用户
113
+ cc create user . "王五" a0I9D000000XXXXUAI "wangwu@example.com"
114
+
115
+ # 4. 验证用户创建成功
116
+ cc get user .
117
+
118
+ # 5. 如需删除
119
+ # cc delete user . <userId>
120
+ ```
121
+
122
+ ---
123
+
124
+ *文档版本:1.0 | 最后更新:2026-03-26*
@@ -0,0 +1,112 @@
1
+ const { postClass } = require("../../utils/http");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const chalk = require("chalk");
4
+
5
+ /**
6
+ * 获取用户视图列表
7
+ * @param {Object} config - 项目配置
8
+ * @returns {Promise<string>} 视图 ID
9
+ */
10
+ async function getUserViewId(config) {
11
+ try {
12
+ const res = await postClass(
13
+ config.setupSvc + "/api/view/list/getViewList",
14
+ { objId: "user" },
15
+ config.accessToken
16
+ );
17
+
18
+ if (res && res.result && res.data && Array.isArray(res.data) && res.data.length > 0) {
19
+ // 查找"全部"视图
20
+ const allView = res.data.find(item =>
21
+ item.name === "全部" ||
22
+ item.label === "全部" ||
23
+ item.viewName === "全部" ||
24
+ item.name === "All" ||
25
+ item.label === "All"
26
+ );
27
+
28
+ if (allView) {
29
+ return allView.id || allView.viewId;
30
+ }
31
+
32
+ // 没有找到"全部"视图,使用第一条数据
33
+ return res.data[0].id || res.data[0].viewId;
34
+ }
35
+
36
+ throw new Error("未找到用户视图列表");
37
+ } catch (error) {
38
+ throw new Error("获取用户视图列表失败: " + error.message);
39
+ }
40
+ }
41
+
42
+ /**
43
+ * 查询用户列表
44
+ * 用法:cc get user <projectPath> [encodedCondJson]
45
+ */
46
+ async function get(argvs, isMcp = false) {
47
+ const projectPath = argvs[2] || process.cwd();
48
+ const condArg = argvs[3];
49
+
50
+ let body = {};
51
+ if (condArg) {
52
+ try {
53
+ body = JSON.parse(decodeURI(condArg));
54
+ } catch (e) {
55
+ try {
56
+ body = JSON.parse(condArg);
57
+ } catch (e2) {
58
+ throw new Error("Get User Failed: encodedCondJson 解析失败,请传 encodeURI(JSON.stringify(...))");
59
+ }
60
+ }
61
+ }
62
+
63
+ const config = await getPackageJson(projectPath);
64
+
65
+ // 如果没有指定 viewId,先查询视图列表获取
66
+ if (!body.viewId) {
67
+ try {
68
+ body.viewId = await getUserViewId(config);
69
+ } catch (error) {
70
+ console.error(chalk.yellow("Warning: " + error.message));
71
+ }
72
+ }
73
+
74
+ const res = await postClass(
75
+ config.setupSvc + "/api/usermange/queryUserList",
76
+ {
77
+ start: 0,
78
+ limit: 30,
79
+ keyword: "",
80
+ ...body
81
+ },
82
+ config.accessToken
83
+ );
84
+
85
+ if (res && res.result) {
86
+ const data = res.data;
87
+ let rawList = [];
88
+ if (Array.isArray(data)) {
89
+ rawList = data;
90
+ } else if (data && Array.isArray(data.list)) {
91
+ rawList = data.list;
92
+ } else if (data && typeof data === "object") {
93
+ rawList = Object.keys(data)
94
+ .filter((key) => /list$/i.test(key) && Array.isArray(data[key]))
95
+ .flatMap((key) =>
96
+ data[key].map((item) => ({
97
+ ...item,
98
+ __group: key
99
+ }))
100
+ );
101
+ }
102
+ if (!isMcp) {
103
+ console.log(JSON.stringify(rawList));
104
+ }
105
+ return rawList;
106
+ }
107
+
108
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
109
+ throw new Error("Get User Failed: " + msg);
110
+ }
111
+
112
+ module.exports = get;
@@ -0,0 +1,12 @@
1
+ const cc = {}
2
+ cc.create = require("./create")
3
+ cc.delete = require("./delete")
4
+ cc.get = require("./get")
5
+ cc.view = require("./view")
6
+ cc.update = require("./update")
7
+ cc.doc = require("./doc")
8
+ function main(action, argvs) {
9
+ cc[action](argvs)
10
+ }
11
+
12
+ module.exports = main;
@@ -0,0 +1,96 @@
1
+ const { postClass } = require("../../utils/http");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const chalk = require("chalk");
4
+
5
+ /**
6
+ * 编辑/禁用用户
7
+ * 用法:cc update user <projectPath> <userDataJson>
8
+ * @param {Array} argvs - 命令行参数数组
9
+ * @returns {Promise<Object>} 更新结果
10
+ */
11
+ async function update(argvs) {
12
+ try {
13
+ const projectPath = argvs[2] || process.cwd();
14
+ const userDataArg = argvs[3];
15
+
16
+ if (!userDataArg) {
17
+ console.error();
18
+ console.error(chalk.red("Error: 缺少用户数据"));
19
+ console.error(chalk.yellow("用法: cc update user <projectPath> <userDataJson>"));
20
+ console.error(chalk.yellow("示例: cc update user . '{\"id\":\"xxx\",\"loginName\":\"test@example.com\",\"isusing\":\"false\"}'"));
21
+ console.error();
22
+ throw new Error("缺少必需参数: userDataJson");
23
+ }
24
+
25
+ // 解析用户数据
26
+ let userData;
27
+ try {
28
+ userData = JSON.parse(decodeURI(userDataArg));
29
+ } catch (e) {
30
+ try {
31
+ userData = JSON.parse(userDataArg);
32
+ } catch (e2) {
33
+ console.error();
34
+ console.error(chalk.red("Error: 用户数据 JSON 解析失败"));
35
+ console.error(chalk.yellow("请确保传入的是有效的 JSON 字符串或 URI 编码后的 JSON"));
36
+ console.error();
37
+ throw new Error("userDataJson 解析失败");
38
+ }
39
+ }
40
+
41
+ // 验证必填字段
42
+ if (!userData.id) {
43
+ console.error();
44
+ console.error(chalk.red("Error: 缺少用户 ID"));
45
+ console.error();
46
+ throw new Error("用户数据中必须包含 id 字段");
47
+ }
48
+
49
+ if (!userData.loginName) {
50
+ console.error();
51
+ console.error(chalk.red("Error: 缺少登录名"));
52
+ console.error();
53
+ throw new Error("用户数据中必须包含 loginName 字段");
54
+ }
55
+
56
+ const config = await getPackageJson(projectPath);
57
+ if (!config || !config.accessToken) {
58
+ console.error();
59
+ console.error(chalk.red("Error: 配置未找到或 accessToken 缺失"));
60
+ console.error();
61
+ throw new Error("配置未找到或 accessToken 缺失");
62
+ }
63
+
64
+ console.error();
65
+ console.error(chalk.green(`Updating user (${userData.id}), please wait...`));
66
+ console.error();
67
+
68
+ // 构造 dataJson 字符串
69
+ const dataJson = JSON.stringify(userData);
70
+
71
+ const result = await postClass(
72
+ config.setupSvc + "/api/usermange/editandsave",
73
+ { dataJson: dataJson },
74
+ config.accessToken
75
+ );
76
+
77
+ if (result && result.result) {
78
+ console.error();
79
+ console.error(chalk.green("Success! User updated."));
80
+ console.error();
81
+ return result;
82
+ }
83
+
84
+ const msg = result && (result.returnInfo || result.message) ? (result.returnInfo || result.message) : "Unknown error";
85
+ console.error();
86
+ console.error(chalk.red("Error: " + msg));
87
+ console.error();
88
+ throw new Error("Update User Failed: " + msg);
89
+ } catch (error) {
90
+ console.error();
91
+ console.error(chalk.red("用户更新失败:"), error);
92
+ throw error;
93
+ }
94
+ }
95
+
96
+ module.exports = update;
@@ -0,0 +1,60 @@
1
+ const { postClass } = require("../../utils/http");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const chalk = require("chalk");
4
+
5
+ /**
6
+ * 查看单个用户详情
7
+ * 用法:cc view user <projectPath> <userId>
8
+ */
9
+ async function view(argvs, isMcp = false) {
10
+ try {
11
+ const projectPath = argvs[2] || process.cwd();
12
+ const userId = argvs[3];
13
+
14
+ if (!userId) {
15
+ console.error();
16
+ console.error(chalk.red("Error: 缺少用户 ID"));
17
+ console.error(chalk.yellow("用法: cc view user <projectPath> <userId>"));
18
+ console.error();
19
+ throw new Error("缺少必需参数: userId");
20
+ }
21
+
22
+ const config = await getPackageJson(projectPath);
23
+ if (!config || !config.accessToken) {
24
+ console.error();
25
+ console.error(chalk.red("Error: 配置未找到或 accessToken 缺失"));
26
+ console.error();
27
+ throw new Error("配置未找到或 accessToken 缺失");
28
+ }
29
+
30
+ console.error();
31
+ console.error(chalk.green(`Fetching user details (${userId}), please wait...`));
32
+ console.error();
33
+
34
+ const res = await postClass(
35
+ config.setupSvc + "/api/usermange/viewUser",
36
+ { userId: userId },
37
+ config.accessToken
38
+ );
39
+
40
+ if (res && res.result) {
41
+ const data = res.data || res;
42
+ if (!isMcp) {
43
+ console.log(JSON.stringify(data, null, 2));
44
+ }
45
+ return data;
46
+ }
47
+
48
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
49
+ console.error();
50
+ console.error(chalk.red("Error: " + msg));
51
+ console.error();
52
+ throw new Error("View User Failed: " + msg);
53
+ } catch (error) {
54
+ console.error();
55
+ console.error(chalk.red("查看用户详情失败:"), error);
56
+ throw error;
57
+ }
58
+ }
59
+
60
+ module.exports = view;
@@ -17,7 +17,7 @@ async function runCc(args) {
17
17
  return execAsync(cmd, { cwd: repoRoot });
18
18
  }
19
19
 
20
- test("类管理流程:创建→doc→发布→拉取→线上详情→列表→批量拉取→delete→清空classes文件夹", async (t) => {
20
+ test("自定义类", async (t) => {
21
21
  const className = `CCbbbbbbFlow${Date.now()}`;
22
22
  const classDir = path.join(repoRoot, "classes", className);
23
23
  const configPath = path.join(classDir, "config.json");
@@ -40,9 +40,12 @@ test("类管理流程:创建→doc→发布→拉取→线上详情→列表
40
40
  assert.equal(config.name, className);
41
41
  });
42
42
 
43
- t.test("2) 获取 doc(classes overview)", async () => {
44
- const { stdout } = await runCc(["doc", "classes", "overview"]);
45
- assert.match(stdout, /CloudCC 自定义类开发指南|CloudCC 类编辑知识库/);
43
+ t.test("2) 获取 doc(classes introduction / devguide)", async () => {
44
+ const intro = await runCc(["doc", "classes", "introduction"]);
45
+ assert.match(intro.stdout, /CloudCC 自定义类能力与适用场景说明/);
46
+
47
+ const devguide = await runCc(["doc", "classes", "devguide"]);
48
+ assert.match(devguide.stdout, /CloudCC 自定义类开发指南/);
46
49
  });
47
50
 
48
51
  t.test("3) 发布类(publish,写回 config.id)", async () => {
@@ -0,0 +1,96 @@
1
+ const test = require("node:test");
2
+ const assert = require("node:assert/strict");
3
+ const path = require("path");
4
+
5
+ const repoRoot = path.resolve(__dirname, "..");
6
+
7
+ const createCustomPage = require("../src/customPage/create");
8
+ const listCustomPage = require("../src/customPage/get");
9
+ const deleteCustomPage = require("../src/customPage/delete");
10
+ const doc = require("../src/customPage/doc");
11
+
12
+ /** CloudCC 业务接口常见结构:成功为 result === true 或 returnCode 为 "200" */
13
+ function isApiSuccess(res) {
14
+ if (res == null) return false;
15
+ if (res.result === true) return true;
16
+ return String(res.returnCode) === "200";
17
+ }
18
+
19
+ function listRecords(res) {
20
+ const data = res && res.data ? res.data : {};
21
+ if (Array.isArray(data.records)) return data.records;
22
+ if (Array.isArray(data.list)) return data.list;
23
+ if (Array.isArray(data)) return data;
24
+ return [];
25
+ }
26
+
27
+ function pickCreatedPageId(res) {
28
+ const raw = res && res.data != null ? res.data : null;
29
+ if (raw == null) return null;
30
+ if (typeof raw === "string" && raw.trim()) return raw.trim();
31
+ if (typeof raw === "object" && raw.id) return String(raw.id);
32
+ return null;
33
+ }
34
+
35
+ /** doc() 会 console.log 全文,单测里静默避免刷屏 */
36
+ function docQuiet(argvs) {
37
+ const prev = console.log;
38
+ console.log = () => {};
39
+ try {
40
+ return doc(argvs);
41
+ } finally {
42
+ console.log = prev;
43
+ }
44
+ }
45
+
46
+ test("customPage:doc → 创建 → 列表含新建 → 删除 → 列表无该条(result / returnCode 校验)", async (t) => {
47
+ let createdPageId = null;
48
+
49
+ await t.test("1) doc:introduction / devguide", async () => {
50
+ const intro = docQuiet(["doc", "customPage", "introduction"]);
51
+ assert.match(intro, /自定义页面/);
52
+ const dev = docQuiet(["doc", "customPage", "devguide"]);
53
+ assert.match(dev, /自定义页面/);
54
+ });
55
+
56
+ await t.test("2) create:无参,insertCustomPage 成功(result / returnCode)", async () => {
57
+ const res = await createCustomPage(["create", "customPage"]);
58
+ assert.ok(
59
+ isApiSuccess(res),
60
+ `create 接口应 result=true 或 returnCode=200,实际: ${JSON.stringify({ result: res?.result, returnCode: res?.returnCode })}`
61
+ );
62
+ createdPageId = pickCreatedPageId(res);
63
+ assert.ok(createdPageId, `应从 res.data 解析页面 id,实际 data: ${JSON.stringify(res?.data)}`);
64
+ });
65
+
66
+ await t.test("3) pageCustomPage 列表包含刚创建的 id", async () => {
67
+ assert.ok(createdPageId);
68
+ const res = await listCustomPage(["get", "customPage", "1", "50", repoRoot]);
69
+ assert.ok(
70
+ isApiSuccess(res),
71
+ `get 列表接口应 result=true 或 returnCode=200,实际: ${JSON.stringify({ result: res?.result, returnCode: res?.returnCode })}`
72
+ );
73
+ const hit = listRecords(res).some((row) => row && String(row.id) === String(createdPageId));
74
+ assert.ok(hit, "列表 records 中应包含刚创建页面的 id");
75
+ });
76
+
77
+ await t.test("4) deleteCustomPage 成功(result / returnCode)", async () => {
78
+ assert.ok(createdPageId);
79
+ const res = await deleteCustomPage(["delete", "customPage", createdPageId, repoRoot]);
80
+ assert.ok(
81
+ isApiSuccess(res),
82
+ `delete 接口应 result=true 或 returnCode=200,实际: ${JSON.stringify({ result: res?.result, returnCode: res?.returnCode })}`
83
+ );
84
+ });
85
+
86
+ await t.test("5) 再次列表,不应包含已删除 id", async () => {
87
+ assert.ok(createdPageId);
88
+ const res = await listCustomPage(["get", "customPage", "1", "50", repoRoot]);
89
+ assert.ok(
90
+ isApiSuccess(res),
91
+ `get 列表接口应 result=true 或 returnCode=200,实际: ${JSON.stringify({ result: res?.result, returnCode: res?.returnCode })}`
92
+ );
93
+ const stillThere = listRecords(res).some((row) => row && String(row.id) === String(createdPageId));
94
+ assert.equal(stillThere, false, "删除后列表不应再包含该页面 id");
95
+ });
96
+ });