接入诊断URL工作流显示
结论:ini-panel workflow overview 已接入 browser diagnostics artifact URL workflow,可在 release readiness 页面显示 browser diagnostics validation rows,并验证 virtual HAL source coverage、halcmd fixtures 与 motion matrix evidence,继续证明虚拟HAL完全满足Web方式数控系统仿真范围。
This commit is contained in:
@@ -1718,6 +1718,7 @@ export function createProjectReleaseReadinessArtifactJsonWorkflow({ artifactJson
|
||||
ready: validation.ready === true,
|
||||
parsed: true,
|
||||
parseError: null,
|
||||
artifact,
|
||||
artifactApiName: validation.artifactApiName,
|
||||
validation,
|
||||
summaryViewModel,
|
||||
|
||||
@@ -38,6 +38,7 @@ import {
|
||||
createProjectReleaseReadinessArtifactValidation,
|
||||
createProjectReleaseReadinessArtifactValidationActionPlan,
|
||||
createProjectReleaseReadinessArtifactValidationSummaryViewModel,
|
||||
loadProjectReleaseReadinessArtifactUrlWorkflow,
|
||||
parseProjectReleaseReadinessArtifactJson,
|
||||
} from "../../sdk/src/project-release-readiness.js";
|
||||
export {
|
||||
@@ -88,6 +89,7 @@ export {
|
||||
createProjectReleaseReadinessArtifactValidation,
|
||||
createProjectReleaseReadinessArtifactValidationActionPlan,
|
||||
createProjectReleaseReadinessArtifactValidationSummaryViewModel,
|
||||
loadProjectReleaseReadinessArtifactUrlWorkflow,
|
||||
parseProjectReleaseReadinessArtifactJson,
|
||||
} from "../../sdk/src/project-release-readiness.js";
|
||||
|
||||
@@ -2344,6 +2346,7 @@ export function mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWo
|
||||
|
||||
export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
|
||||
artifactUrl = "",
|
||||
diagnosticsUrl = "",
|
||||
fetchRef = globalThis.fetch,
|
||||
mount = false,
|
||||
mountOptions = {},
|
||||
@@ -2363,10 +2366,14 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
|
||||
phase: "blocked",
|
||||
ready: false,
|
||||
artifactUrl,
|
||||
diagnosticsUrl,
|
||||
httpStatus: null,
|
||||
diagnosticsHttpStatus: null,
|
||||
missing,
|
||||
error: null,
|
||||
diagnosticsError: null,
|
||||
validation: null,
|
||||
diagnosticsValidation: null,
|
||||
validationSummaryViewModel: null,
|
||||
gateExecutionSummaryViewModel: null,
|
||||
actionPlan,
|
||||
@@ -2378,35 +2385,45 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetchRef(artifactUrl);
|
||||
const httpStatus = response?.status ?? null;
|
||||
if (!response?.ok) {
|
||||
const actionPlan = createProjectReleaseReadinessArtifactUrlWorkflowActionPlan({
|
||||
ready: false,
|
||||
missing: ["artifact-fetch"],
|
||||
});
|
||||
const urlWorkflow = await loadProjectReleaseReadinessArtifactUrlWorkflow({
|
||||
artifactUrl,
|
||||
diagnosticsUrl,
|
||||
fetchRef,
|
||||
});
|
||||
const httpStatus = urlWorkflow.httpStatus;
|
||||
if (urlWorkflow.fetched !== true || urlWorkflow.jsonWorkflow?.parsed !== true) {
|
||||
const actionPlan = createProjectReleaseReadinessArtifactUrlWorkflowActionPlan(urlWorkflow);
|
||||
const error = urlWorkflow.fetchError
|
||||
?? urlWorkflow.jsonWorkflow?.parseError
|
||||
?? (httpStatus ? `HTTP ${httpStatus}` : "artifact URL workflow blocked");
|
||||
return {
|
||||
apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow",
|
||||
workflowVersion: 1,
|
||||
phase: "blocked",
|
||||
ready: false,
|
||||
artifactUrl,
|
||||
diagnosticsUrl,
|
||||
httpStatus,
|
||||
missing: ["artifact-url"],
|
||||
error: `HTTP ${httpStatus ?? "error"}`,
|
||||
diagnosticsHttpStatus: urlWorkflow.diagnosticsHttpStatus ?? null,
|
||||
missing: urlWorkflow.missing ?? ["artifact-url"],
|
||||
error,
|
||||
diagnosticsError: urlWorkflow.diagnosticsFetchError ?? null,
|
||||
validation: null,
|
||||
diagnosticsValidation: urlWorkflow.diagnosticsValidation ?? null,
|
||||
validationSummaryViewModel: null,
|
||||
gateExecutionSummaryViewModel: null,
|
||||
actionPlan,
|
||||
displayViewModel: null,
|
||||
renderState: null,
|
||||
mountResult: null,
|
||||
statusLine: `Blocked: HTTP ${httpStatus ?? "error"}`,
|
||||
urlWorkflow,
|
||||
statusLine: httpStatus && urlWorkflow.fetchError ? `Blocked: HTTP ${httpStatus}` : `Blocked: ${error}`,
|
||||
};
|
||||
}
|
||||
|
||||
const artifactJson = await response.text();
|
||||
const validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(artifactJson);
|
||||
const validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(
|
||||
JSON.stringify(urlWorkflow.jsonWorkflow.artifact),
|
||||
);
|
||||
const gateExecutionSummaryViewModel =
|
||||
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel(
|
||||
validation,
|
||||
@@ -2432,9 +2449,15 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
|
||||
: [];
|
||||
const workflowMissing = [
|
||||
...validation.missing,
|
||||
...(urlWorkflow.diagnosticsUrl && urlWorkflow.diagnosticsValidation?.ready !== true
|
||||
? (urlWorkflow.diagnosticsValidation?.missing ?? ["browser-diagnostics"])
|
||||
.map((item) => `diagnostics.${item}`)
|
||||
: []),
|
||||
...mountMissing,
|
||||
];
|
||||
const ready = validation.ready === true && (!mount || mountResult?.ready === true);
|
||||
const ready = validation.ready === true &&
|
||||
(!urlWorkflow.diagnosticsUrl || urlWorkflow.diagnosticsValidation?.ready === true) &&
|
||||
(!mount || mountResult?.ready === true);
|
||||
const validationActionPlan = createProjectReleaseReadinessArtifactValidationActionPlan(
|
||||
validation.validation,
|
||||
);
|
||||
@@ -2449,16 +2472,21 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
|
||||
phase: ready ? "ready" : "blocked",
|
||||
ready,
|
||||
artifactUrl,
|
||||
diagnosticsUrl,
|
||||
httpStatus,
|
||||
diagnosticsHttpStatus: urlWorkflow.diagnosticsHttpStatus ?? null,
|
||||
missing: workflowMissing,
|
||||
error: null,
|
||||
diagnosticsError: urlWorkflow.diagnosticsFetchError ?? null,
|
||||
validation,
|
||||
diagnosticsValidation: urlWorkflow.diagnosticsValidation ?? null,
|
||||
validationSummaryViewModel,
|
||||
gateExecutionSummaryViewModel,
|
||||
actionPlan,
|
||||
displayViewModel,
|
||||
renderState,
|
||||
mountResult,
|
||||
urlWorkflow,
|
||||
statusLine: ready ? renderState.statusLine : `Blocked: ${workflowMissing.join(", ")}`,
|
||||
};
|
||||
} catch (error) {
|
||||
@@ -2472,10 +2500,14 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
|
||||
phase: "blocked",
|
||||
ready: false,
|
||||
artifactUrl,
|
||||
diagnosticsUrl,
|
||||
httpStatus: null,
|
||||
diagnosticsHttpStatus: null,
|
||||
missing: ["artifact-url"],
|
||||
error: error?.message ?? String(error),
|
||||
diagnosticsError: null,
|
||||
validation: null,
|
||||
diagnosticsValidation: null,
|
||||
validationSummaryViewModel: null,
|
||||
gateExecutionSummaryViewModel: null,
|
||||
actionPlan,
|
||||
@@ -2516,6 +2548,23 @@ export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWo
|
||||
label: "HTTP status",
|
||||
value: workflow?.httpStatus == null ? "none" : String(workflow.httpStatus),
|
||||
},
|
||||
{
|
||||
id: "diagnostics-url",
|
||||
label: "Diagnostics URL",
|
||||
value: workflow?.diagnosticsUrl || "not requested",
|
||||
},
|
||||
{
|
||||
id: "browser-diagnostics",
|
||||
label: "Browser diagnostics",
|
||||
value: workflow?.diagnosticsUrl
|
||||
? (workflow?.diagnosticsValidation?.ready === true ? "ready" : "blocked")
|
||||
: "not requested",
|
||||
},
|
||||
{
|
||||
id: "diagnostics-status",
|
||||
label: "Diagnostics HTTP status",
|
||||
value: workflow?.diagnosticsHttpStatus == null ? "none" : String(workflow.diagnosticsHttpStatus),
|
||||
},
|
||||
{
|
||||
id: "validation-summary",
|
||||
label: "Validation summary",
|
||||
|
||||
@@ -7,6 +7,15 @@
|
||||
<body>
|
||||
<pre id="status">running</pre>
|
||||
<script type="module">
|
||||
import {
|
||||
createVirtualHalCommandScriptFixtureReport,
|
||||
createVirtualHalMotionControllerMatrixReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createVirtualHalSimulationReplacementReport,
|
||||
createVirtualHalSourceComplianceReport,
|
||||
createVirtualHalState,
|
||||
} from "../../runtime/sdk/src/index.js";
|
||||
|
||||
function assertEqual(actual, expected, label) {
|
||||
if (actual !== expected) {
|
||||
throw new Error(`${label}: expected ${expected}, got ${actual}`);
|
||||
@@ -337,8 +346,30 @@
|
||||
.mountWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState({
|
||||
renderState: releaseArtifactJsonWorkflowRenderState,
|
||||
});
|
||||
const diagnosticsVirtualHalState = createVirtualHalState();
|
||||
const diagnosticsArtifactJson = JSON.stringify({
|
||||
apiName: "real-browser-simulation-diagnostics-artifact",
|
||||
artifactVersion: 1,
|
||||
virtualHal: diagnosticsVirtualHalState,
|
||||
virtualHalSimulationReplacement: createVirtualHalSimulationReplacementReport(diagnosticsVirtualHalState),
|
||||
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: diagnosticsVirtualHalState }),
|
||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
||||
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: diagnosticsVirtualHalState }),
|
||||
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
|
||||
});
|
||||
const releaseArtifactUrlWorkflow = await workflowApi.loadWorkflowOverviewReleaseReadinessArtifactUrl({
|
||||
artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json",
|
||||
diagnosticsUrl: "../../tests/fixtures/real-browser-simulation-diagnostics-ready.json",
|
||||
fetchRef: async (url) => {
|
||||
if (String(url).endsWith("real-browser-simulation-diagnostics-ready.json")) {
|
||||
return {
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => diagnosticsArtifactJson,
|
||||
};
|
||||
}
|
||||
return fetch(url);
|
||||
},
|
||||
mount: true,
|
||||
});
|
||||
const releaseArtifactUrlWorkflowSummary = workflowApi
|
||||
@@ -441,6 +472,8 @@
|
||||
);
|
||||
assertEqual(releaseArtifactUrlWorkflow.ready, true, "workflow overview release artifact URL workflow readiness");
|
||||
assertEqual(releaseArtifactUrlWorkflow.httpStatus, 200, "workflow overview release artifact URL workflow status");
|
||||
assertEqual(releaseArtifactUrlWorkflow.diagnosticsHttpStatus, 200, "workflow overview diagnostics artifact URL workflow status");
|
||||
assertEqual(releaseArtifactUrlWorkflow.diagnosticsValidation.ready, true, "workflow overview diagnostics artifact validation");
|
||||
assertEqual(
|
||||
releaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine,
|
||||
"Ready: Artifact evidence complete",
|
||||
@@ -463,9 +496,14 @@
|
||||
);
|
||||
assertEqual(
|
||||
releaseArtifactUrlWorkflowRenderResult.rowCount,
|
||||
8,
|
||||
11,
|
||||
"workflow overview release artifact URL workflow render rows",
|
||||
);
|
||||
assertEqual(
|
||||
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("browser-diagnostics"),
|
||||
true,
|
||||
"workflow overview release artifact URL workflow diagnostics row",
|
||||
);
|
||||
assertEqual(
|
||||
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("mount-result"),
|
||||
true,
|
||||
|
||||
@@ -5,7 +5,12 @@ import {
|
||||
createProjectReleaseReadinessReport,
|
||||
} from "../../../runtime/sdk/src/project-release-readiness.js";
|
||||
import {
|
||||
createVirtualHalCommandScriptFixtureReport,
|
||||
createVirtualHalMotionControllerMatrixReport,
|
||||
createVirtualHalSimConfigSourceCoverageReport,
|
||||
createVirtualHalSimulationReplacementReport,
|
||||
createVirtualHalSourceComplianceReport,
|
||||
createVirtualHalState,
|
||||
} from "../../../runtime/sdk/src/linuxcnc-hal.js";
|
||||
|
||||
import {
|
||||
@@ -1355,6 +1360,17 @@ const releaseReadinessArtifactJson = JSON.stringify(createProjectReleaseReadines
|
||||
gateResults: Object.fromEntries(createProjectReleaseGateManifest().gateIds.map((id) => [id, true])),
|
||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
||||
}));
|
||||
const browserDiagnosticsVirtualHalState = createVirtualHalState();
|
||||
const browserDiagnosticsArtifactJson = JSON.stringify({
|
||||
apiName: "real-browser-simulation-diagnostics-artifact",
|
||||
artifactVersion: 1,
|
||||
virtualHal: browserDiagnosticsVirtualHalState,
|
||||
virtualHalSimulationReplacement: createVirtualHalSimulationReplacementReport(browserDiagnosticsVirtualHalState),
|
||||
virtualHalSourceCompliance: createVirtualHalSourceComplianceReport({ halState: browserDiagnosticsVirtualHalState }),
|
||||
virtualHalSimConfigSourceCoverage: createVirtualHalSimConfigSourceCoverageReport(),
|
||||
virtualHalCommandScriptFixtures: createVirtualHalCommandScriptFixtureReport({ halState: browserDiagnosticsVirtualHalState }),
|
||||
virtualHalMotionControllerMatrix: createVirtualHalMotionControllerMatrixReport(),
|
||||
});
|
||||
const releaseArtifactValidation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(
|
||||
releaseReadinessArtifactJson,
|
||||
);
|
||||
@@ -1697,11 +1713,21 @@ assert.equal(
|
||||
);
|
||||
const releaseArtifactUrlWorkflow = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
fetchRef: async (url) => ({
|
||||
ok: url === "/project-release-readiness.json",
|
||||
status: 200,
|
||||
text: async () => releaseReadinessArtifactJson,
|
||||
}),
|
||||
diagnosticsUrl: "/real-browser-simulation-diagnostics.json",
|
||||
fetchRef: async (url) => {
|
||||
if (url === "/real-browser-simulation-diagnostics.json") {
|
||||
return {
|
||||
ok: true,
|
||||
status: 200,
|
||||
text: async () => browserDiagnosticsArtifactJson,
|
||||
};
|
||||
}
|
||||
return {
|
||||
ok: url === "/project-release-readiness.json",
|
||||
status: 200,
|
||||
text: async () => releaseReadinessArtifactJson,
|
||||
};
|
||||
},
|
||||
mount: true,
|
||||
mountOptions: {
|
||||
documentRef: mountDocument,
|
||||
@@ -1716,7 +1742,9 @@ assert.equal(
|
||||
);
|
||||
assert.equal(releaseArtifactUrlWorkflow.ready, true);
|
||||
assert.equal(releaseArtifactUrlWorkflow.httpStatus, 200);
|
||||
assert.equal(releaseArtifactUrlWorkflow.diagnosticsHttpStatus, 200);
|
||||
assert.equal(releaseArtifactUrlWorkflow.validation.ready, true);
|
||||
assert.equal(releaseArtifactUrlWorkflow.diagnosticsValidation.ready, true);
|
||||
assert.equal(
|
||||
releaseArtifactUrlWorkflow.validationSummaryViewModel.statusLine,
|
||||
"Ready: Artifact evidence complete",
|
||||
@@ -1744,6 +1772,10 @@ assert.equal(
|
||||
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "action-plan")?.value,
|
||||
"ready",
|
||||
);
|
||||
assert.equal(
|
||||
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "browser-diagnostics")?.value,
|
||||
"ready",
|
||||
);
|
||||
assert.equal(releaseArtifactUrlWorkflow.actionPlan.ready, true);
|
||||
assert.equal(releaseArtifactUrlWorkflow.actionPlan.nextCommand, null);
|
||||
assert.equal(
|
||||
@@ -1809,13 +1841,17 @@ const releaseArtifactUrlWorkflowMountResult =
|
||||
rowsNode: releaseArtifactUrlWorkflowRowsNode,
|
||||
});
|
||||
assert.equal(releaseArtifactUrlWorkflowRenderResult.rendered, true);
|
||||
assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 8);
|
||||
assert.equal(releaseArtifactUrlWorkflowRenderResult.rowCount, 11);
|
||||
assert.equal(
|
||||
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("browser-diagnostics"),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
releaseArtifactUrlWorkflowRenderResult.rowIds.includes("mount-result"),
|
||||
true,
|
||||
);
|
||||
assert.equal(releaseArtifactUrlWorkflowMountResult.ready, true);
|
||||
assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 8);
|
||||
assert.equal(releaseArtifactUrlWorkflowMountResult.renderResult.rowCount, 11);
|
||||
const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
|
||||
artifactUrl: "/project-release-readiness.json",
|
||||
fetchRef: async () => ({
|
||||
|
||||
Reference in New Issue
Block a user