上传真实浏览器仿真推进

结论:新增 LinuxCNC WASM 驱动的真实浏览器仿真页面,接入 browser smoke、release gate、SDK 与项目交付文档,并完成当前推进批次的验收记录。
This commit is contained in:
2026-06-16 20:59:21 +08:00
parent 19eabdf06e
commit 24e1fc18b1
39 changed files with 7563 additions and 59 deletions

View File

@@ -25,8 +25,12 @@ import {
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlGateExecutionSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createLinuxCncIniSdk,
createLinuxCncInterpSdk,
@@ -34,6 +38,18 @@ import {
createMachineSessionPersistenceDisplayViewModel,
createMachineSessionPersistenceRenderState,
createMachineSessionPersistenceSummary,
createProjectBatchAcceptanceActionPlan,
createProjectBatchAcceptanceCapabilityMatrix,
createProjectBatchAcceptanceChecklist,
createProjectBatchAcceptanceReport,
createProjectBatchAcceptanceReportJsonWorkflow,
createProjectBatchAcceptanceReportUrlWorkflowActionPlan,
createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel,
createProjectBatchAcceptanceReportValidationActionPlan,
createProjectBatchAcceptanceReportValidationSummaryViewModel,
createProjectBatchAcceptanceReportValidation,
createProjectBatchAcceptanceSummaryViewModel,
createProjectBatchAcceptanceWorkflow,
createProjectReleaseGateActionPlan,
createProjectReleaseGateExecutionManifest,
createProjectReleaseGateExecutionSummaryViewModel,
@@ -60,6 +76,30 @@ import {
isSupportedIniPanelLaunchApiManifest,
isSupportedIniPanelShellIntegrationManifest,
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
loadProjectBatchAcceptanceReportUrlWorkflow,
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness,
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState,
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness,
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState,
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness,
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState,
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness,
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState,
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState,
loadProjectReleaseReadinessArtifactUrlWorkflow,
loadMachineSessionFromOpfs,
loadMachineSessionSnapshot,
@@ -97,6 +137,30 @@ const trackerText = readFileSync(resolve(root, "../PROJECT_COMPLETION_TRACKER.md
const requiredExports = [
["createLinuxCncIniSdk", createLinuxCncIniSdk],
["createLinuxCncInterpSdk", createLinuxCncInterpSdk],
["createProjectBatchAcceptanceActionPlan", createProjectBatchAcceptanceActionPlan],
["createProjectBatchAcceptanceCapabilityMatrix", createProjectBatchAcceptanceCapabilityMatrix],
["createProjectBatchAcceptanceChecklist", createProjectBatchAcceptanceChecklist],
["createProjectBatchAcceptanceReport", createProjectBatchAcceptanceReport],
["createProjectBatchAcceptanceReportJsonWorkflow", createProjectBatchAcceptanceReportJsonWorkflow],
[
"createProjectBatchAcceptanceReportUrlWorkflowActionPlan",
createProjectBatchAcceptanceReportUrlWorkflowActionPlan,
],
[
"createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel",
createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel,
],
[
"createProjectBatchAcceptanceReportValidationActionPlan",
createProjectBatchAcceptanceReportValidationActionPlan,
],
[
"createProjectBatchAcceptanceReportValidationSummaryViewModel",
createProjectBatchAcceptanceReportValidationSummaryViewModel,
],
["createProjectBatchAcceptanceReportValidation", createProjectBatchAcceptanceReportValidation],
["createProjectBatchAcceptanceSummaryViewModel", createProjectBatchAcceptanceSummaryViewModel],
["createProjectBatchAcceptanceWorkflow", createProjectBatchAcceptanceWorkflow],
["createProjectReleaseGateActionPlan", createProjectReleaseGateActionPlan],
["createProjectReleaseGateExecutionManifest", createProjectReleaseGateExecutionManifest],
["createProjectReleaseGateExecutionSummaryViewModel", createProjectReleaseGateExecutionSummaryViewModel],
@@ -127,10 +191,103 @@ const requiredExports = [
"validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson",
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson,
],
[
"runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow",
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowRenderState",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowRenderState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness,
],
[
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState",
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState,
],
[
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState",
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness,
],
[
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState",
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState,
],
[
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState",
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness,
],
[
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState",
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState,
],
[
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState",
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness,
],
[
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState",
renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState,
],
[
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState",
mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState,
],
[
"loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl",
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
],
["loadProjectBatchAcceptanceReportUrlWorkflow", loadProjectBatchAcceptanceReportUrlWorkflow],
["loadProjectReleaseReadinessArtifactUrlWorkflow", loadProjectReleaseReadinessArtifactUrlWorkflow],
["planIniFileContextStaging", planIniFileContextStaging],
["planSimConfigStaging", planSimConfigStaging],
@@ -194,10 +351,26 @@ const requiredExports = [
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlGateExecutionSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlGateExecutionSummaryViewModel,
],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
@@ -246,6 +419,106 @@ assert.equal(normalizeOpfsPath("linuxcnc/machines/sdk-mill/tool.tbl"), "linuxcnc
assert.equal(gcodeFilenameFromProgramPath("linuxcnc/gcode/demo.ngc"), "demo.ngc");
const releaseReadinessWaiting = createProjectReleaseReadinessReport();
const batchCapabilityMatrix = createProjectBatchAcceptanceCapabilityMatrix({
capabilities: [
{
id: "sdk-surface-api",
type: "api",
label: "SDK surface API",
},
],
});
assert.equal(batchCapabilityMatrix.ready, true);
assert.equal(batchCapabilityMatrix.countsByType.api, 1);
const batchAcceptanceWorkflow = createProjectBatchAcceptanceWorkflow({
batchId: "sdk-surface-batch",
capabilities: [
{
id: "sdk-surface-api",
type: "api",
label: "SDK surface API",
},
],
observedOutputs: ["project_batch_acceptance_workflow_node_smoke=ok"],
});
assert.equal(batchAcceptanceWorkflow.ready, true);
assert.equal(batchAcceptanceWorkflow.capabilityTypes[0], "api");
assert.equal(
createProjectBatchAcceptanceSummaryViewModel(batchAcceptanceWorkflow).statusLine,
"Ready: Batch acceptance evidence complete",
);
assert.equal(
createProjectBatchAcceptanceActionPlan(batchAcceptanceWorkflow).shellScript,
"# Project batch acceptance workflow is already ready.\n",
);
assert.equal(
createProjectBatchAcceptanceChecklist({ workflow: batchAcceptanceWorkflow }).rows[0].value,
"pass: api",
);
assert.equal(
createProjectBatchAcceptanceReport({
batchId: "sdk-surface-batch",
capabilities: batchAcceptanceWorkflow.capabilities,
observedOutputs: ["project_batch_acceptance_workflow_node_smoke=ok"],
}).rows.find(({ id }) => id === "checklist")?.value,
"3/3 passed",
);
const batchAcceptanceReport = createProjectBatchAcceptanceReport({
batchId: "sdk-surface-batch",
capabilities: batchAcceptanceWorkflow.capabilities,
observedOutputs: ["project_batch_acceptance_workflow_node_smoke=ok"],
});
assert.equal(createProjectBatchAcceptanceReportValidation(batchAcceptanceReport).ready, true);
assert.equal(
createProjectBatchAcceptanceReportValidationSummaryViewModel(
createProjectBatchAcceptanceReportValidation(batchAcceptanceReport),
).statusLine,
"Ready: Batch acceptance report evidence complete",
);
assert.equal(
createProjectBatchAcceptanceReportValidationActionPlan(
createProjectBatchAcceptanceReportValidation(batchAcceptanceReport),
).shellScript,
"# Project batch acceptance report validation is already ready.\n",
);
assert.equal(
createProjectBatchAcceptanceReportJsonWorkflow({
reportJson: JSON.stringify(batchAcceptanceReport),
}).ready,
true,
);
const batchAcceptanceReportUrlWorkflow = await loadProjectBatchAcceptanceReportUrlWorkflow({
reportUrl: "/project-batch-acceptance.json",
fetchRef: async () => ({
ok: true,
status: 200,
text: async () => JSON.stringify(batchAcceptanceReport),
}),
});
assert.equal(batchAcceptanceReportUrlWorkflow.ready, true);
assert.equal(
createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel(
batchAcceptanceReportUrlWorkflow,
).statusLine,
"Ready: Batch report URL workflow complete",
);
assert.equal(
createProjectBatchAcceptanceReportUrlWorkflowActionPlan(
batchAcceptanceReportUrlWorkflow,
).shellScript,
"# Project batch acceptance report URL workflow is already ready.\n",
);
assert.equal(
(await loadProjectBatchAcceptanceReportUrlWorkflow({
reportUrl: "/missing-project-batch-acceptance.json",
fetchRef: async () => ({ ok: false, status: 404, text: async () => "" }),
})).missing[0],
"report-fetch",
);
assert.equal(
createProjectBatchAcceptanceActionPlan(createProjectBatchAcceptanceWorkflow()).nextCommand,
"wasm-port/tests/sdk/node/verify_project_batch_acceptance_workflow.sh",
);
assert.equal(releaseReadinessWaiting.apiName, "project-release-readiness-report");
assert.equal(releaseReadinessWaiting.ready, false);
assert.deepEqual(releaseReadinessWaiting.missing, ["project-release-gate"]);
@@ -446,6 +719,44 @@ assert.equal(
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify(releaseReadinessArtifact)).ready,
true,
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan(
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson(JSON.stringify(releaseReadinessArtifact)),
).shellScript,
"# Project release readiness artifact validation is already ready.\n",
);
assert.equal(
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow({
artifactJson: JSON.stringify(releaseReadinessArtifact),
}).statusLine,
"Ready: Artifact JSON workflow complete",
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel(
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow({
artifactJson: JSON.stringify(releaseReadinessArtifact),
}),
).statusLine,
"Ready: Artifact JSON workflow complete",
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan(
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow({
artifactJson: JSON.stringify(releaseReadinessArtifact),
}),
).nextCommand,
null,
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowRenderState(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel(
runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow({
artifactJson: JSON.stringify(releaseReadinessArtifact),
}),
),
).dataset.handoffScope,
"workflow-overview-release-readiness-artifact-json-workflow",
);
const releaseReadinessArtifactUrlWorkflow = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
artifactUrl: "/project-release-readiness.json",
fetchRef: async () => ({
@@ -465,6 +776,12 @@ assert.equal(
).statusLine,
"Ready: Artifact URL workflow complete",
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan(
releaseReadinessArtifactUrlWorkflow,
).shellScript,
"# Project release readiness artifact URL workflow is already ready.\n",
);
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(