cloudcc-cli 2.3.0 → 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.
- package/.claude/settings.json +15 -0
- package/.cloudcc-cache.json +17 -48
- package/.cursor/skills/cloudcc-cli-dev.zip +0 -0
- package/.cursor/skills/cloudcc-cli-usage/SKILL.md +67 -0
- package/README.md +22 -0
- package/bin/cc.js +13 -8
- package/bin/index.js +12 -2
- package/bin/mcp.js +1 -1
- package/build/{component-cc-test-001.common.js → component-CCPlugin1774500425584.common.js} +25 -25
- package/build/component-CCPlugin1774500425584.common.js.map +1 -0
- package/build/component-CCPlugin1774500425584.css +1 -0
- package/build/{component-cc-test-001.umd.js → component-CCPlugin1774500425584.umd.js} +27 -27
- package/build/component-CCPlugin1774500425584.umd.js.map +1 -0
- package/build/{component-cc-test-001.umd.min.js → component-CCPlugin1774500425584.umd.min.js} +3 -3
- package/build/component-CCPlugin1774500425584.umd.min.js.map +1 -0
- package/build/demo.html +1 -1
- package/{src/mcp → mcp}/tools/Class Editor Guide/handler.js +12 -4
- package/{src/mcp → mcp}/tools/Component Editor Guide/handler.js +15 -14
- package/{src/mcp → mcp}/tools/Trigger Editor Guide/handler.js +8 -2
- package/package.json +2 -2
- package/src/application/delete.js +59 -0
- package/src/application/doc.js +46 -0
- package/src/application/docs/devguide.md +173 -0
- package/src/application/docs/introduction.md +81 -0
- package/src/application/get.js +31 -5
- package/src/application/index.js +2 -0
- package/src/brief/get.js +1 -1
- package/src/classes/create.js +6 -1
- package/src/classes/delete.js +49 -0
- package/src/classes/detail.js +21 -7
- package/src/classes/doc.js +49 -472
- package/src/classes/docs/devguide.md +451 -0
- package/src/classes/get.js +9 -2
- package/src/classes/index.js +3 -1
- package/src/classes/publish.js +6 -1
- package/src/classes/pull.js +6 -1
- package/src/classes/pullList.js +6 -3
- package/src/config/doc.js +31 -0
- package/src/config/docs/devguide.md +100 -0
- package/src/config/index.js +5 -0
- package/src/customPage/create.js +109 -14
- package/src/customPage/delete.js +2 -2
- package/src/customPage/doc.js +46 -0
- package/src/customPage/docs/devguide.md +200 -0
- package/src/customPage/docs/introduction.md +224 -0
- package/src/customPage/get.js +1 -1
- package/src/customPage/index.js +1 -0
- package/src/customSetting/create.js +36 -0
- package/src/customSetting/delete.js +35 -0
- package/src/customSetting/deleteCustomSettingField.js +43 -0
- package/src/customSetting/detail.js +33 -0
- package/src/customSetting/doc.js +22 -179
- package/src/customSetting/docs/devguide.md +181 -0
- package/src/customSetting/docs/introduction.md +3 -0
- package/src/customSetting/editCustomSettingField.js +34 -0
- package/src/customSetting/get.js +34 -0
- package/src/customSetting/index.js +10 -1
- package/src/customSetting/modify.js +30 -0
- package/src/customSetting/saveCustomSettingField.js +46 -0
- package/src/fields/delete.js +52 -0
- package/src/fields/doc.js +45 -0
- package/src/fields/docs/devguide.md +224 -0
- package/src/fields/docs/introduction.md +217 -0
- package/src/fields/index.js +2 -0
- package/src/globalSelectList/create.js +51 -0
- package/src/globalSelectList/delete.js +56 -0
- package/src/globalSelectList/detail.js +45 -0
- package/src/globalSelectList/doc.js +52 -0
- package/src/globalSelectList/docs/devguide.md +212 -0
- package/src/globalSelectList/docs/introduction.md +82 -0
- package/src/globalSelectList/get.js +31 -0
- package/src/globalSelectList/index.js +16 -0
- package/src/menu/create-page.js +54 -26
- package/src/menu/create-script.js +67 -19
- package/src/menu/create.js +9 -3
- package/src/menu/delete.js +59 -0
- package/src/menu/doc.js +57 -0
- package/src/menu/docs/devguide.md +203 -0
- package/src/menu/docs/introduction.md +99 -0
- package/src/menu/get.js +56 -0
- package/src/menu/index.js +3 -0
- package/src/menu/validator.js +80 -0
- package/src/object/delete.js +51 -0
- package/src/object/doc.js +45 -0
- package/src/object/docs/devguide.md +112 -0
- package/src/object/docs/introduction.md +187 -0
- package/src/object/get.js +1 -23
- package/src/object/index.js +2 -0
- package/src/pagelayout/create.js +123 -0
- package/src/pagelayout/doc.js +46 -0
- package/src/pagelayout/docs/devguide.md +295 -0
- package/src/pagelayout/docs/introduction.md +44 -0
- package/src/pagelayout/get.js +46 -0
- package/src/pagelayout/index.js +9 -0
- package/src/plugin/detail.js +14 -6
- package/src/plugin/doc.js +43 -863
- package/src/plugin/docs/devguide.md +923 -0
- package/src/plugin/publish1.js +3 -3
- package/src/profile/create.js +108 -0
- package/src/profile/delete.js +59 -0
- package/src/profile/doc.js +46 -0
- package/src/profile/docs/devguide.md +332 -0
- package/src/profile/docs/introduction.md +123 -0
- package/src/profile/get.js +55 -0
- package/src/profile/index.js +14 -0
- package/src/project/doc.js +39 -372
- package/src/project/docs/devguide.md +359 -0
- package/src/project/docs/introduction.md +3 -0
- package/src/recordType/create.js +77 -0
- package/src/recordType/delete.js +52 -0
- package/src/recordType/doc.js +36 -0
- package/src/recordType/docs/devguide.md +160 -0
- package/src/recordType/docs/introduction.md +53 -0
- package/src/recordType/editInfo.js +39 -0
- package/src/recordType/editSave.js +47 -0
- package/src/recordType/get.js +1 -1
- package/src/recordType/getList.js +31 -0
- package/src/recordType/index.js +16 -3
- package/src/recordType/newInfo.js +39 -0
- package/src/recordType/validDelete.js +91 -0
- package/src/res.md +66 -0
- package/src/role/create.js +153 -0
- package/src/role/delete.js +59 -0
- package/src/role/doc.js +46 -0
- package/src/role/docs/devguide.md +387 -0
- package/src/role/docs/introduction.md +124 -0
- package/src/role/get.js +57 -0
- package/src/role/index.js +10 -0
- package/src/scheduleJob/delete.js +26 -0
- package/src/scheduleJob/detail.js +23 -0
- package/src/scheduleJob/doc.js +49 -0
- package/src/scheduleJob/docs/devguide.md +79 -0
- package/src/scheduleJob/docs/introduction.md +101 -0
- package/src/scheduleJob/get.js +26 -0
- package/src/scheduleJob/index.js +15 -0
- package/src/script/delete.js +112 -0
- package/src/script/doc.js +31 -245
- package/src/script/docs/devguide.md +290 -0
- package/src/script/docs/introduction.md +48 -0
- package/src/script/index.js +1 -0
- package/src/staticResource/count.js +46 -0
- package/src/staticResource/create.js +97 -0
- package/src/staticResource/delete.js +48 -0
- package/src/staticResource/detail.js +46 -0
- package/src/staticResource/doc.js +39 -0
- package/src/staticResource/docs/devguide.md +157 -0
- package/src/staticResource/docs/introduction.md +3 -0
- package/src/staticResource/get.js +48 -0
- package/src/staticResource/index.js +13 -0
- package/src/timer/create.js +6 -1
- package/src/timer/delete.js +49 -0
- package/src/timer/detail.js +5 -5
- package/src/timer/doc.js +57 -0
- package/src/timer/get.js +7 -1
- package/src/timer/index.js +4 -1
- package/src/timer/publish.js +6 -1
- package/src/timer/pull.js +6 -1
- package/src/timer/pullList.js +5 -3
- package/src/triggers/delete.js +46 -0
- package/src/triggers/detail.js +5 -5
- package/src/triggers/doc.js +49 -364
- package/src/triggers/docs/devguide.md +334 -0
- package/src/triggers/get.js +7 -3
- package/src/triggers/index.js +2 -4
- package/src/triggers/pullList.js +7 -7
- package/src/user/create.js +50 -0
- package/src/user/delete.js +59 -0
- package/src/user/doc.js +46 -0
- package/src/user/docs/devguide.md +634 -0
- package/src/user/docs/introduction.md +124 -0
- package/src/user/get.js +112 -0
- package/src/user/index.js +12 -0
- package/src/user/update.js +96 -0
- package/src/user/view.js +60 -0
- package/test/application.cli.test.js +49 -8
- package/test/classes.cli.test.js +14 -5
- package/test/customPage.cli.test.js +96 -0
- package/test/customSetting.cli.test.js +84 -0
- package/test/fields.cli.test.js +18 -3
- package/test/globalSelectList.cli.test.js +94 -0
- package/test/menu-script.cli.test.js +147 -0
- package/test/menu.cli.test.js +42 -5
- package/test/object.cli.test.js +17 -1
- package/test/plugin.cli.test.js +5 -3
- package/test/scheduleJob.cli.test.js +52 -0
- package/test/staticResource.cli.test.js +78 -0
- package/test/timer.cli.test.js +20 -7
- package/test/trigger.cli.test.js +13 -5
- package/tmp_customsetting_detail.json +1 -0
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_CLASS.md +0 -97
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_SCHEDULE.md +0 -78
- package/.cursor/skills/cloudcc-cli-dev/BACKEND_TRIGGER.md +0 -137
- package/.cursor/skills/cloudcc-cli-dev/CLI_CHEATSHEET.md +0 -215
- package/.cursor/skills/cloudcc-cli-dev/CUSTOM-SETTING-API.md +0 -241
- package/.cursor/skills/cloudcc-cli-dev/INSTALL_AND_BOOTSTRAP.md +0 -59
- package/.cursor/skills/cloudcc-cli-dev/OBJECTS_AND_FIELDS.md +0 -120
- package/.cursor/skills/cloudcc-cli-dev/REQUIREMENTS_BREAKDOWN.md +0 -98
- package/.cursor/skills/cloudcc-cli-dev/SKILL.md +0 -44
- package/.cursor/skills/cloudcc-cli-dev/VUE_CUSTOM_COMPONENT.md +0 -151
- package/build/component-cc-test-001.common.js.map +0 -1
- package/build/component-cc-test-001.css +0 -1
- package/build/component-cc-test-001.umd.js.map +0 -1
- package/build/component-cc-test-001.umd.min.js.map +0 -1
- package/classes/CCdd/CCdd.java +0 -22
- package/classes/CCdd/CCddTest.java +0 -11
- package/classes/CCdd/config.json +0 -1
- package/core.zip +0 -0
- package/plugins/cc-test-001/cc-test-001.vue +0 -32
- package/plugins/cc-test-001/components/HelloWorld.vue +0 -11
- package/plugins/cc-test-001/config.json +0 -6
- package/schedule/CCdd/CCdd.java +0 -11
- package/schedule/CCdd/config.json +0 -1
- package/src/approval/approve.js +0 -105
- package/src/approval/get.js +0 -245
- package/src/approval/index.js +0 -11
- package/src/approval/reject.js +0 -105
- package/src/plugin/readme.md +0 -7
- package/target/ccopenapi-0.0.4-classes.jar +0 -0
- package/target/ccopenapi-0.0.4.jar +0 -0
- package/target/classes/CCdd/CCdd.class +0 -0
- package/target/classes/CCdd/CCddTest.class +0 -0
- package/target/classes/CCdd/config.json +0 -1
- package/target/maven-archiver/pom.properties +0 -3
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +0 -20
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +0 -19
- /package/{src/mcp → mcp}/cliRunner.js +0 -0
- /package/{src/mcp → mcp}/index.js +0 -0
- /package/{src/mcp → mcp}/readme.md +0 -0
- /package/{src/mcp → mcp}/tools/Application Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Approval/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Class Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Editor Guide/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Client Script Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/CloudCC Development Overview/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Component Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Creator/fetcher.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Dev Environment Validator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/fetcher.js +0 -0
- /package/{src/mcp → mcp}/tools/Developer Key Setup Guide/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/JSP Migrator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Menu Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Fields Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object Fields Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Object List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Scheduled Class Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Creator/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Detail Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger List Retriever/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Publisher/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/Trigger Puller/handler.js +0 -0
- /package/{src/mcp → mcp}/tools/index.js +0 -0
- /package/{docs//350/207/252/345/256/232/344/271/211/347/261/273.md" → src/classes/docs/introduction.md} +0 -0
- /package/{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
- /package/{docs/cloudcc/345/256/232/346/227/266/344/275/234/344/270/232.md" → src/timer/docs/devguide.md} +0 -0
- /package/{docs/cloudcc/345/256/232/346/227/266/347/261/273.md" → src/timer/docs/introduction.md} +0 -0
- /package/{docs//350/247/246/345/217/221/345/231/250/347/261/273.md" → src/triggers/docs/introduction.md} +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const chalk = require("chalk");
|
|
2
|
+
const { postClass } = require("../../utils/http");
|
|
3
|
+
const { getPackageJson } = require("../../utils/config");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 删除自定义菜单(标签页)
|
|
7
|
+
* 用法:cc delete menu <projectPath> <tabId>
|
|
8
|
+
*/
|
|
9
|
+
async function remove(argvs) {
|
|
10
|
+
try {
|
|
11
|
+
const projectPath = argvs[2] || process.cwd();
|
|
12
|
+
const tabId = argvs[3];
|
|
13
|
+
|
|
14
|
+
if (!tabId) {
|
|
15
|
+
console.error();
|
|
16
|
+
console.error(chalk.red("Error: 缺少菜单 ID"));
|
|
17
|
+
console.error(chalk.yellow("用法: cc delete menu <projectPath> <tabId>"));
|
|
18
|
+
console.error();
|
|
19
|
+
throw new Error("缺少必需参数: tabId");
|
|
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(`Deleting menu (${tabId}), please wait...`));
|
|
32
|
+
console.error();
|
|
33
|
+
|
|
34
|
+
const result = await postClass(
|
|
35
|
+
config.setupSvc + "/api/customTab/deleteTab",
|
|
36
|
+
{ id: tabId },
|
|
37
|
+
config.accessToken
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
if (result && result.result) {
|
|
41
|
+
console.error();
|
|
42
|
+
console.error(chalk.green("Success! Menu deleted."));
|
|
43
|
+
console.error();
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const msg = result && (result.returnInfo || result.message) ? (result.returnInfo || result.message) : "Unknown error";
|
|
48
|
+
console.error();
|
|
49
|
+
console.error(chalk.red("Error: " + msg));
|
|
50
|
+
console.error();
|
|
51
|
+
throw new Error("Delete Menu Failed: " + msg);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error();
|
|
54
|
+
console.error(chalk.red("菜单删除失败:"), error);
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = remove;
|
package/src/menu/doc.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* menu 文档入口:正文均在 `docs/` 目录。
|
|
3
|
+
*/
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
|
|
7
|
+
const DOCS_DIR = path.join(__dirname, "docs");
|
|
8
|
+
const CCDK_SDK = path.join(__dirname, "..", "api", "ccdk-sdk.md");
|
|
9
|
+
|
|
10
|
+
function readDocFile(basename) {
|
|
11
|
+
return fs.readFileSync(path.join(DOCS_DIR, `${basename}.md`), "utf8");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** 介绍文档:菜单能力、类型与入口 */
|
|
15
|
+
function getIntroductionDoc() {
|
|
16
|
+
return readDocFile("introduction");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** 开发指导:CLI 创建/查询/删除等;末尾拼接 CCDK SDK 速查 */
|
|
20
|
+
function getDevGuideDoc() {
|
|
21
|
+
const base = readDocFile("devguide").trimEnd();
|
|
22
|
+
let sdk = "";
|
|
23
|
+
try {
|
|
24
|
+
sdk = fs.readFileSync(CCDK_SDK, "utf8").trim();
|
|
25
|
+
} catch (e) {
|
|
26
|
+
sdk = "";
|
|
27
|
+
}
|
|
28
|
+
if (!sdk) {
|
|
29
|
+
return base;
|
|
30
|
+
}
|
|
31
|
+
return [base, "", "---", "", "## 附录:CCDK SDK 速查", "", sdk, ""].join("\n");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* cc doc menu <introduction|devguide>
|
|
36
|
+
* @param {string[]} argvs [doc, type, introduction|devguide, ...]
|
|
37
|
+
*/
|
|
38
|
+
function doc(argvs) {
|
|
39
|
+
const subType = argvs[2];
|
|
40
|
+
const key = String(subType || "").trim().toLowerCase();
|
|
41
|
+
if (!key) {
|
|
42
|
+
throw new Error("cc doc menu 需要子命令:introduction 或 devguide");
|
|
43
|
+
}
|
|
44
|
+
if (key === "introduction") {
|
|
45
|
+
const content = getIntroductionDoc();
|
|
46
|
+
console.log(content);
|
|
47
|
+
return content;
|
|
48
|
+
}
|
|
49
|
+
if (key === "devguide") {
|
|
50
|
+
const content = getDevGuideDoc();
|
|
51
|
+
console.log(content);
|
|
52
|
+
return content;
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`doc 不支持的子命令: ${subType},请使用 introduction 或 devguide`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = doc;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# CloudCC 菜单开发指南
|
|
2
|
+
|
|
3
|
+
## 1. 模块定位
|
|
4
|
+
|
|
5
|
+
`menu` 模块用于创建、查询、删除 CloudCC 菜单(标签页)。
|
|
6
|
+
菜单是对象、页面、脚本能力的可视化入口,也是应用导航的重要组成部分。
|
|
7
|
+
|
|
8
|
+
可通过以下命令查看文档:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
cc doc menu introduction
|
|
12
|
+
cc doc menu devguide
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. 开发前准备
|
|
18
|
+
|
|
19
|
+
执行菜单相关命令前,请确认:
|
|
20
|
+
|
|
21
|
+
- 已完成 `cc doc project devguide` 的环境初始化
|
|
22
|
+
- 项目根目录存在可用的 `cloudcc-cli.config.js`
|
|
23
|
+
- 当前环境连接可用(org / token / endpoint 正确)
|
|
24
|
+
- 已明确菜单所属资源(对象 ID、页面 API、脚本内容或站点 ID)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 3. 支持的命令总览
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
cc create menu object <path> <objectId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
|
|
32
|
+
cc create menu page <path> <pageApi> <tabName> <pname> [tabStyle] [mobileimg] [cloudccservicetab] [mobileurl]
|
|
33
|
+
cc create menu script <path> <tabName> <pname> [functioncode] [tabStyle] [mobileimg] [cloudccservicetab]
|
|
34
|
+
cc create menu site <path> <siteId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
|
|
35
|
+
|
|
36
|
+
cc get menu <projectPath> [encodedCondJson]
|
|
37
|
+
cc delete menu <projectPath> <tabId>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 4. 创建菜单
|
|
43
|
+
|
|
44
|
+
### 4.1 创建自定义对象菜单
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cc create menu object <path> <objectId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
参数说明:
|
|
51
|
+
|
|
52
|
+
- `path`:项目路径,`.` 表示当前目录
|
|
53
|
+
- `objectId`:自定义对象 ID
|
|
54
|
+
- `tabName`:菜单显示名称
|
|
55
|
+
- `tabStyle`:PC 端图标(可选,默认 `cloudtab145`)
|
|
56
|
+
- `mobileimg`:移动端图标(可选,默认 `cloudcc01`)
|
|
57
|
+
- `cloudccservicetab`:服务图标(可选,默认 `cloudccservicetab_1`)
|
|
58
|
+
|
|
59
|
+
示例:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
cc create menu object . a0F9D000000XXXXUAI "客户管理"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 4.2 创建自定义页面菜单
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
cc create menu page <path> <pageApi> <tabName> <pname> [tabStyle] [mobileimg] [cloudccservicetab] [mobileurl]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
参数说明:
|
|
72
|
+
|
|
73
|
+
- `path`:项目路径
|
|
74
|
+
- `pageApi`:自定义页面 API 名称(CLI 会追加 `#lightning`)
|
|
75
|
+
- `tabName`:菜单显示名称
|
|
76
|
+
- `pname`:菜单内部名称(建议字母开头,字母/数字/下划线)
|
|
77
|
+
- `tabStyle` / `mobileimg` / `cloudccservicetab`:图标参数(可选)
|
|
78
|
+
- `mobileurl`:移动端地址(可选)
|
|
79
|
+
|
|
80
|
+
示例:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
cc create menu page . contract-assistant "合同助手" contract_menu
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 4.3 创建自定义脚本菜单
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
cc create menu script <path> <tabName> <pname> [functioncode] [tabStyle] [mobileimg] [cloudccservicetab]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
参数说明:
|
|
93
|
+
|
|
94
|
+
- `path`:项目路径
|
|
95
|
+
- `tabName`:菜单显示名称
|
|
96
|
+
- `pname`:菜单内部名称
|
|
97
|
+
- `functioncode`:脚本内容(可选,默认示例脚本)
|
|
98
|
+
- `tabStyle` / `mobileimg` / `cloudccservicetab`:图标参数(可选)
|
|
99
|
+
|
|
100
|
+
示例:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
cc create menu script . "数据导入工具" data_import_menu "ccc.alert('Hello World');"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 4.4 创建站点菜单
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
cc create menu site <path> <siteId> <tabName> [tabStyle] [mobileimg] [cloudccservicetab]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
参数说明:
|
|
113
|
+
|
|
114
|
+
- `path`:项目路径
|
|
115
|
+
- `siteId`:站点 ID
|
|
116
|
+
- `tabName`:菜单显示名称
|
|
117
|
+
- `tabStyle` / `mobileimg` / `cloudccservicetab`:图标参数(可选)
|
|
118
|
+
|
|
119
|
+
示例:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
cc create menu site . a0H9D000000XXXXUAI "合作伙伴门户"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 5. 查询与删除
|
|
128
|
+
|
|
129
|
+
### 5.1 查询菜单
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
cc get menu <projectPath> [encodedCondJson]
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
说明:
|
|
136
|
+
|
|
137
|
+
- `projectPath` 默认当前目录
|
|
138
|
+
- `encodedCondJson` 为 URI 编码后的 JSON 查询条件
|
|
139
|
+
|
|
140
|
+
示例:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
cc get menu .
|
|
144
|
+
cc get menu . '%7B%22type%22%3A%22page%22%7D'
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 5.2 删除菜单
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
cc delete menu <projectPath> <tabId>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
说明:
|
|
154
|
+
|
|
155
|
+
- `tabId` 为菜单 ID,建议先执行 `cc get menu .` 再删除
|
|
156
|
+
|
|
157
|
+
示例:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
cc delete menu . a0I9D000000XXXXUAI
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 6. 与后台菜单配置流程的映射
|
|
166
|
+
|
|
167
|
+
根据 CloudCC 官方菜单流程,完整上线通常包含三层动作:
|
|
168
|
+
|
|
169
|
+
1. 新建菜单(对象 / 页面 / 脚本)
|
|
170
|
+
2. 添加到简档(控制可见角色)
|
|
171
|
+
3. 添加到应用程序(控制出现在什么应用)
|
|
172
|
+
|
|
173
|
+
`cloudcc-cli` 当前主要覆盖第 1 步(菜单实体创建)。
|
|
174
|
+
因此在 CLI 创建后,建议在后台继续核验第 2-3 步,确保用户可见且出现在目标应用导航中。
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 7. 常见注意事项
|
|
179
|
+
|
|
180
|
+
- 菜单创建成功不等于用户可见,需检查简档权限
|
|
181
|
+
- 菜单创建成功不等于出现在预期应用,需检查应用挂载
|
|
182
|
+
- `page` 类型请确认页面 API 存在且可访问
|
|
183
|
+
- 删除菜单前确认未被培训文档、操作手册或用户流程依赖
|
|
184
|
+
- 建议先在测试环境验证,再在生产环境执行
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 8. 推荐操作顺序
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# 1) 查询现有菜单,避免重名
|
|
192
|
+
cc get menu .
|
|
193
|
+
|
|
194
|
+
# 2) 创建目标菜单(示例:页面菜单)
|
|
195
|
+
cc create menu page . contract-manage "合同管理" contract_menu
|
|
196
|
+
|
|
197
|
+
# 3) 再次查询确认已创建
|
|
198
|
+
cc get menu .
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
创建后请在 CloudCC 后台完成简档与应用核验。
|
|
202
|
+
|
|
203
|
+
---
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# CloudCC 菜单模块介绍
|
|
2
|
+
|
|
3
|
+
## 1. 模块定位
|
|
4
|
+
|
|
5
|
+
`menu` 模块用于在 CloudCC
|
|
6
|
+
中创建和管理导航菜单(标签页),把对象、页面或脚本能力暴露给业务用户。
|
|
7
|
+
|
|
8
|
+
在 CloudCC
|
|
9
|
+
中,菜单是用户看到系统功能的主要入口。对象、页面、脚本等能力通常需要通过菜单挂载到应用中,才方便被终端用户访问。
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 2. 菜单能做什么
|
|
14
|
+
|
|
15
|
+
通过菜单模块,你可以:
|
|
16
|
+
|
|
17
|
+
- 为自定义对象创建入口
|
|
18
|
+
- 为自定义页面创建入口
|
|
19
|
+
- 为自定义脚本创建入口
|
|
20
|
+
- 将入口加入应用导航
|
|
21
|
+
- 配置 PC 与移动端图标,统一产品体验
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 3. 支持的菜单类型
|
|
26
|
+
|
|
27
|
+
| 类型 | 说明 | 常见用途 |
|
|
28
|
+
| -------- | -------------- | ------------------------- |
|
|
29
|
+
| `object` | 自定义对象菜单 | 打开对象列表/详情能力 |
|
|
30
|
+
| `page` | 自定义页面菜单 | 打开 Lightning 自定义页面 |
|
|
31
|
+
| `script` | 自定义脚本菜单 | 点击后执行脚本逻辑 |
|
|
32
|
+
| `site` | 站点菜单 | 关联 Site.com 站点 |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 4. 菜单在平台中的典型流程
|
|
37
|
+
|
|
38
|
+
参考 CloudCC 官方「菜单」能力,创建菜单通常包含以下流程:
|
|
39
|
+
|
|
40
|
+
1. 进入后台设置,打开菜单管理
|
|
41
|
+
2. 新建菜单(对象菜单 / 页面菜单 / 脚本菜单)
|
|
42
|
+
3. 配置菜单标签与图标
|
|
43
|
+
4. 选择可见简档(决定谁能看到菜单)
|
|
44
|
+
5. 选择要加入的应用程序(决定菜单出现在哪个应用)
|
|
45
|
+
6. 保存并验证显示效果
|
|
46
|
+
|
|
47
|
+
在 `cloudcc-cli` 中,你主要通过 `cc create menu ...` 完成第 2-3
|
|
48
|
+
步;权限与应用归属建议在创建后补充核验。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 5. 为什么要用菜单模块
|
|
53
|
+
|
|
54
|
+
菜单模块解决的是“能力可访问性”问题:
|
|
55
|
+
|
|
56
|
+
- 只创建对象/页面,不创建菜单,用户通常无法在导航中直接发现该能力
|
|
57
|
+
- 通过菜单可将功能按业务场景组织到不同应用
|
|
58
|
+
- 结合简档权限,可对不同角色展示不同入口
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 6. 适用场景
|
|
63
|
+
|
|
64
|
+
以下场景建议使用 `menu` 模块:
|
|
65
|
+
|
|
66
|
+
- 新建了自定义对象,需要给业务团队增加入口
|
|
67
|
+
- 开发了 Lightning 自定义页面,需要挂到导航栏
|
|
68
|
+
- 需要提供一个一键执行脚本的菜单入口
|
|
69
|
+
- 不同业务线需要在各自应用里看到不同菜单组合
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 7. 与其他模块的关系
|
|
74
|
+
|
|
75
|
+
`menu` 常与以下模块协同:
|
|
76
|
+
|
|
77
|
+
- `object`:菜单绑定对象能力
|
|
78
|
+
- `customPage`:菜单绑定页面能力
|
|
79
|
+
- `script`:菜单绑定脚本能力
|
|
80
|
+
- `application`:菜单最终出现在具体应用中
|
|
81
|
+
- `project`:提供连接配置与环境能力
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 8. 建议实践
|
|
86
|
+
|
|
87
|
+
- 菜单命名与对象/页面语义保持一致,降低学习成本
|
|
88
|
+
- 先在测试环境完成创建与权限验证,再推向生产
|
|
89
|
+
- 统一图标规范,避免同一应用内视觉风格不一致
|
|
90
|
+
- 创建后立即验证简档可见性与应用挂载是否正确
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 9. 相关文档与命令
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cc doc menu introduction
|
|
98
|
+
cc doc menu devguide
|
|
99
|
+
```
|
package/src/menu/get.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const { postClass } = require("../../utils/http");
|
|
2
|
+
const { getPackageJson } = require("../../utils/config");
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 查询自定义菜单(标签页)列表
|
|
6
|
+
* 用法:cc get menu <projectPath> [encodedCondJson]
|
|
7
|
+
*/
|
|
8
|
+
async function get(argvs, isMcp = false) {
|
|
9
|
+
const projectPath = argvs[2] || process.cwd();
|
|
10
|
+
const condArg = argvs[3];
|
|
11
|
+
|
|
12
|
+
let body = {};
|
|
13
|
+
if (condArg) {
|
|
14
|
+
try {
|
|
15
|
+
body = JSON.parse(decodeURI(condArg));
|
|
16
|
+
} catch (e) {
|
|
17
|
+
throw new Error("Get Menu Failed: encodedCondJson 解析失败,请传 encodeURI(JSON.stringify(...))");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const config = await getPackageJson(projectPath);
|
|
22
|
+
const res = await postClass(
|
|
23
|
+
config.setupSvc + "/api/customTab/queryTabList",
|
|
24
|
+
body,
|
|
25
|
+
config.accessToken
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
if (res && res.result) {
|
|
29
|
+
const data = res.data;
|
|
30
|
+
let rawList = [];
|
|
31
|
+
if (Array.isArray(data)) {
|
|
32
|
+
rawList = data;
|
|
33
|
+
} else if (data && Array.isArray(data.list)) {
|
|
34
|
+
rawList = data.list;
|
|
35
|
+
} else if (data && typeof data === "object") {
|
|
36
|
+
// 兼容 queryTabList 返回的分组结构:botlist/objectlist/objlist/pagelist/scriptlist...
|
|
37
|
+
rawList = Object.keys(data)
|
|
38
|
+
.filter((key) => /list$/i.test(key) && Array.isArray(data[key]))
|
|
39
|
+
.flatMap((key) =>
|
|
40
|
+
data[key].map((item) => ({
|
|
41
|
+
...item,
|
|
42
|
+
__group: key
|
|
43
|
+
}))
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
if (!isMcp) {
|
|
47
|
+
console.log(JSON.stringify(rawList));
|
|
48
|
+
}
|
|
49
|
+
return rawList;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const msg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
|
|
53
|
+
throw new Error("Get Menu Failed: " + msg);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module.exports = get;
|
package/src/menu/index.js
CHANGED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
const menuGet = require('./get');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 验证 pname 是否有效
|
|
6
|
+
* 规则:
|
|
7
|
+
* 1. 只能包含字母、数字、下划线
|
|
8
|
+
* 2. 开头必须是字母
|
|
9
|
+
* 3. 不能有中文
|
|
10
|
+
* 4. 必须唯一(查询现有菜单列表)
|
|
11
|
+
*
|
|
12
|
+
* @param {string} pname - 要验证的菜单名称
|
|
13
|
+
* @param {string} projectPath - 项目路径
|
|
14
|
+
* @param {string} currentType - 当前菜单类型 (script/page/object/site)
|
|
15
|
+
* @returns {Promise<{valid: boolean, message?: string}>}
|
|
16
|
+
*/
|
|
17
|
+
async function validatePname(pname, projectPath, currentType) {
|
|
18
|
+
// 1. 检查是否为空
|
|
19
|
+
if (!pname || typeof pname !== 'string') {
|
|
20
|
+
return { valid: false, message: 'pname 不能为空' };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// 2. 检查长度
|
|
24
|
+
if (pname.length < 1 || pname.length > 50) {
|
|
25
|
+
return { valid: false, message: 'pname 长度必须在 1-50 个字符之间' };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 3. 检查是否有中文
|
|
29
|
+
if (/[\u4e00-\u9fa5]/.test(pname)) {
|
|
30
|
+
return { valid: false, message: 'pname 不能包含中文字符' };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 4. 检查开头必须是字母
|
|
34
|
+
if (!/^[a-zA-Z]/.test(pname)) {
|
|
35
|
+
return { valid: false, message: 'pname 必须以字母开头' };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 5. 检查只能包含字母、数字、下划线
|
|
39
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(pname)) {
|
|
40
|
+
return { valid: false, message: 'pname 只能包含字母、数字和下划线' };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 6. 检查唯一性
|
|
44
|
+
try {
|
|
45
|
+
const argvs = ['', '', projectPath];
|
|
46
|
+
const existingMenus = await menuGet(argvs, true);
|
|
47
|
+
|
|
48
|
+
if (Array.isArray(existingMenus)) {
|
|
49
|
+
const duplicate = existingMenus.find(menu =>
|
|
50
|
+
menu.pname === pname && menu.type !== currentType
|
|
51
|
+
);
|
|
52
|
+
if (duplicate) {
|
|
53
|
+
return { valid: false, message: `pname "${pname}" 已被其他菜单使用` };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
} catch (error) {
|
|
57
|
+
// 如果查询失败,记录警告但不阻止创建
|
|
58
|
+
console.error(chalk.yellow(`警告: 无法验证 pname 唯一性: ${error.message}`));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return { valid: true };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 格式化 pname(将不合法字符替换为下划线)
|
|
66
|
+
* @param {string} input - 输入字符串
|
|
67
|
+
* @returns {string} - 格式化后的字符串
|
|
68
|
+
*/
|
|
69
|
+
function formatPname(input) {
|
|
70
|
+
if (!input || typeof input !== 'string') {
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
// 将非字母数字下划线字符替换为下划线
|
|
74
|
+
return input.replace(/[^0-9a-zA-Z_]/g, '_');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = {
|
|
78
|
+
validatePname,
|
|
79
|
+
formatPname
|
|
80
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const chalk = require("chalk");
|
|
2
|
+
const { postClass } = require("../../utils/http");
|
|
3
|
+
const { getPackageJson } = require("../../utils/config");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 删除自定义对象
|
|
7
|
+
* 用法:cc delete object <projectPath> <objid>
|
|
8
|
+
*/
|
|
9
|
+
async function remove(argvs) {
|
|
10
|
+
const projectPath = argvs[2] || process.cwd();
|
|
11
|
+
const objid = argvs[3];
|
|
12
|
+
|
|
13
|
+
if (!objid) {
|
|
14
|
+
console.error();
|
|
15
|
+
console.error(chalk.red("Error: objid is required"));
|
|
16
|
+
console.error(chalk.yellow("Usage: cc delete object <projectPath> <objid>"));
|
|
17
|
+
console.error();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const config = await getPackageJson(projectPath);
|
|
22
|
+
if (!config || !config.accessToken) {
|
|
23
|
+
console.error();
|
|
24
|
+
console.error(chalk.red("Error: Configuration not found or accessToken is missing"));
|
|
25
|
+
console.error();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
console.error();
|
|
30
|
+
console.error(chalk.green(`Deleting custom object (${objid}), please wait...`));
|
|
31
|
+
console.error();
|
|
32
|
+
|
|
33
|
+
const res = await postClass(
|
|
34
|
+
config.setupSvc + "/api/customObject/deleteLogic",
|
|
35
|
+
{ objid },
|
|
36
|
+
config.accessToken
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (res && res.result) {
|
|
40
|
+
console.error(chalk.green("Success! Custom object deleted."));
|
|
41
|
+
console.error();
|
|
42
|
+
return res;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const errMsg = res && (res.returnInfo || res.message) ? (res.returnInfo || res.message) : "Unknown error";
|
|
46
|
+
console.error(chalk.red(`Fail: ${errMsg}`));
|
|
47
|
+
console.error();
|
|
48
|
+
throw new Error("Delete Custom Object Failed: " + errMsg);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = remove;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
|
|
4
|
+
const DOCS_DIR = path.join(__dirname, "docs");
|
|
5
|
+
const INTRODUCTION = path.join(DOCS_DIR, "introduction.md");
|
|
6
|
+
const DEVGUIDE = path.join(DOCS_DIR, "devguide.md");
|
|
7
|
+
|
|
8
|
+
function readDocOrFallback(filePath, fallback) {
|
|
9
|
+
try {
|
|
10
|
+
return fs.readFileSync(filePath, "utf8").trim();
|
|
11
|
+
} catch (e) {
|
|
12
|
+
return fallback;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function getIntroductionDoc() {
|
|
17
|
+
return readDocOrFallback(
|
|
18
|
+
INTRODUCTION,
|
|
19
|
+
`# CloudCC 自定义对象介绍\n\n(未找到文件:${INTRODUCTION})\n`
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getDevGuideDoc() {
|
|
24
|
+
return readDocOrFallback(
|
|
25
|
+
DEVGUIDE,
|
|
26
|
+
`# CloudCC 自定义对象开发指南\n\n(未找到文件:${DEVGUIDE})\n`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function doc(argvs = []) {
|
|
31
|
+
const subType = String(argvs[2] || "").trim().toLowerCase();
|
|
32
|
+
if (!subType || subType === "devguide") {
|
|
33
|
+
const content = getDevGuideDoc();
|
|
34
|
+
console.log(content);
|
|
35
|
+
return content;
|
|
36
|
+
}
|
|
37
|
+
if (subType === "introduction") {
|
|
38
|
+
const content = getIntroductionDoc();
|
|
39
|
+
console.log(content);
|
|
40
|
+
return content;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`doc 不支持的子命令: ${argvs[2]},请使用 introduction 或 devguide`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = doc;
|