cloudcc-cli 2.3.8 → 2.4.0
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/.cursor/skills/{cloudcc-cli-dev → dev-guide}/SKILL.md +5 -1
- package/README.md +82 -1
- package/bin/cc.js +2 -1
- package/bin/index.js +1 -0
- package/cloudcc-dev-skill/SKILL.md +31 -8
- package/cloudcc-dev-skill/cloudcc-dev-html.md +42 -0
- package/cloudcc-dev-skill/config.json +2 -2
- package/mcp/index.js +27 -3
- package/mcp/tools/JSP Migrator/handler.js +51 -866
- package/mcp/tools/Object Creator/handler.js +14 -4
- package/mcp/tools/Object Fields Creator/handler.js +149 -3
- package/package.json +1 -1
- package/src/classes/docs/devguide.md +758 -364
- package/src/classes/docs/introduction.md +279 -143
- package/src/fields/buildFieldData.js +692 -0
- package/src/fields/create.js +10 -170
- package/src/fields/detail.js +37 -0
- package/src/fields/docs/devguide.md +168 -44
- package/src/fields/docs/introduction.md +2 -0
- package/src/fields/fields/A.js +3 -2
- package/src/fields/fields/AD.js +4 -2
- package/src/fields/fields/B.js +8 -5
- package/src/fields/fields/C.js +13 -5
- package/src/fields/fields/D.js +4 -4
- package/src/fields/fields/E.js +10 -5
- package/src/fields/fields/ENC.js +27 -8
- package/src/fields/fields/ENCD.js +27 -8
- package/src/fields/fields/F.js +4 -4
- package/src/fields/fields/FL.js +8 -4
- package/src/fields/fields/H.js +4 -4
- package/src/fields/fields/IMG.js +23 -5
- package/src/fields/fields/J.js +21 -6
- package/src/fields/fields/L.js +32 -8
- package/src/fields/fields/LT.js +23 -6
- package/src/fields/fields/M.js +2 -2
- package/src/fields/fields/MR.js +2 -2
- package/src/fields/fields/N.js +31 -8
- package/src/fields/fields/P.js +13 -5
- package/src/fields/fields/Q.js +42 -12
- package/src/fields/fields/S.js +19 -7
- package/src/fields/fields/SCORE.js +9 -4
- package/src/fields/fields/T.js +4 -4
- package/src/fields/fields/U.js +18 -5
- package/src/fields/fields/X.js +20 -6
- package/src/fields/fields/Y.js +17 -4
- package/src/fields/index.js +2 -0
- package/src/fields/update.js +148 -0
- package/src/jsp/analyze.js +17 -0
- package/src/jsp/doc.js +18 -0
- package/src/jsp/docs/devguide.md +111 -0
- package/src/jsp/docs/introduction.md +50 -0
- package/src/jsp/docs.js +21 -0
- package/src/jsp/index.js +14 -0
- package/src/jsp/migration.js +871 -0
- package/src/jsp/split.js +17 -0
- package/src/object/create.js +36 -10
- package/src/object/docs/devguide.md +6 -3
- package/src/project/docs/devguide.md +1 -1
- package/src/timer/docs/devguide.md +849 -400
- package/src/timer/docs/introduction.md +343 -231
- package/src/triggers/docs/devguide.md +929 -352
- package/src/triggers/docs/introduction.md +640 -369
- package/src/version/listModuleCommands.js +6 -0
- package/test/fields.cli.test.js +3 -1
- package/test/jsp.cli.test.js +70 -0
- package/test/object.cli.test.js +9 -1
|
@@ -18,6 +18,7 @@ const MODULE_KEYS_ORDER = [
|
|
|
18
18
|
"triggers",
|
|
19
19
|
"timer",
|
|
20
20
|
"script",
|
|
21
|
+
"jsp",
|
|
21
22
|
"token",
|
|
22
23
|
"object",
|
|
23
24
|
"recordType",
|
|
@@ -53,6 +54,7 @@ const MODULE_HINT = {
|
|
|
53
54
|
schedule: "定时类(Scheduled Class):与平台同步 Java 与配置(resource 亦可用 timer)。",
|
|
54
55
|
triggers: "触发器:本地 Java 与平台同步。",
|
|
55
56
|
script: "客户端脚本:创建、发布、拉取等。",
|
|
57
|
+
jsp: "JSP 迁移:规则查看、分析与拆分生成。",
|
|
56
58
|
token: "访问令牌/凭证。",
|
|
57
59
|
object: "标准对象与自定义对象。",
|
|
58
60
|
recordType: "记录类型。",
|
|
@@ -86,6 +88,7 @@ const MODULE_FOLDER = {
|
|
|
86
88
|
triggers: "triggers",
|
|
87
89
|
timer: "timer",
|
|
88
90
|
script: "script",
|
|
91
|
+
jsp: "jsp",
|
|
89
92
|
token: "token",
|
|
90
93
|
object: "object",
|
|
91
94
|
recordType: "recordType",
|
|
@@ -160,6 +163,7 @@ const RESOURCE_CN = {
|
|
|
160
163
|
timer: "定时类",
|
|
161
164
|
triggers: "触发器",
|
|
162
165
|
script: "客户端脚本",
|
|
166
|
+
jsp: "JSP 迁移",
|
|
163
167
|
token: "访问令牌",
|
|
164
168
|
object: "对象",
|
|
165
169
|
recordType: "记录类型",
|
|
@@ -204,6 +208,8 @@ function describeActionLine(resource, action) {
|
|
|
204
208
|
modify: () => `修改${n}`,
|
|
205
209
|
download: () => `下载${n}相关文件`,
|
|
206
210
|
getList: () => `获取${n}列表`,
|
|
211
|
+
analyze: () => `分析${n}`,
|
|
212
|
+
split: () => `拆分${n}`,
|
|
207
213
|
newInfo: () => `获取新建${n}所需信息`,
|
|
208
214
|
editInfo: () => `获取编辑${n}前信息`,
|
|
209
215
|
editSave: () => `保存${n}编辑`,
|
package/test/fields.cli.test.js
CHANGED
|
@@ -21,6 +21,7 @@ test("字段管理流程:获取对象列表→create 字段→get 字段列表
|
|
|
21
21
|
let objId = null;
|
|
22
22
|
let objName = null;
|
|
23
23
|
const fieldLabel = `AutoField_${Date.now()}`;
|
|
24
|
+
const fieldRemark = `AutoFieldRemark_${Date.now()}`;
|
|
24
25
|
let fieldId = null;
|
|
25
26
|
|
|
26
27
|
t.test("1) 获取对象列表(取第一个对象的 id 和 objprefix)", async () => {
|
|
@@ -45,7 +46,8 @@ test("字段管理流程:获取对象列表→create 字段→get 字段列表
|
|
|
45
46
|
t.test("2) create 创建一个文本字段(S)", async () => {
|
|
46
47
|
assert.ok(objId, "需要对象 id");
|
|
47
48
|
// create fields 调用约定:cloudcc create fields <path> <fieldType> <objid> <nameLabel> [...]
|
|
48
|
-
|
|
49
|
+
// 统一规则:argvs[6] 作为 remark
|
|
50
|
+
const { stdout, stderr } = await runCc(["create", "fields", repoRoot, "S", objId, fieldLabel, fieldRemark]);
|
|
49
51
|
// create fields 会通过 console.error 输出创建结果(见 src/fields/create.js)
|
|
50
52
|
assert.match(
|
|
51
53
|
`${stdout}\n${stderr}`,
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const test = require("node:test")
|
|
2
|
+
const assert = require("node:assert/strict")
|
|
3
|
+
const fs = require("node:fs")
|
|
4
|
+
const os = require("node:os")
|
|
5
|
+
const path = require("node:path")
|
|
6
|
+
const { execFile } = require("node:child_process")
|
|
7
|
+
const { promisify } = require("node:util")
|
|
8
|
+
|
|
9
|
+
const execFileAsync = promisify(execFile)
|
|
10
|
+
const repoRoot = path.resolve(__dirname, "..")
|
|
11
|
+
|
|
12
|
+
async function runCc(args, cwd = repoRoot) {
|
|
13
|
+
return execFileAsync(
|
|
14
|
+
process.execPath,
|
|
15
|
+
[path.join(repoRoot, "bin", "cc.js"), ...args],
|
|
16
|
+
{ cwd }
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
test("jsp doc/analyze/split CLI workflow", async () => {
|
|
21
|
+
const tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), "cloudcc-jsp-"))
|
|
22
|
+
const customizeDir = path.join(tmpRoot, "customize")
|
|
23
|
+
fs.mkdirSync(customizeDir, { recursive: true })
|
|
24
|
+
|
|
25
|
+
const jspPath = path.join(customizeDir, "wt_ly.jsp")
|
|
26
|
+
fs.writeFileSync(
|
|
27
|
+
jspPath,
|
|
28
|
+
`<cc>
|
|
29
|
+
</cc>
|
|
30
|
+
<div>legacy page</div>
|
|
31
|
+
<cc!>
|
|
32
|
+
if ("save".equals(reason)) {
|
|
33
|
+
cs.cquery("Account");
|
|
34
|
+
Object result = new PageClsInvoker(userInfo).invoker("FooService", "saveData", argList);
|
|
35
|
+
}
|
|
36
|
+
</cc>`,
|
|
37
|
+
"utf8"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
const { stdout: docStdout } = await runCc(["doc", "jsp", "devguide"], tmpRoot)
|
|
41
|
+
assert.match(docStdout, /## 6\. JSP 迁移规则/)
|
|
42
|
+
assert.match(docStdout, /customize/)
|
|
43
|
+
|
|
44
|
+
const analyzePayload = encodeURI(JSON.stringify({
|
|
45
|
+
jspPath: "customize/wt_ly.jsp",
|
|
46
|
+
projectPath: tmpRoot,
|
|
47
|
+
}))
|
|
48
|
+
const { stdout: analyzeStdout } = await runCc(["analyze", "jsp", analyzePayload], tmpRoot)
|
|
49
|
+
assert.match(analyzeStdout, /JSP 迁移分析完成/)
|
|
50
|
+
assert.match(analyzeStdout, /reason分支: 1/)
|
|
51
|
+
|
|
52
|
+
const splitPayload = encodeURI(JSON.stringify({
|
|
53
|
+
jspPath: "customize/wt_ly.jsp",
|
|
54
|
+
projectPath: tmpRoot,
|
|
55
|
+
overwrite: true,
|
|
56
|
+
}))
|
|
57
|
+
const { stdout: splitStdout } = await runCc(["split", "jsp", splitPayload], tmpRoot)
|
|
58
|
+
assert.match(splitStdout, /JSP 迁移生成完成/)
|
|
59
|
+
|
|
60
|
+
const classDir = path.join(tmpRoot, "classes", "WtLyMigratedService")
|
|
61
|
+
const pluginDir = path.join(tmpRoot, "plugins", "wt-ly-migrated")
|
|
62
|
+
const reportPath = path.join(tmpRoot, "migration-report", "wt_ly.migration.md")
|
|
63
|
+
|
|
64
|
+
assert.ok(fs.existsSync(path.join(classDir, "WtLyMigratedService.java")))
|
|
65
|
+
assert.ok(fs.existsSync(path.join(classDir, "WtLyMigratedServiceTest.java")))
|
|
66
|
+
assert.ok(fs.existsSync(path.join(classDir, "config.json")))
|
|
67
|
+
assert.ok(fs.existsSync(path.join(pluginDir, "wt-ly-migrated.vue")))
|
|
68
|
+
assert.ok(fs.existsSync(path.join(pluginDir, "config.json")))
|
|
69
|
+
assert.ok(fs.existsSync(reportPath))
|
|
70
|
+
})
|
package/test/object.cli.test.js
CHANGED
|
@@ -23,7 +23,15 @@ test("对象管理流程:get 对象列表→create 对象→get 列表校验
|
|
|
23
23
|
let createdObjId = null;
|
|
24
24
|
|
|
25
25
|
t.test("1) create 创建自定义对象", async () => {
|
|
26
|
-
await assert.doesNotReject(() =>
|
|
26
|
+
await assert.doesNotReject(() =>
|
|
27
|
+
runCc([
|
|
28
|
+
"create",
|
|
29
|
+
"object",
|
|
30
|
+
repoRoot,
|
|
31
|
+
objectLabel,
|
|
32
|
+
"CLI 集成测试用对象业务说明",
|
|
33
|
+
])
|
|
34
|
+
);
|
|
27
35
|
console.error(`\n[object-test] 已创建自定义对象 label: ${objectLabel}`);
|
|
28
36
|
});
|
|
29
37
|
|