cloudcc-cli 2.2.5 → 2.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/.cloudcc-cache.json +38 -0
  2. package/README.md +1435 -522
  3. package/bin/cc.js +7 -2
  4. package/bin/index.js +4 -0
  5. package/java/com/cloudcc/core/BaseException.java +100 -0
  6. package/java/com/cloudcc/core/BusiException.java +43 -0
  7. package/java/com/cloudcc/core/CCService.java +3 -1
  8. package/java/com/cloudcc/core/StringUtils.java +7 -0
  9. package/java/com/cloudcc/core/TimeUtil.java +33 -0
  10. package/java/com/cloudcc/core/UserInfo.java +9 -0
  11. package/package.json +7 -1
  12. package/pom.xml +1 -1
  13. package/skill/BACKEND_CODE.md +114 -0
  14. package/skill/CLI_CHEATSHEET.md +90 -0
  15. package/skill/INSTALL_AND_BOOTSTRAP.md +59 -0
  16. package/skill/OBJECTS_AND_FIELDS.md +120 -0
  17. package/skill/REQUIREMENTS_BREAKDOWN.md +98 -0
  18. package/skill/SKILL.md +33 -0
  19. package/skill/VUE_CUSTOM_COMPONENT.md +50 -0
  20. package/src/api/backend-sdk-java.md +427 -0
  21. package/src/api/ccdk-sdk.md +1039 -0
  22. package/src/application/create.js +114 -0
  23. package/src/application/get.js +13 -0
  24. package/src/application/index.js +8 -0
  25. package/src/classes/doc.js +486 -0
  26. package/src/classes/index.js +1 -0
  27. package/src/mcp/cliRunner.js +61 -0
  28. package/src/mcp/index.js +84 -12
  29. package/src/mcp/readme.md +6 -3
  30. package/src/mcp/tools/Application Creator/handler.js +78 -0
  31. package/src/mcp/tools/Approval/handler.js +34 -151
  32. package/src/mcp/tools/Class Creator/handler.js +18 -15
  33. package/src/mcp/tools/Class Detail Retriever/handler.js +8 -9
  34. package/src/mcp/tools/Class Editor Guide/handler.js +5 -19
  35. package/src/mcp/tools/Class List Retriever/handler.js +8 -3
  36. package/src/mcp/tools/Class Publisher/handler.js +7 -9
  37. package/src/mcp/tools/Class Puller/handler.js +6 -65
  38. package/src/mcp/tools/Client Script Detail Retriever/handler.js +12 -18
  39. package/src/mcp/tools/Client Script Editor Guide/handler.js +9 -605
  40. package/src/mcp/tools/Client Script List Retriever/handler.js +30 -33
  41. package/src/mcp/tools/Client Script Publisher/handler.js +12 -11
  42. package/src/mcp/tools/Client Script Puller/handler.js +23 -30
  43. package/src/mcp/tools/CloudCC Development Overview/handler.js +11 -5
  44. package/src/mcp/tools/Component Creator/handler.js +12 -11
  45. package/src/mcp/tools/Component Detail Retriever/handler.js +12 -9
  46. package/src/mcp/tools/Component Editor Guide/handler.js +5 -22
  47. package/src/mcp/tools/Component List Retriever/handler.js +21 -18
  48. package/src/mcp/tools/Component Publisher/handler.js +25 -3
  49. package/src/mcp/tools/Component Puller/handler.js +13 -16
  50. package/src/mcp/tools/Dev Environment Creator/handler.js +5 -72
  51. package/src/mcp/tools/Dev Environment Validator/handler.js +5 -66
  52. package/src/mcp/tools/Developer Key Setup Guide/handler.js +11 -20
  53. package/src/mcp/tools/JSP Migrator/handler.js +842 -0
  54. package/src/mcp/tools/Menu Creator/handler.js +86 -0
  55. package/src/mcp/tools/Object Creator/handler.js +14 -6
  56. package/src/mcp/tools/Object Fields Creator/handler.js +9 -10
  57. package/src/mcp/tools/Object Fields Retriever/handler.js +6 -3
  58. package/src/mcp/tools/Object List Retriever/handler.js +10 -7
  59. package/src/mcp/tools/Scheduled Class Creator/handler.js +12 -16
  60. package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +7 -9
  61. package/src/mcp/tools/Scheduled Class List Retriever/handler.js +21 -23
  62. package/src/mcp/tools/Scheduled Class Publisher/handler.js +7 -9
  63. package/src/mcp/tools/Scheduled Class Puller/handler.js +6 -70
  64. package/src/mcp/tools/Trigger Creator/handler.js +12 -20
  65. package/src/mcp/tools/Trigger Detail Retriever/handler.js +7 -9
  66. package/src/mcp/tools/Trigger Editor Guide/handler.js +10 -35
  67. package/src/mcp/tools/Trigger List Retriever/handler.js +12 -4
  68. package/src/mcp/tools/Trigger Publisher/handler.js +8 -11
  69. package/src/mcp/tools/Trigger Puller/handler.js +12 -17
  70. package/src/menu/common.js +16 -0
  71. package/src/menu/create-object.js +94 -0
  72. package/src/menu/create-page.js +108 -0
  73. package/src/menu/create-script.js +108 -0
  74. package/src/menu/create-site.js +108 -0
  75. package/src/menu/create.js +54 -0
  76. package/src/menu/index.js +7 -0
  77. package/src/plugin/doc.js +801 -0
  78. package/src/plugin/index.js +1 -0
  79. package/src/plugin/pull.js +3 -0
  80. package/src/project/doc.js +378 -0
  81. package/src/project/index.js +1 -0
  82. package/src/script/doc.js +259 -0
  83. package/src/script/index.js +1 -0
  84. package/src/timer/index.js +1 -0
  85. package/src/triggers/doc.js +342 -0
  86. package/src/triggers/index.js +5 -0
  87. package/target/classes/com/cloudcc/core/BaseException.class +0 -0
  88. package/target/classes/com/cloudcc/core/BusiException.class +0 -0
  89. package/target/classes/com/cloudcc/core/CCService.class +0 -0
  90. package/target/classes/com/cloudcc/core/StringUtils.class +0 -0
  91. package/target/classes/com/cloudcc/core/TimeUtil.class +0 -0
  92. package/target/classes/com/cloudcc/core/UserInfo.class +0 -0
  93. package/template/lib/ccopenapi-0.0.4.jar +0 -0
  94. package/test/application.cli.test.js +30 -0
  95. package/test/classes.cli.test.js +121 -0
  96. package/test/fields.cli.test.js +69 -0
  97. package/test/mcp.cli.test.js +21 -0
  98. package/test/menu.cli.test.js +41 -0
  99. package/test/object.cli.test.js +64 -0
  100. package/test/plugin.cli.test.js +109 -0
  101. package/test/script.cli.test.js +101 -0
  102. package/test/timer.cli.test.js +107 -0
  103. package/test/trigger.cli.test.js +146 -0
  104. package/.vscode/settings.json +0 -3
  105. package/bin/mcp-svc.js +0 -13
  106. package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +0 -8
  107. package/src/mcp/index-sse-svc.js +0 -126
  108. package/src/mcp/index-streamable-svc.js +0 -180
  109. package/src/mcp/tools/Class Detail Retriever/prompt.js +0 -37
  110. package/src/mcp/tools/Class Editor Guide/prompt.js +0 -468
  111. package/src/mcp/tools/Class Publisher/prompt.js +0 -40
  112. package/src/mcp/tools/Class Puller/prompt.js +0 -49
  113. package/src/mcp/tools/Client Script Creator/handler.js +0 -179
  114. package/src/mcp/tools/CloudCC Development Overview/prompt.js +0 -870
  115. package/src/mcp/tools/Component Editor Guide/prompt.js +0 -519
  116. package/src/mcp/tools/Component Publisher/prompt.js +0 -659
  117. package/src/mcp/tools/Dev Environment Creator/prompt.js +0 -273
  118. package/src/mcp/tools/Dev Environment Validator/prompt.js +0 -193
  119. package/src/mcp/tools/Developer Key Setup Guide/prompt.js +0 -71
  120. package/src/mcp/tools/Object Fields Retriever/prompt.js +0 -10
  121. package/src/mcp/tools/Object List Retriever/prompt.js +0 -10
  122. package/src/mcp/tools/ccdk/fetcher.js +0 -18
  123. package/src/mcp/tools/ccdk/handler.js +0 -98
  124. package/src/mcp/tools/ccdk/prompt.js +0 -453
  125. package/target/ccopenapi-0.0.3-classes.jar +0 -0
  126. package/target/ccopenapi-0.0.3.jar +0 -0
  127. package/target/maven-archiver/pom.properties +0 -3
  128. package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -18
  129. package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
  130. package/template/lib/ccopenapi-0.0.3.jar +0 -0
@@ -4,6 +4,7 @@ cc.publish = require("./publish1")
4
4
  cc.get = require("./get")
5
5
  cc.detail = require("./detail")
6
6
  cc.pull = require("./pull")
7
+ cc.doc = require("./doc")
7
8
  function Plugin(action, argvs) {
8
9
  cc[action](argvs)
9
10
  }
@@ -100,6 +100,9 @@ async function pullById(pluginId, projectPath) {
100
100
 
101
101
  // 遍历所有文件并保存
102
102
  Object.entries(contentMap).forEach(([filePath, content]) => {
103
+ // 统一路径分隔符(服务端可能返回 Windows 风格的反斜杠)
104
+ filePath = filePath.replace(/\\/g, '/');
105
+
103
106
  // 获取文件名(不包含路径)
104
107
  const fileName = path.basename(filePath);
105
108
 
@@ -0,0 +1,378 @@
1
+ function generateFullMarkdownDoc() {
2
+ const lines = [
3
+ "# CloudCC Project 文档(全量)",
4
+ "",
5
+ "## 开发环境搭建(env-setup)",
6
+ "",
7
+ "> 来源:`.cursor/skills/cloudcc-crm-dev-guide/env-setup.md`",
8
+ "",
9
+ "# CloudCC CRM 前后端开发环境搭建指南",
10
+ "",
11
+ "> 本文档基于 CloudCC",
12
+ "> 官方「开发环境」文档整理而成,原文参见:[CloudCC 开发环境](https://help.cloudcc.cn/product03/kai-fa-huan-jing/)。\\",
13
+ "> 目标:指导开发者完成本地 Node / VS Code / cloudcc-cli / MCP / 模板项目 /",
14
+ "> 密钥配置等端到端环境搭建。",
15
+ "",
16
+ "---",
17
+ "",
18
+ "## 1. 前置条件与总体说明",
19
+ "",
20
+ "- 适用人群:CloudCC 前端组件、客户端脚本、后端类/触发器/定时器等二次开发工程师。",
21
+ "- 基本流程:",
22
+ " 1. 安装 Node 与 npm,并切换 npm 源",
23
+ " 2. 安装 `cloudcc-cli` 全局依赖",
24
+ " 3. 安装 VS Code 与 CloudCC 插件",
25
+ " 4. 配置本地 MCP(`cc-mcp`)",
26
+ " 5. 使用 CLI 创建模板项目并安装依赖",
27
+ " 6. 通过 CRM 获取开发者密钥、安全标记并写入 `cloudcc-cli.config.js`",
28
+ " 7. 视情况配置私有云与多环境参数",
29
+ "",
30
+ "---",
31
+ "",
32
+ "## 2. 安装 Node 与 npm 源配置",
33
+ "",
34
+ "### 2.1 安装 Node",
35
+ "",
36
+ "- **推荐版本**:`v20.19.5`(官方示例)",
37
+ "- **下载地址**:",
38
+ " - Node 官方历史版本下载:`https://nodejs.org/download/release/v20.19.5/`",
39
+ "- **建议**:使用 `nvm` 等 Node 多版本管理工具切换版本,保证与 CloudCC",
40
+ " 官方推荐版本一致。",
41
+ "",
42
+ "安装完成后,在终端中验证:",
43
+ "",
44
+ "```bash",
45
+ "node -v",
46
+ "```",
47
+ "",
48
+ "### 2.2 切换 npm 源到阿里镜像",
49
+ "",
50
+ "为加速依赖安装,建议设置 npm 源为阿里镜像:",
51
+ "",
52
+ "```bash",
53
+ "npm config set registry https://registry.npmmirror.com",
54
+ "```",
55
+ "",
56
+ "验证是否设置成功:",
57
+ "",
58
+ "```bash",
59
+ "npm config get registry",
60
+ "```",
61
+ "",
62
+ "返回 `https://registry.npmmirror.com/` 即表示生效。",
63
+ "",
64
+ "---",
65
+ "",
66
+ "## 3. 安装 cloudcc-cli(全局)",
67
+ "",
68
+ "### 3.1 Windows 用户",
69
+ "",
70
+ "在命令行中执行:",
71
+ "",
72
+ "```bash",
73
+ "npm install -g cloudcc-cli",
74
+ "```",
75
+ "",
76
+ "### 3.2 macOS 用户",
77
+ "",
78
+ "在终端中执行(需要 sudo):",
79
+ "",
80
+ "```bash",
81
+ "sudo npm install -g cloudcc-cli",
82
+ "```",
83
+ "",
84
+ "### 3.3 验证安装",
85
+ "",
86
+ "查看全局依赖列表,确认 `cloudcc-cli` 已安装:",
87
+ "",
88
+ "```bash",
89
+ "npm ls -g --depth=0",
90
+ "```",
91
+ "",
92
+ "在 macOS 上如需查看 sudo 下的全局包,可使用:",
93
+ "",
94
+ "```bash",
95
+ "sudo npm ls -g --depth=0",
96
+ "```",
97
+ "",
98
+ "---",
99
+ "",
100
+ "## 4. 安装 VS Code 与 CloudCC 插件",
101
+ "",
102
+ "### 4.1 安装 VS Code",
103
+ "",
104
+ "- 下载地址:`https://code.visualstudio.com/download`",
105
+ "- 安装完成后,用 VS Code 作为主要开发编辑器。",
106
+ "",
107
+ "### 4.2 安装 CloudCC 插件",
108
+ "",
109
+ "1. 打开 VS Code,点击左侧扩展(Extensions)图标",
110
+ "2. 搜索 `CloudCC`",
111
+ "3. 选择官方 CloudCC 插件并安装",
112
+ "",
113
+ "> 若在 Cursor 中开发,可参考 CloudCC 帮助中心中关于「常用工具 / Cursor",
114
+ "> 安装方式」的说明:`https://help.cloudcc.cn/product03/chang-yong-gong-ju/`",
115
+ "",
116
+ "---",
117
+ "",
118
+ "## 5. 安装并配置本地 MCP(cc-mcp)",
119
+ "",
120
+ "在支持 MCP 的开发工具中(如 Cursor),需要在 MCP 配置文件中添加:",
121
+ "",
122
+ "```json",
123
+ "{",
124
+ " \"mcpServers\": {",
125
+ " \"cloudcc-cli\": {",
126
+ " \"command\": \"cc-mcp\"",
127
+ " }",
128
+ " }",
129
+ "}",
130
+ "```",
131
+ "",
132
+ "说明:",
133
+ "",
134
+ "- `cloudcc-cli`:MCP 服务器标识,用于在工具中调用 CloudCC 相关能力",
135
+ "- `command: \"cc-mcp\"`:实际执行的命令,通常由 `cloudcc-cli` 提供",
136
+ "",
137
+ "---",
138
+ "",
139
+ "## 6. 创建模板项目并本地运行",
140
+ "",
141
+ "### 6.1 使用 CLI 创建项目",
142
+ "",
143
+ "在终端中切换到你的开发目录(如 `Documents`):",
144
+ "",
145
+ "```bash",
146
+ "cd ~/Documents",
147
+ "cc create project demo1",
148
+ "```",
149
+ "",
150
+ "`demo1` 为示例项目名,可按需替换。",
151
+ "",
152
+ "### 6.2 安装依赖并启动",
153
+ "",
154
+ "1. 使用 VS Code 打开刚创建的项目目录",
155
+ "2. 在 VS Code 中选择菜单:`终端 → 新建终端`",
156
+ "3. 在项目根目录安装依赖:",
157
+ "",
158
+ "```bash",
159
+ "npm i",
160
+ "```",
161
+ "",
162
+ "4. 依赖安装完成后启动本地开发服务器:",
163
+ "",
164
+ "```bash",
165
+ "npm run serve",
166
+ "```",
167
+ "",
168
+ "5. 在浏览器访问:",
169
+ "",
170
+ "```text",
171
+ "http://localhost:8080/",
172
+ "```",
173
+ "",
174
+ "看到模板页面即表示前端本地环境搭建成功。",
175
+ "",
176
+ "---",
177
+ "",
178
+ "## 7. 获取并配置开发者密钥",
179
+ "",
180
+ "> 目的:将本地项目与指定 CloudCC",
181
+ "> 环境(Org)关联,需使用具备「开发者权限」的账号在 CRM",
182
+ "> 中获取密钥和安全标记,然后配置到项目根目录下的 `cloudcc-cli.config.js`。",
183
+ "",
184
+ "### 7.1 创建开发者账号",
185
+ "",
186
+ "前提:拥有系统管理员账号。",
187
+ "",
188
+ "1. 使用系统管理账号登录 CRM",
189
+ "2. 点击右上角齿轮,进入后台设置",
190
+ "3. 进入 `用户管理 → 新建` 创建新用户",
191
+ "4. 为新用户分配**具有开发者权限**的简档:",
192
+ " - 路径:`管理用户 → 简档 → 对应简档 → 普通用户权限 → 代码管理`",
193
+ " - 确认「代码管理」权限已开启",
194
+ "",
195
+ "### 7.2 获取开发者密钥(CloudCCDev)",
196
+ "",
197
+ "1. 使用开发者账号登录 CRM",
198
+ "2. 点击右上角齿轮,进入后台设置",
199
+ "3. 路径:`用户及控制 → 安全性控制 → 连接的应用程序 → 新建`",
200
+ "4. 填写:",
201
+ " - 连接的应用程序名称",
202
+ " - API 名称",
203
+ " - 联系人电子邮件",
204
+ "5. 创建完成后,在详情页中找到",
205
+ " `CloudCC Dev`,点击后面的复制按钮,得到开发者密钥,妥善保管。",
206
+ "",
207
+ "### 7.3 获取安全标记(safetyMark)",
208
+ "",
209
+ "1. 使用同一开发者账号登录 CRM",
210
+ "2. 路径:`常规 → 个人设置 → 重置我的安全标记`",
211
+ "3. 点击后,安全标记会发送到用户邮箱,在邮箱中查收并记录。",
212
+ "",
213
+ "### 7.4 配置 `cloudcc-cli.config.js`",
214
+ "",
215
+ "在模板项目根目录找到并打开 `cloudcc-cli.config.js`,参考官方示例填写:",
216
+ "",
217
+ "```javascript",
218
+ "module.exports = {",
219
+ " // 当前使用的环境标记",
220
+ " use: \"dev\",",
221
+ "",
222
+ " // dev 环境密钥",
223
+ " dev: {",
224
+ " safetyMark: \"必填,安全标记\",",
225
+ " CloudCCDev: \"必填,开发者密钥\",",
226
+ " username: \"选填,开发者用户名,会覆盖 CloudCCDev 中的 username\",",
227
+ " },",
228
+ "",
229
+ " // prod 环境密钥",
230
+ " prod: {",
231
+ " safetyMark: \"必填,安全标记\",",
232
+ " CloudCCDev: \"必填,开发者密钥\",",
233
+ " username: \"选填,开发者用户名,会覆盖 CloudCCDev 中的 username\",",
234
+ " },",
235
+ "};",
236
+ "```",
237
+ "",
238
+ "说明:",
239
+ "",
240
+ "- `use` 决定当前连接哪个环境(如 `\"dev\"` / `\"prod\"` 等)",
241
+ "- 不要把真实密钥提交到 Git 仓库(应在 `.gitignore` 中忽略)",
242
+ "",
243
+ "---",
244
+ "",
245
+ "## 8. 私有云与特殊参数配置",
246
+ "",
247
+ "### 8.1 私有云标记",
248
+ "",
249
+ "在私有云场景下,需要额外增加 `version: \"private\"` 字段示意:",
250
+ "",
251
+ "```javascript",
252
+ "module.exports = {",
253
+ " use: \"dev\",",
254
+ " dev: {",
255
+ " safetyMark: \"必填,安全标记\",",
256
+ " CloudCCDev: \"必填,开发者密钥\",",
257
+ " version: \"必填,private\",",
258
+ " username: \"选填,开发者用户名,会覆盖 CloudCCDev 中的 username\",",
259
+ " },",
260
+ " prod: {",
261
+ " safetyMark: \"必填,安全标记\",",
262
+ " CloudCCDev: \"必填,开发者密钥\",",
263
+ " version: \"必填, private\",",
264
+ " username: \"选填,开发者用户名,会覆盖 CloudCCDev 中的 username\",",
265
+ " },",
266
+ "};",
267
+ "```",
268
+ "",
269
+ "### 8.2 baseUrl 与网关前缀",
270
+ "",
271
+ "示例配置(精简自官方文档):",
272
+ "",
273
+ "```javascript",
274
+ "dev: {",
275
+ " // 服务访问地址:",
276
+ " // 国内默认:https://developer.apis.cloudcc.cn",
277
+ " // 海外默认:https://developer.apis.cloudcc.com",
278
+ " // 私有云:可在登录 CRM 后,右键 → 检查 → 控制台,执行 $CCDK.CCConfig.getBaseUrl()",
279
+ " baseUrl: \"http://xxx\",",
280
+ "",
281
+ " // 组件进入后台后自动销毁时间(毫秒),如 10 分钟:10 * 60 * 1000",
282
+ " destroyTimeout: 600000,",
283
+ "",
284
+ " // 开发者平台在网关配置的前缀名,注意 URL 不要以 / 结尾",
285
+ " devSvcDispatch: \"/devconsole\",",
286
+ "",
287
+ " // api-service-svc 访问网关前缀地址",
288
+ " apiSvcPrefix: \"/xxx\",",
289
+ "",
290
+ " // setup-svc 访问网关前缀地址",
291
+ " setupSvcPrefix: \"/xxx\"",
292
+ "}",
293
+ "```",
294
+ "",
295
+ "---",
296
+ "",
297
+ "## 9. 多环境配置示例",
298
+ "",
299
+ "`cloudcc-cli.config.js` 支持配置多个环境,通过 `use` 字段选择当前使用的环境:",
300
+ "",
301
+ "```javascript",
302
+ "module.exports = {",
303
+ " // 使用 dev 环境密钥,与 dev 环境连接",
304
+ " use: \"dev\",",
305
+ "",
306
+ " // dev 环境密钥",
307
+ " dev: {",
308
+ " safetyMark: \"xxx\",",
309
+ " CloudCCDev: \"xxx\",",
310
+ " },",
311
+ "",
312
+ " // prod 环境密钥",
313
+ " prod: {",
314
+ " safetyMark: \"xxx\",",
315
+ " CloudCCDev: \"xxx\",",
316
+ " },",
317
+ "};",
318
+ "```",
319
+ "",
320
+ "建议:",
321
+ "",
322
+ "- 本地调试使用 `dev` 或测试环境",
323
+ "- 合并上线前在 `uat` 或类似环境进行回归验证",
324
+ "- 生产配置应仅在 CI/CD 或受控环境中可见,避免在开发机上长期保存生产密钥",
325
+ "",
326
+ "---",
327
+ "",
328
+ "## 10. 开发工具与代码规范补充",
329
+ "",
330
+ "### 10.1 推荐开发工具组合",
331
+ "",
332
+ "- 编辑器:VS Code(配合 CloudCC 插件)",
333
+ "- 包管理:npm(建议配置阿里源)",
334
+ "- 版本控制:Git",
335
+ "",
336
+ "官方文档中的推荐插件示例:",
337
+ "",
338
+ "- `ESLint`:代码规范检查",
339
+ "- `Vetur` / 对应 Vue 插件:Vue 语法高亮与提示",
340
+ "- `GitLens`:Git 历史与责任人查看",
341
+ "- `Live Server`:静态资源快速预览(如需)",
342
+ "",
343
+ "### 10.2 代码规范(简要)",
344
+ "",
345
+ "详细 JS/CSS/注释规范可参考官方文档「开发规范」小节,这里仅保留关键点:",
346
+ "",
347
+ "- 启用 ESLint 作为基础校验",
348
+ "- 在项目根目录维护 `README.md`,记录每次发布版本与更新内容",
349
+ "- Vue 组件中使用 `scoped` 样式或统一引入的样式变量文件,避免污染全局",
350
+ "",
351
+ "---",
352
+ "",
353
+ "## 11. 小结:环境搭建 Checklist",
354
+ "",
355
+ "在实际项目中,可使用以下清单快速自检:",
356
+ "",
357
+ "- [ ] 已安装 Node(推荐 v20.19.5)并通过 `node -v` 验证",
358
+ "- [ ] npm 源已切换到 `https://registry.npmmirror.com`",
359
+ "- [ ] 已全局安装 `cloudcc-cli` 并验证",
360
+ "- [ ] 已安装 VS Code 与 CloudCC 插件(或已按官方指引配置 Cursor)",
361
+ "- [ ] MCP 已配置 `cloudcc-cli → cc-mcp`",
362
+ "- [ ] 已通过 `cc create project` 创建模板项目并成功 `npm i` + `npm run serve`",
363
+ "- [ ] 已创建开发者账号并确认「代码管理」权限开启",
364
+ "- [ ] 已获取开发者密钥与安全标记并正确配置 `cloudcc-cli.config.js`",
365
+ "- [ ] 如为私有云,已配置 `version: \"private\"` 与正确的 `baseUrl`/网关前缀",
366
+ "- [ ] 多环境(dev/prod/uat 等)配置与 `use` 字段已核对无误",
367
+ ];
368
+
369
+ return lines.join("\n");
370
+ }
371
+
372
+ function doc(argvs) {
373
+ const content = generateFullMarkdownDoc();
374
+ console.log(content);
375
+ return content;
376
+ }
377
+
378
+ module.exports = doc;
@@ -1,5 +1,6 @@
1
1
  const cc = {}
2
2
  cc.create = require("./create1")
3
+ cc.doc = require("./doc")
3
4
  function Plugin(action, argvs) {
4
5
  cc[action](argvs)
5
6
  }
@@ -0,0 +1,259 @@
1
+ /**
2
+ * script 文档统一入口(全量一次性输出)
3
+ */
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+
7
+ function generateFullMarkdownDoc() {
8
+ const lines = [
9
+ "# CloudCC 客户端脚本开发指南",
10
+ "",
11
+ "> 本文档参考 CloudCC 官方「客户端脚本」文档整理而成:[客户端脚本](https://help.cloudcc.cn/product03/ke-hu-duan-jiao-ben/)。 ",
12
+ "> 目标:指导开发者在不同页面(列表、新建/编辑、详情、全局)特定时机运行 JavaScript,基于 CCDK 能力实现字段控制、布局调整等前端增强。",
13
+ "",
14
+ "---",
15
+ "",
16
+ "## 1. 概念与入口",
17
+ "",
18
+ "### 1.1 什么是客户端脚本",
19
+ "",
20
+ "- 客户端脚本是在 **浏览器端**、特定页面和时机执行的一段 JavaScript。 ",
21
+ "- 依托 `$CCDK` 提供的桥接能力,可以:",
22
+ " - 显示提示信息",
23
+ " - 控制字段显隐 / 只读",
24
+ " - 调整页面 DOM 结构",
25
+ " - 在保存前/后执行校验或自定义逻辑",
26
+ "",
27
+ "### 1.2 进入客户端脚本设置页面",
28
+ "",
29
+ "1. 登录 CloudCC 系统 ",
30
+ "2. 点击右上角头像,选择「开发者平台」(仅管理员简档可见) ",
31
+ "3. 左侧菜单:`扩展 → 客户端脚本`",
32
+ "",
33
+ "---",
34
+ "",
35
+ "## 2. 创建第一个客户端脚本",
36
+ "",
37
+ "### 2.1 新建脚本",
38
+ "",
39
+ "1. 在「客户端脚本」列表页,点击右上角「新建」 ",
40
+ "2. 填写基本信息(名称、适用对象/页面/事件等),进入代码编辑页面 ",
41
+ "3. 在代码输入区输入示例代码:",
42
+ "",
43
+ "```javascript",
44
+ "$CCDK.CCMessage.showMessage('hello cloudCC');",
45
+ "```",
46
+ "",
47
+ "4. 点击右上角「保存」",
48
+ "",
49
+ "### 2.2 回到前台查看效果",
50
+ "",
51
+ "例如: ",
52
+ "- 配置为在「客户详情页 onLoad」执行 ",
53
+ "- 返回前台 → 打开客户菜单 → 进入任意一条客户详情 ",
54
+ "- 页面加载完成后,会看到 `hello cloudCC` 提示信息",
55
+ "",
56
+ "---",
57
+ "",
58
+ "## 3. 利用 devid 精确控制页面元素",
59
+ "",
60
+ "> 为方便控制页面元素,平台在关键 DOM 节点上添加了 `devid` 自定义属性,并使用特定业务 ID 绑定。可通过 F12 查看并用于脚本选择器。",
61
+ "",
62
+ "### 3.1 示例:禁用编辑页的「分级」字段",
63
+ "",
64
+ "#### 第一步:查看 devid",
65
+ "",
66
+ "1. 按 `F12` 打开浏览器开发者工具 ",
67
+ "2. 切换到「元素」(Elements) 面板 ",
68
+ "3. 使用元素选择器选中「分级」字段对应 DOM ",
69
+ "4. 在右侧/标签属性中查找并复制该元素的 `devid` 值备用",
70
+ "",
71
+ "#### 第二步:创建客户端脚本",
72
+ "",
73
+ "在客户端脚本中,根据 `devid` 操作 DOM:",
74
+ "",
75
+ "```javascript",
76
+ "// 方式一:通过动态插入样式禁用点击",
77
+ "let style = document.createElement('style');",
78
+ "style.type = 'text/css';",
79
+ "style.innerHTML = '[devid=\"ffe201100003855g6Ipz\"]{pointer-events:none}';",
80
+ "document.getElementsByTagName('head').item(0).appendChild(style);",
81
+ "",
82
+ "// 方式二:直接隐藏某个元素",
83
+ "let dd = document.querySelector('div[devid=\"ffe201100003428r65pk\"]');",
84
+ "if (dd) {",
85
+ " dd.style.display = \"none\";",
86
+ "}",
87
+ "```",
88
+ "",
89
+ "保存后回到前台,进入对应页面查看效果。",
90
+ "",
91
+ "### 3.2 示例:隐藏详情页某个字段",
92
+ "",
93
+ "同样通过 `devid` 精确定位字段,再注入样式:",
94
+ "",
95
+ "```javascript",
96
+ "// 隐藏并不占用空间",
97
+ "let style = document.createElement('style');",
98
+ "style.type = 'text/css';",
99
+ "style.innerHTML = '[devid=\"ffe20220523account01\"]{display:none !important}';",
100
+ "document.getElementsByTagName('head').item(0).appendChild(style);",
101
+ "```",
102
+ "",
103
+ "```javascript",
104
+ "// 隐藏但保留空间",
105
+ "let style = document.createElement('style');",
106
+ "style.type = 'text/css';",
107
+ "style.innerHTML = '[devid=\"ffe20220523account01\"]{visibility:hidden !important}';",
108
+ "document.getElementsByTagName('head').item(0).appendChild(style);",
109
+ "```",
110
+ "",
111
+ "### 3.3 示例:移动页面元素到其他位置",
112
+ "",
113
+ "```javascript",
114
+ "// 获取要移动的节点",
115
+ "const moveNode = document.querySelector('[devid=\"aee2024EFBBA5EEfs1Ta\"]');",
116
+ "// 目标节点",
117
+ "const targetNode = document.querySelector('[devid=\"adf2024D33E03DA6xzBj\"]');",
118
+ "// 目标节点的父节点",
119
+ "const targetParentNode = targetNode.parentNode;",
120
+ "",
121
+ "// 将需要移动的节点插入到目标节点前面",
122
+ "if (moveNode && targetNode && targetParentNode) {",
123
+ " targetParentNode.insertBefore(moveNode, targetNode);",
124
+ "}",
125
+ "```",
126
+ "",
127
+ "**注意**:DOM 可能尚未渲染完成,可结合定时器或 `MutationObserver` 等机制等待节点出现。",
128
+ "",
129
+ "---",
130
+ "",
131
+ "## 4. 页面类型与脚本事件映射",
132
+ "",
133
+ "> 系统页面大致分为「全局、列表、新建/编辑、详情」等类型,每种页面支持不同事件,脚本在对应时机执行。",
134
+ "",
135
+ "以下是官方提供的主要事件(简化说明):",
136
+ "",
137
+ "### 4.1 全局类型",
138
+ "",
139
+ "- **onCreate**",
140
+ " - 适用:PC / HS",
141
+ " - 函数签名:`function test($CCDK, obj = {})`",
142
+ " - 说明:项目启动时触发(业务页面代码尚未执行)",
143
+ "",
144
+ "- **onLoad**",
145
+ " - 适用:PC / HS",
146
+ " - 场景:全局 UI 首次展示后",
147
+ "",
148
+ "- **onDestroy**",
149
+ " - 适用:PC / HS",
150
+ " - 场景:关闭 Tab / 更改流程等导致当前应用关闭时",
151
+ "",
152
+ "### 4.2 视图页(列表页面)",
153
+ "",
154
+ "事件函数统一形如:`function test($CCDK, obj = {})`",
155
+ "",
156
+ "- **onCreated**",
157
+ " - 时机:进入视图页,但 DOM 还未创建 ",
158
+ "- **onLoad**",
159
+ " - 时机:首次进入,或点击搜索刷新列表数据后 ",
160
+ "- **onDestroy**",
161
+ " - 时机:离开列表页(如进入详情页等)",
162
+ "",
163
+ "### 4.3 新建/编辑页",
164
+ "",
165
+ "同样使用 `function test($CCDK, obj = {})`:",
166
+ "",
167
+ "- **onCreated**",
168
+ " - 时机:进入新建/编辑页面,但 DOM 尚未创建 ",
169
+ "- **onLoad**",
170
+ " - 时机:详情数据加载完成、页面渲染结束 ",
171
+ "- **onDestroy**",
172
+ " - 时机:离开新建/编辑页面 ",
173
+ "- **beforeSave**",
174
+ " - 参数:`obj.detailData` 为 key-value 形式的详情数据,**可以在这里修改** ",
175
+ " - 时机:点击保存按钮时触发,适合做前端校验与补充字段赋值 ",
176
+ "- **afterSave**",
177
+ " - 时机:保存接口请求完成后触发 ",
178
+ "- **onChange**",
179
+ " - 时机:编辑某个字段、光标失焦,且 value 有变化时触发",
180
+ "",
181
+ "### 4.4 详情页",
182
+ "",
183
+ "- **onLoad**",
184
+ " - 适用:PC / HS ",
185
+ " - 时机:获取详情基础数据并完成 DOM 渲染后触发 ",
186
+ "",
187
+ "---",
188
+ "",
189
+ "## 5. 实战建议与注意事项",
190
+ "",
191
+ "### 5.1 DOM 渲染时机",
192
+ "",
193
+ "- 部分页面在脚本执行时 DOM 可能尚未完全渲染,建议:",
194
+ " - 使用 `setTimeout` / 轮询检查目标节点是否存在 ",
195
+ " - 或配合 `MutationObserver` 监听 DOM 变化后再操作 ",
196
+ "",
197
+ "### 5.2 与 CCDK 的配合",
198
+ "",
199
+ "- `$CCDK` 提供了多种能力,如:",
200
+ " - `CCMessage`:消息提示 ",
201
+ " - `CCLoad`:脚本/样式加载 ",
202
+ " - 其他与对象/类交互的桥接能力 ",
203
+ "- 客户端脚本中应优先调用 `$CCDK` 而非自行拼接接口。",
204
+ "",
205
+ "### 5.3 与自定义组件的边界",
206
+ "",
207
+ "- 客户端脚本更适合:",
208
+ " - 简单的字段控制",
209
+ " - 小范围布局微调",
210
+ " - 轻量交互增强 ",
211
+ "- 更复杂的 UI、交互与业务逻辑推荐用「自定义组件」实现(详见 `custom-component-dev.md`)。",
212
+ "",
213
+ "---",
214
+ "",
215
+ "## 6. 客户端脚本开发 Checklist",
216
+ "",
217
+ "- [ ] 已在「开发者平台 → 客户端脚本」正确选择对象、页面类型与事件(onLoad / beforeSave 等) ",
218
+ "- [ ] 使用 `$CCDK` 能力而非手工拼接接口或直接依赖不稳定的全局变量 ",
219
+ "- [ ] 所有 DOM 操作都考虑了渲染时机,避免因节点不存在而报错 ",
220
+ "- [ ] 通过 `devid` 精确定位关键元素,避免依赖脆弱的层级或 class 选择器 ",
221
+ "- [ ] 对性能敏感操作(如定时器、频繁 DOM 查询)做了节流或销毁处理 ",
222
+ "- [ ] 已区分客户端脚本与自定义组件的职责,将复杂 UI / 交互放到组件中实现 ",
223
+ "- [ ] 在目标环境中完整测试:列表 / 新建 / 编辑 / 详情等场景,确认无脚本错误和布局异常 ",
224
+ "",
225
+ ];
226
+
227
+ const base = lines.join("\n");
228
+ const ccdkPath = path.join(__dirname, "..", "api", "ccdk-sdk.md");
229
+ let ccdkContent = "";
230
+ try {
231
+ ccdkContent = fs.readFileSync(ccdkPath, "utf8");
232
+ } catch (e) {
233
+ ccdkContent = `# CloudCC 前端 SDK(cloudcc-ccdk)使用指南\n\n(未找到文件:${ccdkPath})\n`;
234
+ }
235
+
236
+ return [
237
+ base,
238
+ "",
239
+ "---",
240
+ "",
241
+ "## 附录:CCDK SDK 速查",
242
+ "",
243
+ "> 来源:`src/api/ccdk-sdk.md`",
244
+ "",
245
+ ccdkContent.trim(),
246
+ "",
247
+ ].join("\n");
248
+ }
249
+
250
+ function doc() {
251
+ const content = generateFullMarkdownDoc();
252
+ console.log(content);
253
+ return content;
254
+ }
255
+
256
+ // 兼容旧调用方:仍提供同名入口(但都返回全量文档)
257
+ doc.getEditGuide = doc;
258
+
259
+ module.exports = doc;
@@ -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.doc = require("./doc")
8
9
  function main(action, argvs) {
9
10
  cc[action](argvs)
10
11
  }
@@ -4,6 +4,7 @@ cc.publish = require("./publish")
4
4
  cc.pull = require("./pull")
5
5
  cc.get = require("./get")
6
6
  cc.pullList = require("./pullList")
7
+ cc.detail = require("./detail")
7
8
  function Timer(action, argvs) {
8
9
  cc[action](argvs[2], argvs[3])
9
10
  }