weaver-e10-builder 1.5.11 → 1.5.12

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 (172) hide show
  1. package/README.md +212 -189
  2. package/assets/image-style-observation.schema.json +1355 -0
  3. package/assets/layout-spec.schema.json +52 -0
  4. package/dist/commands/form-field-linkage.d.ts +55 -0
  5. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  6. package/dist/commands/form-field-linkage.js +1026 -12
  7. package/dist/commands/form-field-linkage.js.map +1 -1
  8. package/dist/commands/form-formula-linkage.d.ts +36 -0
  9. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  10. package/dist/commands/form-formula-linkage.js +107 -7
  11. package/dist/commands/form-formula-linkage.js.map +1 -1
  12. package/dist/commands/form-layout-restore.d.ts +3 -0
  13. package/dist/commands/form-layout-restore.d.ts.map +1 -0
  14. package/dist/commands/form-layout-restore.js +217 -0
  15. package/dist/commands/form-layout-restore.js.map +1 -0
  16. package/dist/commands/form-layout.d.ts.map +1 -1
  17. package/dist/commands/form-layout.js +11 -1
  18. package/dist/commands/form-layout.js.map +1 -1
  19. package/dist/commands/form-obj-meta.d.ts +12 -0
  20. package/dist/commands/form-obj-meta.d.ts.map +1 -0
  21. package/dist/commands/form-obj-meta.js +116 -0
  22. package/dist/commands/form-obj-meta.js.map +1 -0
  23. package/dist/commands/form-validate.d.ts.map +1 -1
  24. package/dist/commands/form-validate.js +167 -35
  25. package/dist/commands/form-validate.js.map +1 -1
  26. package/dist/commands/form.d.ts.map +1 -1
  27. package/dist/commands/form.js +26 -2
  28. package/dist/commands/form.js.map +1 -1
  29. package/dist/commands/menu.d.ts.map +1 -1
  30. package/dist/commands/menu.js +5 -3
  31. package/dist/commands/menu.js.map +1 -1
  32. package/dist/commands/wf-form.d.ts.map +1 -1
  33. package/dist/commands/wf-form.js +215 -13
  34. package/dist/commands/wf-form.js.map +1 -1
  35. package/dist/core/client.d.ts +2 -1
  36. package/dist/core/client.d.ts.map +1 -1
  37. package/dist/core/client.js +4 -2
  38. package/dist/core/client.js.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
  42. package/dist/services/actionflow/calendar_mapper.js +34 -14
  43. package/dist/services/actionflow/calendar_mapper.js.map +1 -1
  44. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  45. package/dist/services/actionflow/components/document_actions.js +113 -4
  46. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  47. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  48. package/dist/services/actionflow/components/eb_get_data_by_id.js +18 -1
  49. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  50. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  51. package/dist/services/actionflow/components/index.js +2 -1
  52. package/dist/services/actionflow/components/index.js.map +1 -1
  53. package/dist/services/actionflow/components/schedule_create.d.ts.map +1 -1
  54. package/dist/services/actionflow/components/schedule_create.js +22 -6
  55. package/dist/services/actionflow/components/schedule_create.js.map +1 -1
  56. package/dist/services/actionflow/components/workflow_actions.d.ts +1 -0
  57. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/workflow_actions.js +31 -6
  59. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  60. package/dist/services/actionflow/document_source.d.ts +5 -0
  61. package/dist/services/actionflow/document_source.d.ts.map +1 -1
  62. package/dist/services/actionflow/document_source.js +16 -0
  63. package/dist/services/actionflow/document_source.js.map +1 -1
  64. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  65. package/dist/services/actionflow/formula_service.js +19 -8
  66. package/dist/services/actionflow/formula_service.js.map +1 -1
  67. package/dist/services/actionflow/preflight_service.d.ts +5 -0
  68. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  69. package/dist/services/actionflow/preflight_service.js +127 -2
  70. package/dist/services/actionflow/preflight_service.js.map +1 -1
  71. package/dist/services/actionflow/save_workflow_draft.d.ts +7 -0
  72. package/dist/services/actionflow/save_workflow_draft.d.ts.map +1 -1
  73. package/dist/services/actionflow/save_workflow_draft.js +1 -1
  74. package/dist/services/actionflow/save_workflow_draft.js.map +1 -1
  75. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  76. package/dist/services/actionflow/workflow_compiler.js +26 -0
  77. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  78. package/dist/services/form-formula-linkage.d.ts +4 -0
  79. package/dist/services/form-formula-linkage.d.ts.map +1 -1
  80. package/dist/services/form-formula-linkage.js +3 -1
  81. package/dist/services/form-formula-linkage.js.map +1 -1
  82. package/dist/services/form-layout-io.d.ts +18 -0
  83. package/dist/services/form-layout-io.d.ts.map +1 -0
  84. package/dist/services/form-layout-io.js +89 -0
  85. package/dist/services/form-layout-io.js.map +1 -0
  86. package/dist/services/form-layout-source/artifact.d.ts +8 -0
  87. package/dist/services/form-layout-source/artifact.d.ts.map +1 -0
  88. package/dist/services/form-layout-source/artifact.js +52 -0
  89. package/dist/services/form-layout-source/artifact.js.map +1 -0
  90. package/dist/services/form-layout-source/binding.d.ts +10 -0
  91. package/dist/services/form-layout-source/binding.d.ts.map +1 -0
  92. package/dist/services/form-layout-source/binding.js +43 -0
  93. package/dist/services/form-layout-source/binding.js.map +1 -0
  94. package/dist/services/form-layout-source/compile.d.ts +7 -0
  95. package/dist/services/form-layout-source/compile.d.ts.map +1 -0
  96. package/dist/services/form-layout-source/compile.js +262 -0
  97. package/dist/services/form-layout-source/compile.js.map +1 -0
  98. package/dist/services/form-layout-source/creation.d.ts +18 -0
  99. package/dist/services/form-layout-source/creation.d.ts.map +1 -0
  100. package/dist/services/form-layout-source/creation.js +42 -0
  101. package/dist/services/form-layout-source/creation.js.map +1 -0
  102. package/dist/services/form-layout-source/excel-extractor.d.ts +7 -0
  103. package/dist/services/form-layout-source/excel-extractor.d.ts.map +1 -0
  104. package/dist/services/form-layout-source/excel-extractor.js +342 -0
  105. package/dist/services/form-layout-source/excel-extractor.js.map +1 -0
  106. package/dist/services/form-layout-source/image-border.d.ts +9 -0
  107. package/dist/services/form-layout-source/image-border.d.ts.map +1 -0
  108. package/dist/services/form-layout-source/image-border.js +128 -0
  109. package/dist/services/form-layout-source/image-border.js.map +1 -0
  110. package/dist/services/form-layout-source/image-observation.d.ts +14 -0
  111. package/dist/services/form-layout-source/image-observation.d.ts.map +1 -0
  112. package/dist/services/form-layout-source/image-observation.js +90 -0
  113. package/dist/services/form-layout-source/image-observation.js.map +1 -0
  114. package/dist/services/form-layout-source/image-review.d.ts +32 -0
  115. package/dist/services/form-layout-source/image-review.d.ts.map +1 -0
  116. package/dist/services/form-layout-source/image-review.js +266 -0
  117. package/dist/services/form-layout-source/image-review.js.map +1 -0
  118. package/dist/services/form-layout-source/image-style.d.ts +16 -0
  119. package/dist/services/form-layout-source/image-style.d.ts.map +1 -0
  120. package/dist/services/form-layout-source/image-style.js +539 -0
  121. package/dist/services/form-layout-source/image-style.js.map +1 -0
  122. package/dist/services/form-layout-source/json.d.ts +3 -0
  123. package/dist/services/form-layout-source/json.d.ts.map +1 -0
  124. package/dist/services/form-layout-source/json.js +33 -0
  125. package/dist/services/form-layout-source/json.js.map +1 -0
  126. package/dist/services/form-layout-source/presentation.d.ts +23 -0
  127. package/dist/services/form-layout-source/presentation.d.ts.map +1 -0
  128. package/dist/services/form-layout-source/presentation.js +174 -0
  129. package/dist/services/form-layout-source/presentation.js.map +1 -0
  130. package/dist/services/form-layout-source/preview.d.ts +4 -0
  131. package/dist/services/form-layout-source/preview.d.ts.map +1 -0
  132. package/dist/services/form-layout-source/preview.js +49 -0
  133. package/dist/services/form-layout-source/preview.js.map +1 -0
  134. package/dist/services/form-layout-source/schema.d.ts +20 -0
  135. package/dist/services/form-layout-source/schema.d.ts.map +1 -0
  136. package/dist/services/form-layout-source/schema.js +149 -0
  137. package/dist/services/form-layout-source/schema.js.map +1 -0
  138. package/dist/services/form-layout-source/source-grid.d.ts +8 -0
  139. package/dist/services/form-layout-source/source-grid.d.ts.map +1 -0
  140. package/dist/services/form-layout-source/source-grid.js +61 -0
  141. package/dist/services/form-layout-source/source-grid.js.map +1 -0
  142. package/dist/services/form-layout-source/types.d.ts +242 -0
  143. package/dist/services/form-layout-source/types.d.ts.map +1 -0
  144. package/dist/services/form-layout-source/types.js +2 -0
  145. package/dist/services/form-layout-source/types.js.map +1 -0
  146. package/dist/services/form-layout-source/verify.d.ts +14 -0
  147. package/dist/services/form-layout-source/verify.d.ts.map +1 -0
  148. package/dist/services/form-layout-source/verify.js +226 -0
  149. package/dist/services/form-layout-source/verify.js.map +1 -0
  150. package/dist/services/form-obj-meta.d.ts +72 -0
  151. package/dist/services/form-obj-meta.d.ts.map +1 -0
  152. package/dist/services/form-obj-meta.js +103 -0
  153. package/dist/services/form-obj-meta.js.map +1 -0
  154. package/dist/services/validate-help.d.ts +25 -0
  155. package/dist/services/validate-help.d.ts.map +1 -0
  156. package/dist/services/validate-help.js +29 -0
  157. package/dist/services/validate-help.js.map +1 -0
  158. package/package.json +3 -1
  159. package/skill-docs/SKILL.md +15 -6
  160. package/skill-docs/_catalog.md +1 -0
  161. package/skill-docs/actionflows/references/components/document/DocumentSave.md +17 -17
  162. package/skill-docs/actionflows/references/components/workflow/ApproveCompletelyDelete.md +29 -0
  163. package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +1 -1
  164. package/skill-docs/assets/schemas/image-style-observation.schema.json +1355 -0
  165. package/skill-docs/references/common/guide-plan-template.md +3 -0
  166. package/skill-docs/references/common/ref-cli-commands.md +17 -4
  167. package/skill-docs/references/form/guide-create-form.md +2 -0
  168. package/skill-docs/references/form/guide-field-linkage.md +140 -55
  169. package/skill-docs/references/form/guide-form-layout-planning.md +6 -0
  170. package/skill-docs/references/form/guide-form-layout-source.md +366 -0
  171. package/skill-docs/references/form/guide-form-view.md +1 -1
  172. package/skill-docs/references/form/guide-formula-linkage.md +44 -1
@@ -0,0 +1,226 @@
1
+ import { businessData, environmentOrigin, fieldsHash, layoutRoute, readLayoutContext, snapshotHash } from '../form-layout-io.js';
2
+ import { assert, clone, stable } from './schema.js';
3
+ import { associatedField, detailIdentity, flattenComponents } from './binding.js';
4
+ import { validateArtifact } from './compile.js';
5
+ import { canonicalImageFormStyle, imageStyleReport } from './image-style.js';
6
+ import { assertImageStyleConfirmed } from './image-review.js';
7
+ import { imageBorderReport } from './image-border.js';
8
+ function identity(comp, fields) {
9
+ if (comp.type === 'DetailTable')
10
+ return `detail:${detailIdentity(comp)}`;
11
+ const field = associatedField(comp);
12
+ if (fields.has(field))
13
+ return `${comp.type === 'InternalTitle' ? 'title' : 'value'}:${field}`;
14
+ return `preserved:${comp.id}`;
15
+ }
16
+ function compare(expected, actual, path, differences) {
17
+ if (stable(expected) === stable(actual))
18
+ return;
19
+ if (differences.length >= 100)
20
+ return;
21
+ if (expected && actual && typeof expected === 'object' && typeof actual === 'object' && Array.isArray(expected) === Array.isArray(actual)) {
22
+ if (Array.isArray(expected)) {
23
+ if (expected.length !== actual.length)
24
+ differences.push({ path: `${path}.length`, expected: expected.length, actual: actual.length });
25
+ for (let i = 0; i < Math.min(expected.length, actual.length); i++)
26
+ compare(expected[i], actual[i], `${path}[${i}]`, differences);
27
+ }
28
+ else
29
+ for (const key of new Set([...Object.keys(expected), ...Object.keys(actual)]))
30
+ compare(expected[key], actual[key], `${path}.${key}`, differences);
31
+ }
32
+ else
33
+ differences.push({ path, expected: expected ?? null, actual: actual ?? null });
34
+ }
35
+ /** 仅在一对一语义身份闭合后重绑服务器重新分配的组件及节点 ID。 */
36
+ function normalizePages(expected, actual, fields) {
37
+ const exp = clone(expected);
38
+ const act = clone(actual);
39
+ const componentIds = new Map();
40
+ const nodeIds = new Map();
41
+ const ec = flattenComponents(exp.flatMap(p => p.comps || []));
42
+ const ac = flattenComponents(act.flatMap(p => p.comps || []));
43
+ const byKey = new Map();
44
+ for (const comp of ac) {
45
+ const key = identity(comp, fields);
46
+ assert(!byKey.has(key), `回读组件语义身份重复 ${key}`);
47
+ byKey.set(key, comp);
48
+ }
49
+ const seen = new Set();
50
+ for (const comp of ec) {
51
+ const key = identity(comp, fields);
52
+ assert(!seen.has(key), '预期组件语义身份重复');
53
+ seen.add(key);
54
+ const hit = byKey.get(key);
55
+ assert(hit && hit.type === comp.type, `回读缺少同类型组件 ${key}`);
56
+ assert(!componentIds.has(String(hit.id)), '回读组件 ID 重复');
57
+ componentIds.set(String(hit.id), String(comp.id));
58
+ hit.id = comp.id;
59
+ // 只有标签自己的布局 fieldId 可重绑;值组件与任意业务属性中的 ID 都保持原样。
60
+ if (comp.type === 'InternalTitle' && comp.config?.fieldId && hit.config?.fieldId && !fields.has(String(comp.config.fieldId)) && !fields.has(String(hit.config.fieldId)))
61
+ hit.config.fieldId = comp.config.fieldId;
62
+ for (const mode of ['excel', 'flow'])
63
+ if (hit.config?.[mode]?.nodeId && comp.config?.[mode]?.nodeId) {
64
+ const id = String(hit.config[mode].nodeId);
65
+ assert(!nodeIds.has(id), '回读节点 ID 重复');
66
+ nodeIds.set(id, String(comp.config[mode].nodeId));
67
+ }
68
+ }
69
+ assert(seen.size === byKey.size, '回读新增了未声明组件');
70
+ const geometry = (value, keys) => {
71
+ for (const key of keys)
72
+ if (typeof value?.[key] === 'string' && /^\d+(?:\.\d+)?$/.test(value[key]))
73
+ value[key] = Number(value[key]);
74
+ };
75
+ for (const comp of ac)
76
+ for (const mode of ['excel', 'flow']) {
77
+ const layout = comp.config?.[mode];
78
+ if (!layout)
79
+ continue;
80
+ if (nodeIds.has(String(layout.nodeId)))
81
+ layout.nodeId = nodeIds.get(String(layout.nodeId));
82
+ if (nodeIds.has(String(layout.parent)))
83
+ layout.parent = nodeIds.get(String(layout.parent));
84
+ if (Array.isArray(layout.nodes))
85
+ layout.nodes = layout.nodes.map((id) => nodeIds.get(String(id)) || id);
86
+ if (layout.linkedNodes)
87
+ layout.linkedNodes = Object.fromEntries(Object.entries(layout.linkedNodes).map(([id, value]) => [nodeIds.get(id) || id, typeof value === 'string' ? nodeIds.get(value) || value : value]));
88
+ }
89
+ const order = (pages) => pages.map(p => {
90
+ // 保存后的页版本元数据会更新;只从验收副本移除,保存前 snapshotHash 仍保留它们。
91
+ for (const key of ['updateTime', 'updateTimeStamp', 'pageVersion'])
92
+ delete p[key];
93
+ for (const comp of flattenComponents(p.comps || []))
94
+ for (const mode of ['excel', 'flow'])
95
+ if (comp.config?.[mode])
96
+ geometry(comp.config[mode], ['row', 'col']);
97
+ if (p.config?.workbook)
98
+ for (const sheet of Object.values(p.config.workbook)) {
99
+ geometry(sheet, ['rowCount', 'columnCount']);
100
+ for (const row of [...(sheet.rows || []), ...(sheet.columns || [])])
101
+ geometry(row, ['size', 'defaultWidth']);
102
+ for (const cell of sheet.cells || [])
103
+ geometry(cell, ['row', 'col']);
104
+ for (const span of sheet.spans || [])
105
+ geometry(span, ['row', 'col', 'rowCount', 'colCount']);
106
+ if (Array.isArray(sheet.cells))
107
+ sheet.cells.sort((a, b) => Number(a.row) - Number(b.row) || Number(a.col) - Number(b.col));
108
+ if (Array.isArray(sheet.spans))
109
+ sheet.spans.sort((a, b) => Number(a.row) - Number(b.row) || Number(a.col) - Number(b.col));
110
+ }
111
+ if (Array.isArray(p.comps))
112
+ p.comps.sort((a, b) => String(a.id).localeCompare(String(b.id)));
113
+ return p;
114
+ });
115
+ // 明细 workbook 的键也是组件 ID;必须同步重绑,不能忽略整个 workbook。
116
+ for (const page of act)
117
+ if (page.config?.workbook) {
118
+ page.config.workbook = Object.fromEntries(Object.entries(page.config.workbook).map(([key, value]) => [componentIds.get(key) || key, value]));
119
+ for (const sheet of Object.values(page.config.workbook))
120
+ for (const cell of sheet.cells || []) {
121
+ const type = cell.style?.cellType;
122
+ if (type && componentIds.has(String(type.comId)))
123
+ type.comId = componentIds.get(String(type.comId));
124
+ }
125
+ }
126
+ return { expected: order(exp), actual: order(act) };
127
+ }
128
+ export function verifySourceLayout(artifact, current) {
129
+ validateArtifact(artifact);
130
+ const differences = [];
131
+ const expected = artifact.request.formLayout;
132
+ const actual = current.snapshot.formLayout;
133
+ const fieldsPreserved = artifact.fieldHash === fieldsHash(current.fields);
134
+ if (!fieldsPreserved)
135
+ differences.push({ path: 'fields.businessConfiguration', expected: artifact.fieldHash, actual: fieldsHash(current.fields) });
136
+ compare(artifact.context.target, current.target, 'target', differences);
137
+ compare(artifact.context.origin, current.origin, 'origin', differences);
138
+ compare(String(artifact.context.target.formId), String(current.snapshot.form?.id), 'form.id', differences);
139
+ compare(String(expected.id), String(actual?.id), 'layout.id', differences);
140
+ compare(expected.multipleLayoutId, actual?.multipleLayoutId, 'layout.multipleLayoutId', differences);
141
+ if (artifact.source.imageStyles) {
142
+ try {
143
+ compare(canonicalImageFormStyle(expected.formStyle), canonicalImageFormStyle(actual?.formStyle), 'layout.formStyle', differences);
144
+ }
145
+ catch {
146
+ differences.push({ path: 'layout.formStyle', expected: 'VALID_NATIVE_STYLE', actual: 'INVALID_NATIVE_STYLE' });
147
+ }
148
+ }
149
+ else
150
+ compare(expected.formStyle, actual?.formStyle, 'layout.formStyle', differences);
151
+ let styleReport = artifact.imageStyleProjection ? imageStyleReport(artifact.imageStyleProjection) : undefined;
152
+ let borderReport = artifact.imageBorderProjection ? imageBorderReport(artifact.imageBorderProjection, actual?.pageLayouts?.[0]?.config?.workbook?.Sheet1 || {}) : undefined;
153
+ const ignoredPageMetadata = [];
154
+ for (let i = 0; i < (expected.pageLayouts || []).length; i++)
155
+ for (const property of ['updateTime', 'updateTimeStamp', 'pageVersion']) {
156
+ const before = expected.pageLayouts[i]?.[property], after = actual?.pageLayouts?.[i]?.[property];
157
+ if (stable(before) !== stable(after))
158
+ ignoredPageMetadata.push({ pageIndex: i, property, expected: before ?? null, actual: after ?? null });
159
+ }
160
+ const platformNotPersisted = [];
161
+ try {
162
+ const pages = normalizePages(expected.pageLayouts, actual?.pageLayouts || [], new Set(artifact.context.fields.map(f => String(f.fieldId))));
163
+ const values = flattenComponents(pages.actual.flatMap(p => p.comps || []));
164
+ for (const comp of flattenComponents(pages.expected.flatMap(p => p.comps || [])))
165
+ if (comp.type === 'TextArea') {
166
+ const fieldId = associatedField(comp), hit = values.find(c => c.id === comp.id), field = current.fields.find(f => String(f.fieldId) === fieldId);
167
+ for (const property of ['height', 'disableAutoHeight']) {
168
+ const wanted = comp.config?.[property], got = hit?.config?.[property];
169
+ if (wanted !== undefined && stable(wanted) !== stable(got) && field?.[property] !== undefined && stable(field[property]) === stable(got))
170
+ platformNotPersisted.push({ fieldId, property, expected: wanted, actual: got ?? null });
171
+ }
172
+ }
173
+ compare(pages.expected, pages.actual, 'layout.pageLayouts', differences);
174
+ if (artifact.imageStyleProjection)
175
+ styleReport = imageStyleReport(artifact.imageStyleProjection, pages.actual, actual?.formStyle);
176
+ if (artifact.imageBorderProjection)
177
+ borderReport = imageBorderReport(artifact.imageBorderProjection, pages.actual[0]?.config?.workbook?.Sheet1 || {});
178
+ }
179
+ catch (error) {
180
+ differences.push({ path: 'layout.componentIdentity', expected: 'ONE_TO_ONE', actual: error.message });
181
+ }
182
+ const structureVerified = !differences.some(d => d.path !== 'fields.businessConfiguration');
183
+ return {
184
+ verified: structureVerified && fieldsPreserved, structureVerified, fieldsPreserved,
185
+ sourceStyleVerified: structureVerified && artifact.source.sourceType === 'excel' && artifact.warnings.length === 0 && artifact.source.sheets.some(s => s.name === artifact.spec.sheet && s.cells.length > 0),
186
+ pixelVerified: false, differences, unsupported: clone(artifact.warnings),
187
+ ...(styleReport ? { imageStyleReport: styleReport } : {}),
188
+ ...(borderReport ? { imageBorderReport: borderReport } : {}),
189
+ styleComplete: (styleReport ? styleReport.status === 'VERIFIED' : structureVerified && artifact.warnings.length === 0) && (!borderReport || borderReport.status === 'VERIFIED'),
190
+ ...(ignoredPageMetadata.length ? { ignoredPageMetadata } : {}),
191
+ ...(platformNotPersisted.length ? { platformNotPersisted } : {}),
192
+ };
193
+ }
194
+ /** 单次提交。结果未知时先独立回读;不重复发送保存请求,不自动 initLayout。 */
195
+ export async function applySourceLayout(client, baseUrl, artifact) {
196
+ validateArtifact(artifact);
197
+ assert(artifact.context.origin === environmentOrigin(baseUrl), '产物所属系统与当前环境不同');
198
+ assertImageStyleConfirmed(artifact);
199
+ const current = await readLayoutContext(client, baseUrl, artifact.context.target);
200
+ const already = verifySourceLayout(artifact, current);
201
+ if (already.verified)
202
+ return { saved: true, saveAccepted: null, mutationStarted: false, recoveredAfterUnknownResult: false, report: already };
203
+ assert(fieldsHash(current.fields) === artifact.fieldHash, '[LAYOUT_FIELDS_CHANGED] 目标字段已变更;重新 inspect → compile,不覆盖已有字段配置');
204
+ assert(snapshotHash(current.snapshot) === artifact.snapshotHash, '[LAYOUT_SNAPSHOT_CHANGED] 布局快照已变更(可能包含 updateTime/pageVersion);重新 inspect → compile → apply,不直接刷新时间戳覆盖新快照');
205
+ let error = '';
206
+ let saveAccepted = null;
207
+ try {
208
+ const response = await client.post(`${baseUrl}${layoutRoute(artifact.context.target, 'saveFormAndLayout')}`, clone(artifact.request), { ebbusinessid: artifact.context.target.formId });
209
+ saveAccepted = false;
210
+ businessData(response, '保存源布局', false);
211
+ saveAccepted = true;
212
+ }
213
+ catch (e) {
214
+ error = e.message;
215
+ }
216
+ let report;
217
+ try {
218
+ report = verifySourceLayout(artifact, await readLayoutContext(client, baseUrl, artifact.context.target));
219
+ }
220
+ catch (e) {
221
+ report = { verified: false, structureVerified: false, sourceStyleVerified: false, fieldsPreserved: false, pixelVerified: false, unsupported: clone(artifact.warnings), differences: [{ path: 'independentReadback', expected: 'READABLE', actual: e.message }],
222
+ ...(artifact.imageStyleProjection ? { imageStyleReport: imageStyleReport(artifact.imageStyleProjection) } : {}) };
223
+ }
224
+ return { saved: report.verified, saveAccepted, mutationStarted: true, recoveredAfterUnknownResult: !!error && report.verified, report, ...(error ? { error } : {}) };
225
+ }
226
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/services/form-layout-source/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type EBuilderRoute } from './special-route.js';
2
+ import type { ApiClient } from '../core/client.js';
3
+ /**
4
+ * 表单对象(obj)的两套「名字」:**表单名称** 与 **自定义标题**。
5
+ *
6
+ * 两者在平台上互不相干 —— 不同端点、字段不重叠:
7
+ *
8
+ * - 表单名称 `name` → POST `obj/saveOrUpdate`(**整对象覆盖**)
9
+ * - 自定义标题 `showName` / `formPageName` → POST `obj/saveOrUpdateTitle`(小报文)
10
+ *
11
+ * ⚠ **改表单名时绝不要顺手写 `showName`** —— 那是标题,会被一起改掉。两者不一致
12
+ * (`name` ≠ `showName`)是正常状态,不是「漏改」:CLI 建表时两者同名,之后在
13
+ * 界面上单独改过其中一个就会分叉。
14
+ *
15
+ * ⚠ 另有一个 `matterName`(事项名)是第三套,CLI 建表时发空串,本模块不碰。
16
+ */
17
+ export type FormObjClient = Pick<ApiClient, 'get' | 'post'>;
18
+ /** 归 `obj/saveOrUpdateTitle` 管的字段。改名回写时剔除,避免被 `saveOrUpdate` 顺手覆盖。 */
19
+ export declare const FORM_TITLE_FIELDS: readonly ["showName", "formPageName", "isHiddenHeader", "hiddenFormTitle", "pageNameAllIn"];
20
+ /**
21
+ * 读回表单对象全字段(`obj/getInfoById`)。
22
+ * 界面改名的底稿就是这份响应:读回整体 → 改一处 → 整体回写。
23
+ */
24
+ export declare function getFormObj(client: FormObjClient, baseUrl: string, appId: string, objId: string, route?: EBuilderRoute): Promise<Record<string, any>>;
25
+ export interface RenameFormObjResult {
26
+ objId: string;
27
+ appId: string;
28
+ oldName: string;
29
+ name: string;
30
+ /** false = 新名与现名相同,未发写请求。 */
31
+ changed: boolean;
32
+ }
33
+ /**
34
+ * 修改**表单名称**(`name`)。
35
+ *
36
+ * `obj/saveOrUpdate` 是整对象覆盖 —— 只发 `{id, name}` 会把其余字段清空,
37
+ * 因此流程固定为:读回完整对象 → 剔除标题字段与只读字段 → 换 `name` → 整体回写 → 回读校验。
38
+ */
39
+ export declare function renameFormObj(client: FormObjClient, baseUrl: string, appId: string, objId: string, newName: string, route?: EBuilderRoute): Promise<RenameFormObjResult>;
40
+ export interface FormTitle {
41
+ /** 标题文本。 */
42
+ showName: string;
43
+ formPageName: string;
44
+ /** 1 = 隐藏页面头部。 */
45
+ isHiddenHeader: number;
46
+ /** 1 = 隐藏表单标题。此时改标题在界面上看不出变化。 */
47
+ hiddenFormTitle: number;
48
+ pageNameAllIn: number;
49
+ }
50
+ /** 可改的标题字段。 */
51
+ export interface FormTitlePatch {
52
+ showName?: string;
53
+ formPageName?: string;
54
+ isHiddenHeader?: number;
55
+ hiddenFormTitle?: number;
56
+ pageNameAllIn?: number;
57
+ }
58
+ /** 读自定义标题(从对象全字段里取标题子集 —— `getInfoById` 就是这些字段的来源)。 */
59
+ export declare function getFormTitle(client: FormObjClient, baseUrl: string, appId: string, objId: string, route?: EBuilderRoute): Promise<FormTitle>;
60
+ export interface SetFormTitleResult {
61
+ before: FormTitle;
62
+ after: FormTitle;
63
+ changed: boolean;
64
+ }
65
+ /**
66
+ * 修改**自定义标题**(`obj/saveOrUpdateTitle`,小报文)。
67
+ *
68
+ * 先读回现标题,把改动叠上去再整份提交 —— 只发改动项可能让平台把其余标题项打回默认。
69
+ * 提交后回读,逐项比对改动过的字段。
70
+ */
71
+ export declare function setFormTitle(client: FormObjClient, baseUrl: string, appId: string, objId: string, patch: FormTitlePatch, route?: EBuilderRoute): Promise<SetFormTitleResult>;
72
+ //# sourceMappingURL=form-obj-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-obj-meta.d.ts","sourceRoot":"","sources":["../../src/services/form-obj-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE5D,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,6FAMpB,CAAC;AAqBX;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,aAAsC,GAC5C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAa9B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,aAAsC,GAC5C,OAAO,CAAC,mBAAmB,CAAC,CA6B9B;AAED,MAAM,WAAW,SAAS;IACxB,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAe;AACf,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAOD,uDAAuD;AACvD,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,aAAsC,GAC5C,OAAO,CAAC,SAAS,CAAC,CASpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,EACrB,KAAK,GAAE,aAAsC,GAC5C,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
@@ -0,0 +1,103 @@
1
+ import { ebuilderFormUrl, DEFAULT_EBUILDER_ROUTE } from './special-route.js';
2
+ /** 归 `obj/saveOrUpdateTitle` 管的字段。改名回写时剔除,避免被 `saveOrUpdate` 顺手覆盖。 */
3
+ export const FORM_TITLE_FIELDS = [
4
+ 'showName',
5
+ 'formPageName',
6
+ 'isHiddenHeader',
7
+ 'hiddenFormTitle',
8
+ 'pageNameAllIn',
9
+ ];
10
+ /** 读接口会返回、但不该回写的只读/派生字段。 */
11
+ const NON_WRITABLE_FIELDS = ['operateLogInfo'];
12
+ function requireSuccess(response, operation) {
13
+ if (response?.code !== 200 || response?.status === false || response?.success === false || response?.fail === true) {
14
+ throw new Error(response?.msg || `${operation} 未确认成功`);
15
+ }
16
+ return response;
17
+ }
18
+ function encode(value) {
19
+ return encodeURIComponent(value);
20
+ }
21
+ /** 对象级写接口的查询串。`tpaid` 与 `objId` 同值 —— 与界面发文一致。 */
22
+ function objQuery(appId, objId) {
23
+ return `apid=${encode(appId)}&tpaid=${encode(objId)}&objId=${encode(objId)}`;
24
+ }
25
+ /**
26
+ * 读回表单对象全字段(`obj/getInfoById`)。
27
+ * 界面改名的底稿就是这份响应:读回整体 → 改一处 → 整体回写。
28
+ */
29
+ export async function getFormObj(client, baseUrl, appId, objId, route = DEFAULT_EBUILDER_ROUTE) {
30
+ const res = requireSuccess(await client.get(ebuilderFormUrl(baseUrl, route, 'obj', `getInfoById/${encode(objId)}`, `apid=${encode(appId)}`), { ebbusinessid: appId }), `读取表单对象 ${objId}`);
31
+ const data = res.data;
32
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
33
+ throw new Error(`表单对象 ${objId} 读回为空`);
34
+ }
35
+ return data;
36
+ }
37
+ /**
38
+ * 修改**表单名称**(`name`)。
39
+ *
40
+ * `obj/saveOrUpdate` 是整对象覆盖 —— 只发 `{id, name}` 会把其余字段清空,
41
+ * 因此流程固定为:读回完整对象 → 剔除标题字段与只读字段 → 换 `name` → 整体回写 → 回读校验。
42
+ */
43
+ export async function renameFormObj(client, baseUrl, appId, objId, newName, route = DEFAULT_EBUILDER_ROUTE) {
44
+ const name = String(newName ?? '').trim();
45
+ if (!name)
46
+ throw new Error('新表单名称不能为空');
47
+ const before = await getFormObj(client, baseUrl, appId, objId, route);
48
+ const oldName = String(before.name ?? '');
49
+ if (oldName === name)
50
+ return { objId, appId, oldName, name, changed: false };
51
+ const payload = {};
52
+ for (const [key, value] of Object.entries(before)) {
53
+ if (FORM_TITLE_FIELDS.includes(key))
54
+ continue;
55
+ if (NON_WRITABLE_FIELDS.includes(key))
56
+ continue;
57
+ payload[key] = value;
58
+ }
59
+ payload.name = name;
60
+ requireSuccess(await client.post(ebuilderFormUrl(baseUrl, route, 'obj', 'saveOrUpdate', objQuery(appId, objId)), payload, { ebbusinessid: appId }), '修改表单名称');
61
+ const after = await getFormObj(client, baseUrl, appId, objId, route);
62
+ const actual = String(after.name ?? '');
63
+ if (actual !== name)
64
+ throw new Error(`表单名称回读不一致:期望「${name}」,实际「${actual || '(空)'}」`);
65
+ return { objId, appId, oldName, name, changed: true };
66
+ }
67
+ function num(value) {
68
+ const n = Number(value ?? 0);
69
+ return Number.isFinite(n) ? n : 0;
70
+ }
71
+ /** 读自定义标题(从对象全字段里取标题子集 —— `getInfoById` 就是这些字段的来源)。 */
72
+ export async function getFormTitle(client, baseUrl, appId, objId, route = DEFAULT_EBUILDER_ROUTE) {
73
+ const obj = await getFormObj(client, baseUrl, appId, objId, route);
74
+ return {
75
+ showName: String(obj.showName ?? ''),
76
+ formPageName: String(obj.formPageName ?? ''),
77
+ isHiddenHeader: num(obj.isHiddenHeader),
78
+ hiddenFormTitle: num(obj.hiddenFormTitle),
79
+ pageNameAllIn: num(obj.pageNameAllIn),
80
+ };
81
+ }
82
+ /**
83
+ * 修改**自定义标题**(`obj/saveOrUpdateTitle`,小报文)。
84
+ *
85
+ * 先读回现标题,把改动叠上去再整份提交 —— 只发改动项可能让平台把其余标题项打回默认。
86
+ * 提交后回读,逐项比对改动过的字段。
87
+ */
88
+ export async function setFormTitle(client, baseUrl, appId, objId, patch, route = DEFAULT_EBUILDER_ROUTE) {
89
+ const keys = Object.keys(patch).filter(k => patch[k] !== undefined);
90
+ if (!keys.length)
91
+ throw new Error('没有要修改的标题项(至少给一个 --show-name / --hide-header / --hide-title)');
92
+ const before = await getFormTitle(client, baseUrl, appId, objId, route);
93
+ const next = { ...before, ...patch };
94
+ requireSuccess(await client.post(ebuilderFormUrl(baseUrl, route, 'obj', 'saveOrUpdateTitle', objQuery(appId, objId)), { id: objId, appId, ...next }, { ebbusinessid: appId }), '修改表单标题');
95
+ const after = await getFormTitle(client, baseUrl, appId, objId, route);
96
+ const diff = keys.filter(k => after[k] !== next[k]);
97
+ if (diff.length) {
98
+ const detail = diff.map(k => `${k} 期望=${JSON.stringify(next[k])} 实际=${JSON.stringify(after[k])}`).join('; ');
99
+ throw new Error(`表单标题回读不一致:${detail}`);
100
+ }
101
+ return { before, after, changed: JSON.stringify(before) !== JSON.stringify(after) };
102
+ }
103
+ //# sourceMappingURL=form-obj-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-obj-meta.js","sourceRoot":"","sources":["../../src/services/form-obj-meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 查重规则的**提示内容**(`helpContent`)。
3
+ *
4
+ * EB 表的提示内容存的是**多语言标签 id**(负数雪花),标签正文是富文本,支持插入变量。
5
+ * 平台存变量的片段形状是 `<a>#[字段id]#</a>`,例如:
6
+ *
7
+ * <p>&nbsp;<a>#[1325368659245146126]#</a>&nbsp;文本123&nbsp;</p>
8
+ *
9
+ * 命令行的 `--help` 允许直接写 `#[字段名]#` 或 `#[字段id]#`,由这里解析成平台片段;
10
+ * 文本里没有 `#[…]#` 时**原样返回**(纯文本照旧可用,也不会去动已经写好的 HTML)。
11
+ */
12
+ export interface HelpField {
13
+ fieldName: string;
14
+ fieldId: string;
15
+ }
16
+ /**
17
+ * 把 `#[字段名]#` / `#[字段id]#` 换成平台的变量片段 `<a>#[字段id]#</a>`。
18
+ * 认不出的名字**保持原样**,不静默删掉 —— 让人能看见自己写错了而不是拿到一段少字的内容。
19
+ */
20
+ export declare function renderValidateHelp(text: string, fields: HelpField[]): string;
21
+ /**
22
+ * `--help @<文件>` 从 UTF-8 文件读取正文(绕开 shell 对 `<` `>` `#` 的处理);否则原样返回。
23
+ */
24
+ export declare function resolveHelpInput(value: string): string;
25
+ //# sourceMappingURL=validate-help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-help.d.ts","sourceRoot":"","sources":["../../src/services/validate-help.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAO5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAStD"}
@@ -0,0 +1,29 @@
1
+ import { readFileSync } from 'node:fs';
2
+ /**
3
+ * 把 `#[字段名]#` / `#[字段id]#` 换成平台的变量片段 `<a>#[字段id]#</a>`。
4
+ * 认不出的名字**保持原样**,不静默删掉 —— 让人能看见自己写错了而不是拿到一段少字的内容。
5
+ */
6
+ export function renderValidateHelp(text, fields) {
7
+ // `(?<!<a>)`:已经是平台片段 `<a>#[id]#</a>` 的不要二次包装
8
+ return String(text ?? '').replace(/(?<!<a>)#\[([^\]]+)\]#/g, (whole, key) => {
9
+ const name = String(key).trim();
10
+ const hit = fields.find(f => f.fieldName === name || String(f.fieldId) === name);
11
+ return hit ? `<a>#[${hit.fieldId}]#</a>` : whole;
12
+ });
13
+ }
14
+ /**
15
+ * `--help @<文件>` 从 UTF-8 文件读取正文(绕开 shell 对 `<` `>` `#` 的处理);否则原样返回。
16
+ */
17
+ export function resolveHelpInput(value) {
18
+ const v = String(value ?? '');
19
+ if (!v.startsWith('@'))
20
+ return v;
21
+ const file = v.slice(1);
22
+ try {
23
+ return readFileSync(file, 'utf8');
24
+ }
25
+ catch (error) {
26
+ throw new Error(`读取提示内容文件失败: ${file}(${error.message})`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=validate-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-help.js","sourceRoot":"","sources":["../../src/services/validate-help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAmBvC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,MAAmB;IAClE,6CAA6C;IAC7C,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAClF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QACjF,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,IAAK,KAAe,CAAC,OAAO,GAAG,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "weaver-e10-builder",
3
- "version": "1.5.11",
3
+ "version": "1.5.12",
4
4
  "description": "Eteams/Ebuilder CLI — 泛微 OA 命令行工具",
5
5
  "type": "module",
6
6
  "files": [
@@ -24,6 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@napi-rs/keyring": "^1.3.0",
27
+ "@xmldom/xmldom": "0.8.15",
27
28
  "archiver": "^5.3.1",
28
29
  "axios": "^1.3.4",
29
30
  "chalk": "^5.0.1",
@@ -32,6 +33,7 @@
32
33
  "debug": "^4.3.4",
33
34
  "fs-extra": "^10.1.0",
34
35
  "js-base64": "^3.7.2",
36
+ "jszip": "3.10.1",
35
37
  "mammoth": "^1.12.0",
36
38
  "minimist": "^1.2.6",
37
39
  "node-html-markdown": "^2.0.0",
@@ -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.5.11
6
- description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.5.11。
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.5.11.
5
+ description: 泛微E10智能搭建skill v2(通用版),辅助编写泛微Ebuilder自定义应用,对应CLI版本1.5.12
6
+ description_zh: 泛微Ebuilder低代码应用智能搭建工具 v2(通用版),辅助编写自定义应用(表单/流程/列表/动作流/权限/分组/编号等),与 e10-cli 配套使用,当前对应 CLI 版本 1.5.12。
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.5.12.
8
8
  category: coding
9
- version: 1.5.11
9
+ version: 1.5.12
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.5.11`)。版本不一致时命令/文档/选项可能对不上——升级前先对齐:
18
+ 本 skill 需与 CLI **版本匹配**(当前对应 CLI `1.5.12`)。版本不一致时命令/文档/选项可能对不上——升级前先对齐:
19
19
 
20
20
  ```shell
21
21
  e10-cli --version # 查 CLI 版本,应与上方 description 标注一致
@@ -55,6 +55,14 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
55
55
 
56
56
  > 文档版本 = CLI 版本(`e10-cli --version`)。升级 CLI 后跑一次 `skill sync`(或 auth status)即可带新文档。
57
57
 
58
+ ## 图片布局还原要求
59
+
60
+ 图片搭建先实际查看原图,并读取 references/form/guide-form-layout-source.md。使用 image-context 获取真实像素尺寸,imageStyles.geometry 记录实际边界及完整区域,不照抄示例列宽和行高。compile 后使用 form layout preview 实际核对原图与结构,再保存;API 回读 VERIFIED 不能作为与原图一致的结论。
61
+
62
+ 图片观察完成后,必须主动向用户展示主标题、字段标题、内容的字体类型、字号及 px/pt 单位、颜色、粗细、水平/垂直对齐;相同配置可合并列出,不同配置单列。字体和字号标为视觉估计,未知项明确说明,不能猜测。每个字段标题单独观察对齐:原图居中应记录 textAlign:center、verticalAlign:middle,不能仅记录主标题居中或遗漏字段标题。先执行 form layout style-review 输出复核报告,再等待用户确认或明确修改指令。用户自然语言修改由 Agent 定位到字段/单元格,交给 --overrides 逐项转换;有效项采用用户值,无法转换的单项保留图片识别值并告知,不得整组回退。只有用户已确认最终样式(或明确给出修改指令)才使用 --confirm 并重新 compile;不能代用户确认,新图片未确认不能 apply。识别结果缺少对齐时先重新查看原图,不能把平台默认左对齐当成图片识别结果。
63
+
64
+ 表格边线单独识别:必须记录 imageStyles.tableBorders 的正文范围及 top/right/bottom/left。存在的边线写明颜色、线宽、线型;明确无边线填 none,未识别填 unknown。原图贴边的边线也不能遗漏,左右 4% 留白不承接外框。不得把所有线默认写成 1px;分别展示外框、内部横线/竖线的粗细,按真实图片尺寸和缩放估计,让用户确认。用户明确要求表格线加粗/改色时,可用 style-review --overrides 的 gridBorderStyle 修改已声明表格内的现有线条,不改控件输入框和标题区,不凭此新增未知边线。没有表格时才可写 tableBorders:[]。缺少外框观察的新图片只能生成待审草稿,不能确认或保存。
65
+
58
66
  ## 核心理念
59
67
 
60
68
  > **默认一份完整业务方案落在一个主应用。** 需求明确指定已有应用、跨应用资源或独立业务边界时,按实际范围处理,并在 `plan.md` 中标明每项资源的所属应用和跨应用关系。
@@ -112,7 +120,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
112
120
  - **段①:应用、角色、表单与视图。** 先建立应用和角色;按依赖完成全部表单的字段、明细与布局,读回资源及字段 ID;再按功能批次处理各表单的关联与范围、带出、公式、联动、校验、编号和权限;随后建立全部视图,按功能批次配置显示列、搜索排序、筛选统计、分组、上下级、权限、按钮和关联页签。建表时已完成的字段显示属性不重复写入。依赖流程 ID 的配置先列待办,段②回填。
113
121
  - **段②:流程与自动化。** 按依赖准备矩阵或权责表;每个流程建立后,依次完成该流程的节点、连线、出口条件、操作者及结构排版,核对核心流转后再处理下一流程。其余节点与流程级设置、动作流可按功能批次完成,并回填段①中依赖流程 ID 的表单字段和按钮。
114
122
  - **段③:报表、菜单与页面。** 按需求完成报表与数据集;将台账、流程发起和页面绑定到菜单并配置权限;创建配置式页面或定制页面,使用真实资源 ID 保存、发布并完成整体收尾。分批细节见 `references/common/guide-plan-template.md`。
115
- - 布局样表已进入 plan 时,据蓝图组织 `fields.json`,用现有 `form create --layout EXCEL` 创建并初始化;CLI 不消费蓝图本身。创建后仅在实际需要时读取当前布局并逐项调整,不生成额外布局 JSON、不改初始化逻辑。
123
+ - 布局样表已进入 plan 时,据蓝图组织 `fields.json`,仍由 CLI 创建字段与初始布局。普通布局沿用原路径;明确要求还原图片/XLSX 样式时,读取 `references/form/guide-form-layout-source.md`,通过源证据和 LayoutSpec 执行 `form layout extract/compile/preview/apply/verify`。布局模块只绑定已有字段,不创建或修改业务字段。字段属性、公式及归组重排全部结束后才精确保存;不在源布局保存后自动执行 initLayout。图片必须实际查看,由 Agent 输出可审阅观察,并经样式与外框确认;有未闭合映射或不支持结构时报告差异,不退回默认布局。
116
124
  - 简单单步需求(改字段、查数据)不分段,直接执行。
117
125
  ```
118
126
 
@@ -152,6 +160,7 @@ npx -y skills add ./weaver-e10-builder.zip --skill -y
152
160
  | 新建表单、form create、EB表单创建流程、fields.json | `references/form/guide-create-form.md`;确定具体字段参数时再读 `references/form/ref-form-fields.md` |
153
161
  | 虚拟表、虚拟表单、绑定数据源、业务表展示、数据加工结果 | `references/form/guide-virtual-form.md`;字段类型按来源映射,不按普通字段重新猜测 |
154
162
  | Excel样式、表格式布局、布局样表、布局蓝图、标签字段交替、合并单元格 | `references/form/guide-form-layout-planning.md` |
163
+ | 还原图片样式、还原Excel样式、XLSX布局、源网格、pageLayouts、layout extract/compile/apply/verify/style-audit、已有字段位置匹配 | `references/form/guide-form-layout-source.md`(图片 imageStyles 三层投影与样式诊断;已有字段复用,纯布局编译、单次保存和独立回读) |
155
164
  | 流程、审批、workflow、提交流程、预填 | `references/workflow/guide-workflow.md` |
156
165
  | 流程绑了哪张表、流程对应表单、workflow info、从流程找表单 | 命令速查 `references/common/ref-cli-commands.md` 的 `workflow info` 一行(**流程列表接口不含这个信息**;拿到的是 formId,不是 objId) |
157
166
  | 权责表、权责矩阵、权责表方式流程、分支场景、变量映射 | `references/workflow/guide-workflow-auth-resp.md`(操作者和条件同时遵循流程基础指南) |
@@ -20,6 +20,7 @@
20
20
  | 字段定义、字段类型、关联字段码表、DateRange、multiple | `references/form/ref-form-fields.md` |
21
21
  | FLOW/EXCEL、布局样表、布局蓝图、字段分组、singleRow | `references/form/guide-form-layout-planning.md` |
22
22
  | 布局样式模板、换配色、form layout init | `references/form/style-templates.md`(流式/表格式两套,同名不同 id) |
23
+ | 图片/XLSX源样式还原、imageStyles、pageLayouts、已有字段绑定、字体字号颜色确认、style-review、layout extract/compile/apply/verify/style-audit | `references/form/guide-form-layout-source.md` |
23
24
  | 已有表单加字段、改必填/只读、布局被重建、add-field --reinit、别动别人的表、布局组件、associatedId、字段标题取不到 | `references/form/guide-form-layout-incremental.md` |
24
25
  | 表单复杂编号、serial-mark、流水号、代字 | `references/form/guide-form-serial-mark.md` |
25
26
  | 分类搜索、分类筛选、list-search-group、选项配置、日期粒度、选项排序 | `references/common/ref-cli-commands.md` |