weaver-e10-builder 1.1.2 → 1.1.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 (191) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +2 -0
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +48 -15
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/designer-common.d.ts +56 -0
  8. package/dist/commands/designer-common.d.ts.map +1 -0
  9. package/dist/commands/designer-common.js +165 -0
  10. package/dist/commands/designer-common.js.map +1 -0
  11. package/dist/commands/designer-setters.d.ts +13 -0
  12. package/dist/commands/designer-setters.d.ts.map +1 -0
  13. package/dist/commands/designer-setters.js +593 -0
  14. package/dist/commands/designer-setters.js.map +1 -0
  15. package/dist/commands/designer.d.ts +17 -0
  16. package/dist/commands/designer.d.ts.map +1 -0
  17. package/dist/commands/designer.js +448 -0
  18. package/dist/commands/designer.js.map +1 -0
  19. package/dist/commands/form-add-detail-table.d.ts.map +1 -1
  20. package/dist/commands/form-add-detail-table.js +59 -0
  21. package/dist/commands/form-add-detail-table.js.map +1 -1
  22. package/dist/commands/form-association.d.ts.map +1 -1
  23. package/dist/commands/form-association.js +3 -2
  24. package/dist/commands/form-association.js.map +1 -1
  25. package/dist/commands/form-button.d.ts.map +1 -1
  26. package/dist/commands/form-button.js +86 -1
  27. package/dist/commands/form-button.js.map +1 -1
  28. package/dist/commands/form-data.d.ts.map +1 -1
  29. package/dist/commands/form-data.js +13 -1
  30. package/dist/commands/form-data.js.map +1 -1
  31. package/dist/commands/form-ebuilder-scope.js +3 -3
  32. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  33. package/dist/commands/form-formula.js +4 -4
  34. package/dist/commands/form-formula.js.map +1 -1
  35. package/dist/commands/form-list-click.d.ts.map +1 -1
  36. package/dist/commands/form-list-click.js +30 -2
  37. package/dist/commands/form-list-click.js.map +1 -1
  38. package/dist/commands/form-list-filter.js +1 -1
  39. package/dist/commands/form-list-filter.js.map +1 -1
  40. package/dist/commands/form-list-hierarchy.d.ts +3 -0
  41. package/dist/commands/form-list-hierarchy.d.ts.map +1 -0
  42. package/dist/commands/form-list-hierarchy.js +133 -0
  43. package/dist/commands/form-list-hierarchy.js.map +1 -0
  44. package/dist/commands/form-list-permission.d.ts.map +1 -1
  45. package/dist/commands/form-list-permission.js +17 -3
  46. package/dist/commands/form-list-permission.js.map +1 -1
  47. package/dist/commands/form-list.d.ts.map +1 -1
  48. package/dist/commands/form-list.js +2 -0
  49. package/dist/commands/form-list.js.map +1 -1
  50. package/dist/commands/form-nlist.d.ts.map +1 -1
  51. package/dist/commands/form-nlist.js +47 -15
  52. package/dist/commands/form-nlist.js.map +1 -1
  53. package/dist/commands/form-option-template.d.ts +3 -0
  54. package/dist/commands/form-option-template.d.ts.map +1 -0
  55. package/dist/commands/form-option-template.js +291 -0
  56. package/dist/commands/form-option-template.js.map +1 -0
  57. package/dist/commands/form-permission.d.ts.map +1 -1
  58. package/dist/commands/form-permission.js +214 -2
  59. package/dist/commands/form-permission.js.map +1 -1
  60. package/dist/commands/form-view.d.ts.map +1 -1
  61. package/dist/commands/form-view.js +23 -1
  62. package/dist/commands/form-view.js.map +1 -1
  63. package/dist/commands/form.d.ts.map +1 -1
  64. package/dist/commands/form.js +259 -59
  65. package/dist/commands/form.js.map +1 -1
  66. package/dist/commands/icon.d.ts.map +1 -1
  67. package/dist/commands/icon.js +9 -13
  68. package/dist/commands/icon.js.map +1 -1
  69. package/dist/commands/menu-permission.d.ts.map +1 -1
  70. package/dist/commands/menu-permission.js +19 -12
  71. package/dist/commands/menu-permission.js.map +1 -1
  72. package/dist/commands/page.d.ts +14 -0
  73. package/dist/commands/page.d.ts.map +1 -0
  74. package/dist/commands/page.js +175 -0
  75. package/dist/commands/page.js.map +1 -0
  76. package/dist/commands/update.d.ts.map +1 -1
  77. package/dist/commands/update.js +29 -21
  78. package/dist/commands/update.js.map +1 -1
  79. package/dist/commands/wf-form.js +1 -1
  80. package/dist/commands/wf-form.js.map +1 -1
  81. package/dist/commands/workflow-condition.js +9 -8
  82. package/dist/commands/workflow-condition.js.map +1 -1
  83. package/dist/commands/workflow-node-overtime.d.ts.map +1 -1
  84. package/dist/commands/workflow-node-overtime.js +16 -8
  85. package/dist/commands/workflow-node-overtime.js.map +1 -1
  86. package/dist/commands/workflow-node.d.ts.map +1 -1
  87. package/dist/commands/workflow-node.js +35 -5
  88. package/dist/commands/workflow-node.js.map +1 -1
  89. package/dist/commands/workflow-numbering.d.ts.map +1 -1
  90. package/dist/commands/workflow-numbering.js +63 -30
  91. package/dist/commands/workflow-numbering.js.map +1 -1
  92. package/dist/commands/workflow-operator-sign.d.ts.map +1 -1
  93. package/dist/commands/workflow-operator-sign.js +2 -1
  94. package/dist/commands/workflow-operator-sign.js.map +1 -1
  95. package/dist/commands/workflow.d.ts.map +1 -1
  96. package/dist/commands/workflow.js +78 -38
  97. package/dist/commands/workflow.js.map +1 -1
  98. package/dist/core/client.d.ts +9 -0
  99. package/dist/core/client.d.ts.map +1 -1
  100. package/dist/core/client.js +16 -1
  101. package/dist/core/client.js.map +1 -1
  102. package/dist/index.js +6 -0
  103. package/dist/index.js.map +1 -1
  104. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  105. package/dist/services/actionflow/preflight_service.js +40 -17
  106. package/dist/services/actionflow/preflight_service.js.map +1 -1
  107. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  108. package/dist/services/actionflow/workflow_compiler.js +4 -2
  109. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  110. package/dist/services/form-button-action.d.ts +17 -0
  111. package/dist/services/form-button-action.d.ts.map +1 -0
  112. package/dist/services/form-button-action.js +111 -0
  113. package/dist/services/form-button-action.js.map +1 -0
  114. package/dist/services/form-create.d.ts +15 -1
  115. package/dist/services/form-create.d.ts.map +1 -1
  116. package/dist/services/form-create.js +40 -5
  117. package/dist/services/form-create.js.map +1 -1
  118. package/dist/services/form-list-stats.d.ts.map +1 -1
  119. package/dist/services/form-list-stats.js +29 -6
  120. package/dist/services/form-list-stats.js.map +1 -1
  121. package/dist/services/form-nlist.d.ts +8 -2
  122. package/dist/services/form-nlist.d.ts.map +1 -1
  123. package/dist/services/form-nlist.js +32 -7
  124. package/dist/services/form-nlist.js.map +1 -1
  125. package/dist/services/form-sub-detail.d.ts +36 -0
  126. package/dist/services/form-sub-detail.d.ts.map +1 -0
  127. package/dist/services/form-sub-detail.js +132 -0
  128. package/dist/services/form-sub-detail.js.map +1 -0
  129. package/dist/services/form-view.d.ts +6 -0
  130. package/dist/services/form-view.d.ts.map +1 -1
  131. package/dist/services/form-view.js +24 -0
  132. package/dist/services/form-view.js.map +1 -1
  133. package/dist/services/skill-provision.d.ts +9 -2
  134. package/dist/services/skill-provision.d.ts.map +1 -1
  135. package/dist/services/skill-provision.js +26 -1
  136. package/dist/services/skill-provision.js.map +1 -1
  137. package/dist/services/update-check.d.ts +11 -4
  138. package/dist/services/update-check.d.ts.map +1 -1
  139. package/dist/services/update-check.js +77 -23
  140. package/dist/services/update-check.js.map +1 -1
  141. package/dist/services/workflow-operator.d.ts +9 -0
  142. package/dist/services/workflow-operator.d.ts.map +1 -1
  143. package/dist/services/workflow-operator.js +33 -0
  144. package/dist/services/workflow-operator.js.map +1 -1
  145. package/package.json +1 -1
  146. package/skill-docs/SKILL.md +28 -46
  147. package/skill-docs/assets/factory/chart-dimensions.json +536 -0
  148. package/skill-docs/assets/factory/example-btn-progress-collapse-configured.json +2515 -0
  149. package/skill-docs/assets/factory/example-configured-2.json +13805 -0
  150. package/skill-docs/assets/factory/example-configured.json +6735 -0
  151. package/skill-docs/assets/factory/factory-bar-stack.json +326 -0
  152. package/skill-docs/assets/factory/factory-bar.json +222 -0
  153. package/skill-docs/assets/factory/factory-bubble.json +322 -0
  154. package/skill-docs/assets/factory/factory-calendar.json +325 -0
  155. package/skill-docs/assets/factory/factory-circular.json +320 -0
  156. package/skill-docs/assets/factory/factory-collapse-panel.json +132 -0
  157. package/skill-docs/assets/factory/factory-comment.json +388 -0
  158. package/skill-docs/assets/factory/factory-count-down.json +198 -0
  159. package/skill-docs/assets/factory/factory-digital-panel.json +108 -0
  160. package/skill-docs/assets/factory/factory-eb-button.json +150 -0
  161. package/skill-docs/assets/factory/factory-fast-create.json +62 -0
  162. package/skill-docs/assets/factory/factory-gauge.json +312 -0
  163. package/skill-docs/assets/factory/factory-h-bar-stack.json +328 -0
  164. package/skill-docs/assets/factory/factory-h-bar.json +326 -0
  165. package/skill-docs/assets/factory/factory-line.json +212 -0
  166. package/skill-docs/assets/factory/factory-nav-bar.json +167 -0
  167. package/skill-docs/assets/factory/factory-nav-menu.json +144 -0
  168. package/skill-docs/assets/factory/factory-nav-panel.json +338 -0
  169. package/skill-docs/assets/factory/factory-new-tab.json +163 -0
  170. package/skill-docs/assets/factory/factory-nightingale.json +312 -0
  171. package/skill-docs/assets/factory/factory-nlist.json +112 -0
  172. package/skill-docs/assets/factory/factory-page-header.json +171 -0
  173. package/skill-docs/assets/factory/factory-picture.json +169 -0
  174. package/skill-docs/assets/factory/factory-pie.json +212 -0
  175. package/skill-docs/assets/factory/factory-progress-chart.json +162 -0
  176. package/skill-docs/assets/factory/factory-search-global.json +104 -0
  177. package/skill-docs/assets/factory/factory-slide.json +164 -0
  178. package/skill-docs/assets/factory/factory-treemap.json +322 -0
  179. package/skill-docs/assets/icons.db +0 -0
  180. package/skill-docs/references/coding/guide-page-code.md +21 -1
  181. package/skill-docs/references/coding/ref-compile-rules.md +24 -0
  182. package/skill-docs/references/common/guide-plan-template.md +219 -201
  183. package/skill-docs/references/common/ref-cli-commands.md +366 -320
  184. package/skill-docs/references/ebuilder-designer/guide-designer-components.md +110 -0
  185. package/skill-docs/references/ebuilder-designer/guide-designer-factory.md +460 -0
  186. package/skill-docs/references/ebuilder-designer/guide-designer-version.md +111 -0
  187. package/skill-docs/references/ebuilder-designer/guide-designer.md +287 -0
  188. package/skill-docs/references/form/guide-create-form.md +464 -409
  189. package/skill-docs/references/form/guide-form-button.md +82 -54
  190. package/skill-docs/references/form/guide-form-view.md +299 -284
  191. package/skill-docs/references/workflow/guide-workflow.md +59 -0
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/services/update-check.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,WAAW,CAK7C;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAKrD;AAQD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAUrD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;gEAEgE;AAChE,wBAAsB,WAAW,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAsCrE;AAED,wDAAwD;AACxD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvD"}
1
+ {"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/services/update-check.ts"],"names":[],"mappings":"AAyBA,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,eAAe,IAAI,WAAW,CAK7C;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAKrD;AAsBD,4DAA4D;AAC5D,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAWrD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CA0CrE;AAED,kEAAkE;AAClE,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAWvD"}
@@ -1,18 +1,40 @@
1
1
  /**
2
2
  * e10-cli 版本更新提醒(只提醒,不自动安装)。
3
3
  *
4
- * 设计约定(2026-09-04 与使用者确认):
5
- * - 检查点:`auth status`(每次会话)最多每 24h 查一次;显式 `e10-cli update check` 强查。
6
- * - 离线/内网:连不上 registry 时静默跳过(不 nag、不报错、照常写缓存时间戳避免下次再等超时)。
4
+ * 设计约定(2026-09-04 与使用者确认 + bug review 修订):
5
+ * - 检查点:`auth status`(每次会话)最多每 24h 连网查一次;显式 `e10-cli update check` 强查。
6
+ * - 提醒(P0-2 修订):**缓存里已知道有新版本也要提醒**(不再要求"本次真的连网"),
7
+ * 用 `lastNotifyAt` 把提醒频率限制为**最多一天一次**,避免每次 auth status 都刷。
8
+ * - 失败处理(P1-3 修订):连网失败**只记 lastFailAt(短 TTL)**,不消耗成功检查的 24h 缓存;
9
+ * 网络恢复后下一次 auth status 会重试,而不是"整天失明"。
10
+ * - registry(P1-4 修订):跟随 npm 配置(`npm_config_registry` 环境变量或 ~/.npmrc registry),
11
+ * 缺省官方源——国内/内网用户配了镜像源即生效。
7
12
  * - 动作:只打印「有新版本」一行提醒;真正安装只发生在 `e10-cli update apply` 且用户确认后。
8
- * - 状态存 <authRoot>/update.json:{ enabled, lastCheckAt, latestSeen }。
13
+ * - 状态存 <authRoot>/update.json:{ enabled, lastCheckAt, lastFailAt, lastNotifyAt, latestSeen }。
9
14
  */
10
15
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
16
+ import { homedir } from 'node:os';
17
+ import { join } from 'node:path';
11
18
  import { getAuthRoot } from '../core/edition.js';
12
19
  import { pkgVersion } from './skill-provision.js';
13
- const REGISTRY_LATEST = 'https://registry.npmjs.org/weaver-e10-builder/latest';
14
- const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h 内不再连网重查
15
- const FETCH_TIMEOUT_MS = 2500; // 最坏一次等 2.5s,且每天最多一次
20
+ const DEFAULT_REGISTRY = 'https://registry.npmjs.org';
21
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 成功检查后 24h 内不再连网
22
+ const FAIL_TTL_MS = 30 * 60 * 1000; // 失败后 30min 内不反复连网(避免每次 2.5s 超时)
23
+ const FETCH_TIMEOUT_MS = 2500;
24
+ /** 跟随 npm 配置的 registry(env npm_config_registry > ~/.npmrc registry > 官方源) */
25
+ export function resolveRegistry() {
26
+ const env = process.env.npm_config_registry;
27
+ if (env)
28
+ return String(env).replace(/\/+$/, '');
29
+ try {
30
+ const rc = readFileSync(join(homedir(), '.npmrc'), 'utf8');
31
+ const m = rc.match(/^\s*registry\s*=\s*(\S+)/m);
32
+ if (m)
33
+ return m[1].replace(/\/+$/, '');
34
+ }
35
+ catch { /* 无 .npmrc 忽略 */ }
36
+ return DEFAULT_REGISTRY;
37
+ }
16
38
  export function updateStateFile() {
17
39
  return `${getAuthRoot()}/update.json`;
18
40
  }
@@ -31,13 +53,32 @@ export function writeUpdateState(s) {
31
53
  }
32
54
  catch { /* 写失败不影响功能 */ }
33
55
  }
34
- /** 粗粒度 semver 比较:isNewer(a,b) = a 比 b 新。仅支持 X.Y.Z[-tag];格式不识别时返回 false(宁可漏报不误报)。 */
56
+ /** 版本号 tag 段做数值感知比较('beta.2' < 'beta.10'),避免字符串比较出错 */
57
+ function compareTag(a, b) {
58
+ const as = a.split('.'), bs = b.split('.');
59
+ const n = Math.max(as.length, bs.length);
60
+ for (let i = 0; i < n; i++) {
61
+ const x = as[i] ?? '', y = bs[i] ?? '';
62
+ if (x === y)
63
+ continue;
64
+ const xn = /^\d+$/.test(x), yn = /^\d+$/.test(y);
65
+ if (xn && yn)
66
+ return Number(x) - Number(y);
67
+ if (xn)
68
+ return 1; // 数字段大于字母段(同位置)
69
+ if (yn)
70
+ return -1;
71
+ return x < y ? -1 : 1;
72
+ }
73
+ return 0;
74
+ }
35
75
  function parseVer(v) {
36
76
  const m = String(v).trim().match(/^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/);
37
77
  if (!m)
38
78
  return null;
39
79
  return { m: +m[1], n: +m[2], p: +m[3], tag: m[4] || '' };
40
80
  }
81
+ /** 粗粒度比较:isNewer(a,b) = a 比 b 新。格式不识别时返回 false(宁可漏报不误报)。 */
41
82
  export function isNewer(a, b) {
42
83
  const A = parseVer(a), B = parseVer(b);
43
84
  if (!A || !B)
@@ -51,27 +92,34 @@ export function isNewer(a, b) {
51
92
  return true;
52
93
  if (A.tag && !B.tag)
53
94
  return false;
54
- return A.tag > B.tag;
95
+ if (!A.tag)
96
+ return false;
97
+ return compareTag(A.tag, B.tag) > 0;
55
98
  }
56
- /** 查询是否有新版本。
99
+ /**
100
+ * 查询是否有新版本。
57
101
  * - force=true:忽略缓存强制连网(`update check` / `update apply` 用)
58
- * - force=false:命中 24h 缓存直接返回缓存结论(`auth status` 自动提醒用,不再连网) */
102
+ * - force=false:优先返回缓存结论(不连网);仅在 成功检查过期 且 不在失败静默窗口 时才真正连网
103
+ */
59
104
  export async function checkUpdate(force = false) {
60
105
  const current = pkgVersion();
61
106
  const st = readUpdateState();
62
- const notDue = !!st.lastCheckAt && Date.now() - st.lastCheckAt < CACHE_TTL_MS;
63
- if (!force && notDue) {
107
+ const now = Date.now();
108
+ const notDue = !!st.lastCheckAt && now - st.lastCheckAt < CACHE_TTL_MS;
109
+ const inFailWindow = !!st.lastFailAt && now - st.lastFailAt < FAIL_TTL_MS;
110
+ // 命中成功缓存 / 失败静默窗口:不连网,直接用缓存结论(outdated 用已见过的 latestSeen 判断)
111
+ if (!force && (notDue || inFailWindow)) {
64
112
  const outdated = !!(st.latestSeen && isNewer(st.latestSeen, current));
65
- return { current, latest: st.latestSeen || current, outdated, checked: false };
113
+ return { current, latest: st.latestSeen || current, outdated, checked: false, offline: !notDue && inFailWindow ? true : undefined };
66
114
  }
67
- // 连网查询(带超时;失败静默并记录时间戳,避免离线环境每次 auth status 都等满超时)
115
+ // 真正连网(带超时;失败静默,只记 lastFailAt,不消耗成功缓存)
68
116
  let latest = '';
69
117
  let ok = false;
70
118
  try {
71
119
  const ctl = new AbortController();
72
120
  const timer = setTimeout(() => ctl.abort(), FETCH_TIMEOUT_MS);
73
121
  try {
74
- const resp = await fetch(REGISTRY_LATEST, {
122
+ const resp = await fetch(`${resolveRegistry()}/weaver-e10-builder/latest`, {
75
123
  signal: ctl.signal,
76
124
  headers: { accept: 'application/json', 'user-agent': `e10-cli/${current}` },
77
125
  });
@@ -85,23 +133,29 @@ export async function checkUpdate(force = false) {
85
133
  clearTimeout(timer);
86
134
  }
87
135
  }
88
- catch { /* 离线/超时/解析失败都走离线分支 */ }
89
- writeUpdateState({ ...st, lastCheckAt: Date.now(), latestSeen: latest || st.latestSeen });
136
+ catch { /* 离线/超时/解析失败都走失败分支 */ }
90
137
  if (!ok) {
138
+ writeUpdateState({ ...st, lastFailAt: now, latestSeen: latest || st.latestSeen });
91
139
  const outdated = !!(st.latestSeen && isNewer(st.latestSeen, current));
92
140
  return { current, latest: st.latestSeen || '', outdated, checked: true, offline: true };
93
141
  }
142
+ writeUpdateState({ ...st, lastCheckAt: now, latestSeen: latest });
94
143
  return { current, latest, outdated: isNewer(latest, current), checked: true };
95
144
  }
96
- /** auth status 自动提醒:仅提醒,不安装。任何异常/关闭偏好/非真正连网命中缓存都不打扰。 */
145
+ /** auth status 自动提醒:仅提醒,不安装。缓存里已知有新版本也会提醒(lastNotifyAt 限一天一次)。 */
97
146
  export async function maybeNotifyUpdate() {
98
147
  try {
99
- if (readUpdateState().enabled === false)
148
+ const st = readUpdateState();
149
+ if (st.enabled === false)
100
150
  return;
101
151
  const r = await checkUpdate(false);
102
- if (r.checked && r.outdated && !r.offline) {
103
- console.log(`💡 检测到新版本: ${r.current} → ${r.latest}(仅提醒,不会自动安装)。升级请运行: e10-cli update apply`);
104
- }
152
+ if (!r.outdated || r.offline)
153
+ return; // 无新版本 / 明确离线不打扰
154
+ const now = Date.now();
155
+ if (st.lastNotifyAt && now - st.lastNotifyAt < CACHE_TTL_MS)
156
+ return; // 今天已提醒过
157
+ console.log(`💡 检测到新版本: ${r.current} → ${r.latest}(仅提醒,不会自动安装)。升级请运行: e10-cli update apply`);
158
+ writeUpdateState({ ...readUpdateState(), lastNotifyAt: now });
105
159
  }
106
160
  catch { /* 提醒失败静默 */ }
107
161
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/services/update-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/services/update-check.ts"],"names":[],"mappings":"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"}
@@ -35,4 +35,13 @@ export declare function findRolesByKeywords(roles: any[], keyword: string): {
35
35
  found: any[];
36
36
  missing: string;
37
37
  };
38
+ export interface OrgHit {
39
+ id: string;
40
+ name: string;
41
+ }
42
+ /** 按名/精确 ID 解析部门(complete/department 是模糊搜索,无条件取首条会在重名部门时选错)。
43
+ * 纯数字长 ID 直接命中;模糊结果多匹配时优先「精确同名」,仍多个则报歧义(禁止静默取首条)。 */
44
+ export declare function resolveDepartment(client: OperatorClient, baseUrl: string, keyword: string): Promise<OrgHit>;
45
+ /** 按名/精确 ID 解析岗位(同 D07 规则)。 */
46
+ export declare function resolvePosition(client: OperatorClient, baseUrl: string, keyword: string): Promise<OrgHit>;
38
47
  //# sourceMappingURL=workflow-operator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-operator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM7B;AAED;6CAC6C;AAC7C,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,EAAE,CAAC,CAOhB;AAED,4CAA4C;AAC5C,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,GAAG,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;gFAEgF;AAChF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;AAcD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpG"}
1
+ {"version":3,"file":"workflow-operator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,kDAAkD;AAClD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM7B;AAED;6CAC6C;AAC7C,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,GAAG,EAAE,CAAC,CAOhB;AAED,4CAA4C;AAC5C,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,GAAG,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;gFAEgF;AAChF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAUjB;AAcD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASpG;AAID,MAAM,WAAW,MAAM;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAErD;sDACsD;AACtD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjH;AAED,+BAA+B;AAC/B,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/G"}
@@ -63,4 +63,37 @@ export function findRolesByKeywords(roles, keyword) {
63
63
  }
64
64
  return { found, missing: '' };
65
65
  }
66
+ /** 按名/精确 ID 解析部门(complete/department 是模糊搜索,无条件取首条会在重名部门时选错)。
67
+ * 纯数字长 ID 直接命中;模糊结果多匹配时优先「精确同名」,仍多个则报歧义(禁止静默取首条)。 */
68
+ export async function resolveDepartment(client, baseUrl, keyword) {
69
+ return resolveOrg(client, baseUrl, keyword, 'department');
70
+ }
71
+ /** 按名/精确 ID 解析岗位(同 D07 规则)。 */
72
+ export async function resolvePosition(client, baseUrl, keyword) {
73
+ return resolveOrg(client, baseUrl, keyword, 'position');
74
+ }
75
+ async function resolveOrg(client, baseUrl, keyword, kind) {
76
+ const label = kind === 'department' ? '部门' : '岗位';
77
+ const kw = String(keyword ?? '').trim();
78
+ if (!kw)
79
+ throw new Error(`${label}关键词为空`);
80
+ // 精确长 ID:直接命中(不搜索,避免把 ID 当名字模糊搜错)
81
+ if (/^\d{15,}$/.test(kw))
82
+ return { id: kw, name: kw };
83
+ const body = kind === 'department'
84
+ ? { browserMultiple: true, virtualType: 'All', showSanYuan: true, newly: 0, searchValue: kw }
85
+ : { browserMultiple: true, newly: 0, searchValue: kw };
86
+ const r = await client.post(`${baseUrl}/api/workflow/pathdef/common/browser/complete/${kind}`, body);
87
+ const list = r?.data?.data || [];
88
+ if (!list.length)
89
+ throw new Error(`未找到${label}: ${kw}`);
90
+ const exact = list.filter((d) => String(d.name ?? d.content ?? '').trim() === kw);
91
+ const pool = exact.length ? exact : list;
92
+ if (pool.length > 1) {
93
+ const names = pool.map((d) => d.name || d.content || d.id).slice(0, 8).join('、');
94
+ throw new Error(`${label}「${kw}」匹配到多个(${names}),可能重名;请改传精确${label} ID(纯数字)`);
95
+ }
96
+ const hit = pool[0];
97
+ return { id: String(hit.id), name: String(hit.name ?? hit.content ?? kw) };
98
+ }
66
99
  //# sourceMappingURL=workflow-operator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-operator.js","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-operator.js","sourceRoot":"","sources":["../../src/services/workflow-operator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weaver-e10-builder",
3
- "version": "1.1.2",
3
+ "version": "1.1.5",
4
4
  "description": "Eteams/Ebuilder CLI — 泛微 OA 命令行工具",
5
5
  "type": "module",
6
6
  "files": [
@@ -2,11 +2,11 @@
2
2
  name: weaver-e10-builder
3
3
  display_name: 泛微E10智能搭建Skill
4
4
  display_name_en: E10 Builder
5
- description: 泛微E10智能搭建skill v2(通用版),辅助编写泛微Ebuilder自定义应用,对应CLI版本1.1.2
6
- description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.1.2。
7
- description_en: E10 Ebuilder low-code app builder skill v2 (general) — helps build Weaver E10 custom apps (forms/workflows/lists/actionflows/permissions/groups/numbering) via e10-cli, currently paired with CLI 1.1.2.
5
+ description: 泛微E10智能搭建skill v2(通用版),辅助编写泛微Ebuilder自定义应用,对应CLI版本1.1.5
6
+ description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.1.5。
7
+ description_en: E10 Ebuilder low-code app builder skill v2 (general) — helps build Weaver E10 custom apps (forms/workflows/lists/actionflows/permissions/groups/numbering) via e10-cli, currently paired with CLI 1.1.5.
8
8
  category: coding
9
- version: 1.1.2
9
+ version: 1.1.5
10
10
  author: 泛微网络科技股份有限公司
11
11
  auto: true
12
12
  ---
@@ -15,7 +15,7 @@ auto: true
15
15
 
16
16
  ## 安装与升级
17
17
 
18
- 本 skill 需与 CLI **版本匹配**(当前对应 CLI `1.1.2`)。版本不一致时命令/文档/选项可能对不上——升级前先对齐:
18
+ 本 skill 需与 CLI **版本匹配**(当前对应 CLI `1.1.3`)。版本不一致时命令/文档/选项可能对不上——升级前先对齐:
19
19
 
20
20
  ```shell
21
21
  e10-cli --version # 查 CLI 版本,应与上方 description 标注一致
@@ -57,47 +57,23 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
57
57
 
58
58
  ## 核心理念
59
59
 
60
- > **一份需求文档 = 一个 eb 应用。** 需求里的所有表单、流程、菜单、页面都建在**同一个应用**下,不要按功能点/表单拆成多个应用。只有需求明确要求分属不同业务系统时才建多个应用(此时先跟用户确认再动手)。
60
+ > **默认一份完整业务方案落在一个主应用。** 需求明确指定已有应用、跨应用资源或独立业务边界时,按实际范围处理,并在 `plan.md` 中标明每项资源的所属应用和跨应用关系。
61
61
 
62
62
  ```
63
- 一份需求文档 → 一个 eb 应用
63
+ 一份完整业务方案 → 一个主应用(默认)
64
64
  └→ 应用下的资源: 表单 → 流程 → 菜单 → 页面
65
- 前四个是业务主体
66
- 页面是最后一步
65
+ 跨应用/已有应用增强 → 按实际边界规划并明确资源归属
67
66
  ```
68
67
 
69
68
  接到需求不要一上来就写页面代码。先想清楚这一个应用下需要哪些表单、字段怎么设计、流程怎么走。
70
69
 
71
- **CLI 支持以下能力,均为第一轮就能配好的,不要留到"后续再补":**
72
- - 字段显隐联动(`form linkage add`)——效果类型:`hide`隐藏 / `show`显示(只读) / `edit`编辑 / `readonly`只读 / `required`必填 / `hideLine`隐藏行(仅表格布局,`hideRow` 兼容)
73
- - 动作流常量/公式/加减(`--constants` / `--formula` / mapping `+` `-` 前缀)
74
- - 动作流新建/保留式更新(`actionflow generate` / `actionflow update`);动作流禁用/删除使用 `workflow action disable|delete|batch-delete`
75
- - 动作流事件触发(`ApproveTrigger` / `EventFormData` / `EventButton` / `DateTrigger` / `TimeBatchTrigger` / `SimpleScheduler` / `CustomTrigger` / `InnerMQListener`)和内置 MQ 发送动作(`InnerMQSend`);各触发器按组件类型联动节点/时机,内置 MQ 监听与发送禁止同流
76
- - 动作流更新保持原触发器不变,固定保存为新版并回读校验;若需改变触发类型、触发表单、触发时机或触发器参数,必须新建动作流
77
- - 自定义触发与内置 MQ 监听使用平台原生输入参数结构;参数行、根触发器图标和保存后回读结果均纳入正确性检查
78
- - 动作流标准函数按每个函数的真实参数名、类型、必填规则和枚举配置生成;`code`/`custom` 仍需按平台或租户能力单独处理,函数接口只作使用时的辅助校验
79
- - 分支条件 AND/OR 嵌套(`workflow save-condition`)
80
- - 表单相关人员审批(`set-operator --type form`)
81
- - 复杂编号/年份编号(`form serial-mark`,如 XM-2026-001)
82
- - 消息提醒动作流(`workflow message create`)
83
- - 表单布局管理(`form layout read/init/set-read-only/set-required/move/remove-field`)
84
- - 表单权限管理(`form permission list/add/remove/rebuild`)
85
- - 表单视图管理(`form view create/list/populate` + `form table-view create`)
86
- - 视图权限(`form view-permission list/grant/set`)
87
- - EBuilder 关联字段数据过滤(`form ebuilder-filter get/set/clear`)
88
- - 字段函数公式(`form formula set/get/list/functions`)
70
+ **能力范围**:应用与资源、表单与字段、视图与按钮、流程与动作流、权限、页面、数据操作。具体能力、命令与限制以本页决策树路由到的 `_catalog.md` 和 `references/` 为准;规划时应一次覆盖需求中已明确的配置项,不因主文档未枚举某条命令而遗漏。
89
71
 
90
72
  ---
91
73
 
92
74
  ## 关于「流程表单 / 工作流程」(非默认路径)
93
75
 
94
- 默认一律走 **eb 表单**(低代码应用内,`workflow create`)——本 skill 的主体就是这个路径,不要主动改道。实在不确定的时候,使用UserAsking工具询问用户。通常情况下:工作流程会配表单引擎创建的原生表单。
95
-
96
- **只有当用户明确强调「用流程表单 / 工作流程 / 流程中心建流程、不在应用下」时**,才改用 `workflow create-workflow <name> --sub-company <机构>`(`relateForm=0` 自建 / `--form-id` 绑定已有流程表单;表单走 `/api/workflow/core/form/...`;不带 eb 模式的 `source`/`messageParams`)。用户没强调就按 eb 表单走,不要提流程表单。流程表单建好后,加字段 / 明细子表 / 布局用 `wf-form` 系列命令(`wf-form read` / `add-field` / `add-detail-table` / `layout init` / `layout add`),与 eb 表 `form` 命令对齐、机制相同(仅前缀 `/api/workflow/core/form/` 与 `module:'workflow'` 不同)。字段属性(必填/只读/可编辑/独占一行)用 `wf-form field-prop <formId> --required 项目名称 --readonly 审批状态`(getConfig 读→改→initLayout 保存到运行时布局;FLOW 模板默认业务字段只读锁死,建字段后都要跑)。多套布局并存用 `wf-form layout add <formId> --name <布局名> --layout-type FLOW|EXCEL`(流式/表格式,PC/移动端各一套不覆盖);删布局 `wf-form layout delete <formId> <layoutId>`(emptyNodeLayout 从列表移除);字段分组用 `wf-form group <formId> --groups '{"基本信息":["字段名"],"系统设置":["字段名"]}'`(折叠容器,对齐 eb 表)。
97
-
98
- 概念补充:EB应用无法选到表单引擎创建的原生表单。**eb 应用内的流程也有自由流程选项(平台支持),但 CLI 的 `workflow create`(eb)暂不支持(isFree 固定 0);只有工作流程 `workflow create-workflow` 支持 `--is-free 1`。用户要求 eb 流程自由流转时,须告知 CLI 暂不支持(平台可在浏览器配)。**
99
-
100
- 概念补充:**表单字段一旦有数据就不能删除了**(`deleteFormField` 会报"当前字段已被布局引用,不允许删除";先 initLayout 从布局移除再删也删不掉有数据的字段)。因此字段加错了/多余时**不要删,直接从布局隐藏**:getConfig(带 groupFieldIds)→ 把该字段从 Collapse children 里过滤掉 → initLayout 重存,字段定义保留、表单里不再显示。CLI 目前也没有 `wf-form delete-field`(三件套待补);eb 表 `form delete` 只删整张表单。
76
+ 默认使用 **EB 表单**及应用内流程。只有需求明确要求原生流程表单、工作流程或流程中心建流程时,才切换到 `wf-form` / `workflow create-workflow` 路径;两条路径的资源 ID、接口和布局操作不可混用。不确定且选择会改变资源归属时,再向用户确认。具体命令、布局、字段属性、分组、删除限制和自由流程边界,读取 `references/workflow/guide-workflow.md` 与 `references/common/ref-cli-commands.md`。
101
77
  ---
102
78
 
103
79
  ## 面向人群
@@ -113,10 +89,11 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
113
89
  ### 工作流
114
90
 
115
91
  ```
116
- 0. 环境确认(每次对话必做)
117
- a. 检查当前鉴权:e10-cli auth status(会顺带自动把 skill 文档同步到本机已装 skill)
118
- b. 确认文档在 skill 目录内(如 `~/.claude/skills/weaver-e10-builder/references/`);不在就先 `e10-cli skill sync`
119
- c. 用户提到不同系统地址(如"在 xxx 搭建")→ 必须切换鉴权:
92
+ 0. 远程操作前确认环境
93
+ a. 仅在即将执行远程查询或写入前运行 `e10-cli auth status`;纯文档、代码、日志分析及本地 CLI 修改不鉴权
94
+ b. 同一连续执行阶段已确认当前环境时不重复检查;切换系统地址、profile 或凭证后必须重新确认
95
+ c. 需要读取配套文档但 skill 目录内不存在 `references/` 时,执行 `e10-cli skill sync`
96
+ d. 用户提到不同系统地址(如"在 xxx 搭建")→ 必须切换鉴权:
120
97
  - 已有 profile(凭证已存):e10-cli auth profile use <name>(直接切,无需重新登录)
121
98
  - 新环境:e10-cli auth set --eteamsid "<ETEAMSID>" --base-url <url>
122
99
  (ETEAMSID 从浏览器 DevTools → Application → Cookies 复制;浏览器 OIDC 登录暂未实现,不要用 auth login)
@@ -127,12 +104,14 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
127
104
 
128
105
  2. 全局资源设计(复杂需求必经)
129
106
  a. 理解需求,不够清楚的地方反问用户
130
- b. 在本地写 `plan.md`:**认真阅读用户提供的实施方案/需求文档** **严格按照 `references/common/guide-plan-template.md` 的模板格式,梳理所有需要搭建的资源和配置项**(应用/表单/字段/流程/出口条件/联动/权限/编号/台账配置等编写`plan.md`,需求里提到的每项都要在 plan 中体现,不能凭记忆遗漏),禁止自创格式、禁止预勾。
131
- c. **编写完成后打开 `plan.md` 和用户确认**(此阶段 plan 里所有 `[ ]` 保持未勾——是待办清单,不是完成清单)
132
- d. 用户确认后按大纲**逐项执行、逐项打勾**:每做完一项、验证通过,才把 `[ ]` 改 `[x]` 并填入实际 ID。**完成一条打勾一条**,禁止预勾。
107
+ b. 写 plan 前扫描需求中的布局章节和表格。**每张表单建表前先向用户确认布局类型:流式(FLOW)还是表格式(EXCEL)**——平台建表后不可切换,需求没明说就不要默认。出现“表格式布局/Excel样式/按照如下布局”、`[字段名]`、标签与字段交替、分组标题或有意义的空白单元格时,按“布局样表”解析;识别方法读取 `references/form/guide-create-form.md`
108
+ c. 在本地写 `plan.md`:**认真阅读用户提供的实施方案/需求文档** **严格按照 `references/common/guide-plan-template.md` 的模板格式,梳理所有需要搭建的资源和配置项**(应用/表单/字段/布局蓝图/流程/出口条件/联动/权限/编号/台账配置等编写`plan.md`,需求里提到的每项都要在 plan 中体现,不能凭记忆遗漏),禁止自创格式、禁止预勾。布局样表必须逐行写入对应表单的“表单布局蓝图”,不得仅压缩成 `group`、`singleRow` 或字段顺序
109
+ d. **编写完成后打开 `plan.md` 和用户确认**(此阶段 plan 里所有 `[ ]` 保持未勾——是待办清单,不是完成清单)
110
+ e. 用户确认后按大纲**逐项执行、逐项打勾**:每做完一项、验证通过,才把 `[ ]` 改 `[x]` 并填入实际 ID。**完成一条打勾一条**,禁止预勾。
133
111
 
134
112
  3. 执行搭建(**最多分三段,每段完成停下来让用户确认,确认后才进下一段**)
135
113
  - 段① 应用+角色+全部表单(建表+表内项配齐)→ 确认字段设计 → 段② 流程(先列出口条件清单→逐条创建→`condition list` 回读核对)→ 确认流程 → 段③ 菜单+页面。分段细节与表内项清单见 `references/common/guide-plan-template.md`「执行分段」。
114
+ - 布局样表已进入 plan 时,据蓝图组织 `fields.json`,用现有 `form create --layout EXCEL` 创建并初始化;CLI 不消费蓝图本身。创建后仅在实际需要时读取当前布局并逐项调整,不生成额外布局 JSON、不改初始化逻辑。
136
115
  - 简单单步需求(改字段、查数据)不分段,直接执行。
137
116
  ```
138
117
 
@@ -141,7 +120,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
141
120
  - 本服务运行于 Windows 环境,注意命令行兼容性
142
121
  - 不要多说废话,直接干活。用户等的是结果。
143
122
  - **写代码不要犹豫**,按模板直接出完整代码,写完用 `e10-cli check` 验证。错了报错再改。
144
- - **解析 Word 文档**:用 `e10-cli docx read <文件>` 一键转 markdown + 提取图片,**禁止自己写 python-docx 脚本**。读取后必须逐张 Read `_images/` 目录里的图片做多模态理解,**把分析结果写回 md**(替换图片占位符为实际描述,让文档完整可读)。
123
+ - **解析 Word 文档**:用 `e10-cli docx read <文件>` 一键转 markdown + 提取图片,**禁止自己写 python-docx 脚本**。读取后必须逐张 Read `_images/` 目录里的图片做多模态理解,**把分析结果写回 md**(替换图片占位符为实际描述,让文档完整可读)。表格若承载表单布局,还要按布局样表规则保留空白、同排和分组关系;Markdown 无法确定合并范围时才查看原 DOCX 对应页面或表格结构。
145
124
 
146
125
  ---
147
126
 
@@ -167,7 +146,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
167
146
  | form data add、form data list、form data delete、写入数据、查询数据、删除数据 | `references/form/guide-form-data.md` |
168
147
  | 编辑回显、handleEdit、getAllData、数据回填 | `references/coding/guide-edit-backfill.md`(前端代码) |
169
148
  | 字段联动、显隐联动、条件显示、form linkage | `references/form/guide-form-linkage.md` |
170
- | 新建表单、form create、字段定义、字段类型、fields.json | `references/form/guide-create-form.md` |
149
+ | 新建表单、form create、字段定义、字段类型、fields.json、Excel样式、表格式布局、布局样表、布局蓝图、标签字段交替 | `references/form/guide-create-form.md` |
171
150
  | 流程、审批、workflow、提交流程、预填 | `references/workflow/guide-workflow.md` |
172
151
  | 流程节点、操作者、审批人、连线、添加节点、删除连线、删除节点、delete-node、节点操作者、set-operator、出口名称、link-rename、节点字段权限、field-permission | `references/workflow/guide-workflow.md` |
173
152
  | 节点校验、提交校验、node validate、智能审批规则、字面值校验、禁止提交 | `references/common/ref-cli-commands.md` |
@@ -180,7 +159,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
180
159
  | CLI命令、打包、build、import、创建应用/表单/菜单 | `references/common/ref-cli-commands.md` |
181
160
  | 编译报错、语法不支持、babel | `references/coding/ref-compile-rules.md`(前端代码) |
182
161
  | Word文档、docx、需求文档、解析文档 | `e10-cli docx read` 一键转换,禁止自己写脚本 |
183
- | 新建视图、表格视图、看板、日历、思维导图、form view、台账显示列、显示列、list-columns、搜索条件、排序、list-sort | `references/form/guide-form-view.md` |
162
+ | 新建视图、表格视图、看板、日历、思维导图、form view、台账显示列、显示列、list-columns、搜索条件、排序、list-sort、上下级、父级、树形展示、上级类型、list-hierarchy | `references/form/guide-form-view.md` |
184
163
  | 视图权限、查看布局、修改共享权限、view permission | `references/form/guide-form-view-permission.md` |
185
164
  | EBuilder关联、关联表单、数据过滤设置、ebuilder-filter、EBuilder显示列、ebuilder-columns、去掉系统字段、只留业务字段 | `references/form/guide-ebuilder-filter.md` |
186
165
  | 关联浏览筛选、数据范围设置、浏览数据定义、只选启用状态、关联客户过滤、ebuilder-scope | `references/form/guide-ebuilder-scope.md` |
@@ -191,13 +170,14 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
191
170
  | 显示列批量设置、批量加列、列宽、列顺序、list-columns --set | `references/form/guide-list-columns.md` |
192
171
  | 顶部统计、明细统计、付款记录数、list-stats、子表计数 | `references/form/guide-list-stats.md` |
193
172
  | 关联页签、关联视图、association、页签显示布局、关联数据筛选、set-filter | `references/form/guide-form-association.md` |
194
- | 表单按钮、button、自定义按钮、视图按钮、行上、行末下拉、按钮显示位置 | `references/form/guide-form-button.md`(位置配置);`references/common/ref-cli-commands.md`(其他按钮命令) |
173
+ | 表单按钮、button、自定义按钮、视图按钮、行上、行末下拉、右上、打开视图、打开布局、发起流程、按钮预填、按钮字段映射、action-set | `references/form/guide-form-button.md`;`references/common/ref-cli-commands.md` |
195
174
  | 表单权限、permission、数据权限 | `references/common/ref-cli-commands.md` |
196
175
  | 消息提醒、消息动作流、workflow message、IM提醒 | `references/common/ref-cli-commands.md` |
197
176
  | 编号规则、serial-mark、自动编号、流水号、年份编号、流程编号、numbering | `references/common/ref-cli-commands.md` |
198
177
  | 超时处理、退回设置、节点菜单、node timeout、node reject | `references/common/ref-cli-commands.md` |
199
178
  | 流程设置、提交确认、签字意见、批量操作、setting | `references/common/ref-cli-commands.md` |
200
179
  | 流程存档、定时触发、高级设置、advanced | `references/common/ref-cli-commands.md` |
180
+ | 页面设计器、配置式页面、仪表盘、看板页、designer、page create、comp-add、工厂模板、factory、组件模板、页面布局、designer layout/save、页面版本、version revert、发布页面菜单、publish-menu | `references/ebuilder-designer/guide-designer.md`(布局层);组件配置见 `guide-designer-components.md`,工厂模板见 `guide-designer-factory.md`,版本见 `guide-designer-version.md`,命令速查见 `references/common/ref-cli-commands.md`「页面 & 设计器」节 |
201
181
  | HRM、矩阵、条件矩阵、matrix、映射表 | `references/hrm/guide-matrix.md` |
202
182
 
203
183
  > 组件文档(Button/Table/Input/Upload 等)在 `references/` 中按文件名查找。完整索引见 `_catalog.md`。
@@ -210,7 +190,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
210
190
 
211
191
  - **Ecode** — 存放和运行代码的平台,自定义页面在这里编码、构建、运行
212
192
  - **Ebuilder 应用** — 独立的概念,包含表单、流程等元素(与 Ecode 项目不同)
213
- - **表单自带台账,无需开发** — 每个表单创建后,平台自动生成默认的台账/列表页面,自带搜索、筛选、导出、批量操作。**台账会自动挂入应用菜单,无需手动建菜单。** 这不是一个「功能」,是一个硬规则——建了表单就有台账页面,不需要写一行代码。只有以下场景才需要自定义页面:图表仪表盘、跨表单聚合视图、特殊交互流程、对外公开页面。
193
+ - **默认台账与菜单入口是两件事** — 表单创建后会生成默认台账/列表视图,但当前 CLI 的 `form create` 默认不添加应用菜单;需求需要入口时使用 `--menu`,或建表后执行 `menu add-table`。不要因默认台账已存在而假定菜单入口也存在。只有图表仪表盘、跨表单聚合视图、特殊交互流程、对外公开页面等场景才需要自定义页面。
214
194
  - 所有系统交互命令均通过 `e10-cli` 执行(已全局 link)。auth 文件自动查找,也可 `--auth <path>` 指定。
215
195
  - 用户的 userId 是固定的变量 `TEAMS.currentUser.id`,系统里已支持,js 代码里可以直接写。
216
196
 
@@ -257,6 +237,8 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
257
237
 
258
238
  > **页面是搭建流程的最后一步。** 写页面代码前,确保应用、表单、流程都已建好。
259
239
 
240
+ **应用内建页优先用设计器 Ebuilder 页面(配置式)**——`page create` → `designer comp-add --template`(28 个内置工厂模板)→ 绑数据 → `designer save` → `designer unlock` → `page publish-menu`,全程不写前端代码;详见 `references/ebuilder-designer/guide-designer.md`。**只有设计器组件无法满足的深度定制交互(特殊交互逻辑、复杂跨表联动 UI)才用 Ecode React 编码**。
241
+
260
242
  页面编码规范、entry.js 模板、@weapp/ui 组件清单、编译规则、代码质量检查清单 → 详见 `references/coding/guide-page-code.md`(前端代码)。
261
243
 
262
244
  ---