cloudcc-cli 2.3.1 → 2.3.2

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 +15 -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 +67 -0
  5. package/README.md +11 -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 +2 -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 +451 -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 +212 -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 +203 -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/doc.js +46 -0
  82. package/src/pagelayout/docs/devguide.md +295 -0
  83. package/src/pagelayout/docs/introduction.md +44 -0
  84. package/src/pagelayout/get.js +46 -0
  85. package/src/pagelayout/index.js +9 -0
  86. package/src/plugin/doc.js +43 -863
  87. package/src/plugin/docs/devguide.md +923 -0
  88. package/src/profile/create.js +108 -0
  89. package/src/profile/delete.js +59 -0
  90. package/src/profile/doc.js +46 -0
  91. package/src/profile/docs/devguide.md +332 -0
  92. package/src/profile/docs/introduction.md +123 -0
  93. package/src/profile/get.js +55 -0
  94. package/src/profile/index.js +14 -0
  95. package/src/project/doc.js +39 -372
  96. package/src/project/docs/devguide.md +359 -0
  97. package/src/project/docs/introduction.md +3 -0
  98. package/src/recordType/create.js +77 -0
  99. package/src/recordType/delete.js +52 -0
  100. package/src/recordType/doc.js +36 -0
  101. package/src/recordType/docs/devguide.md +160 -0
  102. package/src/recordType/docs/introduction.md +53 -0
  103. package/src/recordType/editInfo.js +39 -0
  104. package/src/recordType/editSave.js +47 -0
  105. package/src/recordType/getList.js +31 -0
  106. package/src/recordType/index.js +16 -3
  107. package/src/recordType/newInfo.js +39 -0
  108. package/src/recordType/validDelete.js +91 -0
  109. package/src/res.md +66 -0
  110. package/src/role/create.js +153 -0
  111. package/src/role/delete.js +59 -0
  112. package/src/role/doc.js +46 -0
  113. package/src/role/docs/devguide.md +387 -0
  114. package/src/role/docs/introduction.md +124 -0
  115. package/src/role/get.js +57 -0
  116. package/src/role/index.js +10 -0
  117. package/src/scheduleJob/doc.js +49 -0
  118. package/src/scheduleJob/docs/devguide.md +79 -0
  119. package/src/scheduleJob/docs/introduction.md +101 -0
  120. package/src/scheduleJob/index.js +5 -0
  121. package/src/script/delete.js +112 -0
  122. package/src/script/doc.js +31 -245
  123. package/src/script/docs/devguide.md +290 -0
  124. package/src/script/docs/introduction.md +48 -0
  125. package/src/script/index.js +1 -0
  126. package/src/staticResource/count.js +31 -10
  127. package/src/staticResource/create.js +97 -0
  128. package/src/staticResource/delete.js +30 -8
  129. package/src/staticResource/detail.js +32 -10
  130. package/src/staticResource/doc.js +21 -88
  131. package/src/staticResource/docs/devguide.md +157 -0
  132. package/src/staticResource/docs/introduction.md +3 -0
  133. package/src/staticResource/get.js +31 -8
  134. package/src/staticResource/index.js +2 -1
  135. package/src/timer/create.js +6 -1
  136. package/src/timer/delete.js +7 -1
  137. package/src/timer/detail.js +5 -5
  138. package/src/timer/doc.js +57 -0
  139. package/src/timer/get.js +7 -1
  140. package/src/timer/index.js +3 -1
  141. package/src/timer/publish.js +6 -1
  142. package/src/timer/pull.js +6 -1
  143. package/src/timer/pullList.js +5 -3
  144. package/src/triggers/detail.js +5 -5
  145. package/src/triggers/doc.js +49 -364
  146. package/src/triggers/docs/devguide.md +334 -0
  147. package/src/triggers/get.js +7 -3
  148. package/src/triggers/index.js +1 -4
  149. package/src/triggers/pullList.js +7 -7
  150. package/src/user/create.js +50 -0
  151. package/src/user/delete.js +59 -0
  152. package/src/user/doc.js +46 -0
  153. package/src/user/docs/devguide.md +634 -0
  154. package/src/user/docs/introduction.md +124 -0
  155. package/src/user/get.js +112 -0
  156. package/src/user/index.js +12 -0
  157. package/src/user/update.js +96 -0
  158. package/src/user/view.js +60 -0
  159. package/test/classes.cli.test.js +7 -4
  160. package/test/customPage.cli.test.js +96 -0
  161. package/test/globalSelectList.cli.test.js +94 -0
  162. package/test/menu-script.cli.test.js +147 -0
  163. package/test/menu.cli.test.js +8 -1
  164. package/test/plugin.cli.test.js +5 -3
  165. package/test/timer.cli.test.js +15 -8
  166. package/test/trigger.cli.test.js +5 -3
  167. package/tmp_customsetting_detail.json +1 -0
  168. package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -111
  169. package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -152
  170. package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -150
  171. package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -372
  172. package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -62
  173. package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -62
  174. package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -214
  175. package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -113
  176. package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -66
  177. package/.cursor/skills/cloudcc-cli-dev/STATIC-RESOURCE-API.md +0 -60
  178. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
  179. package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_PAGE.md +0 -216
  180. package/src/approval/approve.js +0 -105
  181. package/src/approval/get.js +0 -245
  182. package/src/approval/index.js +0 -11
  183. package/src/approval/reject.js +0 -105
  184. package/src/plugin/readme.md +0 -7
  185. /package/{src/mcp → mcp}/cliRunner.js +0 -0
  186. /package/{src/mcp → mcp}/index.js +0 -0
  187. /package/{src/mcp → mcp}/readme.md +0 -0
  188. /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
  189. /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
  190. /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
  191. /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
  192. /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
  193. /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
  194. /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
  195. /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
  196. /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
  197. /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
  198. /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
  199. /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
  200. /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
  201. /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
  202. /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
  203. /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
  204. /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
  205. /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
  206. /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
  207. /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
  208. /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
  209. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
  210. /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
  211. /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
  212. /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
  213. /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
  214. /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
  215. /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
  216. /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
  217. /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
  218. /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
  219. /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
  220. /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
  221. /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
  222. /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
  223. /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
  224. /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
  225. /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
  226. /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
  227. /package/{src/mcp → mcp}/tools/index.js +0 -0
  228. /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
  229. /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
  230. /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} +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,290 @@
1
+ # CloudCC Script 文档(全量)
2
+
3
+ ## 客户端脚本(Script)操作指南
4
+
5
+ 直接查看:`cc doc script`
6
+
7
+ ---
8
+
9
+ ## 1. 常见操作
10
+
11
+ - 查询客户端脚本列表
12
+ - 查看客户端脚本详情
13
+ - 新建客户端脚本(生成本地目录与模板)
14
+ - 发布客户端脚本到环境(保存/更新线上脚本)
15
+ - 从环境拉取脚本内容到本地(覆盖本地脚本文件)
16
+ - 删除客户端脚本
17
+
18
+ ---
19
+
20
+ ## 2. 常用 CLI 命令
21
+
22
+ ### 1) 查看客户端脚本文档
23
+
24
+ 命令:
25
+
26
+ ```bash
27
+ cc doc script
28
+ ```
29
+
30
+ 说明:输出客户端脚本文档,并自动附带本文件内容。
31
+
32
+ ---
33
+
34
+ ### 2) 查询客户端脚本列表
35
+
36
+ 命令:
37
+
38
+ ```bash
39
+ cc get script <encodedCondJson> <projectPath>
40
+ ```
41
+
42
+ 参数说明:
43
+
44
+ | 参数名称 | 类型 | 是否必须 | 默认值 | 备注 |
45
+ | :--- | :--- | :--- | :--- | :--- |
46
+ | encodedCondJson | string | 视场景 | — | `encodeURI(JSON.stringify(body))` |
47
+ | projectPath | string | 非必须 | 当前目录 | 项目根目录 |
48
+
49
+ 请求体(decoded 后)字段(与页面抓包一致):
50
+
51
+ | 参数名称 | 类型 | 是否必须 | 默认值 | 备注 |
52
+ | :--- | :--- | :--- | :--- | :--- |
53
+ | pageSize | number | 非必须 | `50` | 每页条数 |
54
+ | pageNo | number | 非必须 | `1` | 页码(从 1 开始) |
55
+ | condition | object | 非必须 | `{}` | 查询条件 |
56
+ | condition.scriptName | string | 非必须 | `""` | 脚本名称筛选 |
57
+ | condition.pageLabel | string | 非必须 | `""` | 页面标签筛选 |
58
+ | condition.objName | string | 非必须 | `""` | 对象名称筛选 |
59
+
60
+ 输出:简化列表(每条包含 `name` / `id` / `apiname`)。
61
+
62
+ ---
63
+
64
+ ### 3) 查看客户端脚本详情
65
+
66
+ 命令(两种用法):
67
+
68
+ ```bash
69
+ # 1) 按本地脚本路径查看(不依赖线上)
70
+ cc detail script <objName/scriptName>
71
+
72
+ # 2) 按线上脚本 id 查看
73
+ cc detail script "" <scriptId> <projectPath>
74
+ ```
75
+
76
+ 说明:
77
+
78
+ - 传 `objName/scriptName`:读取本地 `script/<objName>/<scriptName>/config.json` 和脚本文件。
79
+ - 传 `scriptId`:调用线上接口查询并返回详情。
80
+
81
+ ---
82
+
83
+ ### 4) 新建客户端脚本(本地生成)
84
+
85
+ 命令:
86
+
87
+ ```bash
88
+ cc create script <encodedBodyJson>
89
+ ```
90
+
91
+ 参数说明:
92
+
93
+ | 参数名称 | 类型 | 是否必须 | 默认值 | 备注 |
94
+ | :--- | :--- | :--- | :--- | :--- |
95
+ | encodedBodyJson | string | 必须 | — | `encodeURI(JSON.stringify(body))` |
96
+
97
+ 请求体(decoded 后)常用字段(会写入 `config.json`):
98
+
99
+ | 参数名称 | 类型 | 是否必须 | 默认值 | 备注 |
100
+ | :--- | :--- | :--- | :--- | :--- |
101
+ | objName | string | 必须 | — | 对象 API 名称(目录名) |
102
+ | scriptName | string | 必须 | — | 脚本名称(目录名 + 文件名) |
103
+ | pageId / eventType / event / fieldId / usageScenario | string | 非必须 | `""` | 作为脚本配置元数据 |
104
+
105
+ 生成目录结构:
106
+
107
+ - `script/<objName>/<scriptName>/<scriptName>.js`
108
+ - `script/<objName>/<scriptName>/config.json`
109
+
110
+ ---
111
+
112
+ ### 5) 发布客户端脚本(保存到线上)
113
+
114
+ 命令:
115
+
116
+ ```bash
117
+ cc publish script <objName/scriptName>
118
+ ```
119
+
120
+ 说明:
121
+
122
+ - 读取本地 `script/<objName>/<scriptName>/<scriptName>.js` 与 `config.json`
123
+ - 只会发布 `function main($CCDK, obj) { ... }` 的函数体内容(会校验 main 函数存在)
124
+ - 首次发布成功后,会把返回的 `id` 写回 `config.json`,用于后续更新/拉取/删除
125
+
126
+ ---
127
+
128
+ ### 6) 拉取客户端脚本(用线上内容覆盖本地)
129
+
130
+ 命令:
131
+
132
+ ```bash
133
+ cc pull script <objName/scriptName>
134
+ ```
135
+
136
+ 说明:要求本地 `config.json` 内已存在 `id`(先发布一次)。
137
+
138
+ ---
139
+
140
+ ### 7) 拉取线上脚本到本地(按 id 拉取并生成目录)
141
+
142
+ 命令:
143
+
144
+ ```bash
145
+ cc pullList script <scriptId> <projectPath>
146
+ ```
147
+
148
+ 说明:会在 `<projectPath>/script/<objName>/<scriptName>/` 下生成 `config.json` 与脚本文件。
149
+
150
+ ---
151
+
152
+ ### 8) 删除客户端脚本
153
+
154
+ 命令(两种用法):
155
+
156
+ ```bash
157
+ # 1) 直接按 scriptId 删除
158
+ cc delete script <scriptId> <projectPath>
159
+
160
+ # 2) 按 "objName/scriptName" 删除(会先查询解析出 id,再删除)
161
+ cc delete script <objName/scriptName> <projectPath>
162
+ ```
163
+
164
+ ---
165
+
166
+ ## 3. 示例
167
+
168
+ ### 查询客户端脚本列表(默认条件)
169
+
170
+ ```bash
171
+ cc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'',pageLabel:'',objName:''}})))")" .
172
+ ```
173
+
174
+ ### 按脚本名筛选(例如:test)
175
+
176
+ ```bash
177
+ cc get script "$(node -e "console.log(encodeURI(JSON.stringify({pageSize:50,pageNo:1,condition:{scriptName:'test',pageLabel:'',objName:''}})))")" .
178
+ ```
179
+
180
+ ### 新建脚本(本地)
181
+
182
+ ```bash
183
+ cc create script "$(node -e "console.log(encodeURI(JSON.stringify({objName:'contact',scriptName:'hello_script'})))")"
184
+ ```
185
+
186
+ ### 发布脚本(上线)
187
+
188
+ ```bash
189
+ cc publish script contact/hello_script
190
+ ```
191
+
192
+ ### 拉取脚本(从线上覆盖本地)
193
+
194
+ ```bash
195
+ cc pull script contact/hello_script
196
+ ```
197
+
198
+ ### 删除脚本(按 id)
199
+
200
+ ```bash
201
+ cc delete script <scriptId> .
202
+ ```
203
+
204
+ ---
205
+
206
+ ## 4. Checklist
207
+
208
+ - [ ] 已在正确项目目录执行命令(或显式传入 `projectPath`)
209
+ - [ ] `cc get script` 的条件已按 `encodeURI(JSON.stringify(...))` 传入
210
+ - [ ] 发布前脚本文件包含 `function main($CCDK, obj) { ... }`
211
+ - [ ] 首次发布后确认 `config.json` 已写入 `id`
212
+ - [ ] 拉取/删除前确认目标 `id` 正确(避免误删)
213
+
214
+ ---
215
+
216
+ ## 5. 进阶示例
217
+
218
+ ### 5.1 快速入门示例
219
+
220
+ #### 进入客户端脚本设置页面
221
+
222
+ 1. 登录 CloudCC 系统
223
+ 2. 点击右上角头像,选择「开发者平台」(仅管理员简档可见)
224
+ 3. 左侧菜单:`扩展 -> 客户端脚本`
225
+
226
+ #### 新建并执行第一个脚本
227
+
228
+ 在代码输入区输入:
229
+
230
+ ```javascript
231
+ $CCDK.CCMessage.showMessage("hello cloudCC");
232
+ ```
233
+
234
+ 保存后进入对应页面(如详情页 `onLoad`),可看到提示信息。
235
+
236
+ ### 5.2 基于 devid 控制页面元素
237
+
238
+ > 可通过浏览器开发者工具(F12)查看页面元素上的 `devid`,再在脚本中精确定位。
239
+
240
+ #### 禁用编辑页字段
241
+
242
+ ```javascript
243
+ let style = document.createElement("style");
244
+ style.type = "text/css";
245
+ style.innerHTML = '[devid="ffe201100003855g6Ipz"]{pointer-events:none}';
246
+ document.getElementsByTagName("head").item(0).appendChild(style);
247
+ ```
248
+
249
+ #### 隐藏详情页字段(不占位)
250
+
251
+ ```javascript
252
+ let style = document.createElement("style");
253
+ style.type = "text/css";
254
+ style.innerHTML = '[devid="ffe20220523account01"]{display:none !important}';
255
+ document.getElementsByTagName("head").item(0).appendChild(style);
256
+ ```
257
+
258
+ #### 隐藏详情页字段(保留占位)
259
+
260
+ ```javascript
261
+ let style = document.createElement("style");
262
+ style.type = "text/css";
263
+ style.innerHTML = '[devid="ffe20220523account01"]{visibility:hidden !important}';
264
+ document.getElementsByTagName("head").item(0).appendChild(style);
265
+ ```
266
+
267
+ #### 移动页面元素位置
268
+
269
+ ```javascript
270
+ const moveNode = document.querySelector('[devid="aee2024EFBBA5EEfs1Ta"]');
271
+ const targetNode = document.querySelector('[devid="adf2024D33E03DA6xzBj"]');
272
+ const targetParentNode = targetNode && targetNode.parentNode;
273
+
274
+ if (moveNode && targetNode && targetParentNode) {
275
+ targetParentNode.insertBefore(moveNode, targetNode);
276
+ }
277
+ ```
278
+
279
+ ### 5.3 事件选择建议
280
+
281
+ - 全局脚本:适合应用启动、销毁等全局行为
282
+ - 列表页脚本:适合列表加载后增强
283
+ - 新建/编辑页脚本:适合 `beforeSave` 校验与赋值
284
+ - 详情页脚本:适合详情渲染后字段展示控制
285
+
286
+ ### 5.4 使用注意事项
287
+
288
+ - DOM 可能未渲染完成,建议结合 `setTimeout` 或 `MutationObserver`
289
+ - 优先使用 `$CCDK` 能力,不建议直接拼接接口调用
290
+ - 对频繁执行逻辑做好性能控制,避免页面卡顿
@@ -0,0 +1,48 @@
1
+ # CloudCC 客户端脚本介绍
2
+
3
+ 客户端脚本是在 CloudCC
4
+ 前端页面(如列表页、新建/编辑页、详情页、全局页面)特定事件时机执行的一段
5
+ JavaScript。它依托 `$CCDK`
6
+ 的桥接能力,在不改造核心系统代码的前提下,快速实现页面行为和交互的业务化定制。
7
+
8
+ ## 能干什么
9
+
10
+ - 在页面加载、字段变更、保存前后等时机执行自定义逻辑
11
+ - 控制字段显隐、只读、禁用、默认值与展示顺序
12
+ - 基于页面元素 `devid` 做精确的 DOM 调整(隐藏、移动、样式优化等)
13
+ - 增加消息提示、前端校验、轻量自动化处理
14
+ - 对不同页面类型配置不同脚本,实现同对象的差异化行为
15
+
16
+ ## 主要作用
17
+
18
+ - 让业务规则更贴近一线使用场景,而不是被标准页面能力限制
19
+ - 用小成本实现高频、细粒度的前端需求调整
20
+ - 缩短需求交付周期,降低“等待版本发版”带来的响应延迟
21
+
22
+ ## 为什么要用
23
+
24
+ - 标准配置无法覆盖所有业务细节,尤其是页面行为层面的动态需求
25
+ - 某些需求只在特定页面、特定角色、特定时机触发,客户端脚本更灵活
26
+ - 相比重型开发方式(完整自定义组件/页面),客户端脚本更轻量、迭代更快
27
+
28
+ ## 能解决哪些问题
29
+
30
+ - 保存前做字段联动与数据校验,减少脏数据入库
31
+ - 详情页按业务需要隐藏敏感信息或弱化无关字段
32
+ - 编辑页限制关键字段误操作(禁用或只读)
33
+ - 按流程阶段动态调整页面交互,减少用户操作路径和学习成本
34
+ - 对标准页面做局部增强,而不影响系统其他模块
35
+
36
+ ## 在什么情况下使用
37
+
38
+ - 需求是“前端页面行为增强”,且改动范围集中在单页或少量页面
39
+ - 需要快速上线验证,后续可能持续迭代优化
40
+ - 需要利用页面事件(如 `onLoad`、`beforeSave`、`onChange`)挂载业务逻辑
41
+ - 希望复用 CloudCC 现有页面能力,不希望引入过重改造
42
+
43
+ ## 典型业务场景
44
+
45
+ - 销售管理:编辑客户时按客户等级控制字段可编辑范围
46
+ - 服务管理:详情页按服务阶段动态显示关键指标字段
47
+ - 线索管理:保存前自动补齐或校验必填业务字段
48
+ - 渠道管理:列表页加载后增加提示与辅助标识,帮助快速筛选和处理
@@ -5,6 +5,7 @@ cc.pull = require("./pull")
5
5
  cc.get = require("./get")
6
6
  cc.pullList = require("./pullList")
7
7
  cc.detail = require("./detail")
8
+ cc.delete = require("./delete")
8
9
  cc.doc = require("./doc")
9
10
  function main(action, argvs) {
10
11
  cc[action](argvs)
@@ -1,25 +1,46 @@
1
1
  const { getPackageJson } = require("../../utils/config");
2
- const { postClass } = require("../../utils/http");
2
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
3
3
 
4
+ /**
5
+ * 静态资源 - 容量统计
6
+ * CLI: cc count staticResource <projectPath> [encodedCondJson]
7
+ * 参数说明:
8
+ * - projectPath: 项目根目录,默认 process.cwd()
9
+ * - encodedCondJson(可选): encodeURI(JSON.stringify(body))
10
+ * - body: 统计条件对象(可为空 {})
11
+ * 请求头说明:
12
+ * - accessToken: 从 cloudcc-cli.config.js 读取
13
+ * - source: 默认 cloudcc_cli
14
+ */
4
15
  async function count(projectPath = process.cwd(), encodedCondJson, isMcp = false) {
5
16
  let body = {};
6
17
  if (encodedCondJson) {
7
18
  body = JSON.parse(decodeURI(encodedCondJson));
8
19
  }
9
20
  const config = await getPackageJson(projectPath);
10
- const res = await postClass(
11
- config.setupSvc + "/api/staticResource/countStaticResource",
12
- body,
13
- config.accessToken
21
+ const devSvcDispatch = config.devSvcDispatch || "/devconsole";
22
+ const baseUrl = config.baseUrl || BaseUrl;
23
+ const res = await fetch(
24
+ `${baseUrl}${devSvcDispatch}/staticResource/countStaticResource`,
25
+ {
26
+ method: "POST",
27
+ headers: {
28
+ "Content-Type": "application/json; charset=utf-8",
29
+ accessToken: config.accessToken,
30
+ source: config.source || "cloudcc_cli",
31
+ },
32
+ body: JSON.stringify(body),
33
+ }
14
34
  );
15
- if (res && res.result) {
16
- const data = res.data || {};
35
+ const data = await res.json();
36
+ if (data && (data.result || String(data.returnCode) === "200" || String(data.returnCode).endsWith("-OK"))) {
37
+ const countData = data.data || {};
17
38
  if (!isMcp) {
18
- console.log(JSON.stringify(data));
39
+ console.log(JSON.stringify(countData));
19
40
  }
20
- return data;
41
+ return countData;
21
42
  }
22
- throw new Error("Count Static Resource Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
43
+ throw new Error("Count Static Resource Failed: " + (data?.returnInfo || data?.message || "Unknown error"));
23
44
  }
24
45
 
25
46
  module.exports = count;
@@ -0,0 +1,97 @@
1
+ /**
2
+ * 静态资源 - 新建/编辑(上传)
3
+ * CLI: cc create staticResource <projectPath> <encodedBodyJson>
4
+ * 参数说明:
5
+ * - projectPath: 项目根目录
6
+ * - encodedBodyJson: encodeURI(JSON.stringify(body))
7
+ * - body:
8
+ * {
9
+ * filePath?: string, // 新建必填;编辑不换文件可不传
10
+ * label: string, // 必填
11
+ * desc?: string, // 可选
12
+ * id?: string, // 编辑时传
13
+ * name?: string, // 可选,不传默认取文件名
14
+ * type?: string // 可选,不传默认取文件后缀
15
+ * }
16
+ */
17
+ const fs = require("fs");
18
+ const path = require("path");
19
+ const chalk = require("chalk");
20
+ const { getPackageJson } = require("../../utils/config");
21
+
22
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
23
+
24
+ async function create(projectPath = process.cwd(), encodedBodyJson) {
25
+ if (!encodedBodyJson) {
26
+ throw new Error("Create Static Resource Failed: encodedBodyJson is required");
27
+ }
28
+
29
+ const body = JSON.parse(decodeURI(encodedBodyJson));
30
+ const { filePath, label, desc = "", id = "", name, type } = body || {};
31
+
32
+ if (!label) {
33
+ throw new Error("Create Static Resource Failed: label is required");
34
+ }
35
+
36
+ const config = await getPackageJson(projectPath);
37
+ if (!config || !config.accessToken) {
38
+ throw new Error("Create Static Resource Failed: accessToken is missing");
39
+ }
40
+
41
+ const devSvcDispatch = config.devSvcDispatch || "/devconsole";
42
+ const baseUrl = config.baseUrl || BaseUrl;
43
+ const url = `${baseUrl}${devSvcDispatch}/staticResource/saveStaticResource`;
44
+
45
+ const formData = new FormData();
46
+ formData.append("label", String(label));
47
+ formData.append("desc", String(desc));
48
+ if (id) {
49
+ formData.append("id", String(id));
50
+ }
51
+
52
+ if (filePath) {
53
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(projectPath, filePath);
54
+ if (!fs.existsSync(absPath)) {
55
+ throw new Error(`Create Static Resource Failed: file not found - ${absPath}`);
56
+ }
57
+ const fileBuffer = fs.readFileSync(absPath);
58
+ const fileName = name || path.basename(absPath);
59
+ const fileType = type || path.extname(fileName).replace(".", "");
60
+ formData.append("name", fileName);
61
+ formData.append("type", fileType);
62
+ formData.append("file", new Blob([fileBuffer]), fileName);
63
+ } else {
64
+ // 编辑且不更换文件时,按接口约定传空字符串。
65
+ formData.append("file", "");
66
+ if (name) {
67
+ formData.append("name", String(name));
68
+ }
69
+ if (type) {
70
+ formData.append("type", String(type));
71
+ }
72
+ }
73
+
74
+ console.error();
75
+ console.error(chalk.green("Saving static resource, please wait..."));
76
+ console.error();
77
+
78
+ const res = await fetch(url, {
79
+ method: "POST",
80
+ headers: {
81
+ accessToken: config.accessToken,
82
+ source: config.source || "cloudcc_cli",
83
+ },
84
+ body: formData,
85
+ });
86
+ const result = await res.json();
87
+
88
+ if (result && (result.result || String(result.returnCode) === "200" || String(result.returnCode).endsWith("-OK"))) {
89
+ console.error(chalk.green("Success! Static resource saved."));
90
+ console.error();
91
+ return result;
92
+ }
93
+
94
+ throw new Error("Create Static Resource Failed: " + (result?.returnInfo || result?.message || "Unknown error"));
95
+ }
96
+
97
+ module.exports = create;
@@ -1,7 +1,19 @@
1
1
  const chalk = require("chalk");
2
2
  const { getPackageJson } = require("../../utils/config");
3
- const { postClass } = require("../../utils/http");
3
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
4
4
 
5
+ /**
6
+ * 静态资源 - 删除
7
+ * CLI: cc delete staticResource <projectPath> <resourceId>
8
+ * 参数说明:
9
+ * - projectPath: 项目根目录,默认 process.cwd()
10
+ * - id(resourceId): 静态资源 id(必填)
11
+ * 请求体说明:
12
+ * - { id }
13
+ * 请求头说明:
14
+ * - accessToken: 从 cloudcc-cli.config.js 读取
15
+ * - source: 默认 cloudcc_cli
16
+ */
5
17
  async function remove(projectPath = process.cwd(), id) {
6
18
  if (!id) {
7
19
  throw new Error("Delete Static Resource Failed: id is required");
@@ -10,17 +22,27 @@ async function remove(projectPath = process.cwd(), id) {
10
22
  console.error();
11
23
  console.error(chalk.green(`Deleting static resource (${id}), please wait...`));
12
24
  console.error();
13
- const res = await postClass(
14
- config.setupSvc + "/api/staticResource/deleteStaticResource",
15
- { id },
16
- config.accessToken
25
+ const devSvcDispatch = config.devSvcDispatch || "/devconsole";
26
+ const baseUrl = config.baseUrl || BaseUrl;
27
+ const res = await fetch(
28
+ `${baseUrl}${devSvcDispatch}/staticResource/deleteStaticResource`,
29
+ {
30
+ method: "POST",
31
+ headers: {
32
+ "Content-Type": "application/json; charset=utf-8",
33
+ accessToken: config.accessToken,
34
+ source: config.source || "cloudcc_cli",
35
+ },
36
+ body: JSON.stringify({ id }),
37
+ }
17
38
  );
18
- if (res && res.result) {
39
+ const data = await res.json();
40
+ if (data && (data.result || String(data.returnCode) === "200" || String(data.returnCode).endsWith("-OK"))) {
19
41
  console.error(chalk.green("Success! Static resource deleted."));
20
42
  console.error();
21
- return res;
43
+ return data;
22
44
  }
23
- throw new Error("Delete Static Resource Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
45
+ throw new Error("Delete Static Resource Failed: " + (data?.returnInfo || data?.message || "Unknown error"));
24
46
  }
25
47
 
26
48
  module.exports = remove;
@@ -1,24 +1,46 @@
1
1
  const { getPackageJson } = require("../../utils/config");
2
- const { postClass } = require("../../utils/http");
2
+ const BaseUrl = "https://developer.apis.cloudcc.cn";
3
3
 
4
+ /**
5
+ * 静态资源 - 查询详情
6
+ * CLI: cc detail staticResource <projectPath> <resourceId>
7
+ * 参数说明:
8
+ * - projectPath: 项目根目录,默认 process.cwd()
9
+ * - id(resourceId): 静态资源 id(必填)
10
+ * 请求体说明:
11
+ * - { id }
12
+ * 请求头说明:
13
+ * - accessToken: 从 cloudcc-cli.config.js 读取
14
+ * - source: 默认 cloudcc_cli
15
+ */
4
16
  async function detail(projectPath = process.cwd(), id, isMcp = false) {
5
17
  if (!id) {
6
18
  throw new Error("Static Resource detail requires id");
7
19
  }
8
20
  const config = await getPackageJson(projectPath);
9
- const res = await postClass(
10
- config.setupSvc + "/api/staticResource/detailStaticResource",
11
- { id },
12
- config.accessToken
21
+ const devSvcDispatch = config.devSvcDispatch || "/devconsole";
22
+ const baseUrl = config.baseUrl || BaseUrl;
23
+ const res = await fetch(
24
+ `${baseUrl}${devSvcDispatch}/staticResource/detailStaticResource`,
25
+ {
26
+ method: "POST",
27
+ headers: {
28
+ "Content-Type": "application/json; charset=utf-8",
29
+ accessToken: config.accessToken,
30
+ source: config.source || "cloudcc_cli",
31
+ },
32
+ body: JSON.stringify({ id }),
33
+ }
13
34
  );
14
- if (res && res.result) {
15
- const data = res.data || {};
35
+ const data = await res.json();
36
+ if (data && (data.result || String(data.returnCode) === "200" || String(data.returnCode).endsWith("-OK"))) {
37
+ const detailData = data.data || {};
16
38
  if (!isMcp) {
17
- console.log(JSON.stringify(data));
39
+ console.log(JSON.stringify(detailData));
18
40
  }
19
- return data;
41
+ return detailData;
20
42
  }
21
- throw new Error("Get Static Resource Detail Failed: " + (res?.returnInfo || res?.message || "Unknown error"));
43
+ throw new Error("Get Static Resource Detail Failed: " + (data?.returnInfo || data?.message || "Unknown error"));
22
44
  }
23
45
 
24
46
  module.exports = detail;