Complete platform management workflows

This commit is contained in:
npc0-hue
2026-07-14 16:39:37 +08:00
parent 7e05d0a4e7
commit 4f33f761a3
106 changed files with 11313 additions and 460 deletions
+55 -3
View File
@@ -117,7 +117,7 @@ async function main() {
{
name: "服务器管理",
hash: "#/servers",
markers: ["服务器管理", server.name, server.id, "创建服务器", "全部", "离线"]
markers: ["服务器管理", server.name, server.id, "创建服务器", "全部", "离线", "运行操作"]
},
{
name: "插件市场",
@@ -126,7 +126,8 @@ async function main() {
"插件市场",
"平台 API",
marketplacePlugin.id,
marketplacePlugin.manifestRef,
marketplacePlugin.name,
"Development plugin",
"process.install",
"process.start",
"process.stop",
@@ -144,7 +145,7 @@ async function main() {
{
name: "AI 提供商管理",
hash: "#/aiProviders",
markers: ["AI 提供商管理", "已连接", aiProvider.name, aiProvider.apiKeyRef, "密钥引用"]
markers: ["AI 提供商管理", "平台 API", aiProvider.name, aiProvider.apiKeyRef, "密钥引用"]
},
{
name: "服务器详情",
@@ -152,6 +153,10 @@ async function main() {
markers: [
server.name,
`${server.id} · 插件 ${server.pluginId}@${server.pluginVersion} · 节点 ${server.runEndpointId}`,
"运行分发",
"run 包",
"客户端管理器",
"依赖",
"启动",
"停止",
"日志",
@@ -166,6 +171,14 @@ async function main() {
for (const route of routeChecks) {
const state = await verifyBrowserRoute(chrome, route.hash, route.markers, route.name);
evidence.routes.push(state);
if (route.name === "服务器管理") {
const runtimeMenu = await verifyServerQuickRuntimeMenu(chrome, route.name);
evidence.routes.push({
name: "服务器管理 / 运行操作菜单",
url: await chrome.url(),
...runtimeMenu
});
}
}
const pluginControls = await clickAndVerify(chrome, "插件控制", ["Logs 桥接执行", "server.logs.read", "server.artifacts.read", "读取"]);
@@ -295,6 +308,20 @@ async function verifyResponsiveThemeWalkthroughs(chrome, routeChecks, server) {
layout,
textSample: state.textSample
});
if (route.name === "服务器管理") {
const runtimeMenu = await verifyServerQuickRuntimeMenu(chrome, `${scenario.name} / 服务器管理`);
const runtimeMenuLayout = await chrome.layoutSnapshot();
assertNoVisibleLayoutIssues(runtimeMenuLayout, `${scenario.name} / 服务器管理 / 运行操作菜单`);
routeEvidence.push({
name: "服务器管理 / 运行操作菜单",
url: await chrome.url(),
requiredMarkers: runtimeMenu.requiredMarkers,
fallbackScan: runtimeMenu.fallbackScan,
forbiddenFragmentScan: runtimeMenu.forbiddenFragmentScan,
layout: runtimeMenuLayout,
textSample: runtimeMenu.textSample
});
}
}
await chrome.evaluate(() => {
@@ -372,6 +399,31 @@ async function clickAndVerify(chrome, buttonText, markers) {
};
}
async function verifyServerQuickRuntimeMenu(chrome, label) {
const markers = ["生成 run", "下载 run", "推送更新", "生成客户端", "依赖检查", "依赖安装", "实时日志", "历史日志"];
await chrome.evaluate(() => {
const summary = Array.from(document.querySelectorAll("summary")).find((item) => item.textContent?.includes("运行操作"));
if (!(summary instanceof HTMLElement)) {
throw new Error("runtime action menu summary not found");
}
const details = summary.closest("details");
if (!(details instanceof HTMLDetailsElement)) {
throw new Error("runtime action menu container not found");
}
details.open = true;
});
await chrome.waitForText(markers, `${label} runtime action menu`);
const visibleText = await chrome.visibleText();
assertMarkers(visibleText, markers, `${label} runtime action menu`);
scanText(visibleText, `${label} runtime action menu`);
return {
requiredMarkers: markers,
fallbackScan: "passed",
forbiddenFragmentScan: "passed",
textSample: visibleText.slice(0, 1200)
};
}
async function ensureAiProvider(headers) {
const providers = await getJson("/ai-providers", headers);
if (providers.items.some((item) => item.id === "ai.openai")) {