cloudcc-cli 2.3.3 → 2.3.5

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 (85) hide show
  1. package/.claude/settings.json +28 -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 +65 -7
  5. package/bin/cc.js +106 -28
  6. package/bin/index.js +54 -53
  7. package/mcp/cliRunner.js +11 -4
  8. package/mcp/index.js +12 -2
  9. package/mcp/tools/CloudCC Development Overview/handler.js +1 -1
  10. package/mcp/tools/JSP Migrator/handler.js +46 -0
  11. package/package.json +4 -5
  12. package/src/button/create.js +169 -0
  13. package/src/button/delete.js +35 -0
  14. package/src/button/doc.js +36 -0
  15. package/src/button/docs/devguide.md +133 -0
  16. package/src/button/docs/introduction.md +60 -0
  17. package/src/button/get.js +60 -0
  18. package/src/button/index.js +20 -0
  19. package/src/classes/docs/introduction.md +0 -20
  20. package/src/fields/create.js +12 -0
  21. package/src/identityProvider/create.js +78 -0
  22. package/src/identityProvider/delete.js +61 -0
  23. package/src/identityProvider/doc.js +46 -0
  24. package/src/identityProvider/docs/devguide.md +107 -0
  25. package/src/identityProvider/docs/introduction.md +31 -0
  26. package/src/identityProvider/download.js +105 -0
  27. package/src/identityProvider/get.js +70 -0
  28. package/src/identityProvider/index.js +12 -0
  29. package/src/menu/create-object.js +1 -0
  30. package/src/menu/create-page.js +1 -0
  31. package/src/menu/create-script.js +1 -0
  32. package/src/menu/create-site.js +1 -0
  33. package/src/object/create.js +2 -1
  34. package/src/object/docs/devguide.md +1 -5
  35. package/src/permission/add.js +164 -0
  36. package/src/permission/assign.js +84 -0
  37. package/src/permission/docs/devguide.md +238 -0
  38. package/src/permission/docs/introduction.md +200 -0
  39. package/src/permission/get.js +107 -0
  40. package/src/permission/index.js +10 -0
  41. package/src/permission/remove.js +145 -0
  42. package/src/project/docs/devguide.md +7 -6
  43. package/src/role/create.js +2 -1
  44. package/src/role/delete.js +1 -0
  45. package/src/singleSignOn/delete.js +61 -0
  46. package/src/singleSignOn/doc.js +46 -0
  47. package/src/singleSignOn/docs/devguide.md +61 -0
  48. package/src/singleSignOn/docs/introduction.md +3 -0
  49. package/src/singleSignOn/get.js +70 -0
  50. package/src/singleSignOn/index.js +10 -0
  51. package/src/staticResource/docs/introduction.md +44 -1
  52. package/src/user/create.js +502 -19
  53. package/src/validationRule/create.js +153 -0
  54. package/src/validationRule/delete.js +60 -0
  55. package/src/validationRule/doc.js +46 -0
  56. package/src/validationRule/docs/devguide.md +76 -0
  57. package/src/validationRule/docs/introduction.md +122 -0
  58. package/src/validationRule/get.js +47 -0
  59. package/src/validationRule/index.js +10 -0
  60. package/src/version/actionHelp.js +25 -0
  61. package/src/version/docs.js +26 -0
  62. package/src/version/doctor.js +25 -0
  63. package/src/version/get.js +7 -1
  64. package/src/version/help.js +47 -0
  65. package/src/version/index.js +9 -2
  66. package/src/version/initHelp.js +13 -0
  67. package/src/version/listModuleCommands.js +241 -0
  68. package/src/version/stats.js +44 -0
  69. package/src/version/uninstall.js +30 -0
  70. package/src/version/update.js +13 -0
  71. package/utils/checkVersion.js +31 -2
  72. package/utils/commandStats.js +94 -0
  73. package/utils/formatReleaseNotes.js +312 -0
  74. package/utils/readmeReleases.js +69 -0
  75. package/.cloudcc-cache.json +0 -38
  76. package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
  77. package/.cursor/skills/cloudcc-cli-usage/SKILL.md +0 -68
  78. package/build/component-CCPlugin1774500425584.common.js +0 -831
  79. package/build/component-CCPlugin1774500425584.common.js.map +0 -1
  80. package/build/component-CCPlugin1774500425584.css +0 -1
  81. package/build/component-CCPlugin1774500425584.umd.js +0 -874
  82. package/build/component-CCPlugin1774500425584.umd.js.map +0 -1
  83. package/build/component-CCPlugin1774500425584.umd.min.js +0 -8
  84. package/build/component-CCPlugin1774500425584.umd.min.js.map +0 -1
  85. package/build/demo.html +0 -1
@@ -0,0 +1,107 @@
1
+ const chalk = require('chalk');
2
+ const { postClass } = require("../../utils/http");
3
+ const { getPackageJson } = require("../../utils/config");
4
+
5
+ /**
6
+ * 获取权限集视图ID
7
+ * @param {Object} config - 项目配置
8
+ * @returns {Promise<string>} 视图ID
9
+ */
10
+ async function getPermsetViewId(config) {
11
+ const res = await postClass(
12
+ config.setupSvc + "/api/permissionGroup/queryPermsetsList",
13
+ {},
14
+ config.accessToken
15
+ );
16
+
17
+ if (res && res.result && res.data) {
18
+ // 优先使用返回的 viewId
19
+ if (res.data.viewId) {
20
+ return res.data.viewId;
21
+ }
22
+ // 否则使用 viewList 中的第一个
23
+ if (Array.isArray(res.data.viewList) && res.data.viewList.length > 0) {
24
+ return res.data.viewList[0].id;
25
+ }
26
+ }
27
+
28
+ throw new Error("未找到权限集视图");
29
+ }
30
+
31
+ /**
32
+ * 获取权限集列表
33
+ * 用法:cc get permission <projectPath> [viewId] [page] [pageSize] [searchKeyWord]
34
+ * @param {Array} argvs - 命令行参数数组
35
+ * @param {boolean} isMcp - 是否为MCP模式
36
+ * @returns {Promise<Array>} 权限集列表
37
+ */
38
+ async function get(argvs, isMcp = false) {
39
+ try {
40
+ const projectPath = argvs[2] || process.cwd();
41
+ const viewId = argvs[3] || '';
42
+ const page = parseInt(argvs[4]) || 1;
43
+ const pageSize = parseInt(argvs[5]) || 100000;
44
+ const searchKeyWord = argvs[6] || '';
45
+
46
+ const config = await getPackageJson(projectPath);
47
+
48
+ // 如果没有指定 viewId,先获取视图ID
49
+ let finalViewId = viewId;
50
+ if (!finalViewId) {
51
+ try {
52
+ finalViewId = await getPermsetViewId(config);
53
+ } catch (error) {
54
+ console.error(chalk.yellow("Warning: " + error.message));
55
+ throw error;
56
+ }
57
+ }
58
+
59
+ const res = await postClass(
60
+ config.setupSvc + "/api/permissionGroup/listAJAX",
61
+ {
62
+ viewId: finalViewId,
63
+ page: page,
64
+ pageSize: pageSize,
65
+ searchKeyWord: searchKeyWord
66
+ },
67
+ config.accessToken
68
+ );
69
+
70
+ if (res && res.result && res.data) {
71
+ const list = res.data.list || [];
72
+
73
+ if (!isMcp) {
74
+ if (list.length === 0) {
75
+ console.log(chalk.yellow("未找到权限集"));
76
+ } else {
77
+ console.log(chalk.green(`找到 ${list.length} 个权限集:`));
78
+ console.log();
79
+ // 表格形式输出
80
+ const idWidth = Math.max(20, ...list.map(item => item.id?.length || 0));
81
+ const nameWidth = Math.max(15, ...list.map(item => item.name?.length || 0));
82
+
83
+ console.log(chalk.cyan(` ${'ID'.padEnd(idWidth)} ${'名称'.padEnd(nameWidth)} 许可证 系统管理员`));
84
+ console.log(chalk.cyan(` ${'-'.repeat(idWidth)} ${'-'.repeat(nameWidth)} ---------------- ----------`));
85
+
86
+ list.forEach(item => {
87
+ const sysAdminStr = item.sysadmin === '1' ? '是' : '否';
88
+ console.log(` ${(item.id || '').padEnd(idWidth)} ${(item.name || '').padEnd(nameWidth)} ${(item.licence || '').padEnd(16)} ${sysAdminStr}`);
89
+ });
90
+ console.log();
91
+ }
92
+ }
93
+ return list;
94
+ }
95
+
96
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
97
+ throw new Error("获取权限集列表失败: " + msg);
98
+
99
+ } catch (error) {
100
+ if (!isMcp) {
101
+ console.error(chalk.red("Error: " + error.message));
102
+ }
103
+ throw error;
104
+ }
105
+ }
106
+
107
+ module.exports = get;
@@ -0,0 +1,10 @@
1
+ const cc = {}
2
+ cc.get = require("./get")
3
+ cc.assign = require("./assign")
4
+ cc.add = require("./add")
5
+ cc.remove = require("./remove")
6
+ async function main(action, argvs) {
7
+ await cc[action](argvs)
8
+ }
9
+
10
+ module.exports = main;
@@ -0,0 +1,145 @@
1
+ const chalk = require('chalk');
2
+ const { postClass } = require("../../utils/http");
3
+ const { getPackageJson } = require("../../utils/config");
4
+ const inquirer = require('inquirer');
5
+
6
+ /**
7
+ * 获取权限集已分配的用户列表
8
+ * @param {Object} config - 项目配置
9
+ * @param {string} permsetId - 权限集ID
10
+ * @returns {Promise<Array>} 已分配用户列表
11
+ */
12
+ async function getAssignedUsers(config, permsetId) {
13
+ const res = await postClass(
14
+ config.setupSvc + "/api/permissionGroup/queryUserlistBypermsetsid",
15
+ { id: permsetId },
16
+ config.accessToken
17
+ );
18
+
19
+ if (res && res.result && res.data) {
20
+ return res.data.userlist || [];
21
+ }
22
+
23
+ throw new Error("获取已分配用户列表失败");
24
+ }
25
+
26
+ /**
27
+ * 删除权限集分配用户
28
+ * 用法:cc remove permission <projectPath> <permsetId> [userIds...]
29
+ * 如果不指定 userIds,会进入交互式选择
30
+ * @param {Array} argvs - 命令行参数数组
31
+ * @param {boolean} isMcp - 是否为MCP模式
32
+ * @returns {Promise<Object>} 删除结果
33
+ */
34
+ async function remove(argvs, isMcp = false) {
35
+ try {
36
+ const projectPath = argvs[2] || process.cwd();
37
+ const permsetId = argvs[3];
38
+ // 从第4个参数开始是用户ID
39
+ let userIds = argvs.slice(4);
40
+
41
+ if (!permsetId) {
42
+ console.error();
43
+ console.error(chalk.red('Error: 缺少权限集ID'));
44
+ console.error('用法: cc remove permission <path> <permsetId> [userId1] [userId2] ...');
45
+ console.error('示例:');
46
+ console.error(' cc remove permission . "cac20258F0E4ABBnTxwi" # 交互式选择用户');
47
+ console.error(' cc remove permission . "cac20258F0E4ABBnTxwi" "00520260C00C6FEfsMnT" # 直接指定用户ID');
48
+ console.error();
49
+ throw new Error('缺少必需参数: permsetId');
50
+ }
51
+
52
+ const config = await getPackageJson(projectPath);
53
+
54
+ // 如果没有指定用户ID,进入交互式选择
55
+ if (userIds.length === 0) {
56
+ console.log();
57
+ console.log(chalk.blue('正在获取已分配用户列表...'));
58
+
59
+ const userList = await getAssignedUsers(config, permsetId);
60
+
61
+ if (userList.length === 0) {
62
+ console.log(chalk.yellow("该权限集没有分配任何用户"));
63
+ return { success: false, message: "该权限集没有分配任何用户" };
64
+ }
65
+
66
+ // 交互式选择用户
67
+ const choices = userList.map(user => ({
68
+ name: `${user.name || '未命名'} (${user.loginname || ''}) - ${user.id}`,
69
+ value: user.id,
70
+ short: user.name || user.id
71
+ }));
72
+
73
+ const { selectedUsers } = await inquirer.prompt([
74
+ {
75
+ type: 'checkbox',
76
+ name: 'selectedUsers',
77
+ message: '请选择要删除的用户(使用空格键选择,回车确认):',
78
+ choices: choices,
79
+ validate: (input) => input.length > 0 || '请至少选择一个用户'
80
+ }
81
+ ]);
82
+
83
+ userIds = selectedUsers;
84
+ }
85
+
86
+ if (userIds.length === 0) {
87
+ console.log(chalk.yellow("未选择任何用户"));
88
+ return { success: false, message: "未选择任何用户" };
89
+ }
90
+
91
+ // 确认删除
92
+ const { confirm } = await inquirer.prompt([
93
+ {
94
+ type: 'confirm',
95
+ name: 'confirm',
96
+ message: `确定要从权限集中移除 ${userIds.length} 个用户吗?`,
97
+ default: false
98
+ }
99
+ ]);
100
+
101
+ if (!confirm) {
102
+ console.log(chalk.yellow("已取消操作"));
103
+ return { success: false, message: "用户取消操作" };
104
+ }
105
+
106
+ console.log();
107
+ console.log(chalk.blue(`正在从权限集 ${permsetId} 移除 ${userIds.length} 个用户...`));
108
+
109
+ const res = await postClass(
110
+ config.setupSvc + "/api/permissionGroup/deleteUsersetup",
111
+ {
112
+ id: permsetId,
113
+ ids: userIds.join(',')
114
+ },
115
+ config.accessToken
116
+ );
117
+
118
+ if (res && res.result) {
119
+ if (!isMcp) {
120
+ console.log();
121
+ console.log(chalk.green('✓ 用户移除成功'));
122
+ console.log(` 权限集ID: ${permsetId}`);
123
+ console.log(` 移除用户数: ${userIds.length}`);
124
+ console.log();
125
+ }
126
+ return {
127
+ success: true,
128
+ permsetId: permsetId,
129
+ userCount: userIds.length,
130
+ userIds: userIds
131
+ };
132
+ }
133
+
134
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
135
+ throw new Error("移除用户失败: " + msg);
136
+
137
+ } catch (error) {
138
+ if (!isMcp) {
139
+ console.error(chalk.red("Error: " + error.message));
140
+ }
141
+ throw error;
142
+ }
143
+ }
144
+
145
+ module.exports = remove;
@@ -18,7 +18,7 @@
18
18
  1. 安装 Node 与 npm,并切换 npm 源
19
19
  2. 安装 `cloudcc-cli` 全局依赖
20
20
  3. 安装 VS Code 与 CloudCC 插件
21
- 4. 配置本地 MCP(`cc-mcp`)
21
+ 4. 配置本地 MCP(`node` 运行 `bin/mcp.js`)
22
22
  5. 使用 CLI 创建模板项目并安装依赖
23
23
  6. 通过 CRM 获取开发者密钥、安全标记并写入 `cloudcc-cli.config.js`
24
24
  7. 视情况配置私有云与多环境参数
@@ -109,15 +109,16 @@ sudo npm ls -g --depth=0
109
109
 
110
110
  ---
111
111
 
112
- ## 5. 安装并配置本地 MCP(cc-mcp)
112
+ ## 5. 安装并配置本地 MCP
113
113
 
114
- 在支持 MCP 的开发工具中(如 Cursor),需要在 MCP 配置文件中添加:
114
+ 在支持 MCP 的开发工具中(如 Cursor),需要在 MCP 配置文件中添加(使用 `node` 启动包内脚本,**将 `args` 中的路径换成本机全局安装后的绝对路径**):
115
115
 
116
116
  ```json
117
117
  {
118
118
  "mcpServers": {
119
119
  "cloudcc-cli": {
120
- "command": "cc-mcp"
120
+ "command": "node",
121
+ "args": ["<npm-global>/cloudcc-cli/bin/mcp.js"]
121
122
  }
122
123
  }
123
124
  }
@@ -126,7 +127,7 @@ sudo npm ls -g --depth=0
126
127
  说明:
127
128
 
128
129
  - `cloudcc-cli`:MCP 服务器标识,用于在工具中调用 CloudCC 相关能力
129
- - `command: "cc-mcp"`:实际执行的命令,通常由 `cloudcc-cli` 提供
130
+ - `command` / `args`:通过 Node 执行 `cloudcc-cli` 包内的 `bin/mcp.js`(全局安装后路径一般为 `$(npm root -g)/cloudcc-cli/bin/mcp.js`,请粘贴为绝对路径)
130
131
 
131
132
  ---
132
133
 
@@ -351,7 +352,7 @@ module.exports = {
351
352
  - [ ] npm 源已切换到 `https://registry.npmmirror.com`
352
353
  - [ ] 已全局安装 `cloudcc-cli` 并验证
353
354
  - [ ] 已安装 VS Code 与 CloudCC 插件(或已按官方指引配置 Cursor)
354
- - [ ] MCP 已配置 `cloudcc-cli cc-mcp`
355
+ - [ ] MCP 已配置 `cloudcc-cli`(`node` + `bin/mcp.js`)
355
356
  - [ ] 已通过 `cc create project` 创建模板项目并成功 `npm i` + `npm run serve`
356
357
  - [ ] 已创建开发者账号并确认「代码管理」权限开启
357
358
  - [ ] 已获取开发者密钥与安全标记并正确配置 `cloudcc-cli.config.js`
@@ -2,6 +2,7 @@ const chalk = require('chalk');
2
2
  const inquirer = require('inquirer');
3
3
  const { postClass } = require("../../utils/http");
4
4
  const { getPackageJson } = require("../../utils/config");
5
+ const { id } = require('zod/locales');
5
6
 
6
7
  /**
7
8
  * 创建角色
@@ -49,7 +50,7 @@ async function create(argvs) {
49
50
  console.error(chalk.blue('Step 1: 获取直属上司列表...'));
50
51
  const addRoleRes = await postClass(
51
52
  config.setupSvc + "/api/role/addRole",
52
- { id: "bab2025F8B20EE4d4005" },
53
+ { id: config.orgId },
53
54
  config.accessToken
54
55
  );
55
56
 
@@ -40,6 +40,7 @@ async function remove(argvs) {
40
40
  if (result && result.result) {
41
41
  console.error();
42
42
  console.error(chalk.green("Success! Role deleted."));
43
+ console.error(chalk.blue("返回结果:"), JSON.stringify(result, null, 2));
43
44
  console.error();
44
45
  return result;
45
46
  }
@@ -0,0 +1,61 @@
1
+ const chalk = require("chalk");
2
+ const { postClass } = require("../../utils/http");
3
+ const { getPackageJson } = require("../../utils/config");
4
+
5
+ /**
6
+ * 删除单点登录记录
7
+ * 接口: /spconfig/delete
8
+ * 用法:cc delete singleSignOn <projectPath> <id>
9
+ */
10
+ async function remove(argvs) {
11
+ try {
12
+ const projectPath = argvs[2] || process.cwd();
13
+ const id = argvs[3];
14
+
15
+ if (!id) {
16
+ console.error();
17
+ console.error(chalk.red("Error: 缺少单点登录记录 id"));
18
+ console.error(chalk.yellow("用法: cc delete singleSignOn <projectPath> <id>"));
19
+ console.error(chalk.yellow("示例: cc delete singleSignOn . 20246DB16F11EDF4KHWd"));
20
+ console.error();
21
+ throw new Error("缺少必需参数: id");
22
+ }
23
+
24
+ const config = await getPackageJson(projectPath);
25
+ if (!config || !config.accessToken) {
26
+ console.error();
27
+ console.error(chalk.red("Error: 配置未找到或 accessToken 缺失"));
28
+ console.error();
29
+ throw new Error("配置未找到或 accessToken 缺失");
30
+ }
31
+
32
+ console.error();
33
+ console.error(chalk.green(`Deleting single sign on record (${id}), please wait...`));
34
+ console.error();
35
+
36
+ const result = await postClass(
37
+ config.setupSvc + "/api/spconfig/delete",
38
+ { id: id },
39
+ config.accessToken
40
+ );
41
+
42
+ if (result && result.result) {
43
+ console.error();
44
+ console.error(chalk.green("Success! Single sign on record deleted."));
45
+ console.error();
46
+ return result;
47
+ }
48
+
49
+ const msg = result && (result.returnInfo || result.message) ? (result.returnInfo || result.message) : "Unknown error";
50
+ console.error();
51
+ console.error(chalk.red("Error: " + msg));
52
+ console.error();
53
+ throw new Error("Delete SingleSignOn Failed: " + msg);
54
+ } catch (error) {
55
+ console.error();
56
+ console.error(chalk.red("单点登录记录删除失败:"), error);
57
+ throw error;
58
+ }
59
+ }
60
+
61
+ module.exports = remove;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * singleSignOn 文档入口:正文均在 `docs/` 目录。
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
+ function getIntroductionDoc() {
15
+ return readDocFile("introduction");
16
+ }
17
+
18
+ /** 开发指导:CLI 查询/删除等 */
19
+ function getDevGuideDoc() {
20
+ return readDocFile("devguide");
21
+ }
22
+
23
+ /**
24
+ * cc doc singleSignOn <introduction|devguide>
25
+ * @param {string[]} argvs [doc, type, introduction|devguide, ...]
26
+ */
27
+ function doc(argvs) {
28
+ const subType = argvs[2];
29
+ const key = String(subType || "").trim().toLowerCase();
30
+ if (!key) {
31
+ throw new Error("cc doc singleSignOn 需要子命令:introduction 或 devguide");
32
+ }
33
+ if (key === "introduction") {
34
+ const content = getIntroductionDoc();
35
+ console.log(content);
36
+ return content;
37
+ }
38
+ if (key === "devguide") {
39
+ const content = getDevGuideDoc();
40
+ console.log(content);
41
+ return content;
42
+ }
43
+ throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
44
+ }
45
+
46
+ module.exports = doc;
@@ -0,0 +1,61 @@
1
+ # CloudCC 单点登录 CLI 命令说明
2
+
3
+ ## 支持的命令
4
+
5
+ | 操作 | 说明 |
6
+ |------|------|
7
+ | `get` | 查询单点登录配置列表 |
8
+ | `delete` | 删除单点登录记录 |
9
+
10
+ ## CLI 命令详解
11
+
12
+ ### 查询单点登录配置列表
13
+
14
+ ```bash
15
+ cc get singleSignOn <projectPath> [encodedCondJson]
16
+ ```
17
+
18
+ **参数说明:**
19
+
20
+ | 参数 | 必填 | 说明 |
21
+ |------|------|------|
22
+ | `projectPath` | 否 | 项目路径,默认当前目录 |
23
+ | `encodedCondJson` | 否 | URI 编码后的查询条件 JSON |
24
+
25
+ **查询条件参数:**
26
+
27
+ | 参数名 | 类型 | 说明 |
28
+ |--------|------|------|
29
+ | `start` | number | 起始位置,默认 0 |
30
+ | `limit` | number | 每页条数,默认 30 |
31
+ | `keyword` | string | 搜索关键词 |
32
+
33
+ **示例:**
34
+
35
+ ```bash
36
+ # 获取所有单点登录配置
37
+ cc get singleSignOn .
38
+
39
+ # 带查询条件(搜索关键词)
40
+ cc get singleSignOn . '%7B%22keyword%22%3A%22test%22%2C%22limit%22%3A50%7D'
41
+ ```
42
+
43
+ ### 删除单点登录记录
44
+
45
+ ```bash
46
+ cc delete singleSignOn <projectPath> <id>
47
+ ```
48
+
49
+ **参数说明:**
50
+
51
+ | 参数 | 必填 | 说明 |
52
+ |------|------|------|
53
+ | `projectPath` | 否 | 项目路径,默认当前目录 |
54
+ | `id` | 是 | 单点登录记录 id(从列表接口获取)|
55
+
56
+ **示例:**
57
+
58
+ ```bash
59
+ # 删除单点登录记录
60
+ cc delete singleSignOn . 20246DB16F11EDF4KHWd
61
+ ```
@@ -0,0 +1,3 @@
1
+ # CloudCC 单点登录(SingleSignOn)
2
+
3
+ 单点登录(SSO)设置用于管理 CloudCC 平台中的服务提供商(SP)配置,支持查看和删除 SP 配置记录。
@@ -0,0 +1,70 @@
1
+ const { postClass } = require("../../utils/http");
2
+ const { getPackageJson } = require("../../utils/config");
3
+ const chalk = require("chalk");
4
+
5
+ /**
6
+ * 查询单点登录配置列表
7
+ * 接口: /spconfig/list
8
+ * 用法:cc get singleSignOn <projectPath> [encodedCondJson]
9
+ */
10
+ async function get(argvs, isMcp = false) {
11
+ const projectPath = argvs[2] || process.cwd();
12
+ const condArg = argvs[3];
13
+
14
+ let body = {};
15
+ if (condArg) {
16
+ try {
17
+ body = JSON.parse(decodeURI(condArg));
18
+ } catch (e) {
19
+ try {
20
+ body = JSON.parse(condArg);
21
+ } catch (e2) {
22
+ throw new Error("Get SingleSignOn Failed: encodedCondJson 解析失败,请传 encodeURI(JSON.stringify(...))");
23
+ }
24
+ }
25
+ }
26
+
27
+ const config = await getPackageJson(projectPath);
28
+
29
+ const res = await postClass(
30
+ config.setupSvc + "/api/spconfig/list",
31
+ {
32
+ start: 0,
33
+ limit: 30,
34
+ keyword: "",
35
+ ...body
36
+ },
37
+ config.accessToken
38
+ );
39
+
40
+ if (res && res.result) {
41
+ const data = res.data;
42
+ let rawList = [];
43
+ if (Array.isArray(data)) {
44
+ rawList = data;
45
+ } else if (data && Array.isArray(data.list)) {
46
+ rawList = data.list;
47
+ } else if (data && Array.isArray(data.data)) {
48
+ rawList = data.data;
49
+ } else if (data && typeof data === "object") {
50
+ rawList = Object.keys(data)
51
+ .filter((key) => /list$/i.test(key) && Array.isArray(data[key]))
52
+ .flatMap((key) =>
53
+ data[key].map((item) => ({
54
+ ...item,
55
+ __group: key
56
+ }))
57
+ );
58
+ }
59
+
60
+ if (!isMcp) {
61
+ console.log(JSON.stringify(rawList, null, 2));
62
+ }
63
+ return rawList;
64
+ }
65
+
66
+ const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
67
+ throw new Error("Get SingleSignOn Failed: " + msg);
68
+ }
69
+
70
+ module.exports = get;
@@ -0,0 +1,10 @@
1
+ const cc = {}
2
+ cc.delete = require("./delete")
3
+ cc.get = require("./get")
4
+ cc.doc = require("./doc")
5
+
6
+ function main(action, argvs) {
7
+ cc[action](argvs)
8
+ }
9
+
10
+ module.exports = main;
@@ -1,3 +1,46 @@
1
1
  # CloudCC 静态资源介绍
2
2
 
3
- TODO
3
+ ## 1. 模块定位
4
+
5
+ 静态资源用于统一托管前端开发中需要复用的文件资源(如图片、字体、JS/CSS 文件、压缩包等)。
6
+ 当资源不适合直接内嵌在代码中时,可上传到静态资源库,再通过平台提供的访问链接在组件、页面、脚本中引用。
7
+
8
+ ## 2. 典型使用场景
9
+
10
+ - 自定义组件引用公共图片、图标、字体文件
11
+ - 自定义页面加载第三方前端库(如工具函数、样式文件)
12
+ - 多个业务功能共享同一份资源,避免重复上传与多处维护
13
+
14
+ ## 3. 控制台入口
15
+
16
+ 1. 登录 CloudCC 系统
17
+ 2. 点击右上角头像,进入「开发者平台」(当前仅管理员简档可见)
18
+ 3. 在左侧菜单进入:`扩展 -> 静态资源`
19
+
20
+ ## 4. 核心操作流程
21
+
22
+ ### 4.1 新建静态资源
23
+
24
+ 1. 点击「新建」
25
+ 2. 填写必要信息(名称/标签、描述等)
26
+ 3. 上传资源文件并保存
27
+
28
+ ### 4.2 获取访问链接并应用
29
+
30
+ 1. 在资源列表中找到目标资源
31
+ 2. 点击复制图标获取资源访问链接
32
+ 3. 在组件/页面/脚本中使用该链接
33
+
34
+ ## 5. 关键约束与注意事项
35
+
36
+ - 单个上传文件大小上限为 `5MB`
37
+ - 建议使用可读性强、可维护的命名规范,便于检索和复用
38
+ - 发布前应验证访问链接可用性,避免页面出现 404 或加载失败
39
+ - 建议在团队内约定资源分类(如 `img/`、`font/`、`vendor/`)与版本策略
40
+
41
+ ## 6. 设计建议(面向实施)
42
+
43
+ - **先复用后新增**:优先检查资源库中是否已有同类资源,减少冗余
44
+ - **按用途分层管理**:将业务资源与公共资源分开,降低变更影响
45
+ - **关注性能**:对图片进行压缩,避免引入过大的静态文件影响加载速度
46
+ - **建立变更记录**:重大资源替换建议记录版本和影响范围,便于回滚与排查