feat: vibe-registry M1 — 万物皆注册框架骨架

- core: registerLayout/Widget/Action(泛型)/Schema + 校验闸门
- definePage: 页面只管业务,结构来自注册表
- presets: admin / app-shell 预设布局(vr add 物化)
- cli: vr list/add/update 防覆盖
- examples/qa-orchestrator: 实战编排验证(workspace:* 依赖)
This commit is contained in:
hellow-da-sb
2026-09-03 00:48:10 +08:00
commit 8c93bde5f6
30 changed files with 1289 additions and 0 deletions
@@ -0,0 +1,15 @@
/**
* run-suite —— 重跑测试套件 action
* 行为注册:页面的"重跑"按钮只声明引用该 action,不内联逻辑
*/
import { registerAction } from 'vibe-registry'
export const runSuiteAction = registerAction({
kind: 'action',
id: 'run-suite',
description: '重跑指定测试套件(全量)',
handler: async (payload: { suiteId: string }, _ctx) => {
// M1:真实执行器后续接入;这里返回执行意图供编排层消费
return { started: true, suiteId: payload.suiteId, at: Date.now() }
},
})
@@ -0,0 +1,13 @@
/**
* stop-run —— 停止运行中的套件 action
*/
import { registerAction } from 'vibe-registry'
export const stopRunAction = registerAction({
kind: 'action',
id: 'stop-run',
description: '停止正在运行的测试套件',
handler: async (payload: { runId: string }, _ctx) => {
return { stopped: true, runId: payload.runId, at: Date.now() }
},
})
@@ -0,0 +1,16 @@
/**
* 资产集中注册入口
* 模拟脚手架/自动化生成:所有 registry/** 在此汇聚(副作用 import)
* 页面只需 import 本文件即可让全部注册生效
*/
import './layouts/qa-console.ts'
import './widgets/suite-list.ts'
import './widgets/suite-detail-view.ts'
import './widgets/status-badge.ts'
import './schemas/test-case-fields.ts'
import './actions/run-suite.ts'
import './actions/stop-run.ts'
// 注册完成后,导出注册表供编排层校验
import { registry } from 'vibe-registry'
export { registry }
@@ -0,0 +1,19 @@
/**
* qa-console —— 测试编排控制台布局(自定义布局,非预设)
* 业务场景:QA 负责人在侧栏切换套件,主区查看运行结果
*/
import { registerLayout } from 'vibe-registry'
export const qaConsoleLayout = registerLayout({
kind: 'layout',
id: 'qa-console',
slots: ['suite-sidebar', 'main-content'],
description: '测试编排控制台:左侧套件列表 + 主内容区',
preview: {
title: 'QA Console · 测试编排控制台',
demoBlocks: [
{ slot: 'suite-sidebar', widget: 'suite-list', props: { suites: 'suiteSummary' } },
{ slot: 'main-content', widget: 'suite-detail-view' },
],
},
})
@@ -0,0 +1,17 @@
/**
* test-case-fields —— 测试用例字段 schema
* 用例表格/表单的列定义来源(万物皆注册:连列都是注册的)
*/
import { registerSchema } from 'vibe-registry'
export const testCaseFields = registerSchema({
kind: 'schema',
id: 'test-case-fields',
description: '测试用例字段:名称 / 优先级 / 状态 / 耗时',
fields: [
{ key: 'name', label: '用例名' },
{ key: 'priority', label: '优先级', type: 'P0|P1|P2' },
{ key: 'status', label: '状态', type: 'passed|failed|running|skipped' },
{ key: 'durationMs', label: '耗时(ms)', type: 'number' },
],
})
@@ -0,0 +1,10 @@
/**
* status-badge —— 用例状态徽标 widget(通过/失败/运行中/跳过)
*/
import { registerWidget } from 'vibe-registry'
export const statusBadge = registerWidget({
kind: 'widget',
id: 'status-badge',
description: '用例状态徽标:passed / failed / running / skipped',
})
@@ -0,0 +1,12 @@
/**
* suite-detail-view —— 套件详情 widget
* 渲染套件用例列表 + 状态徽标,支持重跑/停止动作
*/
import { registerWidget } from 'vibe-registry'
export const suiteDetailView = registerWidget({
kind: 'widget',
id: 'suite-detail-view',
schemaId: 'test-case-fields',
description: '套件详情:用例表格 + 状态徽标 + 重跑/停止',
})
@@ -0,0 +1,11 @@
/**
* suite-list —— 测试套件列表 widget
* 展示全部套件与通过率,点击进入套件详情
*/
import { registerWidget } from 'vibe-registry'
export const suiteListWidget = registerWidget({
kind: 'widget',
id: 'suite-list',
description: '测试套件列表:名称 + 最近结果 + 通过率',
})