ice-entity-designer 0.0.29 → 0.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img width="120" src="./tests/assets/ice-entity-designer.png" alt="ice entity designer" />
2
+ <img width="120" src="./examples/assets/ice-entity-designer.png" alt="ice entity designer" />
3
3
  </p>
4
4
 
5
5
  <h1 align="center">IED · ice entity designer</h1>
@@ -54,9 +54,8 @@ IED(ice entity designer)是基于 [ice-render](https://github.com/ice-render
54
54
  ### 编辑器内核能力(继承自 ice-render)
55
55
 
56
56
  - 画布滚轮缩放、空白处拖拽平移。
57
- - 每个域包示例页统一接入上面这套视口交互(`tests/canvas-interactions.js`):canvas 铺满可视区,
57
+ - 每个域包示例页统一接入上面这套视口交互(`examples/canvas-interactions.js`):canvas 铺满可视区,
58
58
  滚轮以光标为锚点缩放,空白处左键 / 任意位置中键拖拽平移,工具栏带「适应视图 / 复位视图」。
59
- 老示例把 canvas 写死成 1800×1100 而可视区更小,`fitViewport()` 是按 canvas 尺寸算的 —— 图会被切在屏幕外。
60
59
  - 拖拽对齐辅助线与磁吸效果。
61
60
  - Undo / Redo(基于项目快照,最多 100 步)。
62
61
  - 项目级保存 / 加载(`serializeProject()` / `loadProject()`)。
@@ -80,31 +79,31 @@ IED(ice entity designer)是基于 [ice-render](https://github.com/ice-render
80
79
 
81
80
  完整的 ER 模型(电商交易 + 用户权限):
82
81
 
83
- <img src="./tests/assets/overview.png" alt="ER 模型总览" />
82
+ <img src="./examples/assets/overview.png" alt="ER 模型总览" />
84
83
 
85
84
  实体字段与约束标记:
86
85
 
87
- <img src="./tests/assets/fields.png" alt="实体字段与约束" />
86
+ <img src="./examples/assets/fields.png" alt="实体字段与约束" />
88
87
 
89
88
  关系语义:自引用、多对多、一对一:
90
89
 
91
- <img src="./tests/assets/relations.png" alt="关系语义" />
90
+ <img src="./examples/assets/relations.png" alt="关系语义" />
92
91
 
93
92
  交互式编辑器(右侧面板可直接切换到「TypeORM Schema」查看导出结果):
94
93
 
95
- <img src="./tests/assets/editor.png" alt="交互式编辑器与 TypeORM Schema" />
94
+ <img src="./examples/assets/editor.png" alt="交互式编辑器与 TypeORM Schema" />
96
95
 
97
- 同一套内核也能承载**流程图**(`tests/flowchart-editor.html`):四类节点(开始/结束、处理、判定、输入/输出,
96
+ 同一套内核也能承载**流程图**(`examples/flowchart-editor.html`):四类节点(开始/结束、处理、判定、输入/输出,
98
97
  其中判定菱形与输入输出平行四边形是自定义 `ICEPath` 形状)、正交/贝塞尔连线 + 分支标签(是/否)、
99
98
  拖拽 / 连线 / 撤销重做 / 快照存取:
100
99
 
101
- <img src="./tests/assets/flowchart-editor.png" alt="流程图编辑器示例" />
100
+ <img src="./examples/assets/flowchart-editor.png" alt="流程图编辑器示例" />
102
101
 
103
- 再加一层业务记法就是 **BPMN 2.0**(`tests/bpmn-editor.html`):池 / 泳道真嵌套(拖动银行池,内部泳道、
102
+ 再加一层业务记法就是 **BPMN 2.0**(`examples/bpmn-editor.html`):池 / 泳道真嵌套(拖动银行池,内部泳道、
104
103
  任务和连线一起平移)、事件 / 网关 / 任务角标 / 数据对象 / 注释、顺序流 + 条件与默认流标记、
105
104
  跨池的消息流,右侧面板按图元类型给出网关类型、事件种类、任务类型等属性,并内置语义校验与 BPMN 2.0 XML 导出:
106
105
 
107
- <img src="./tests/assets/bpmn-editor.png" alt="BPMN 2.0 编辑器示例(信用卡申请审批)" />
106
+ <img src="./examples/assets/bpmn-editor.png" alt="BPMN 2.0 编辑器示例(信用卡申请审批)" />
108
107
 
109
108
  ## 4. 快速开始
110
109
 
@@ -113,17 +112,20 @@ npm install
113
112
  npm run build
114
113
  ```
115
114
 
116
- 可运行的示例(`tests/` 下的页面会加载同级 `dist` `node_modules`,建议通过静态服务器打开):
115
+ 可运行的示例(`examples/` 下的页面加载上一级 `dist` 与本仓 `node_modules`,建议通过静态服务器打开):
117
116
 
118
117
  | 示例 | 说明 |
119
118
  |---|---|
120
- | `tests/entity-editor.html` | 交互式编辑器:实时编辑字段、创建/删除实体与关系、校验与保存加载;右侧面板含「TypeORM Schema」标签页 |
121
- | `tests/flowchart-editor.html` | 流程图编辑器:四类节点形状、拖拽、连线(含分支标签)、撤销重做、localStorage 存取与 JSON 导出;纯 DOM 面板,只依赖 `dist` 产物 |
122
- | `tests/bpmn-editor.html` | BPMN 2.0 编辑器:信用卡申请审批案例(两个池 / 三条泳道)、八类图元、条件与默认流标记、语义校验、BPMN 2.0 XML 导入导出 |
119
+ | `examples/entity-editor.html` | 交互式编辑器:实时编辑字段、创建/删除实体与关系、校验与保存加载;右侧面板含「TypeORM Schema」标签页 |
120
+ | `examples/flowchart-editor.html` | 流程图编辑器:四类节点形状、拖拽、连线(含分支标签)、撤销重做、localStorage 存取与 JSON 导出;纯 DOM 面板,只依赖 `dist` 产物 |
121
+ | `examples/bpmn-editor.html` | BPMN 2.0 编辑器:信用卡申请审批案例(两个池 / 三条泳道)、八类图元、条件与默认流标记、语义校验、BPMN 2.0 XML 导入导出 |
122
+ | `examples/uml-editor.html` | UML 类图编辑器:三段式类框、六种关系、语义校验、矢量导出、PlantUML / Mermaid 文本互操作 |
123
+ | `examples/statechart-editor.html` | 状态机编辑器:伪状态 / 普通状态 / 复合状态容器、转移标签 `事件 [守卫] / 动作` |
124
+ | `examples/gantt-editor.html` | 甘特编辑器:时间轴与按天吸附、依赖线、自动排程、关键路径、资源冲突校验、矢量导出 |
123
125
  | [`ice-entity-designer-react-demo`](../ice-entity-designer-react-demo) | 独立的 React 集成示例工程(webpack + TypeScript),涵盖 ref / hook / onChange / 受控模式 |
124
126
 
125
127
  ```bash
126
- python3 -m http.server 8899 # 然后访问 http://localhost:8899/tests/entity-editor.html
128
+ python3 -m http.server 8899 # 然后访问 http://localhost:8899/examples/entity-editor.html
127
129
  ```
128
130
 
129
131
  ## 5. 使用方式
@@ -214,7 +216,7 @@ flow.undo(); // 100 步历史
214
216
  自定义形状(判定菱形 / 输入输出平行四边形)在 `src/flow/flow_shapes.ts`,走的是引擎的 `ICEPath` 子类机制。
215
217
  流程图节点是**复合组件**(形状 + 标题由 kind/标题/配色派生):它们实现了引擎的 `hasDerivedChildren()`,
216
218
  内部子组件不写进文档、载入时由构造函数按 state 重建——避免重复挂载,也让同一份数据的两次序列化结果保持一致。
217
- 可运行的完整示例见 `tests/flowchart-editor.html`;React 用法见 [6.6](#66-流程图的-react-绑定);
219
+ 可运行的完整示例见 `examples/flowchart-editor.html`;React 用法见 [6.6](#66-流程图的-react-绑定);
218
220
  AI Agent 生成流程图的 JSON DSL 见 `ice-entity-designer-dsl`。
219
221
 
220
222
  #### 5.3 BPMN 2.0(`BpmnDesigner`)
@@ -273,7 +275,7 @@ const svg = IED.exportSvg(ice, { scale: 2 });
273
275
  const { svg, width, height } = IED.exportSvgResult(ice, { padding: 12 });
274
276
  ```
275
277
 
276
- `tests/bpmn-editor.html` 与 `tests/flowchart-editor.html` 上都有「导出 SVG」按钮,点一下即可下载
278
+ `examples/bpmn-editor.html` 与 `examples/flowchart-editor.html` 上都有「导出 SVG」按钮,点一下即可下载
277
279
  (BPMN 案例导出的池/泳道/事件/网关/连线/标签都是矢量)。服务端出图见引擎的 `ICE.headless()`。
278
280
 
279
281
  限制(与引擎一致):阴影用 `feDropShadow` 近似(模糊观感不会与画布逐像素相同);SVG 与 canvas 的
@@ -281,59 +283,63 @@ const { svg, width, height } = IED.exportSvgResult(ice, { padding: 12 });
281
283
  只保留当前相位)。
282
284
 
283
285
  #### 5.5 甘特图(`GanttDesigner`)
284
- +
285
- +排期场景:横轴是**时间**(`start` 日期 × 持续天数 × 每日像素)、纵轴是行,任务条**按天吸附**拖动,
286
- +依赖线从「前置任务的结束」指向「后置任务的开始」。
287
- +
288
- +```js
289
- +import { ICE, GanttDesigner } from 'ice-entity-designer';
290
- +
291
- +const ice = new ICE().init('canvas-1');
292
- +const gantt = new GanttDesigner(ice);
293
- +
294
- +const review = gantt.createTask({ title: '需求评审', start: '2026-03-02', days: 4, progress: 1 });
295
- +const design = gantt.createTask({ title: '交互设计', start: '2026-03-05', days: 6, progress: 0.8 });
296
- +gantt.createDependency({ sourceId: review.state.id, targetId: design.state.id });
297
- +
298
- +gantt.setDayWidth(36); // 时间轴缩放:所有任务与依赖一起重排
299
- +gantt.validateGantt(); // 依赖成环 / 进度越界 / 持续天数非法
300
- +const svg = gantt.toSvg({ background: '#ffffff' });
301
- +```
302
- +
303
- +与其它域包同一套机制:任务条是复合组件(条 + 进度覆盖 + 文字由 state 派生)、依赖复用引擎折线
304
- +(插槽吸附 / 正交路由 / 跟随宿主)、快照与矢量导出全部继承。两条甘特特有的能力:
305
- +
306
- +| 能力 | 说明 |
307
- +|---|---|
308
- +| 时间轴 | `dayWidth` / `originDate` / `labelColumnWidth` 统一换算;框架(左列任务名 + 日期刻度 + 行线)由派生的 `GanttRuler` 渲染,模型一变就重建 |
309
- +| 按天吸附 | `GanttTask.setPosition()` 把 x 吸附到整天的格子并反推 `start`(排期不会出现「13:47 开工」) |
310
- +
311
- +可运行示例:`tests/gantt-editor.html`(移动端 2.0 发布排期,含依赖、进度、**自动排程**与**关键路径**按钮)。
286
+
287
+ 排期场景:横轴是**时间**(`start` 日期 × 持续天数 × 每日像素)、纵轴是行,任务条**按天吸附**拖动,
288
+ 依赖线从「前置任务的结束」指向「后置任务的开始」。
289
+
290
+ ```js
291
+ import { ICE, GanttDesigner } from 'ice-entity-designer';
292
+
293
+ const ice = new ICE().init('canvas-1');
294
+ const gantt = new GanttDesigner(ice);
295
+
296
+ const review = gantt.createTask({ title: '需求评审', start: '2026-03-02', days: 4, progress: 1 });
297
+ const design = gantt.createTask({ title: '交互设计', start: '2026-03-05', days: 6, progress: 0.8 });
298
+ gantt.createDependency({ sourceId: review.state.id, targetId: design.state.id });
299
+
300
+ gantt.setDayWidth(36); // 时间轴缩放:所有任务与依赖一起重排
301
+ gantt.validateGantt(); // 依赖成环 / 进度越界 / 持续天数非法
302
+ const svg = gantt.toSvg({ background: '#ffffff' });
303
+ ```
304
+
305
+ 与其它域包同一套机制:任务条是复合组件(条 + 进度覆盖 + 文字由 state 派生)、依赖复用引擎折线
306
+ (插槽吸附 / 正交路由 / 跟随宿主)、快照与矢量导出全部继承。两条甘特特有的能力:
307
+
308
+ | 能力 | 说明 |
309
+ |---|---|
310
+ | 时间轴 | `dayWidth` / `originDate` / `labelColumnWidth` 统一换算;框架(左列任务名 + 日期刻度 + 行线)由派生的 `GanttRuler` 渲染,模型一变就重建 |
311
+ | 按天吸附 | `GanttTask.setPosition()` 把 x 吸附到整天的格子并反推 `start`(排期不会出现「13:47 开工」) |
312
+
313
+ 可运行示例:`examples/gantt-editor.html`(移动端 2.0 发布排期,含依赖、进度、**自动排程**与**关键路径**按钮)。
314
+
315
+ 文本互操作:`IED.toMermaidGantt(designer)` / `IED.fromMermaidGantt(text, designer)` 走 Mermaid gantt 语法子集 ——
316
+ `section` 对应负责人(`resource`),单前置依赖写成 `after`(Mermaid 自己画依赖箭头);
317
+ 多前置、或带 buffer 的排期写成显式日期 + `%% task` 注释(Mermaid 只忽略注释,渲染不受影响)。
312
318
 
313
319
  #### 5.6 BPMN 令牌仿真(`BpmnSimulator`)
314
- +
315
- +「流程怎么走」可以直接演示出来:令牌从开始事件出发,沿顺序流前进、在任务上停留、在排他网关选一条分支、
316
- +在并行网关一分为多,到达结束事件后消失。
317
- +
318
- +```js
319
- +import { BpmnSimulator } from 'ice-entity-designer';
320
- +
321
- +const simulator = new BpmnSimulator(bpmn, { nodeDuration: 500, edgeDuration: 700 });
322
- +simulator.start(); // 每个开始事件一个令牌;浏览器里由引擎帧事件驱动
323
- +simulator.step(50); // 也可以手动推进(测试/单步调试用,确定性)
324
- +simulator.stop(); // 清空令牌
325
- +```
326
- +
327
- +| 能力 | 说明 |
328
- +|---|---|
329
- +| 令牌 | 工具层组件(`ice.toolNodes`):**不进文档、不影响快照与 BPMN XML 导出**,停止即干净退场 |
330
- +| 路由 | 令牌位置在连线的**实际折点**上按弧长插值,所以始终贴在画出来的线上(含正交绕线) |
331
- +| 语义 | 排他网关优先走带 `condition` 的流、其次走非默认流;并行/包容网关分裂成多条令牌;结束事件上令牌消亡 |
332
- +| 推进 | `step(dtMs)` 显式推进(测试可断言);`start()` 后自动挂帧循环 |
333
- +
334
- +可运行示例:`tests/bpmn-editor.html` 的「仿真 / 停止」按钮(案例是信用卡申请审批)。
335
- +
336
- +#### 5.7 UML 类图(域包示例)
320
+
321
+ 「流程怎么走」可以直接演示出来:令牌从开始事件出发,沿顺序流前进、在任务上停留、在排他网关选一条分支、
322
+ 在并行网关一分为多,到达结束事件后消失。
323
+
324
+ ```js
325
+ import { BpmnSimulator } from 'ice-entity-designer';
326
+
327
+ const simulator = new BpmnSimulator(bpmn, { nodeDuration: 500, edgeDuration: 700 });
328
+ simulator.start(); // 每个开始事件一个令牌;浏览器里由引擎帧事件驱动
329
+ simulator.step(50); // 也可以手动推进(测试/单步调试用,确定性)
330
+ simulator.stop(); // 清空令牌
331
+ ```
332
+
333
+ | 能力 | 说明 |
334
+ |---|---|
335
+ | 令牌 | 工具层组件(`ice.toolNodes`):**不进文档、不影响快照与 BPMN XML 导出**,停止即干净退场 |
336
+ | 路由 | 令牌位置在连线的**实际折点**上按弧长插值,所以始终贴在画出来的线上(含正交绕线) |
337
+ | 语义 | 排他网关优先走带 `condition` 的流、其次走非默认流;并行/包容网关分裂成多条令牌;结束事件上令牌消亡 |
338
+ | 推进 | `step(dtMs)` 显式推进(测试可断言);`start()` 后自动挂帧循环 |
339
+
340
+ 可运行示例:`examples/bpmn-editor.html` 的「仿真 / 停止」按钮(案例是信用卡申请审批)。
341
+
342
+ #### 5.7 UML 类图(域包示例)
337
343
 
338
344
  UML 是**域包(domain pack)**的第一个完整示例:形状 + 应用层 + 语义校验,其余(选择/增删改/连线/
339
345
  撤销重做/快照/适应视图/矢量导出)全部沿用引擎与 `FlowDesigner`。
@@ -368,7 +374,44 @@ const svg = uml.toSvg({ background: '#ffffff', padding: 16 });
368
374
  可见性/静态/泛型都由文本表达 —— 与 PlantUML/Mermaid 的通行写法一致,AI 生成不必学另一套结构化语法;
369
375
  接口与枚举带构造型,抽象类标 «abstract»;**框高随成员自动增长**,成员不会被画到框外。
370
376
 
371
- 可运行示例:`tests/uml-editor.html`(电商支付的类模型:继承 / 实现 / 组合 / 关联 / 依赖)。
377
+ 可运行示例:`examples/uml-editor.html`(电商支付的类模型:继承 / 实现 / 组合 / 关联 / 依赖)。
378
+
379
+ 文本互操作:`IED.toPlantUml(designer)` / `IED.fromPlantUml(text, designer)` 走 PlantUML / Mermaid
380
+ 类图语法子集(三段式类框 + 六种关系的连接符),导出可直接贴进 Wiki / Markdown / 代码评审。
381
+
382
+ #### 5.8 状态机(`StatechartDesigner`)
383
+
384
+ 状态机是**域包(domain pack)**的第二个完整示例:伪状态(初始 / 终止)、普通状态、
385
+ **复合状态是容器**(内部可放子状态,拖动父状态子状态跟着走),转移标签是 `事件 [守卫] / 动作`。
386
+
387
+ ```js
388
+ import { ICE, StatechartDesigner } from 'ice-entity-designer';
389
+
390
+ const ice = new ICE().init('canvas-1');
391
+ const statechart = new StatechartDesigner(ice);
392
+
393
+ const initial = statechart.createState({ kind: 'initial', left: 120, top: 120 });
394
+ const pending = statechart.createState({ title: '待支付', left: 240, top: 100 });
395
+ const paid = statechart.createState({ title: '已支付', left: 620, top: 100 });
396
+
397
+ statechart.createTransition({ sourceId: initial.state.id, targetId: pending.state.id });
398
+ statechart.createTransition({
399
+ sourceId: pending.state.id,
400
+ targetId: paid.state.id,
401
+ event: '支付成功',
402
+ guard: '金额 > 0',
403
+ action: '生成订单',
404
+ });
405
+
406
+ statechart.validateStatechart(); // 缺初始 / 终止有出边 / 孤立状态 / 从初始不可达
407
+ const svg = statechart.toSvg({ background: '#ffffff' });
408
+ ```
409
+
410
+ 文本互操作:`IED.toPlantUmlState(designer)` / `IED.fromPlantUmlState(text, designer)` 走 PlantUML 状态图语法子集 ——
411
+ 伪状态映射成 `[*]`,复合状态成 `state 订单处理 { ... }` 嵌套块(块的嵌套就是容器归属),
412
+ 转移标签导入时拆回事件 / 守卫 / 动作三段(`IED.splitTransitionLabel(label)` 是这一步的公开口径)。
413
+
414
+ 可运行示例:`examples/statechart-editor.html`(订单状态机,含复合状态与 PlantUML 导入导出)。
372
415
 
373
416
  ## 6. 在 React 中使用
374
417
 
@@ -514,8 +557,8 @@ React 里可沿用 `createFlowSession` 的模式自建一层封装。
514
557
 
515
558
  ### 7.1 一个「域包(domain pack)」由什么组成
516
559
 
517
- 域包 = **一个领域的记法 + 应用层 + 语义校验**,跑在同一套引擎与同一套应用层机制上。已落地的三个
518
- 域(ER / 流程图 / BPMN)再加 UML,边际成本主要在「记法本身」,不在编辑器:
560
+ 域包 = **一个领域的记法 + 应用层 + 语义校验**,跑在同一套引擎与同一套应用层机制上。现已落地
561
+ 6 类文档:ER、流程图、UML 类图、状态机、甘特、BPMN 2.0 —— 边际成本主要在「记法本身」,不在编辑器:
519
562
 
520
563
  | 组成 | 复用什么 | 以 UML 为例 |
521
564
  |---|---|---|
@@ -524,8 +567,8 @@ React 里可沿用 `createFlowSession` 的模式自建一层封装。
524
567
  | 应用层 | `FlowDesigner`(选择 / 增删改 / 连线 / 撤销重做 / 快照 / 适应视图 / 订阅 / `toSvg`) | `UmlDesigner` 只重写「建什么图元 + 类型过滤」 |
525
568
  | 语义校验 | 结构校验之外的部分自写,规则直白 | `validateUml()`:重名类 / 悬空关系 / 继承成环 |
526
569
  | 文档格式 | 引擎序列化(typeId 注册表 + `hasDerivedChildren`),零登记 | 类与关系统统自动往返 |
527
- | 互操作 | 有标准格式的域就做(BPMN 2.0 XML 已有) | UML XMI / PlantUML 互操作待补 |
528
- | 交付物 | 示例页 + e2e + README + (可选)JSON DSL 与技能 | `tests/uml-editor.html` + `e2e/uml-editor.spec.ts` |
570
+ | 互操作 | 有标准格式的域就做 | BPMN 2.0 XML(导入 + 导出,含 BPMNDI 布局);UML 类图与状态机的 PlantUML 文本互操作;甘特的 Mermaid gantt 文本互操作 |
571
+ | 交付物 | 示例页 + e2e + README + (可选)JSON DSL 与技能 | `examples/uml-editor.html` + `e2e/uml-editor.spec.ts` |
529
572
 
530
573
  新开一个域包时,按这张表从上往下填即可;**不要**在域包里另造序列化、另造选择/历史、另造导出。
531
574
 
@@ -543,12 +586,12 @@ src/
543
586
  │ ├── UmlClass.ts # 复合组件:类名 / 属性 / 方法三段,构造型,框高随成员增长
544
587
  │ ├── UmlRelation.ts # 六种关系 = 线型 + 端点标记(三角/菱形/开放箭头,标记进路径点集)
545
588
  │ └── UmlDesigner.ts # FlowDesigner 薄扩展:建 UML 图元 + 类型过滤 + validateUml()
546
- +├── gantt/ # 甘特图(第三个 domain pack:时间轴 + 按天吸附 + 依赖)
547
- +│ ├── gantt_date.ts # 日期工具(UTC 口径,YYYY-MM-DD ↔ 天数)
548
- +│ ├── GanttTask.ts # 任务条(复合组件)+ setPosition 按天吸附
549
- +│ ├── GanttRuler.ts # 图表框架:左列任务名 + 日期刻度 + 行线(派生重建)
550
- +│ ├── GanttDependency.ts # 依赖线(完成 → 开始)
551
- +│ └── GanttDesigner.ts # 时间轴换算 + syncChrome + validateGantt
589
+ ├── gantt/ # 甘特图(第三个 domain pack:时间轴 + 按天吸附 + 依赖)
590
+ ├── gantt_date.ts # 日期工具(UTC 口径,YYYY-MM-DD ↔ 天数)
591
+ ├── GanttTask.ts # 任务条(复合组件)+ setPosition 按天吸附
592
+ ├── GanttRuler.ts # 图表框架:左列任务名 + 日期刻度 + 行线(派生重建)
593
+ ├── GanttDependency.ts # 依赖线(完成 → 开始)
594
+ └── GanttDesigner.ts # 时间轴换算 + syncChrome + validateGantt
552
595
  ├── bpmn/ # BPMN 2.0(FlowDesigner 之上的业务记法)
553
596
  │ ├── BpmnSimulator.ts # 令牌仿真:沿顺序流推进、网关分叉、结束消亡(令牌在工具层)
554
597
  │ ├── bpmn_shapes.ts # 形状:事件圆 / 网关菱形 / 任务角标 / 子流程标记 / 数据对象 / 注释 / 池泳道
@@ -579,7 +622,7 @@ src/
579
622
  | `npm run build` | 清理并完整构建(类型声明 + JS 产物) |
580
623
  | `npm run types:check` | 仅做 TypeScript 类型检查 |
581
624
  | `npm test` | 运行单元测试(Jest) |
582
- | `npm run test:e2e` | 浏览器端到端回归(Playwright,覆盖 `tests/entity-editor.html` 与 `tests/flowchart-editor.html`) |
625
+ | `npm run test:e2e` | 浏览器端到端回归(Playwright,覆盖 `examples/entity-editor.html` 与 `examples/flowchart-editor.html`) |
583
626
  | `npm run pretty` | Prettier 格式化源码 |
584
627
 
585
628
  ## 9. 环境要求与依赖