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.
Files changed (66) hide show
  1. package/.cursor/skills/{cloudcc-cli-dev → dev-guide}/SKILL.md +5 -1
  2. package/README.md +82 -1
  3. package/bin/cc.js +2 -1
  4. package/bin/index.js +1 -0
  5. package/cloudcc-dev-skill/SKILL.md +31 -8
  6. package/cloudcc-dev-skill/cloudcc-dev-html.md +42 -0
  7. package/cloudcc-dev-skill/config.json +2 -2
  8. package/mcp/index.js +27 -3
  9. package/mcp/tools/JSP Migrator/handler.js +51 -866
  10. package/mcp/tools/Object Creator/handler.js +14 -4
  11. package/mcp/tools/Object Fields Creator/handler.js +149 -3
  12. package/package.json +1 -1
  13. package/src/classes/docs/devguide.md +758 -364
  14. package/src/classes/docs/introduction.md +279 -143
  15. package/src/fields/buildFieldData.js +692 -0
  16. package/src/fields/create.js +10 -170
  17. package/src/fields/detail.js +37 -0
  18. package/src/fields/docs/devguide.md +168 -44
  19. package/src/fields/docs/introduction.md +2 -0
  20. package/src/fields/fields/A.js +3 -2
  21. package/src/fields/fields/AD.js +4 -2
  22. package/src/fields/fields/B.js +8 -5
  23. package/src/fields/fields/C.js +13 -5
  24. package/src/fields/fields/D.js +4 -4
  25. package/src/fields/fields/E.js +10 -5
  26. package/src/fields/fields/ENC.js +27 -8
  27. package/src/fields/fields/ENCD.js +27 -8
  28. package/src/fields/fields/F.js +4 -4
  29. package/src/fields/fields/FL.js +8 -4
  30. package/src/fields/fields/H.js +4 -4
  31. package/src/fields/fields/IMG.js +23 -5
  32. package/src/fields/fields/J.js +21 -6
  33. package/src/fields/fields/L.js +32 -8
  34. package/src/fields/fields/LT.js +23 -6
  35. package/src/fields/fields/M.js +2 -2
  36. package/src/fields/fields/MR.js +2 -2
  37. package/src/fields/fields/N.js +31 -8
  38. package/src/fields/fields/P.js +13 -5
  39. package/src/fields/fields/Q.js +42 -12
  40. package/src/fields/fields/S.js +19 -7
  41. package/src/fields/fields/SCORE.js +9 -4
  42. package/src/fields/fields/T.js +4 -4
  43. package/src/fields/fields/U.js +18 -5
  44. package/src/fields/fields/X.js +20 -6
  45. package/src/fields/fields/Y.js +17 -4
  46. package/src/fields/index.js +2 -0
  47. package/src/fields/update.js +148 -0
  48. package/src/jsp/analyze.js +17 -0
  49. package/src/jsp/doc.js +18 -0
  50. package/src/jsp/docs/devguide.md +111 -0
  51. package/src/jsp/docs/introduction.md +50 -0
  52. package/src/jsp/docs.js +21 -0
  53. package/src/jsp/index.js +14 -0
  54. package/src/jsp/migration.js +871 -0
  55. package/src/jsp/split.js +17 -0
  56. package/src/object/create.js +36 -10
  57. package/src/object/docs/devguide.md +6 -3
  58. package/src/project/docs/devguide.md +1 -1
  59. package/src/timer/docs/devguide.md +849 -400
  60. package/src/timer/docs/introduction.md +343 -231
  61. package/src/triggers/docs/devguide.md +929 -352
  62. package/src/triggers/docs/introduction.md +640 -369
  63. package/src/version/listModuleCommands.js +6 -0
  64. package/test/fields.cli.test.js +3 -1
  65. package/test/jsp.cli.test.js +70 -0
  66. 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}编辑`,
@@ -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
- const { stdout, stderr } = await runCc(["create", "fields", repoRoot, "S", objId, fieldLabel]);
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
+ })
@@ -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(() => runCc(["create", "object", repoRoot, objectLabel]));
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