跳转至

P0.U-measurement-node-registry · ADR-12 Phase 1 #3 · NodeFactory + LeftDock 拖入入口

Worker:TBD(用户分配)· 部门:前端 (frontend_vue3) 预计:1.0d · 优先级:P1 · 状态:dispatched 隔离:文件隔离(stages/xitest/registry/ + drawers/left/Measurements/ 全新)

🔍 触发与解锁链

  • 触发:P0.U-meter-types-v3 (9fc31c4) zombie 后 Phase 1 #3 解锁(2026-05-29 15:36)
  • 前置就位:MeasurementKind + MeasurementNode 7 子能力 types(9fc31c4)+ DashboardWidget/Workspace types(9fc31c4)
  • 本任务 zombie 后解锁:Phase 2 #5/#6/#7(每类 MeasurementNode 实施时调本 registry 的 NodeFactory + 拖拽创建 widget)

任务定义(基于 ADR-AIOS-12 §2.3 + §2.5)

按 ADR-12 §2.3 MeasurementNode 7 子能力抽象 + §5.1 Phase 1 #3,落地 MeasurementNodeRegistry + 7 类 NodeFactory stub + LeftDock § Measurements 列表(可拖入 DashboardCanvas)。仅 stages/xitest/registry/ + drawers/left/Measurements/ 全新文件 · 不动 modes/* 业务

完整 prompt(直接复制粘贴 worker 终端)

[U-thread] P0.U-measurement-node-registry
[部门] 前端 (frontend_vue3) · 推荐 skill: vuejs-typescript-best-practices
[Worker CWD] d:/work/25_claude/workspace/AlgoDepartment/04_development/(由用户分配的 worker / worktree 决定)
[Occupies] P0.K-shared-meter-dock(read · 复用现有 6 stub vue) · P0.K-shared-types(read) · P4.K2-left-dock(写 · drawers/left/Measurements/*)
[隔离] 文件隔离 · 仅写 frontend_vue3/src/stages/xitest/registry/* + drawers/left/Measurements/* 全新文件
       严禁动 stages/xitest/modes/*(P4.U3 ceecccf 已实装)+ stages/xitest/dashboard/*(P0.U-widget-workspace-framework 写权)
[优先级] P1 · 1.0d · ADR-12 Phase 1 #3 · 解锁 Phase 2 #5/#6/#7
[ADR] docs/08-implementation/40-aios/ADR/ADR-AIOS-12-xitest-realtime-arch.md(必读 §2.3 + §2.5 + §5.1 #3)
[业务行为契约引用] ADR-AIOS-12 §3.1-§3.7(本任务仅注册 NodeFactory stub · 真实业务行为留 Phase 2)
[参考文档](绝对路径)
  - d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/ADR/ADR-AIOS-12-xitest-realtime-arch.md(§2.3 + §2.5)
  - d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/types/measurement-node.ts(MeasurementKind + MeasurementNode 7 子能力 · 9fc31c4)
  - d:/work/25_claude/workspace/AlgoDepartment/04_development/frontend_vue3/src/test-aux/meter/(K-shared-meter-dock 6 stub vue · ea5e9e4 · 本任务 read-only 引用 stub)
  - d:/work/25_claude/workspace/AlgoDepartment/06_docs/site-build/docs/08-implementation/40-aios/prompts/done/P0.U-meter-types-v3--9fc31c4.md(同部门标本 · 仿写格式)

【背景】
ADR-12 §2.3 MeasurementNode 7 子能力抽象 + §2.5 Widget 容器需要"节点工厂注册表"统一创建 measurementNode 实例。本任务实施 MeasurementNodeRegistry(Map<type, NodeFactory>)+ 7 类 NodeFactory stub + LeftDock § Measurements 列表(可拖入 DashboardCanvas · 触发 DashboardWidget 创建)。

【执行步骤】

Step 1 · read 已有基础(只读)
- read frontend_vue3/src/types/measurement-node.ts(MeasurementKind 7 类 + 7 子能力 schema)
- read frontend_vue3/src/test-aux/meter/(6 stub vue · 现成可复用为 NodeFactory 输出)
- read stages/xitest/dashboard/(待 P0.U-widget-workspace-framework 落地 · 本任务可先 mock DashboardCanvas 接口)

Step 2 · 新建 stages/xitest/registry/MeasurementNodeRegistry.ts
- export class MeasurementNodeRegistry · 单例 · Map<type: string, NodeFactory>
- export type NodeFactory = (id: string, config: Partial<MeasurementNode>) => MeasurementNode
- 注册 7 类 NodeFactory stub:
  - 'rms-meter' / 'fft-analyzer' / 'transfer-fn' / 'phase-meter' / 'waveform-scope' / 'electrical-meter' / 'recorder'
  - 各 stub 返回 MeasurementNode 实例(含 7 子能力默认值 · 业务行为留 Phase 2 实施)
- export function registerNodeFactory(type, factory):允许 Phase 2 fork 后续注册

Step 3 · 新建 drawers/left/Measurements/MeasurementsList.vue
- 列出 MeasurementNodeRegistry 注册的 7 类节点(按 MeasurementKind 分组:Time Domain / Frequency / Transfer / Electrical / Recording / Validation / Utility)
- 每项可拖入 DashboardCanvas(HTML5 Drag API · drag start 时序列化 type 字段)
- ADR-12 §2.5 Widget 容器接收拖入事件 · 调 xiTestWorkspaceStore.addWidget(measurementNodeId)

Step 4 · 集成 DashboardCanvas 拖入接收
- 在 DashboardCanvas.vue 加 @drop 事件 · 解析 type 字段 · 调 MeasurementNodeRegistry.create(type) → 调 store.addWidget()
- ⚠️ 若 P0.U-widget-workspace-framework 未 zombie · 本任务 mock 接口 + 留集成 TODO

Step 5 · 单元测试
- 新增 measurement-node-registry.test.ts(7 类 NodeFactory 注册 + 创建 + 类型校验 · 8+ 用例)
- 新增 measurements-list.test.ts(渲染 + 7 节点分组 + drag start 触发 dataTransfer · 5+ 用例)
- test:unit 基线 312/3 → 目标 ≥ 325(+13 用例)

Step 6 · 验收
- npm run typecheck → ✓ exit 0
- npm run build → ✓ 零错误
- npm run test:unit → ≥ 325/3
- 浏览器手动测试:LeftDock § Measurements 显示 7 类节点 · 拖入 DashboardCanvas → widget 创建成功

【验收】

- typecheck/build 全绿 · test:unit ≥ 325/3
- MeasurementNodeRegistry + 7 类 NodeFactory stub + MeasurementsList.vue 全部就位
- LeftDock § Measurements 用户可见 · 拖入流程通畅
- 不动 modes/*(regression/realtime · P4.U3 实装)+ dashboard/*(#2 写权)

**端到端真值** ⭐(.clinerules v1.8 §业务行为契约必填段强制要求)
- e2e 真值:浏览器打开 /xitest?mode=realtime → LeftDock § Measurements 列出 7 类节点(按 MeasurementKind 分组)· 拖一个 'rms-meter' 到 DashboardCanvas → 触发 store.addWidget · DashboardWidget 实例创建 · WidgetContainer 渲染 RMSMeter stub · DOM 出现 1 个 widget
- 自查清单:
  - [ ] 7 类 NodeFactory 全部注册 · registry.create(type) 返回有效 MeasurementNode
  - [ ] LeftDock § Measurements 渲染 7 节点 + Kind 分组
  - [ ] HTML5 Drag API 触发(dragstart/dragover/drop)
  - [ ] DashboardCanvas 接收 drop 事件 · 调 store.addWidget
  - [ ] 不破坏现有 LeftDock 其他段(若有)

【commit】
- subject:`feat(P0.U-measurement-node-registry/registry+drawer): NodeFactory + LeftDock § Measurements · ADR-12 Phase 1 #3`
- trailer:`[step=6/6] [pid=P0] [uid=U-measurement-node-registry] [occupies=P0.K-shared-meter-dock+P0.K-shared-types+P4.K2] [files=stages/xitest/registry/*+drawers/left/Measurements/*+tests/*]`

【禁止】
1. ❌ 不动 stages/xitest/modes/*(P4.U3 实装)+ dashboard/*(P0.U-widget-workspace-framework 写权)
2. ❌ 不实施 measurementNode 真实业务行为(NodeFactory 仅 stub · 业务留 Phase 2 #5/#6/#7)
3. ❌ 不嵌入完整 Vue SFC 骨架(.clinerules v1.6 §prompt 内容硬约束)
4. ❌ 不绑定 CPU(worker: TBD · 用户分配)
5. ❌ 不与 #2 P0.U-widget-workspace-framework 写权重叠(本任务 read-only DashboardCanvas 接口 · 若未就绪用 mock)
6. ❌ 不验"typecheck 全绿就 commit"——必须浏览器手动测试拖入流程
7. ❌ 不实施 Validation/Utility kind(本期仅前 5 类 + Recording · Validation/Utility 留下季度)

解锁链(本任务 zombie 后)

  • ✅ Phase 2 #5/#6/#7(每类 MeasurementNode 实施时 registerNodeFactory 替换 stub 为真实业务行为)

风险评估

风险 缓解
⚠️ #2 未 zombie · DashboardCanvas 接口未定 mock 接口 + 留集成 TODO · 等 #2 zombie 后回头改
⚠️ HTML5 Drag API 浏览器兼容 用 vue-dnd 或 vue-grid-layout 内置拖拽(若 #2 已用)· 减少自实现

历史

时间 事件 hash
2026-05-29 15:36 dispatched · ADR-12 Phase 1 #3 解锁 · #1 zombie(9fc31c4)后立即派 (待 stop 时回填)