cloudcc-cli 2.2.2 → 2.2.4
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/.vscode/settings.json +3 -0
- package/README.md +47 -0
- package/bin/cc.js +11 -35
- package/bin/index.js +33 -0
- package/bin/mcp-svc.js +13 -0
- package/bin/mcp.js +18 -0
- package/java/com/cloudcc/core/TriggerInvoker.java +17 -1
- package/package.json +16 -7
- package/pom.xml +1 -0
- package/prompt/DevelopmentEnvironmentConstruction.ts +133 -0
- package/prompt/ccdk.ts +1190 -0
- package/prompt/ccprompt.ts +8 -0
- package/prompt/cloudccdev.ts +109 -0
- package/prompt/index.ts +52 -0
- package/prompt/objectInfo.ts +94 -0
- package/prompt/objectList.ts +25 -0
- package/prompt/openapi.ts +310 -0
- package/prompt/system.ts +14 -0
- package/prompt/vscodeExtension.ts +27 -0
- package/src/approval/approve.js +105 -0
- package/src/approval/get.js +245 -0
- package/src/approval/index.js +11 -0
- package/src/approval/reject.js +105 -0
- package/src/brief/get.js +51 -0
- package/src/brief/index.js +7 -0
- package/src/config/get.js +1 -1
- package/src/fields/create.js +204 -0
- package/src/fields/fields/A.js +23 -0
- package/src/fields/fields/AD.js +25 -0
- package/src/fields/fields/B.js +28 -0
- package/src/fields/fields/C.js +28 -0
- package/src/fields/fields/D.js +27 -0
- package/src/fields/fields/E.js +28 -0
- package/src/fields/fields/ENC.js +28 -0
- package/src/fields/fields/ENCD.js +28 -0
- package/src/fields/fields/F.js +27 -0
- package/src/fields/fields/FL.js +25 -0
- package/src/fields/fields/H.js +27 -0
- package/src/fields/fields/IMG.js +27 -0
- package/src/fields/fields/J.js +26 -0
- package/src/fields/fields/L.js +32 -0
- package/src/fields/fields/LT.js +28 -0
- package/src/fields/fields/M.js +29 -0
- package/src/fields/fields/MR.js +24 -0
- package/src/fields/fields/N.js +30 -0
- package/src/fields/fields/P.js +28 -0
- package/src/fields/fields/Q.js +35 -0
- package/src/fields/fields/S.js +30 -0
- package/src/fields/fields/SCORE.js +24 -0
- package/src/fields/fields/T.js +27 -0
- package/src/fields/fields/U.js +28 -0
- package/src/fields/fields/X.js +28 -0
- package/src/fields/fields/Y.js +33 -0
- package/src/fields/get.js +36 -0
- package/src/fields/index.js +9 -0
- package/src/mcp/MCP/345/234/272/346/231/257/346/250/241/346/213/237.md +8 -0
- package/src/mcp/index-sse-svc.js +126 -0
- package/src/mcp/index-streamable-svc.js +180 -0
- package/src/mcp/index.js +631 -0
- package/src/mcp/readme.md +137 -0
- package/src/mcp/tools/Approval/handler.js +349 -0
- package/src/mcp/tools/Class Creator/handler.js +37 -0
- package/src/mcp/tools/Class Detail Retriever/handler.js +33 -0
- package/src/mcp/tools/Class Detail Retriever/prompt.js +37 -0
- package/src/mcp/tools/Class Editor Guide/handler.js +72 -0
- package/src/mcp/tools/Class Editor Guide/prompt.js +468 -0
- package/src/mcp/tools/Class List Retriever/handler.js +36 -0
- package/src/mcp/tools/Class Publisher/handler.js +29 -0
- package/src/mcp/tools/Class Publisher/prompt.js +40 -0
- package/src/mcp/tools/Class Puller/handler.js +86 -0
- package/src/mcp/tools/Class Puller/prompt.js +49 -0
- package/src/mcp/tools/Client Script Creator/handler.js +179 -0
- package/src/mcp/tools/Client Script Detail Retriever/handler.js +53 -0
- package/src/mcp/tools/Client Script Editor Guide/handler.js +633 -0
- package/src/mcp/tools/Client Script List Retriever/handler.js +68 -0
- package/src/mcp/tools/Client Script Publisher/handler.js +54 -0
- package/src/mcp/tools/Client Script Puller/handler.js +73 -0
- package/src/mcp/tools/CloudCC Development Overview/handler.js +48 -0
- package/src/mcp/tools/CloudCC Development Overview/prompt.js +870 -0
- package/src/mcp/tools/Component Creator/handler.js +44 -0
- package/src/mcp/tools/Component Detail Retriever/handler.js +38 -0
- package/src/mcp/tools/Component Editor Guide/handler.js +76 -0
- package/src/mcp/tools/Component Editor Guide/prompt.js +519 -0
- package/src/mcp/tools/Component List Retriever/handler.js +43 -0
- package/src/mcp/tools/Component Publisher/handler.js +18 -0
- package/src/mcp/tools/Component Publisher/prompt.js +659 -0
- package/src/mcp/tools/Component Puller/handler.js +63 -0
- package/src/mcp/tools/Dev Environment Creator/fetcher.js +500 -0
- package/src/mcp/tools/Dev Environment Creator/handler.js +92 -0
- package/src/mcp/tools/Dev Environment Creator/prompt.js +273 -0
- package/src/mcp/tools/Dev Environment Validator/handler.js +88 -0
- package/src/mcp/tools/Dev Environment Validator/prompt.js +193 -0
- package/src/mcp/tools/Developer Key Setup Guide/fetcher.js +278 -0
- package/src/mcp/tools/Developer Key Setup Guide/handler.js +43 -0
- package/src/mcp/tools/Developer Key Setup Guide/prompt.js +71 -0
- package/src/mcp/tools/Object Creator/handler.js +34 -0
- package/src/mcp/tools/Object Fields Creator/handler.js +64 -0
- package/src/mcp/tools/Object Fields Retriever/handler.js +37 -0
- package/src/mcp/tools/Object Fields Retriever/prompt.js +10 -0
- package/src/mcp/tools/Object List Retriever/handler.js +43 -0
- package/src/mcp/tools/Object List Retriever/prompt.js +10 -0
- package/src/mcp/tools/Scheduled Class Creator/handler.js +37 -0
- package/src/mcp/tools/Scheduled Class Detail Retriever/handler.js +34 -0
- package/src/mcp/tools/Scheduled Class List Retriever/handler.js +52 -0
- package/src/mcp/tools/Scheduled Class Publisher/handler.js +30 -0
- package/src/mcp/tools/Scheduled Class Puller/handler.js +92 -0
- package/src/mcp/tools/Trigger Creator/handler.js +53 -0
- package/src/mcp/tools/Trigger Detail Retriever/handler.js +33 -0
- package/src/mcp/tools/Trigger Editor Guide/handler.js +58 -0
- package/src/mcp/tools/Trigger List Retriever/handler.js +49 -0
- package/src/mcp/tools/Trigger Publisher/handler.js +34 -0
- package/src/mcp/tools/Trigger Puller/handler.js +40 -0
- package/src/mcp/tools/ccdk/fetcher.js +18 -0
- package/src/mcp/tools/ccdk/handler.js +98 -0
- package/src/mcp/tools/ccdk/prompt.js +453 -0
- package/src/mcp/tools/index.js +23 -0
- package/src/object/create.js +105 -0
- package/src/object/get.js +43 -4
- package/src/object/index.js +2 -1
- package/src/plugin/create.js +1 -2
- package/src/plugin/create1.js +9 -9
- package/src/plugin/detail.js +91 -0
- package/src/plugin/get.js +79 -0
- package/src/plugin/index.js +4 -1
- package/src/plugin/publish.js +13 -13
- package/src/plugin/publish1.js +33 -24
- package/src/plugin/pull.js +173 -0
- package/src/project/create.js +9 -9
- package/src/project/create1.js +31 -17
- package/src/recordType/get.js +4 -2
- package/src/script/create.js +7 -7
- package/src/script/detail.js +95 -0
- package/src/script/get.js +4 -2
- package/src/script/index.js +1 -0
- package/src/script/publish.js +14 -14
- package/src/script/pull.js +12 -12
- package/src/script/pullList.js +5 -3
- package/src/timer/create.js +7 -7
- package/src/timer/detail.js +84 -0
- package/src/timer/get.js +6 -3
- package/src/timer/publish.js +7 -7
- package/src/timer/pull.js +8 -8
- package/src/timer/pullList.js +5 -3
- package/src/token/get.js +1 -1
- package/src/triggers/create.js +7 -7
- package/src/triggers/detail.js +90 -0
- package/src/triggers/get.js +4 -2
- package/src/triggers/index.js +1 -0
- package/src/triggers/publish.js +7 -7
- package/src/triggers/pull.js +8 -8
- package/src/triggers/pullList.js +5 -3
- package/src/version/get.js +3 -3
- package/target/ccopenapi-0.0.3-classes.jar +0 -0
- package/target/ccopenapi-0.0.3.jar +0 -0
- package/target/maven-archiver/pom.properties +3 -0
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +18 -0
- package/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +19 -0
- package/template/Appvue +452 -12
- package/template/index.js +30 -19
- package/tool/branch/index.js +1 -1
- package/tool/checkLange/checkLang.js +6 -6
- package/tool/checkLange/clearLang.js +1 -1
- package/utils/accessClass.js +23 -0
- package/utils/checkVersion.js +22 -20
- package/utils/config.js +18 -3
- package/utils/http.js +10 -10
- package/utils/utils.js +128 -40
- package/java/com/cloudcc/core/CCTriggerDemo.java +0 -25
- package/src/classes/create.js +0 -65
- package/src/classes/get.js +0 -21
- package/src/classes/index.js +0 -11
- package/src/classes/publish.js +0 -50
- package/src/classes/pull.js +0 -54
- package/src/classes/pullList.js +0 -44
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin 工具处理器
|
|
3
|
+
* 提供 Vue 插件的创建、发布功能
|
|
4
|
+
* 同时作为 Component Creator 和 Component Publisher 的处理器
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const createPluginModule = require('../../../plugin/create1');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 创建插件/自定义组件
|
|
12
|
+
*/
|
|
13
|
+
async function createCustomComponent({ pluginName, projectPath = process.cwd() }) {
|
|
14
|
+
try {
|
|
15
|
+
// 临时改变工作目录以兼容原有模块
|
|
16
|
+
const originalCwd = process.cwd();
|
|
17
|
+
process.chdir(projectPath);
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
await createPluginModule(['plugin', 'create', pluginName]);
|
|
21
|
+
const pluginPath = path.join(projectPath, `plugins/${pluginName}`);
|
|
22
|
+
return {
|
|
23
|
+
content: [{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: `✓ 自定义组件创建成功!\n\n组件路径: ${pluginPath}\n生成的文件:\n - ${pluginName}.vue (主组件文件)\n - components/HelloWorld.vue (示例子组件)\n - config.json (配置文件)\n\n下一步:\n1. 编辑 ${pluginName}.vue 实现你的组件逻辑\n2. 在 componentInfo 中配置组件信息\n3. 确保所有 <style> 标签都有 scoped 属性\n4. 使用 publish_plugin 或 publish_component 发布到服务器`
|
|
26
|
+
}]
|
|
27
|
+
};
|
|
28
|
+
} finally {
|
|
29
|
+
process.chdir(originalCwd);
|
|
30
|
+
}
|
|
31
|
+
} catch (error) {
|
|
32
|
+
return {
|
|
33
|
+
content: [{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `✗ 创建失败: ${error.message}\n\n可能的原因:\n- 组件名称已存在\n- 权限不足\n- 磁盘空间不足`
|
|
36
|
+
}]
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
createCustomComponent
|
|
44
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Detail Retriever 工具处理器
|
|
3
|
+
* 获取自定义组件的详细信息
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const detailModule = require('../../../plugin/detail');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 获取自定义组件详细信息
|
|
10
|
+
* @param {Object} params - 参数对象
|
|
11
|
+
* @param {string} params.pluginName - 组件名称(可选,优先使用)
|
|
12
|
+
* @param {string} params.pluginId - 组件ID(可选,当没有pluginName时使用)
|
|
13
|
+
* @param {string} params.projectPath - 项目路径(可选,默认为当前工作目录)
|
|
14
|
+
*/
|
|
15
|
+
async function getCustomComponentDetail({ pluginName, pluginId, projectPath = process.cwd() }) {
|
|
16
|
+
try {
|
|
17
|
+
const originalCwd = process.cwd();
|
|
18
|
+
process.chdir(projectPath);
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const detail = await detailModule(['get', pluginName, pluginId, projectPath]);
|
|
22
|
+
return { content: [{ type: 'text', text: JSON.stringify(detail, null, 2) }] };
|
|
23
|
+
} finally {
|
|
24
|
+
process.chdir(originalCwd);
|
|
25
|
+
}
|
|
26
|
+
} catch (error) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: `✗ 获取失败: ${error.message}\n\n可能的原因:\n- 组件不存在\n- 组件名称或ID不正确\n- 网络连接问题`
|
|
31
|
+
}]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = {
|
|
37
|
+
getCustomComponentDetail
|
|
38
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Editor Guide 工具处理器
|
|
3
|
+
* 提供自定义组件编辑时的指导和知识库
|
|
4
|
+
*
|
|
5
|
+
* 设计理念:
|
|
6
|
+
* 1. 默认返回规范、最佳实践、强制要求和API概要
|
|
7
|
+
* 2. 需要详细信息时再查询具体主题
|
|
8
|
+
*/
|
|
9
|
+
const prompt = require('./prompt');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 获取编辑指南
|
|
13
|
+
* @param {Object} options - 参数对象
|
|
14
|
+
* @param {string} options.topic - 指南主题(可选,默认为 'overview')
|
|
15
|
+
* @returns {Object} MCP 格式的响应对象
|
|
16
|
+
*
|
|
17
|
+
* 主题说明:
|
|
18
|
+
* - overview (默认): 📋 规范、最佳实践、强制要求、API概要 - 智能体首先应该阅读
|
|
19
|
+
* - component-structure: 组件结构说明
|
|
20
|
+
* - config: 配置文件详解
|
|
21
|
+
* - data-structure: 数据结构规范
|
|
22
|
+
* - style-scoped: 样式作用域最佳实践
|
|
23
|
+
* - publish-workflow: 发布流程详解
|
|
24
|
+
* - dependency: 依赖收集机制
|
|
25
|
+
* - api: API 参考文档
|
|
26
|
+
* - bestpractices: 最佳实践
|
|
27
|
+
* - faq: 常见问题
|
|
28
|
+
*/
|
|
29
|
+
async function editComponent({ topic = 'overview' } = {}) {
|
|
30
|
+
try {
|
|
31
|
+
// 验证 topic 参数
|
|
32
|
+
const validTopics = [
|
|
33
|
+
'overview',
|
|
34
|
+
'component-structure',
|
|
35
|
+
'config',
|
|
36
|
+
'data-structure',
|
|
37
|
+
'style-scoped',
|
|
38
|
+
'publish-workflow',
|
|
39
|
+
'dependency',
|
|
40
|
+
'project-config',
|
|
41
|
+
'api',
|
|
42
|
+
'bestpractices',
|
|
43
|
+
'faq'
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
if (topic && !validTopics.includes(topic)) {
|
|
47
|
+
return {
|
|
48
|
+
content: [{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: `✗ 无效的主题: "${topic}"\n\n支持的主题:\n${validTopics.map(t => `- ${t}`).join('\n')}`
|
|
51
|
+
}]
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 获取指定主题的编辑指南
|
|
56
|
+
const result = prompt.getEditGuide(topic);
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
content: [{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: result
|
|
62
|
+
}]
|
|
63
|
+
};
|
|
64
|
+
} catch (error) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: `✗ 获取编辑指南失败: ${error.message}\n\n错误堆栈:\n${error.stack}`
|
|
69
|
+
}]
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
module.exports = {
|
|
75
|
+
editComponent
|
|
76
|
+
};
|
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin 工具知识库
|
|
3
|
+
* 提供 Vue 插件模板、配置结构和开发指南
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { ccdkApiTree } = require('../ccdk/prompt');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Vue 插件模板示例
|
|
10
|
+
*/
|
|
11
|
+
const vuePluginTemplate = {
|
|
12
|
+
name: 'Vue插件组件模板',
|
|
13
|
+
description: 'CloudCC Vue 自定义组件的标准结构,支持自定义元素和组件注册',
|
|
14
|
+
mainComponent: `<template>
|
|
15
|
+
<div class="cc-container">
|
|
16
|
+
<HelloWorld />
|
|
17
|
+
</div>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script>
|
|
21
|
+
import HelloWorld from "./components/HelloWorld.vue";
|
|
22
|
+
export default {
|
|
23
|
+
components: {
|
|
24
|
+
HelloWorld,
|
|
25
|
+
},
|
|
26
|
+
data() {
|
|
27
|
+
return {
|
|
28
|
+
componentInfo: {
|
|
29
|
+
// 组件唯一标识符
|
|
30
|
+
component: "component-{pluginName}",
|
|
31
|
+
// 组件显示名称
|
|
32
|
+
compName: "compName-{pluginName}",
|
|
33
|
+
// 组件描述信息
|
|
34
|
+
compDesc: "Component description information",
|
|
35
|
+
// 业务类型(可选)
|
|
36
|
+
bizType: "",
|
|
37
|
+
// 分类(可选)
|
|
38
|
+
category: "",
|
|
39
|
+
// 加载模式:lazy(懒加载)或 eager(立即加载)
|
|
40
|
+
loadModel: "lazy",
|
|
41
|
+
// 所属组织标识
|
|
42
|
+
belongOrgFlag: "custom"
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
</script>
|
|
48
|
+
<style lang="scss" scoped>
|
|
49
|
+
.cc-container {
|
|
50
|
+
text-align: center;
|
|
51
|
+
padding: 8px;
|
|
52
|
+
}
|
|
53
|
+
</style>`,
|
|
54
|
+
subComponent: `<template>
|
|
55
|
+
<div>Hello world</div>
|
|
56
|
+
</template>
|
|
57
|
+
|
|
58
|
+
<script>
|
|
59
|
+
export default {};
|
|
60
|
+
</script>
|
|
61
|
+
|
|
62
|
+
<style lang="scss" scoped>
|
|
63
|
+
</style>`,
|
|
64
|
+
notes: [
|
|
65
|
+
'所有 <style> 标签必须包含 scoped 属性,避免样式全局污染',
|
|
66
|
+
'componentInfo.component 必须唯一,建议使用 "component-" 前缀',
|
|
67
|
+
'componentInfo.compName 是在界面上显示的名称,支持国际化',
|
|
68
|
+
'loadModel 为 "lazy" 时组件按需加载,为 "eager" 时立即加载',
|
|
69
|
+
'belongOrgFlag 默认为 "custom",表示自定义组件'
|
|
70
|
+
]
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* config.json 配置文件结构
|
|
75
|
+
*/
|
|
76
|
+
const configStructure = {
|
|
77
|
+
name: 'config.json配置结构',
|
|
78
|
+
description: '每个插件目录下的配置文件',
|
|
79
|
+
fields: {
|
|
80
|
+
component: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
required: true,
|
|
83
|
+
description: '组件唯一标识符,必须以 "component-" 开头'
|
|
84
|
+
},
|
|
85
|
+
compName: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
required: true,
|
|
88
|
+
description: '组件显示名称'
|
|
89
|
+
},
|
|
90
|
+
compDesc: {
|
|
91
|
+
type: 'string',
|
|
92
|
+
required: true,
|
|
93
|
+
description: '组件描述信息'
|
|
94
|
+
},
|
|
95
|
+
loadModel: {
|
|
96
|
+
type: 'string',
|
|
97
|
+
required: false,
|
|
98
|
+
description: '加载模式:lazy(懒加载)或 eager(立即加载)',
|
|
99
|
+
default: 'lazy'
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
example: {
|
|
103
|
+
component: 'component-MyPlugin',
|
|
104
|
+
compName: 'compName-MyPlugin',
|
|
105
|
+
compDesc: 'Component description information'
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* CloudCC 组件数据结构
|
|
111
|
+
*/
|
|
112
|
+
const componentDataStructure = {
|
|
113
|
+
name: '组件数据结构',
|
|
114
|
+
description: 'Vue 组件 data() 中返回的 CloudCC 标准结构',
|
|
115
|
+
fields: {
|
|
116
|
+
componentInfo: {
|
|
117
|
+
description: '组件基本信息(必需)',
|
|
118
|
+
required: true,
|
|
119
|
+
fields: {
|
|
120
|
+
component: '组件唯一标识',
|
|
121
|
+
compName: '组件名称',
|
|
122
|
+
compDesc: '组件描述',
|
|
123
|
+
loadModel: '加载模式(可选,默认 lazy)'
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
propObj: {
|
|
127
|
+
description: '组件属性对象',
|
|
128
|
+
required: false,
|
|
129
|
+
example: {
|
|
130
|
+
title: '默认标题'
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
propOption: {
|
|
134
|
+
description: '属性配置选项',
|
|
135
|
+
required: false,
|
|
136
|
+
example: {
|
|
137
|
+
title: {
|
|
138
|
+
label: '标题',
|
|
139
|
+
type: 'input'
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* 样式作用域最佳实践
|
|
149
|
+
*/
|
|
150
|
+
const styleScopedBestPractices = {
|
|
151
|
+
name: '样式作用域最佳实践',
|
|
152
|
+
description: '避免样式污染的关键规则',
|
|
153
|
+
rules: [
|
|
154
|
+
'✓ 必须:所有 <style> 标签都要加 scoped 属性',
|
|
155
|
+
'✓ 推荐:使用 BEM 命名规范(Block__Element--Modifier)',
|
|
156
|
+
'✓ 推荐:使用唯一的类名前缀(如组件名)',
|
|
157
|
+
'✗ 避免:直接修改全局标签样式(如 div、span)',
|
|
158
|
+
'✗ 避免:使用 !important 强制覆盖样式'
|
|
159
|
+
],
|
|
160
|
+
goodExample: `<style lang="scss" scoped>
|
|
161
|
+
.my-component {
|
|
162
|
+
padding: 8px;
|
|
163
|
+
|
|
164
|
+
&__header {
|
|
165
|
+
font-size: 16px;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
&__content {
|
|
169
|
+
margin-top: 10px;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
</style>`,
|
|
173
|
+
badExample: `<style lang="scss">
|
|
174
|
+
/* 没有 scoped,会污染全局 */
|
|
175
|
+
div {
|
|
176
|
+
padding: 8px;
|
|
177
|
+
}
|
|
178
|
+
</style>`
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* 使用指南
|
|
183
|
+
*/
|
|
184
|
+
const usageGuide = {
|
|
185
|
+
name: '插件开发使用指南',
|
|
186
|
+
workflow: [
|
|
187
|
+
'1. 创建插件:cc plugin create <pluginName>',
|
|
188
|
+
'2. 开发组件:编辑 plugins/<pluginName>/<pluginName>.vue',
|
|
189
|
+
'3. 发布插件:cc plugin publish <pluginName>'
|
|
190
|
+
],
|
|
191
|
+
bestPractices: [
|
|
192
|
+
'始终在 <style> 标签上添加 scoped 属性',
|
|
193
|
+
'componentInfo.component 必须唯一,建议使用 "component-" 前缀',
|
|
194
|
+
'合理设置 loadModel(lazy 适合大型组件,eager 适合小型组件)'
|
|
195
|
+
]
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* 常见问题
|
|
200
|
+
*/
|
|
201
|
+
const faq = [
|
|
202
|
+
{
|
|
203
|
+
question: '为什么发布时提示 "style scoped 缺失"?',
|
|
204
|
+
answer: '这是警告信息,不会阻止发布。但强烈建议添加 scoped 属性避免样式污染。将 <style> 改为 <style scoped> 即可。'
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
question: 'componentInfo 和 config.json 的关系?',
|
|
208
|
+
answer: 'componentInfo 在 Vue 文件中定义(优先级更高),config.json 作为备选配置。发布时优先使用 componentInfo。'
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
question: 'loadModel 应该选 lazy 还是 eager?',
|
|
212
|
+
answer: 'lazy(懒加载)适合大型组件或不常用组件;eager(立即加载)适合核心组件或小型组件。默认推荐 lazy。'
|
|
213
|
+
}
|
|
214
|
+
];
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 获取编辑指南
|
|
218
|
+
*/
|
|
219
|
+
function getEditGuide(topic = 'overview') {
|
|
220
|
+
const guides = {
|
|
221
|
+
overview: `## Vue 插件编辑指南概览
|
|
222
|
+
|
|
223
|
+
${vuePluginTemplate.name}
|
|
224
|
+
${vuePluginTemplate.description}
|
|
225
|
+
|
|
226
|
+
### 快速导航
|
|
227
|
+
- component-structure: 组件结构说明
|
|
228
|
+
- config: 配置文件详解
|
|
229
|
+
- data-structure: 数据结构规范
|
|
230
|
+
- style-scoped: 样式作用域最佳实践
|
|
231
|
+
- ccdk: CCDK API 使用文档
|
|
232
|
+
|
|
233
|
+
### 核心概念
|
|
234
|
+
1. **组件唯一标识**: componentInfo.component 必须全局唯一
|
|
235
|
+
2. **样式隔离**: 所有样式必须使用 scoped 避免污染
|
|
236
|
+
3. **加载模式**: lazy(懒加载)vs eager(立即加载)
|
|
237
|
+
|
|
238
|
+
### UI 库和工具
|
|
239
|
+
- **Element UI 2**: 全局已安装,可直接使用,无需额外引入
|
|
240
|
+
- **ECharts**: 全局已安装,可直接使用,无需额外引入
|
|
241
|
+
- **建议**: 优先使用 Vue2 相关的 UI 库进行开发,确保兼容性
|
|
242
|
+
|
|
243
|
+
### CCDK API 使用
|
|
244
|
+
CCDK 是 CloudCC 提供的全局 API 对象,可在组件中直接使用 \`window.$CCDK\` 或 \`$CCDK\` 访问。
|
|
245
|
+
|
|
246
|
+
**常用 API 模块**:
|
|
247
|
+
${Object.entries(ccdkApiTree).slice(0, 10).map(([key, module]) =>
|
|
248
|
+
`- **${module.name}** (\`$CCDK.${key}\`): ${module.description}`
|
|
249
|
+
).join('\n')}
|
|
250
|
+
|
|
251
|
+
**使用示例**:
|
|
252
|
+
\`\`\`javascript
|
|
253
|
+
// 获取用户信息
|
|
254
|
+
const userInfo = $CCDK.CCUser.getUserInfo();
|
|
255
|
+
|
|
256
|
+
// 消息提示
|
|
257
|
+
$CCDK.CCMessage.showMessage('操作成功', 'success');
|
|
258
|
+
|
|
259
|
+
// 打开详情页
|
|
260
|
+
const pageId = $CCDK.CCPage.openDetailPage({
|
|
261
|
+
objectName: '客户',
|
|
262
|
+
objId: 'account',
|
|
263
|
+
prefix: '001'
|
|
264
|
+
}, recordId);
|
|
265
|
+
|
|
266
|
+
// 获取详情页数据
|
|
267
|
+
const detail = $CCDK.CCDetail.getDetail();
|
|
268
|
+
|
|
269
|
+
// 事件总线
|
|
270
|
+
$CCDK.CCBus.$emit('customEvent', data);
|
|
271
|
+
$CCDK.CCBus.$on('customEvent', (data) => {
|
|
272
|
+
console.error(data);
|
|
273
|
+
});
|
|
274
|
+
\`\`\`
|
|
275
|
+
|
|
276
|
+
**更多 API**: 使用 \`ccdk\` 主题查看完整的 CCDK API 文档
|
|
277
|
+
|
|
278
|
+
### 注意事项
|
|
279
|
+
${vuePluginTemplate.notes.map(note => `- ${note}`).join('\n')}
|
|
280
|
+
`,
|
|
281
|
+
'component-structure': `## 组件结构详解
|
|
282
|
+
|
|
283
|
+
### 主组件模板
|
|
284
|
+
\`\`\`vue
|
|
285
|
+
${vuePluginTemplate.mainComponent}
|
|
286
|
+
\`\`\`
|
|
287
|
+
|
|
288
|
+
### 子组件模板
|
|
289
|
+
\`\`\`vue
|
|
290
|
+
${vuePluginTemplate.subComponent}
|
|
291
|
+
\`\`\`
|
|
292
|
+
|
|
293
|
+
### 关键点说明
|
|
294
|
+
${vuePluginTemplate.notes.map(note => `- ${note}`).join('\n')}
|
|
295
|
+
`,
|
|
296
|
+
config: `## 配置文件详解
|
|
297
|
+
|
|
298
|
+
### ${configStructure.name}
|
|
299
|
+
${configStructure.description}
|
|
300
|
+
|
|
301
|
+
### 配置字段
|
|
302
|
+
${Object.entries(configStructure.fields).map(([key, field]) =>
|
|
303
|
+
`- **${key}** (${field.type}${field.required ? ', 必需' : ', 可选'}): ${field.description}${field.default ? `\n 默认值: ${field.default}` : ''}`
|
|
304
|
+
).join('\n')}
|
|
305
|
+
|
|
306
|
+
### 示例
|
|
307
|
+
\`\`\`json
|
|
308
|
+
${JSON.stringify(configStructure.example, null, 2)}
|
|
309
|
+
\`\`\`
|
|
310
|
+
`,
|
|
311
|
+
'data-structure': `## 数据结构规范
|
|
312
|
+
|
|
313
|
+
### ${componentDataStructure.name}
|
|
314
|
+
${componentDataStructure.description}
|
|
315
|
+
|
|
316
|
+
${Object.entries(componentDataStructure.fields).map(([key, field]) => `
|
|
317
|
+
### ${key}
|
|
318
|
+
**描述**: ${field.description}
|
|
319
|
+
**必需**: ${field.required ? '是' : '否'}
|
|
320
|
+
${field.example ? `**示例**:\n\`\`\`json\n${JSON.stringify(field.example, null, 2)}\n\`\`\`` : ''}
|
|
321
|
+
${field.default ? `**默认值**:\n\`\`\`json\n${JSON.stringify(field.default, null, 2)}\n\`\`\`` : ''}
|
|
322
|
+
${field.fields ? `**字段**:\n${Object.entries(field.fields).map(([k, v]) => `- ${k}: ${v}`).join('\n')}` : ''}
|
|
323
|
+
`).join('\n')}
|
|
324
|
+
`,
|
|
325
|
+
'style-scoped': `## 样式作用域最佳实践
|
|
326
|
+
|
|
327
|
+
### ${styleScopedBestPractices.name}
|
|
328
|
+
${styleScopedBestPractices.description}
|
|
329
|
+
|
|
330
|
+
### 规则清单
|
|
331
|
+
${styleScopedBestPractices.rules.map(rule => rule).join('\n')}
|
|
332
|
+
|
|
333
|
+
### ✓ 正确示例
|
|
334
|
+
\`\`\`vue
|
|
335
|
+
${styleScopedBestPractices.goodExample}
|
|
336
|
+
\`\`\`
|
|
337
|
+
|
|
338
|
+
### ✗ 错误示例
|
|
339
|
+
\`\`\`vue
|
|
340
|
+
${styleScopedBestPractices.badExample}
|
|
341
|
+
\`\`\`
|
|
342
|
+
`,
|
|
343
|
+
bestpractices: `## 最佳实践
|
|
344
|
+
|
|
345
|
+
### ${usageGuide.name}
|
|
346
|
+
|
|
347
|
+
### 工作流
|
|
348
|
+
${usageGuide.workflow.map(step => step).join('\n')}
|
|
349
|
+
|
|
350
|
+
### 最佳实践清单
|
|
351
|
+
${usageGuide.bestPractices.map(practice => `- ${practice}`).join('\n')}
|
|
352
|
+
`,
|
|
353
|
+
ccdk: `## CCDK API 使用文档
|
|
354
|
+
|
|
355
|
+
CCDK 是 CloudCC 提供的全局 API 对象,可在组件中直接使用 \`window.$CCDK\` 或 \`$CCDK\` 访问。
|
|
356
|
+
|
|
357
|
+
### 快速开始
|
|
358
|
+
|
|
359
|
+
\`\`\`javascript
|
|
360
|
+
// 在组件的 methods 或生命周期钩子中使用
|
|
361
|
+
export default {
|
|
362
|
+
mounted() {
|
|
363
|
+
// 获取用户信息
|
|
364
|
+
const userInfo = $CCDK.CCUser.getUserInfo();
|
|
365
|
+
console.error(userInfo);
|
|
366
|
+
|
|
367
|
+
// 消息提示
|
|
368
|
+
$CCDK.CCMessage.showMessage('组件加载完成', 'success');
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
\`\`\`
|
|
372
|
+
|
|
373
|
+
### API 模块列表
|
|
374
|
+
|
|
375
|
+
${Object.entries(ccdkApiTree).map(([key, module]) => `
|
|
376
|
+
### ${module.name} (\`$CCDK.${key}\`)
|
|
377
|
+
|
|
378
|
+
**描述**: ${module.description}
|
|
379
|
+
|
|
380
|
+
**可用方法**:
|
|
381
|
+
${Object.entries(module.apis).map(([apiKey, api]) =>
|
|
382
|
+
`- **${api.name}**: ${api.description} (${api.version})`
|
|
383
|
+
).join('\n')}
|
|
384
|
+
|
|
385
|
+
**使用示例**:
|
|
386
|
+
${Object.entries(module.apis).slice(0, 1).map(([apiKey, api]) => {
|
|
387
|
+
// 提取代码示例
|
|
388
|
+
const content = api.content || '';
|
|
389
|
+
const codeMatch = content.match(/```js\n([\s\S]*?)```/);
|
|
390
|
+
if (codeMatch) {
|
|
391
|
+
return `\`\`\`javascript\n${codeMatch[1]}\n\`\`\``;
|
|
392
|
+
}
|
|
393
|
+
return '暂无示例';
|
|
394
|
+
}).join('\n')}
|
|
395
|
+
`).join('\n')}
|
|
396
|
+
|
|
397
|
+
### 常用场景示例
|
|
398
|
+
|
|
399
|
+
**1. 获取和设置详情页数据**
|
|
400
|
+
\`\`\`javascript
|
|
401
|
+
// 获取详情页数据
|
|
402
|
+
const detail = $CCDK.CCDetail.getDetail();
|
|
403
|
+
const detailId = $CCDK.CCDetail.getDetailId();
|
|
404
|
+
|
|
405
|
+
// 设置详情页数据
|
|
406
|
+
$CCDK.CCDetail.setDetail({
|
|
407
|
+
id: detailId,
|
|
408
|
+
detail: updatedData
|
|
409
|
+
});
|
|
410
|
+
\`\`\`
|
|
411
|
+
|
|
412
|
+
**2. 打开页面**
|
|
413
|
+
\`\`\`javascript
|
|
414
|
+
// 打开详情页
|
|
415
|
+
const pageId = $CCDK.CCPage.openDetailPage({
|
|
416
|
+
objectName: '客户',
|
|
417
|
+
objId: 'account',
|
|
418
|
+
objectApi: 'Account',
|
|
419
|
+
prefix: '001'
|
|
420
|
+
}, recordId, {
|
|
421
|
+
openPlace: 'dialog',
|
|
422
|
+
openMode: '_blank'
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
// 打开新建页
|
|
426
|
+
const createPageId = $CCDK.CCPage.openCreatePage({
|
|
427
|
+
objectName: '客户',
|
|
428
|
+
objId: 'account',
|
|
429
|
+
prefix: '001'
|
|
430
|
+
}, {
|
|
431
|
+
openPlace: 'dialog'
|
|
432
|
+
});
|
|
433
|
+
\`\`\`
|
|
434
|
+
|
|
435
|
+
**3. 消息提示**
|
|
436
|
+
\`\`\`javascript
|
|
437
|
+
// 简单提示
|
|
438
|
+
$CCDK.CCMessage.showMessage('操作成功', 'success');
|
|
439
|
+
|
|
440
|
+
// 确认对话框
|
|
441
|
+
$CCDK.CCMessage.showConfirm(
|
|
442
|
+
'确定要删除吗?',
|
|
443
|
+
'确认删除',
|
|
444
|
+
{},
|
|
445
|
+
() => {
|
|
446
|
+
// 确认回调
|
|
447
|
+
console.error('确认');
|
|
448
|
+
},
|
|
449
|
+
() => {
|
|
450
|
+
// 取消回调
|
|
451
|
+
console.error('取消');
|
|
452
|
+
}
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
// 通知
|
|
456
|
+
$CCDK.CCMessage.showNotification({
|
|
457
|
+
title: '提示',
|
|
458
|
+
message: '这是一条通知消息',
|
|
459
|
+
type: 'success'
|
|
460
|
+
});
|
|
461
|
+
\`\`\`
|
|
462
|
+
|
|
463
|
+
**4. 事件总线**
|
|
464
|
+
\`\`\`javascript
|
|
465
|
+
// 发布事件
|
|
466
|
+
$CCDK.CCBus.$emit('dataUpdated', { id: '123', name: 'test' });
|
|
467
|
+
|
|
468
|
+
// 订阅事件
|
|
469
|
+
$CCDK.CCBus.$on('dataUpdated', (data) => {
|
|
470
|
+
console.error('数据已更新', data);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
// 取消订阅(在组件销毁时)
|
|
474
|
+
this.$once('hook:beforeDestroy', () => {
|
|
475
|
+
$CCDK.CCBus.$off('dataUpdated');
|
|
476
|
+
});
|
|
477
|
+
\`\`\`
|
|
478
|
+
|
|
479
|
+
**5. 调用自定义类**
|
|
480
|
+
\`\`\`javascript
|
|
481
|
+
$CCDK.CCCommon.post('MyClass', 'myMethod', [
|
|
482
|
+
{
|
|
483
|
+
argType: 'java.lang.String',
|
|
484
|
+
argValue: 'hello'
|
|
485
|
+
}
|
|
486
|
+
]).then((res) => {
|
|
487
|
+
console.error(res.data);
|
|
488
|
+
}).catch((error) => {
|
|
489
|
+
console.error(error);
|
|
490
|
+
});
|
|
491
|
+
\`\`\`
|
|
492
|
+
|
|
493
|
+
### 注意事项
|
|
494
|
+
- CCDK API 在组件运行时环境中全局可用,无需导入
|
|
495
|
+
- 使用事件总线时,记得在组件销毁时取消订阅,避免内存泄漏
|
|
496
|
+
- 页面操作 API(如 openDetailPage)返回的 pageId 可用于后续的页面操作
|
|
497
|
+
- 详情页相关 API 需要在详情页上下文中使用才能正常工作
|
|
498
|
+
`,
|
|
499
|
+
faq: `## 常见问题
|
|
500
|
+
|
|
501
|
+
${faq.map((item, index) => `
|
|
502
|
+
### ${index + 1}. ${item.question}
|
|
503
|
+
${item.answer}
|
|
504
|
+
`).join('\n')}
|
|
505
|
+
`
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
return guides[topic] || guides.overview;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
module.exports = {
|
|
512
|
+
vuePluginTemplate,
|
|
513
|
+
configStructure,
|
|
514
|
+
componentDataStructure,
|
|
515
|
+
styleScopedBestPractices,
|
|
516
|
+
usageGuide,
|
|
517
|
+
faq,
|
|
518
|
+
getEditGuide
|
|
519
|
+
};
|