新增发布 readiness artifact SDK 校验 workflow
This commit is contained in:
@@ -9,7 +9,7 @@ turn-by-turn continuation notes and next-batch execution records.
|
|||||||
## Current Status
|
## Current Status
|
||||||
|
|
||||||
- Active continuation file: `text14.txt`
|
- Active continuation file: `text14.txt`
|
||||||
- Latest completed batch: project release readiness gate artifact
|
- Latest completed batch: project release readiness artifact validation workflow
|
||||||
- Latest relevant commit: use `git log -1 --oneline` after each committed batch
|
- Latest relevant commit: use `git log -1 --oneline` after each committed batch
|
||||||
- Working tree at tracker creation: clean
|
- Working tree at tracker creation: clean
|
||||||
- Required policy: LinuxCNC remains the only CNC semantic source
|
- Required policy: LinuxCNC remains the only CNC semantic source
|
||||||
@@ -43,12 +43,12 @@ The project is complete for the current scope when all of the following are true
|
|||||||
| Native nc_files baseline | Stable | Last recorded Layer 1: `total 107`, `pass 101`, `expected_fail 6`, `unexpected_fail 0`. |
|
| Native nc_files baseline | Stable | Last recorded Layer 1: `total 107`, `pass 101`, `expected_fail 6`, `unexpected_fail 0`. |
|
||||||
| Native sim configs baseline | Stable | Last recorded Layer 2: `total 159`, `pass 151`, `expected_fail 8`, `unexpected_fail 0`. |
|
| Native sim configs baseline | Stable | Last recorded Layer 2: `total 159`, `pass 151`, `expected_fail 8`, `unexpected_fail 0`. |
|
||||||
| OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()` and `createMachineSessionPersistenceSummary()`, the UI exposes `getMachineSessionPersistenceSummary()`, and `docs/opfs-session-persistence.md` defines the project-level release gate. |
|
| OPFS/session persistence | Stable for current scope | Browser smoke passes, SDK re-exports OPFS/session helpers including `readMachineSessionReadiness()` and `createMachineSessionPersistenceSummary()`, the UI exposes `getMachineSessionPersistenceSummary()`, and `docs/opfs-session-persistence.md` defines the project-level release gate. |
|
||||||
| SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, project release readiness, INI panel entry/launcher/control-page/shell/workflow overview helpers, the session readiness workflow report, and the shell API surface inventory with a Node surface smoke. |
|
| SDK/API surface | Stable for current scope | SDK re-exports core, OPFS/session readiness/load helpers, sim-config staging, project release readiness report/artifact validation, INI panel entry/launcher/control-page/shell/workflow overview helpers, the session readiness workflow report, and the shell API surface inventory with a Node surface smoke. |
|
||||||
| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, and report OPFS/session readiness, OPFS/session persistence summary, and API surface inventory before loading or reading WASM session state. |
|
| Browser/UI workflow | Stable for current scope | Workflow overview embedding mount DOM closure is complete, and INI panel session workflows plus read-only control/shell handoff expose, render, and report OPFS/session readiness, OPFS/session persistence summary, and API surface inventory before loading or reading WASM session state. |
|
||||||
| Workflow overview embedding | Stable for current scope | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer/wrapper exist. |
|
| Workflow overview embedding | Stable for current scope | Report/display/render, DOM contract/readiness/renderer, mount result/display/render, mount DOM contract/readiness/renderer/wrapper exist. |
|
||||||
| Host/runtime boundary proof | Stable blocked state | Host smoke passes; runtime families remain blocked and `docs/host-runtime-boundary-handoff.md` records host readiness, promotion blockers, dispatch, and evidence gates. |
|
| Host/runtime boundary proof | Stable blocked state | Host smoke passes; runtime families remain blocked and `docs/host-runtime-boundary-handoff.md` records host readiness, promotion blockers, dispatch, and evidence gates. |
|
||||||
| Documentation/release gate | Stable for current scope | `docs/project-release-handoff.md` links README, panel entry, SDK, OPFS/session, sim-config, host/runtime, source reuse, drift, tracker acceptance paths, and the machine-readable release readiness report/artifact. |
|
| Documentation/release gate | Stable for current scope | `docs/project-release-handoff.md` links README, panel entry, SDK, OPFS/session, sim-config, host/runtime, source reuse, drift, tracker acceptance paths, and the machine-readable release readiness report/artifact. |
|
||||||
| Project release gate wrapper | Stable | `tests/host/verify_project_release_gate.sh` runs the documented minimum release validation commands, writes `build/project-release-readiness.json`, verifies it, and ends with `project_release_gate=ok`. |
|
| Project release gate wrapper | Stable | `tests/host/verify_project_release_gate.sh` runs the documented minimum release validation commands, writes `build/project-release-readiness.json`, verifies it through the SDK artifact validation workflow, and ends with `project_release_gate=ok`. |
|
||||||
|
|
||||||
## Blocked Runtime Families
|
## Blocked Runtime Families
|
||||||
|
|
||||||
|
|||||||
82
text14.txt
82
text14.txt
@@ -2918,3 +2918,85 @@ artifact 摘要:
|
|||||||
|
|
||||||
继续只做实质能力推进。下一批优先选择真实 browser/UI workflow 或外部 shell 可消费能力;
|
继续只做实质能力推进。下一批优先选择真实 browser/UI workflow 或外部 shell 可消费能力;
|
||||||
如果继续 release 路径,必须产出可执行 gate 或可消费 artifact,不再只做文档/记录补强。
|
如果继续 release 路径,必须产出可执行 gate 或可消费 artifact,不再只做文档/记录补强。
|
||||||
|
|
||||||
|
三十七、2026-06-16 继续执行记录:project release readiness artifact validation workflow
|
||||||
|
|
||||||
|
本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进,
|
||||||
|
把 release readiness artifact 从 host 测试里的硬编码断言推进为 SDK 可调用的 artifact parse/validation
|
||||||
|
workflow。外部工具现在可以直接复用 SDK 校验 `build/project-release-readiness.json`,host gate verifier
|
||||||
|
也改为复用同一套 SDK workflow。
|
||||||
|
|
||||||
|
完成内容:
|
||||||
|
|
||||||
|
- `runtime/sdk/src/project-release-readiness.js` 新增:
|
||||||
|
- `parseProjectReleaseReadinessArtifactJson()`;
|
||||||
|
- `createProjectReleaseReadinessArtifactValidation()`;
|
||||||
|
- artifact validation 输出:
|
||||||
|
- `apiName: "project-release-readiness-artifact-validation"`;
|
||||||
|
- `validationVersion`;
|
||||||
|
- `phase`;
|
||||||
|
- `ready`;
|
||||||
|
- `missing`;
|
||||||
|
- `artifactApiName`;
|
||||||
|
- `artifactVersion`;
|
||||||
|
- `gateCount`;
|
||||||
|
- `blockedRuntimeFamilies`;
|
||||||
|
- `rows`;
|
||||||
|
- 修复 artifact validation 中空 `gates` 数组会因 `Array.every()` 空真值被误判为 passed 的问题;
|
||||||
|
- `runtime/sdk/src/index.js` re-export 新 parse/validation API;
|
||||||
|
- `tests/host/verify_project_release_readiness_artifact.mjs` 改为调用 SDK parse/validation workflow;
|
||||||
|
- `verify_sdk_surface.mjs` 覆盖:
|
||||||
|
- artifact JSON parse;
|
||||||
|
- ready artifact validation;
|
||||||
|
- 空 artifact blocked/missing;
|
||||||
|
- blocked runtime family 不被误 promotion;
|
||||||
|
- `runtime/sdk/README.md` 和 `docs/project-release-handoff.md` 记录外部工具如何复用 artifact validation API;
|
||||||
|
- `verify_project_release_handoff_docs.mjs` 覆盖新 artifact validation API;
|
||||||
|
- `PROJECT_COMPLETION_TRACKER.md` 同步 latest completed batch、SDK/API surface 与 release gate wrapper 状态;
|
||||||
|
- 未新增控制按钮;
|
||||||
|
- 未执行 action-plan;
|
||||||
|
- 未解析 G-code;
|
||||||
|
- 未解释 canonical events;
|
||||||
|
- 未新增 JS CNC 语义;
|
||||||
|
- 未运行 opt-in runtime probes;
|
||||||
|
- 未 promotion blocked runtime family;
|
||||||
|
- 未改变 LinuxCNC interpreter、tool、parameter、planner、kinematics、remap 或 LinuxCNC-owned
|
||||||
|
runtime semantics。
|
||||||
|
|
||||||
|
验证已通过:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
wasm-port/tests/sdk/node/verify_sdk_surface.sh
|
||||||
|
wasm-port/tests/host/verify_project_release_readiness_artifact.sh
|
||||||
|
wasm-port/tests/docs/node/verify_project_release_handoff_docs.sh
|
||||||
|
wasm-port/tools/verify_vendor_sync.sh
|
||||||
|
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
|
||||||
|
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
|
||||||
|
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
|
||||||
|
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
|
||||||
|
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
|
||||||
|
wasm-port/tests/host/verify_project_release_gate.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
关键输出:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sdk_surface_node_smoke=ok
|
||||||
|
project_release_readiness_artifact_node_smoke=ok
|
||||||
|
project_release_handoff_docs_node_smoke=ok
|
||||||
|
vendor sync up to date
|
||||||
|
standalone CNC semantics guard complete
|
||||||
|
interp_wasm_node_smoke=ok
|
||||||
|
sim_configs_wasm_node_inventory_unexpected_fail=0
|
||||||
|
ui_node_smokes=ok
|
||||||
|
browser_ini_shell_integration_workflow_smoke=ok
|
||||||
|
project_release_readiness_artifact=/home/cnc/桌面/cnc_wams/wasm-port/build/project-release-readiness.json
|
||||||
|
host_wasm_opfs_browser_smokes=ok
|
||||||
|
project_release_gate=ok
|
||||||
|
```
|
||||||
|
|
||||||
|
下一步工作计划:
|
||||||
|
|
||||||
|
继续只做实质能力推进。优先选择真实 browser/UI workflow 或外部 shell 可消费能力;
|
||||||
|
如果继续 release 路径,必须继续产出可调用 API、可验证 workflow、可执行 gate 或可消费 artifact。
|
||||||
|
|||||||
@@ -41,7 +41,9 @@ continuation records are in `../text14.txt`.
|
|||||||
evidence driven and only reports `ready: true` when the caller supplies
|
evidence driven and only reports `ready: true` when the caller supplies
|
||||||
release gate evidence such as `project_release_gate=ok`. The project release
|
release gate evidence such as `project_release_gate=ok`. The project release
|
||||||
gate writes the same report to `build/project-release-readiness.json` and
|
gate writes the same report to `build/project-release-readiness.json` and
|
||||||
validates it with `verify_project_release_readiness_artifact.sh`.
|
validates it with `verify_project_release_readiness_artifact.sh`. External
|
||||||
|
tools can load that artifact with `parseProjectReleaseReadinessArtifactJson()`
|
||||||
|
and validate it with `createProjectReleaseReadinessArtifactValidation()`.
|
||||||
- OPFS/session callers can use `createMachineSessionPersistenceSummary()` or
|
- OPFS/session callers can use `createMachineSessionPersistenceSummary()` or
|
||||||
`linuxCncIniPanelApi.getMachineSessionPersistenceSummary()` to inspect
|
`linuxCncIniPanelApi.getMachineSessionPersistenceSummary()` to inspect
|
||||||
machine files, session snapshot, session readiness, session load, readonly
|
machine files, session snapshot, session readiness, session load, readonly
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ import {
|
|||||||
createMachineSessionPersistenceRenderState,
|
createMachineSessionPersistenceRenderState,
|
||||||
createMachineSessionPersistenceSummary,
|
createMachineSessionPersistenceSummary,
|
||||||
createMachineSessionSnapshotPayload,
|
createMachineSessionSnapshotPayload,
|
||||||
|
createProjectReleaseReadinessArtifactValidation,
|
||||||
createProjectReleaseReadinessReport,
|
createProjectReleaseReadinessReport,
|
||||||
createSessionSnapshot,
|
createSessionSnapshot,
|
||||||
defaultMachinePaths,
|
defaultMachinePaths,
|
||||||
@@ -69,6 +70,7 @@ import {
|
|||||||
mountIniPanelShellWorkflowOverviewEmbeddingMountState,
|
mountIniPanelShellWorkflowOverviewEmbeddingMountState,
|
||||||
normalizeOpfsPath,
|
normalizeOpfsPath,
|
||||||
parameterFilePath,
|
parameterFilePath,
|
||||||
|
parseProjectReleaseReadinessArtifactJson,
|
||||||
planIniFileContextStaging,
|
planIniFileContextStaging,
|
||||||
planSimConfigStaging,
|
planSimConfigStaging,
|
||||||
readMachineSessionReadiness,
|
readMachineSessionReadiness,
|
||||||
@@ -194,7 +196,10 @@ and `../PROJECT_COMPLETION_TRACKER.md`.
|
|||||||
The executable release gate uses the same helper to write
|
The executable release gate uses the same helper to write
|
||||||
`build/project-release-readiness.json` after all project checks pass, then
|
`build/project-release-readiness.json` after all project checks pass, then
|
||||||
validates that artifact with
|
validates that artifact with
|
||||||
`tests/host/verify_project_release_readiness_artifact.sh`.
|
`tests/host/verify_project_release_readiness_artifact.sh`. External tools can
|
||||||
|
load that JSON with `parseProjectReleaseReadinessArtifactJson()` and validate
|
||||||
|
it with `createProjectReleaseReadinessArtifactValidation()` without copying the
|
||||||
|
host test assertions.
|
||||||
|
|
||||||
## OPFS/session persistence exports
|
## OPFS/session persistence exports
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
export { createLinuxCncIniSdk } from "./linuxcnc-ini.js";
|
export { createLinuxCncIniSdk } from "./linuxcnc-ini.js";
|
||||||
export { createLinuxCncInterpSdk } from "./linuxcnc-interp.js";
|
export { createLinuxCncInterpSdk } from "./linuxcnc-interp.js";
|
||||||
export { createProjectReleaseReadinessReport } from "./project-release-readiness.js";
|
export {
|
||||||
|
createProjectReleaseReadinessArtifactValidation,
|
||||||
|
createProjectReleaseReadinessReport,
|
||||||
|
parseProjectReleaseReadinessArtifactJson,
|
||||||
|
} from "./project-release-readiness.js";
|
||||||
export {
|
export {
|
||||||
analyzeIniRuntimeBoundaries,
|
analyzeIniRuntimeBoundaries,
|
||||||
planIniFileContextStaging,
|
planIniFileContextStaging,
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ const BLOCKED_RUNTIME_FAMILIES = [
|
|||||||
"L4-PYTHON-REMAP",
|
"L4-PYTHON-REMAP",
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const PROJECT_RELEASE_READINESS_ARTIFACT_API = "project-release-readiness-report";
|
||||||
|
const PROJECT_RELEASE_READINESS_ARTIFACT_VERSION = 1;
|
||||||
|
|
||||||
function outputContains(observedOutputs, expectedOutput) {
|
function outputContains(observedOutputs, expectedOutput) {
|
||||||
return observedOutputs.some((output) => String(output).includes(expectedOutput));
|
return observedOutputs.some((output) => String(output).includes(expectedOutput));
|
||||||
}
|
}
|
||||||
@@ -81,6 +84,14 @@ function readGatePassed({ gate, gateResults, observedOutputs }) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function objectOrEmpty(value) {
|
||||||
|
return value && typeof value === "object" ? value : {};
|
||||||
|
}
|
||||||
|
|
||||||
|
function arrayOrEmpty(value) {
|
||||||
|
return Array.isArray(value) ? value : [];
|
||||||
|
}
|
||||||
|
|
||||||
export function createProjectReleaseReadinessReport({
|
export function createProjectReleaseReadinessReport({
|
||||||
gateResults = {},
|
gateResults = {},
|
||||||
observedOutputs = [],
|
observedOutputs = [],
|
||||||
@@ -118,8 +129,8 @@ export function createProjectReleaseReadinessReport({
|
|||||||
];
|
];
|
||||||
|
|
||||||
return {
|
return {
|
||||||
apiName: "project-release-readiness-report",
|
apiName: PROJECT_RELEASE_READINESS_ARTIFACT_API,
|
||||||
reportVersion: 1,
|
reportVersion: PROJECT_RELEASE_READINESS_ARTIFACT_VERSION,
|
||||||
phase: ready ? "ready" : "waiting",
|
phase: ready ? "ready" : "waiting",
|
||||||
ready,
|
ready,
|
||||||
missing,
|
missing,
|
||||||
@@ -152,3 +163,69 @@ export function createProjectReleaseReadinessReport({
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function parseProjectReleaseReadinessArtifactJson(text) {
|
||||||
|
return JSON.parse(String(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createProjectReleaseReadinessArtifactValidation(artifact = {}) {
|
||||||
|
const artifactObject = objectOrEmpty(artifact);
|
||||||
|
const releaseGate = objectOrEmpty(artifactObject.releaseGate);
|
||||||
|
const simConfigInventory = objectOrEmpty(artifactObject.simConfigInventory);
|
||||||
|
const gates = arrayOrEmpty(artifactObject.gates);
|
||||||
|
const rows = arrayOrEmpty(artifactObject.rows);
|
||||||
|
const gateCountReady = gates.length === REQUIRED_RELEASE_GATES.length;
|
||||||
|
const gatesPassed = gateCountReady && gates.every(({ passed }) => passed === true);
|
||||||
|
const missing = [
|
||||||
|
...(artifactObject.apiName === PROJECT_RELEASE_READINESS_ARTIFACT_API ? [] : ["apiName"]),
|
||||||
|
...(artifactObject.reportVersion === PROJECT_RELEASE_READINESS_ARTIFACT_VERSION ? [] : ["reportVersion"]),
|
||||||
|
...(artifactObject.phase === "ready" ? [] : ["phase"]),
|
||||||
|
...(artifactObject.ready === true ? [] : ["ready"]),
|
||||||
|
...(Array.isArray(artifactObject.missing) && artifactObject.missing.length === 0 ? [] : ["missing"]),
|
||||||
|
...(releaseGate.command === "wasm-port/tests/host/verify_project_release_gate.sh" ? [] : ["releaseGate.command"]),
|
||||||
|
...(releaseGate.passed === true ? [] : ["releaseGate.passed"]),
|
||||||
|
...(releaseGate.expectedOutput === "project_release_gate=ok" ? [] : ["releaseGate.expectedOutput"]),
|
||||||
|
...(simConfigInventory.executed === 28 ? [] : ["simConfigInventory.executed"]),
|
||||||
|
...(simConfigInventory.passed === 28 ? [] : ["simConfigInventory.passed"]),
|
||||||
|
...(simConfigInventory.skipped === 131 ? [] : ["simConfigInventory.skipped"]),
|
||||||
|
...(simConfigInventory.unexpectedFail === 0 ? [] : ["simConfigInventory.unexpectedFail"]),
|
||||||
|
...(arrayOrEmpty(artifactObject.blockedRuntimeFamilies).join(",") === BLOCKED_RUNTIME_FAMILIES.join(",")
|
||||||
|
? []
|
||||||
|
: ["blockedRuntimeFamilies"]),
|
||||||
|
...(arrayOrEmpty(artifactObject.promotedBlockedFamilies).length === 0 ? [] : ["promotedBlockedFamilies"]),
|
||||||
|
...(gateCountReady ? [] : ["gates.length"]),
|
||||||
|
...(gatesPassed ? [] : ["gates.passed"]),
|
||||||
|
...(rows.find(({ id, value }) => id === "project-release-gate" && value === "passed")
|
||||||
|
? []
|
||||||
|
: ["rows.project-release-gate"]),
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
apiName: "project-release-readiness-artifact-validation",
|
||||||
|
validationVersion: 1,
|
||||||
|
phase: missing.length === 0 ? "ready" : "blocked",
|
||||||
|
ready: missing.length === 0,
|
||||||
|
missing,
|
||||||
|
artifactApiName: artifactObject.apiName ?? null,
|
||||||
|
artifactVersion: artifactObject.reportVersion ?? null,
|
||||||
|
gateCount: gates.length,
|
||||||
|
blockedRuntimeFamilies: arrayOrEmpty(artifactObject.blockedRuntimeFamilies),
|
||||||
|
rows: [
|
||||||
|
{
|
||||||
|
id: "artifact",
|
||||||
|
label: "Readiness artifact",
|
||||||
|
value: artifactObject.apiName ?? "missing",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "project-release-gate",
|
||||||
|
label: "Project release gate",
|
||||||
|
value: releaseGate.passed === true ? "passed" : "missing",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "validation",
|
||||||
|
label: "Artifact validation",
|
||||||
|
value: missing.length === 0 ? "ready" : missing.join(", "),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ for (const phrase of [
|
|||||||
"PROJECT_COMPLETION_TRACKER.md",
|
"PROJECT_COMPLETION_TRACKER.md",
|
||||||
"runtime/sdk/src/index.js",
|
"runtime/sdk/src/index.js",
|
||||||
"createProjectReleaseReadinessReport()",
|
"createProjectReleaseReadinessReport()",
|
||||||
|
"parseProjectReleaseReadinessArtifactJson()",
|
||||||
|
"createProjectReleaseReadinessArtifactValidation()",
|
||||||
"createIniPanelShellApiSurfaceInventory()",
|
"createIniPanelShellApiSurfaceInventory()",
|
||||||
"createIniPanelShellSessionReadinessWorkflowReport()",
|
"createIniPanelShellSessionReadinessWorkflowReport()",
|
||||||
"workflow overview embedding mount DOM",
|
"workflow overview embedding mount DOM",
|
||||||
@@ -89,6 +91,8 @@ for (const phrase of [
|
|||||||
"OPFS/session persistence exports",
|
"OPFS/session persistence exports",
|
||||||
"Project release readiness export",
|
"Project release readiness export",
|
||||||
"createProjectReleaseReadinessReport()",
|
"createProjectReleaseReadinessReport()",
|
||||||
|
"parseProjectReleaseReadinessArtifactJson()",
|
||||||
|
"createProjectReleaseReadinessArtifactValidation()",
|
||||||
"build/project-release-readiness.json",
|
"build/project-release-readiness.json",
|
||||||
"INI panel shell handoff exports",
|
"INI panel shell handoff exports",
|
||||||
"createIniPanelShellApiSurfaceInventory()",
|
"createIniPanelShellApiSurfaceInventory()",
|
||||||
|
|||||||
@@ -3,33 +3,23 @@ import { readFileSync } from "node:fs";
|
|||||||
import { dirname, resolve } from "node:path";
|
import { dirname, resolve } from "node:path";
|
||||||
import { fileURLToPath } from "node:url";
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
import {
|
||||||
|
createProjectReleaseReadinessArtifactValidation,
|
||||||
|
parseProjectReleaseReadinessArtifactJson,
|
||||||
|
} from "../../runtime/sdk/src/index.js";
|
||||||
|
|
||||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||||
const root = resolve(__dirname, "../..");
|
const root = resolve(__dirname, "../..");
|
||||||
const artifactPath = process.argv[2] ?? resolve(root, "build/project-release-readiness.json");
|
const artifactPath = process.argv[2] ?? resolve(root, "build/project-release-readiness.json");
|
||||||
const artifact = JSON.parse(readFileSync(artifactPath, "utf8"));
|
const artifact = parseProjectReleaseReadinessArtifactJson(readFileSync(artifactPath, "utf8"));
|
||||||
|
const validation = createProjectReleaseReadinessArtifactValidation(artifact);
|
||||||
|
|
||||||
assert.equal(artifact.apiName, "project-release-readiness-report");
|
assert.equal(validation.apiName, "project-release-readiness-artifact-validation");
|
||||||
assert.equal(artifact.reportVersion, 1);
|
assert.equal(validation.ready, true);
|
||||||
assert.equal(artifact.phase, "ready");
|
assert.equal(validation.phase, "ready");
|
||||||
assert.equal(artifact.ready, true);
|
assert.deepEqual(validation.missing, []);
|
||||||
assert.deepEqual(artifact.missing, []);
|
assert.equal(validation.artifactApiName, "project-release-readiness-report");
|
||||||
assert.equal(artifact.releaseGate.command, "wasm-port/tests/host/verify_project_release_gate.sh");
|
assert.equal(validation.artifactVersion, 1);
|
||||||
assert.equal(artifact.releaseGate.passed, true);
|
assert.equal(validation.gateCount, 9);
|
||||||
assert.equal(artifact.releaseGate.expectedOutput, "project_release_gate=ok");
|
|
||||||
assert.equal(artifact.simConfigInventory.executed, 28);
|
|
||||||
assert.equal(artifact.simConfigInventory.passed, 28);
|
|
||||||
assert.equal(artifact.simConfigInventory.skipped, 131);
|
|
||||||
assert.equal(artifact.simConfigInventory.unexpectedFail, 0);
|
|
||||||
assert.deepEqual(artifact.blockedRuntimeFamilies, [
|
|
||||||
"L4-USER-M-PROCESS",
|
|
||||||
"L4-TOOL-DB",
|
|
||||||
"L4-PYTHON-REMAP",
|
|
||||||
]);
|
|
||||||
assert.deepEqual(artifact.promotedBlockedFamilies, []);
|
|
||||||
assert.equal(artifact.gates.every(({ passed }) => passed === true), true);
|
|
||||||
assert.equal(
|
|
||||||
artifact.rows.find(({ id }) => id === "project-release-gate")?.value,
|
|
||||||
"passed",
|
|
||||||
);
|
|
||||||
|
|
||||||
console.log("project_release_readiness_artifact_node_smoke=ok");
|
console.log("project_release_readiness_artifact_node_smoke=ok");
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ import {
|
|||||||
createMachineSessionPersistenceDisplayViewModel,
|
createMachineSessionPersistenceDisplayViewModel,
|
||||||
createMachineSessionPersistenceRenderState,
|
createMachineSessionPersistenceRenderState,
|
||||||
createMachineSessionPersistenceSummary,
|
createMachineSessionPersistenceSummary,
|
||||||
|
createProjectReleaseReadinessArtifactValidation,
|
||||||
createProjectReleaseReadinessReport,
|
createProjectReleaseReadinessReport,
|
||||||
|
parseProjectReleaseReadinessArtifactJson,
|
||||||
createSessionSnapshot,
|
createSessionSnapshot,
|
||||||
defaultMachinePaths,
|
defaultMachinePaths,
|
||||||
gcodeFilenameFromProgramPath,
|
gcodeFilenameFromProgramPath,
|
||||||
@@ -73,7 +75,9 @@ const trackerText = readFileSync(resolve(root, "../PROJECT_COMPLETION_TRACKER.md
|
|||||||
const requiredExports = [
|
const requiredExports = [
|
||||||
["createLinuxCncIniSdk", createLinuxCncIniSdk],
|
["createLinuxCncIniSdk", createLinuxCncIniSdk],
|
||||||
["createLinuxCncInterpSdk", createLinuxCncInterpSdk],
|
["createLinuxCncInterpSdk", createLinuxCncInterpSdk],
|
||||||
|
["createProjectReleaseReadinessArtifactValidation", createProjectReleaseReadinessArtifactValidation],
|
||||||
["createProjectReleaseReadinessReport", createProjectReleaseReadinessReport],
|
["createProjectReleaseReadinessReport", createProjectReleaseReadinessReport],
|
||||||
|
["parseProjectReleaseReadinessArtifactJson", parseProjectReleaseReadinessArtifactJson],
|
||||||
["planIniFileContextStaging", planIniFileContextStaging],
|
["planIniFileContextStaging", planIniFileContextStaging],
|
||||||
["planSimConfigStaging", planSimConfigStaging],
|
["planSimConfigStaging", planSimConfigStaging],
|
||||||
["analyzeIniRuntimeBoundaries", analyzeIniRuntimeBoundaries],
|
["analyzeIniRuntimeBoundaries", analyzeIniRuntimeBoundaries],
|
||||||
@@ -170,6 +174,73 @@ const releaseReadinessReady = createProjectReleaseReadinessReport({
|
|||||||
});
|
});
|
||||||
assert.equal(releaseReadinessReady.ready, true);
|
assert.equal(releaseReadinessReady.ready, true);
|
||||||
assert.equal(releaseReadinessReady.releaseGate.passed, true);
|
assert.equal(releaseReadinessReady.releaseGate.passed, true);
|
||||||
|
const releaseReadinessArtifact = parseProjectReleaseReadinessArtifactJson(JSON.stringify(createProjectReleaseReadinessReport({
|
||||||
|
gateResults: {
|
||||||
|
"diff-check": true,
|
||||||
|
"vendor-sync": true,
|
||||||
|
"standalone-cnc-semantics": true,
|
||||||
|
"interp-wasm": true,
|
||||||
|
"sim-config-inventory": true,
|
||||||
|
"ini-panel-browser": true,
|
||||||
|
"ui-node-smokes": true,
|
||||||
|
"host-smokes": true,
|
||||||
|
"project-release-gate": true,
|
||||||
|
},
|
||||||
|
})));
|
||||||
|
assert.equal(releaseReadinessArtifact.apiName, "project-release-readiness-report");
|
||||||
|
assert.deepEqual(createProjectReleaseReadinessArtifactValidation(releaseReadinessArtifact), {
|
||||||
|
apiName: "project-release-readiness-artifact-validation",
|
||||||
|
validationVersion: 1,
|
||||||
|
phase: "ready",
|
||||||
|
ready: true,
|
||||||
|
missing: [],
|
||||||
|
artifactApiName: "project-release-readiness-report",
|
||||||
|
artifactVersion: 1,
|
||||||
|
gateCount: 9,
|
||||||
|
blockedRuntimeFamilies: [
|
||||||
|
"L4-USER-M-PROCESS",
|
||||||
|
"L4-TOOL-DB",
|
||||||
|
"L4-PYTHON-REMAP",
|
||||||
|
],
|
||||||
|
rows: [
|
||||||
|
{
|
||||||
|
id: "artifact",
|
||||||
|
label: "Readiness artifact",
|
||||||
|
value: "project-release-readiness-report",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "project-release-gate",
|
||||||
|
label: "Project release gate",
|
||||||
|
value: "passed",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "validation",
|
||||||
|
label: "Artifact validation",
|
||||||
|
value: "ready",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
assert.deepEqual(
|
||||||
|
createProjectReleaseReadinessArtifactValidation({}).missing,
|
||||||
|
[
|
||||||
|
"apiName",
|
||||||
|
"reportVersion",
|
||||||
|
"phase",
|
||||||
|
"ready",
|
||||||
|
"missing",
|
||||||
|
"releaseGate.command",
|
||||||
|
"releaseGate.passed",
|
||||||
|
"releaseGate.expectedOutput",
|
||||||
|
"simConfigInventory.executed",
|
||||||
|
"simConfigInventory.passed",
|
||||||
|
"simConfigInventory.skipped",
|
||||||
|
"simConfigInventory.unexpectedFail",
|
||||||
|
"blockedRuntimeFamilies",
|
||||||
|
"gates.length",
|
||||||
|
"gates.passed",
|
||||||
|
"rows.project-release-gate",
|
||||||
|
],
|
||||||
|
);
|
||||||
assert.equal(
|
assert.equal(
|
||||||
createProjectReleaseReadinessReport({
|
createProjectReleaseReadinessReport({
|
||||||
observedOutputs: ["project_release_gate=ok"],
|
observedOutputs: ["project_release_gate=ok"],
|
||||||
|
|||||||
Reference in New Issue
Block a user