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:
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* 套件总览页(overview)
|
||||
* 业务:QA 看板上展示所有套件、总通过率、失败数
|
||||
* 布局:qa-console;页面只管业务数据
|
||||
*/
|
||||
import { definePage } from 'vibe-registry'
|
||||
|
||||
export const overviewPage = definePage({
|
||||
layout: 'qa-console',
|
||||
title: '测试编排 · 总览',
|
||||
blocks: [
|
||||
{ widget: 'suite-list', bind: { suites: 'suites' } },
|
||||
{
|
||||
widget: 'suite-detail-view',
|
||||
props: { mode: 'summary' },
|
||||
bind: { cases: 'summary' },
|
||||
},
|
||||
],
|
||||
setup: async () => {
|
||||
// 真实场景:从 API 拉取;这里用模拟数据演示编排
|
||||
const suites = [
|
||||
{ id: 'auth', name: '认证模块', passedRate: 0.92, lastResult: 'passed' },
|
||||
{ id: 'billing', name: '计费模块', passedRate: 0.71, lastResult: 'failed' },
|
||||
{ id: 'search', name: '搜索模块', passedRate: 1.0, lastResult: 'passed' },
|
||||
]
|
||||
const total = suites.length
|
||||
const failed = suites.filter((s) => s.lastResult === 'failed').length
|
||||
return {
|
||||
suites,
|
||||
summary: {
|
||||
total,
|
||||
failed,
|
||||
passingRate: Math.round((1 - failed / total) * 100),
|
||||
},
|
||||
}
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* 运行记录页(run history)
|
||||
* 业务:全部历史运行 + 失败率统计
|
||||
*/
|
||||
import { definePage } from 'vibe-registry'
|
||||
|
||||
export const runHistoryPage = definePage({
|
||||
layout: 'qa-console',
|
||||
title: '测试编排 · 运行记录',
|
||||
blocks: [
|
||||
{ widget: 'suite-list', bind: { suites: 'suites' } },
|
||||
{ widget: 'suite-detail-view', props: { mode: 'history' }, bind: { cases: 'runs' } },
|
||||
],
|
||||
setup: async () => {
|
||||
return {
|
||||
suites: [
|
||||
{ id: 'auth', name: '认证模块', passedRate: 0.92, lastResult: 'passed' },
|
||||
{ id: 'billing', name: '计费模块', passedRate: 0.71, lastResult: 'failed' },
|
||||
],
|
||||
runs: [
|
||||
{ id: 'r1', name: 'auth #0421', priority: 'P0', status: 'passed', durationMs: 980 },
|
||||
{ id: 'r2', name: 'auth #0420', priority: 'P1', status: 'skipped', durationMs: null },
|
||||
{ id: 'r3', name: 'billing #0419', priority: 'P0', status: 'failed', durationMs: 2100 },
|
||||
],
|
||||
}
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* 套件详情页(suite detail)
|
||||
* 业务:展示单个套件的用例列表,提供重跑/停止动作
|
||||
* 注意:页面不内联任何"重跑逻辑",只声明引用 run-suite action —— 行为万物皆注册
|
||||
*/
|
||||
import { definePage } from 'vibe-registry'
|
||||
|
||||
export const suiteDetailPage = definePage({
|
||||
layout: 'qa-console',
|
||||
title: '测试编排 · 套件详情',
|
||||
blocks: [
|
||||
{ widget: 'suite-list', bind: { suites: 'suites' } },
|
||||
{
|
||||
widget: 'suite-detail-view',
|
||||
props: { mode: 'detail', suiteId: 'current' },
|
||||
bind: { cases: 'cases', suite: 'suite' },
|
||||
},
|
||||
],
|
||||
setup: async (ctx) => {
|
||||
const suiteId = ctx.params.id ?? 'auth'
|
||||
const cases = [
|
||||
{ id: 'a1', name: '登录成功', priority: 'P0', status: 'passed', durationMs: 120 },
|
||||
{ id: 'a2', name: '登录失败锁定', priority: 'P1', status: 'failed', durationMs: 340 },
|
||||
{ id: 'a3', name: '令牌过期刷新', priority: 'P1', status: 'running', durationMs: null },
|
||||
]
|
||||
return {
|
||||
suites: [
|
||||
{ id: 'auth', name: '认证模块', passedRate: 0.92, lastResult: 'passed' },
|
||||
{ id: 'billing', name: '计费模块', passedRate: 0.71, lastResult: 'failed' },
|
||||
],
|
||||
suite: { id: suiteId, name: `${suiteId} 套件` },
|
||||
cases,
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
rerun: async (payload: { suiteId?: string }) => {
|
||||
// 页面只做"把用户意图转成 action 调用",实现仍在注册表
|
||||
const { runSuiteAction } = await import('../registry/actions/run-suite.ts')
|
||||
return runSuiteAction.handler({ suiteId: payload.suiteId ?? 'auth' }, null)
|
||||
},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user