上传真实浏览器仿真推进

结论:新增 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

@@ -14,6 +14,10 @@ const handoffText = readFileSync(resolve(root, "docs/project-release-handoff.md"
const readmeText = readFileSync(resolve(root, "README.md"), "utf8");
const panelEntryText = readFileSync(resolve(root, "docs/panel-entry.md"), "utf8");
const sdkReadmeText = readFileSync(resolve(root, "runtime/sdk/README.md"), "utf8");
const realBrowserSimulationPriorityText = readFileSync(
resolve(root, "docs/real-browser-simulation-priority.md"),
"utf8",
);
const sourceReuseText = readFileSync(resolve(root, "docs/source-reuse-map.md"), "utf8");
const driftText = readFileSync(resolve(root, "docs/drift-report.md"), "utf8");
const hostSmokeText = readFileSync(resolve(root, "tests/host/verify_host_smokes.sh"), "utf8");
@@ -25,12 +29,18 @@ for (const phrase of [
"docs/panel-entry.md",
"runtime/sdk/README.md",
"docs/opfs-session-persistence.md",
"docs/real-browser-simulation-priority.md",
"docs/sim-configs-coverage-handoff.md",
"docs/host-runtime-boundary-handoff.md",
"docs/source-reuse-map.md",
"docs/drift-report.md",
"PROJECT_COMPLETION_TRACKER.md",
"runtime/sdk/src/index.js",
"real browser CNC simulation page",
"runtime/ui/simulation/index.html",
"verify_real_simulation_browser.sh",
"LinuxCNC-backed interpreter execution",
"toolpath/preview area",
"createProjectReleaseGateManifest()",
"createProjectReleaseGateResultMatrix()",
"createProjectReleaseGateActionPlan()",
@@ -46,9 +56,48 @@ for (const phrase of [
"loadProjectReleaseReadinessArtifactUrlWorkflow()",
"createProjectReleaseReadinessArtifactUrlWorkflowActionPlan()",
"createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
"createProjectBatchAcceptanceCapabilityMatrix()",
"createProjectBatchAcceptanceWorkflow()",
"createProjectBatchAcceptanceChecklist()",
"createProjectBatchAcceptanceReport()",
"createProjectBatchAcceptanceReportValidation()",
"createProjectBatchAcceptanceReportValidationSummaryViewModel()",
"createProjectBatchAcceptanceReportValidationActionPlan()",
"createProjectBatchAcceptanceReportJsonWorkflow()",
"loadProjectBatchAcceptanceReportUrlWorkflow()",
"createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel()",
"createProjectBatchAcceptanceReportUrlWorkflowActionPlan()",
"write_project_batch_acceptance_artifact.mjs",
"verify_project_batch_acceptance_artifact.sh",
"embedded gate manifest, execution manifest, result matrix, and",
"validateWorkflowOverviewReleaseReadinessArtifactJson()",
"runWorkflowOverviewReleaseReadinessArtifactJsonWorkflow()",
"getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel()",
"getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan()",
"getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract()",
"getWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness()",
"renderWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()",
"mountWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()",
"loadWorkflowOverviewReleaseReadinessArtifactUrl()",
"getWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel()",
"getWorkflowOverviewReleaseReadinessArtifactUrlGateExecutionSummaryViewModel()",
"getWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState()",
"getWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract()",
"getWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness()",
"renderWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()",
"mountWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness()",
"renderWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()",
"mountWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()",
"getWorkflowOverviewReleaseReadinessArtifactValidationActionPlan()",
"getWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState()",
"getWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract()",
"getWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness()",
"renderWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()",
"mountWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
"render-state",
"DOM readiness",
@@ -61,15 +110,21 @@ for (const phrase of [
"build/project-release-readiness.json",
"verify_project_release_readiness_artifact.sh",
"verify_project_release_artifact_url_workflow.sh",
"verify_project_batch_acceptance_workflow.sh",
"verify_real_browser_simulation_priority_docs.sh",
"verify_opfs_session_workflow_browser.sh",
"host_wasm_opfs_browser_smokes=ok",
"project_release_readiness_artifact_node_smoke=ok",
"project_release_artifact_url_workflow_node_smoke=ok",
"project_batch_acceptance_workflow_node_smoke=ok",
"project_batch_acceptance_artifact_node_smoke=ok",
"real_browser_simulation_priority_docs_node_smoke=ok",
"project_release_gate=ok",
"sim_configs_wasm_node_inventory_unexpected_fail=0",
"browser_ini_shell_integration_workflow_smoke=ok",
"browser_opfs_session_workflow_smoke=ok",
"browser_release_artifact_url_workflow_smoke=ok",
"browser_real_simulation_page_smoke=ok",
"project_release_handoff_docs_node_smoke=ok",
"L4-USER-M-PROCESS",
"L4-TOOL-DB",
@@ -80,7 +135,9 @@ for (const phrase of [
for (const phrase of [
"docs/project-release-handoff.md",
"docs/real-browser-simulation-priority.md",
"project_release_handoff_docs_node_smoke=ok",
"real_browser_simulation_priority_docs_node_smoke=ok",
]) {
assert.match(readmeText, literalRegExp(phrase));
assert.match(hostSmokeText, literalRegExp("verify_project_release_handoff_docs.sh"));
@@ -95,11 +152,15 @@ for (const phrase of [
"verify_ini_panel_browser.sh",
"verify_opfs_session_workflow_browser.sh",
"verify_release_artifact_url_workflow_browser.sh",
"verify_project_batch_acceptance_workflow.sh",
"verify_real_browser_simulation_priority_docs.sh",
"verify_ui_node_smokes.sh",
"verify_host_smokes.sh",
"write_project_release_readiness_artifact.mjs",
"verify_project_release_readiness_artifact.sh",
"verify_project_release_artifact_url_workflow.sh",
"verify_project_batch_acceptance_workflow.sh",
"verify_real_browser_simulation_priority_docs.sh",
"project_release_gate=ok",
]) {
assert.match(projectReleaseGateText, literalRegExp(phrase));
@@ -136,8 +197,51 @@ for (const phrase of [
"loadProjectReleaseReadinessArtifactUrlWorkflow()",
"createProjectReleaseReadinessArtifactUrlWorkflowActionPlan()",
"createProjectReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
"createProjectBatchAcceptanceCapabilityMatrix()",
"createProjectBatchAcceptanceWorkflow()",
"createProjectBatchAcceptanceChecklist()",
"createProjectBatchAcceptanceReport()",
"createProjectBatchAcceptanceReportValidation()",
"createProjectBatchAcceptanceReportValidationSummaryViewModel()",
"createProjectBatchAcceptanceReportValidationActionPlan()",
"createProjectBatchAcceptanceReportJsonWorkflow()",
"loadProjectBatchAcceptanceReportUrlWorkflow()",
"createProjectBatchAcceptanceReportUrlWorkflowSummaryViewModel()",
"createProjectBatchAcceptanceReportUrlWorkflowActionPlan()",
"createProjectBatchAcceptanceSummaryViewModel()",
"createProjectBatchAcceptanceActionPlan()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryViewModel()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlGateExecutionSummaryViewModel()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryRenderState()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomContract()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryDomReadiness()",
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()",
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactGateExecutionSummaryState()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowActionPlan()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowRenderState()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomContract()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowDomReadiness()",
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()",
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowState()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlan()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanRenderState()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomContract()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanDomReadiness()",
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()",
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationActionPlanState()",
"runIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflow()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowSummaryViewModel()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowActionPlan()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomContract()",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowDomReadiness()",
"renderIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()",
"mountIniPanelShellWorkflowOverviewReleaseReadinessArtifactJsonWorkflowState()",
"verify_project_release_artifact_url_workflow.sh",
"verify_project_batch_acceptance_workflow.sh",
"verify_project_batch_acceptance_artifact.sh",
"project_release_artifact_url_workflow_node_smoke=ok",
"project_batch_acceptance_workflow_node_smoke=ok",
"project_batch_acceptance_artifact_node_smoke=ok",
"build/project-release-readiness.json",
"INI panel shell handoff exports",
"createIniPanelShellApiSurfaceInventory()",
@@ -148,7 +252,10 @@ for (const phrase of [
assert.match(sourceReuseText, literalRegExp("docs/project-release-handoff.md"));
assert.match(driftText, literalRegExp("docs/project-release-handoff.md"));
assert.match(realBrowserSimulationPriorityText, literalRegExp("first priority is to deliver a real browser CNC simulation page"));
assert.match(realBrowserSimulationPriorityText, literalRegExp("must not implement CNC semantics in JavaScript"));
assert.match(trackerText, /Documentation\/release gate/);
assert.match(trackerText, /Real browser simulation priority/);
assert.match(trackerText, /Project release gate wrapper/);
assert.match(trackerText, /Final Acceptance Checklist/);

View File

@@ -0,0 +1,53 @@
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = resolve(__dirname, "../../..");
function literalRegExp(text) {
return new RegExp(text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
}
const priorityText = readFileSync(resolve(root, "docs/real-browser-simulation-priority.md"), "utf8");
const handoffText = readFileSync(resolve(root, "docs/project-release-handoff.md"), "utf8");
const readmeText = readFileSync(resolve(root, "README.md"), "utf8");
const trackerText = readFileSync(resolve(root, "../PROJECT_COMPLETION_TRACKER.md"), "utf8");
const hostSmokeText = readFileSync(resolve(root, "tests/host/verify_host_smokes.sh"), "utf8");
const releaseGateText = readFileSync(resolve(root, "tests/host/verify_project_release_gate.sh"), "utf8");
const simulationHtmlText = readFileSync(resolve(root, "runtime/ui/simulation/index.html"), "utf8");
const simulationSmokeText = readFileSync(resolve(root, "tests/browser/verify_real_simulation_browser.sh"), "utf8");
for (const phrase of [
"Real Browser Simulation Priority",
"first priority is to deliver a real browser CNC simulation page",
"machine/session loader",
"G-code program view",
"LinuxCNC-backed interpreter execution",
"toolpath/preview area",
"browser smoke coverage",
"must not implement CNC semantics in JavaScript",
"vendored LinuxCNC source",
"wasm-port/tests/docs/node/verify_real_browser_simulation_priority_docs.sh",
"runtime/ui/simulation/index.html",
"wasm-port/tests/browser/verify_real_simulation_browser.sh",
]) {
assert.match(priorityText, literalRegExp(phrase));
}
for (const text of [handoffText, readmeText, trackerText]) {
assert.match(text, literalRegExp("docs/real-browser-simulation-priority.md"));
assert.match(text, /real browser CNC simulation page|真实 UI\/browser 数控仿真页面/);
assert.match(text, /LinuxCNC semantic boundary|LinuxCNC 语义边界|LinuxCNC-backed/);
}
assert.match(hostSmokeText, /verify_real_browser_simulation_priority_docs\.sh/);
assert.match(hostSmokeText, /verify_real_simulation_browser\.sh/);
assert.match(releaseGateText, /verify_real_simulation_browser\.sh/);
assert.match(simulationHtmlText, /LinuxCNC Browser Simulation/);
assert.match(simulationHtmlText, /data-toolpath-svg/);
assert.match(simulationHtmlText, /data-program-lines/);
assert.match(simulationSmokeText, /browser_real_simulation_page_smoke=ok/);
console.log("real_browser_simulation_priority_docs_node_smoke=ok");

View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)"
node "$ROOT_DIR/tests/docs/node/verify_real_browser_simulation_priority_docs.mjs"