新增 release artifact URL workflow summary view model

This commit is contained in:
2026-06-16 11:44:11 +08:00
parent 4970d156c1
commit e00c7b038b
18 changed files with 225 additions and 6 deletions

View File

@@ -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: workflow overview release artifact URL workflow validation summary - Latest completed batch: workflow overview release artifact URL workflow summary view-model API
- 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

View File

@@ -3308,6 +3308,73 @@ ui_node_smokes=ok
继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow 继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow
不要做只整理断言或局部常量化的批次。 不要做只整理断言或局部常量化的批次。
五十、2026-06-16 继续执行记录workflow overview release artifact URL workflow summary view-model API
本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进,
把 release readiness artifact URL workflow 封装成外部 browser shell 可直接展示的 summary view-model。
外部调用方现在可以在 URL fetch/validate/render/mount workflow 之后读取一个稳定 statusLine 和 rows
不用自行解释 artifact URL、HTTP status、validation summary、render-state、mount-result 或 missing reasons。
完成内容:
- `runtime/ui/ini-panel/ui-shell.js` 新增:
- `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
- 新 summary view-model 返回:
- `apiName: ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow-summary-view-model`
- `viewModelVersion: 1`
- `phase/ready`
- `title/statusText/detailText/statusLine`
- rows`artifact-url`、`http-status`、`validation-summary`、`render-state`、`mount-result`、`missing`
- `createIniPanelShellWorkflowOverviewContract().methodNames` 新增:
- `getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel`
- `createIniPanelLaunchApiManifest().methods` 新增同名 discovery method
- `createIniPanelShellViewModel()` 暴露:
- `createWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel`
- `workflow-overview.html` 暴露:
- `window.linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
- `launch.html` 暴露:
- `window.linuxCncIniPanelLaunchApi.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
- `runtime/sdk/src/index.js` re-export 新 UI helper
- UI Node smoke、launch manifest smoke、shell integration manifest smoke、entry docs smoke、SDK surface smoke 覆盖新 helper/API
- Browser smoke 覆盖 workflow overview iframe、launch API 和 standalone release artifact URL workflow summary
- `docs/panel-entry.md`、`runtime/sdk/README.md`、`docs/project-release-handoff.md`、`verify_project_release_handoff_docs.mjs`
记录 URL workflow summary view-model API
- `PROJECT_COMPLETION_TRACKER.md` 同步 latest completed batch
- 未新增控制按钮;
- 未在 browser/API 中执行 release gate 或 shell command
- 未解析 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。
验证已通过(先行 targeted
```bash
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
wasm-port/tests/sdk/node/verify_sdk_surface.sh
wasm-port/tests/docs/node/verify_project_release_handoff_docs.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_release_artifact_url_workflow_browser.sh
```
关键输出:
```text
ui_node_smokes=ok
sdk_surface_node_smoke=ok
project_release_handoff_docs_node_smoke=ok
browser_ini_shell_integration_workflow_smoke=ok
browser_release_artifact_url_workflow_smoke=ok
```
下一步工作计划:
继续只做实质能力推进。优先选择可执行 gate、SDK/API surface、或真实 browser workflow
不要做只整理断言或局部常量化的批次。
四十九、2026-06-16 继续执行记录workflow overview release artifact URL workflow validation summary 四十九、2026-06-16 继续执行记录workflow overview release artifact URL workflow validation summary
本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进, 本轮继续按“每批必须产出可调用 API、可验证 workflow、可执行 gate、或真实 UI/browser 能力”推进,

View File

@@ -169,6 +169,10 @@ when the shell should fetch the artifact JSON URL, validate it, and optionally
mount the render-state into caller-owned DOM without executing gates. The URL mount the render-state into caller-owned DOM without executing gates. The URL
workflow result includes `validationSummaryViewModel` so callers can show workflow result includes `validationSummaryViewModel` so callers can show
stable validation status and rows from the same fetch. stable validation status and rows from the same fetch.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
when the shell needs one stable status line and dashboard rows for the whole
artifact URL fetch/validate/render/mount workflow.
Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` or Use `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` or
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()` `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`
when the shell needs stable artifact validation status text and dashboard rows when the shell needs stable artifact validation status text and dashboard rows

View File

@@ -62,7 +62,10 @@ continuation records are in `../text14.txt`.
can also call can also call
`linuxCncIniPanelWorkflowOverviewApi.loadWorkflowOverviewReleaseReadinessArtifactUrl()` `linuxCncIniPanelWorkflowOverviewApi.loadWorkflowOverviewReleaseReadinessArtifactUrl()`
to fetch the artifact URL, validate it, and optionally mount the resulting to fetch the artifact URL, validate it, and optionally mount the resulting
read-only render state. When the outer shell needs DOM output, the workflow read-only render state. That URL workflow includes a validation summary
view-model and can be summarized with
`getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`.
When the outer shell needs DOM output, the workflow
overview iframe also exposes overview iframe also exposes
display, render-state, DOM readiness, renderer, and mount helpers for the display, render-state, DOM readiness, renderer, and mount helpers for the
same release readiness artifact validation. same release readiness artifact validation.

View File

@@ -45,6 +45,7 @@ import {
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createLinuxCncIniSdk, createLinuxCncIniSdk,
createLinuxCncInterpSdk, createLinuxCncInterpSdk,
@@ -301,6 +302,8 @@ for external browser shells:
browser or shell should fetch the artifact JSON URL, validate it, and browser or shell should fetch the artifact JSON URL, validate it, and
optionally mount the resulting render-state into caller-owned DOM. The URL optionally mount the resulting render-state into caller-owned DOM. The URL
workflow result includes `validationSummaryViewModel` for dashboards. workflow result includes `validationSummaryViewModel` for dashboards.
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()`
turns the full URL workflow result into stable status text and rows.
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState()`,
`createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`, `createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel()`,

View File

@@ -103,6 +103,7 @@ export {
createIniPanelShellWorkflowOverviewEmbeddingRenderState, createIniPanelShellWorkflowOverviewEmbeddingRenderState,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness,

View File

@@ -300,6 +300,9 @@
loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => ( loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => (
shellViewModel.loadWorkflowOverviewReleaseReadinessArtifactUrl(options) shellViewModel.loadWorkflowOverviewReleaseReadinessArtifactUrl(options)
), ),
getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel: (workflow) => (
shellViewModel.createWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(workflow)
),
getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => ( getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => (
shellViewModel.createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation) shellViewModel.createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation)
), ),

View File

@@ -197,6 +197,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr
"getWorkflowOverviewReadiness", "getWorkflowOverviewReadiness",
"mountWorkflowOverviewEmbedding", "mountWorkflowOverviewEmbedding",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingReport",
"getWorkflowOverviewEmbeddingDisplayViewModel", "getWorkflowOverviewEmbeddingDisplayViewModel",
@@ -1879,6 +1880,7 @@ export function createIniPanelShellWorkflowOverviewContract() {
"getWorkflowOverviewPersistenceSummary", "getWorkflowOverviewPersistenceSummary",
"validateWorkflowOverviewReleaseReadinessArtifactJson", "validateWorkflowOverviewReleaseReadinessArtifactJson",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
"getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactRenderState",
@@ -2048,6 +2050,61 @@ export async function loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactU
} }
} }
export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
workflow = {},
) {
const missing = Array.isArray(workflow?.missing) ? workflow.missing : [];
const ready = workflow?.ready === true;
const statusText = ready ? "Ready" : "Blocked";
const detailText = ready
? "Artifact URL workflow complete"
: (missing.length > 0 ? missing.join(", ") : workflow?.error ?? "artifact URL workflow blocked");
return {
apiName: "ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow-summary-view-model",
viewModelVersion: 1,
phase: ready ? "ready" : "blocked",
ready,
title: "Release artifact URL workflow",
statusText,
detailText,
statusLine: `${statusText}: ${detailText}`,
rows: [
{
id: "artifact-url",
label: "Artifact URL",
value: workflow?.artifactUrl || "missing",
},
{
id: "http-status",
label: "HTTP status",
value: workflow?.httpStatus == null ? "none" : String(workflow.httpStatus),
},
{
id: "validation-summary",
label: "Validation summary",
value: workflow?.validationSummaryViewModel?.statusLine ?? "missing",
},
{
id: "render-state",
label: "Render state",
value: workflow?.renderState?.statusLine ?? "missing",
},
{
id: "mount-result",
label: "Mount result",
value: workflow?.mountResult
? (workflow.mountResult.ready ? "ready" : workflow.mountResult.statusLine)
: "not requested",
},
{
id: "missing",
label: "Missing workflow evidence",
value: missing.length > 0 ? missing.join(", ") : "none",
},
],
};
}
export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( export function createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(
validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}"), validation = validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson("{}"),
) { ) {
@@ -3292,6 +3349,8 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness, createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness,
createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: createWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel:
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel:
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
loadWorkflowOverviewReleaseReadinessArtifactUrl: loadWorkflowOverviewReleaseReadinessArtifactUrl:
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding, mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding,

View File

@@ -107,6 +107,7 @@
mountIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState,
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson,
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
@@ -148,6 +149,9 @@
loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => ( loadWorkflowOverviewReleaseReadinessArtifactUrl: (options) => (
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl(options) loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl(options)
), ),
getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel: (workflow) => (
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(workflow)
),
getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => ( getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: (validation) => (
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation) createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel(validation)
), ),

View File

@@ -116,6 +116,7 @@ TOOL_TABLE = browser-shell-tool.tbl
!launchApi?.getWorkflowOverviewReadiness || !launchApi?.getWorkflowOverviewReadiness ||
!launchApi?.mountWorkflowOverviewEmbedding || !launchApi?.mountWorkflowOverviewEmbedding ||
!launchApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl || !launchApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl ||
!launchApi?.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel ||
!launchApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel || !launchApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel ||
!launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.getWorkflowOverviewEmbeddingReport ||
!launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel || !launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel ||
@@ -372,6 +373,14 @@ TOOL_TABLE = browser-shell-tool.tbl
.loadWorkflowOverviewReleaseReadinessArtifactUrl({ .loadWorkflowOverviewReleaseReadinessArtifactUrl({
artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json", artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json",
}); });
const workflowOverviewReleaseArtifactUrlWorkflowSummary = workflowOverviewApi
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
workflowOverviewReleaseArtifactUrlWorkflow,
);
const launchReleaseArtifactUrlWorkflowSummary = launchApi
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
launchReleaseArtifactUrlWorkflow,
);
const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({ const workflowOverviewEmbedding = launchApi.mountWorkflowOverviewEmbedding({
overviewApi: workflowOverviewApi, overviewApi: workflowOverviewApi,
}); });
@@ -478,6 +487,11 @@ TOOL_TABLE = browser-shell-tool.tbl
"Ready: Artifact evidence complete", "Ready: Artifact evidence complete",
"shell workflow overview release artifact URL workflow summary", "shell workflow overview release artifact URL workflow summary",
); );
assertEqual(
workflowOverviewReleaseArtifactUrlWorkflowSummary.statusLine,
"Ready: Artifact URL workflow complete",
"shell workflow overview release artifact URL workflow summary view model",
);
assertEqual( assertEqual(
workflowOverviewReleaseArtifactUrlWorkflow.mountResult.ready, workflowOverviewReleaseArtifactUrlWorkflow.mountResult.ready,
true, true,
@@ -493,6 +507,11 @@ TOOL_TABLE = browser-shell-tool.tbl
"Ready: Artifact evidence complete", "Ready: Artifact evidence complete",
"launch release artifact URL workflow summary", "launch release artifact URL workflow summary",
); );
assertEqual(
launchReleaseArtifactUrlWorkflowSummary.statusLine,
workflowOverviewReleaseArtifactUrlWorkflowSummary.statusLine,
"launch release artifact URL workflow summary view model",
);
assertEqual( assertEqual(
document.querySelector("[data-external-release-artifact-status]").textContent, document.querySelector("[data-external-release-artifact-status]").textContent,
"Ready: No blocking reasons", "Ready: No blocking reasons",

View File

@@ -36,6 +36,7 @@
!workflowApi?.getWorkflowOverviewPersistenceSummary || !workflowApi?.getWorkflowOverviewPersistenceSummary ||
!workflowApi?.validateWorkflowOverviewReleaseReadinessArtifactJson || !workflowApi?.validateWorkflowOverviewReleaseReadinessArtifactJson ||
!workflowApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl || !workflowApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl ||
!workflowApi?.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel ||
!workflowApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel ||
!workflowApi?.getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel ||
!workflowApi?.getWorkflowOverviewReleaseReadinessArtifactRenderState || !workflowApi?.getWorkflowOverviewReleaseReadinessArtifactRenderState ||
@@ -257,6 +258,8 @@
artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json", artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json",
mount: true, mount: true,
}); });
const releaseArtifactUrlWorkflowSummary = workflowApi
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(releaseArtifactUrlWorkflow);
assertEqual(releaseArtifactDomReadinessReady.ready, true, "workflow overview release artifact DOM readiness"); assertEqual(releaseArtifactDomReadinessReady.ready, true, "workflow overview release artifact DOM readiness");
assertEqual(releaseArtifactRenderResult.rendered, true, "workflow overview release artifact render result"); assertEqual(releaseArtifactRenderResult.rendered, true, "workflow overview release artifact render result");
assertEqual(releaseArtifactRenderResult.rowCount, 6, "workflow overview release artifact render row count"); assertEqual(releaseArtifactRenderResult.rowCount, 6, "workflow overview release artifact render row count");
@@ -269,6 +272,11 @@
"Ready: Artifact evidence complete", "Ready: Artifact evidence complete",
"workflow overview release artifact URL workflow summary", "workflow overview release artifact URL workflow summary",
); );
assertEqual(
releaseArtifactUrlWorkflowSummary.statusLine,
"Ready: Artifact URL workflow complete",
"workflow overview release artifact URL workflow summary view model",
);
assertEqual(releaseArtifactUrlWorkflow.mountResult.ready, true, "workflow overview release artifact URL workflow mount"); assertEqual(releaseArtifactUrlWorkflow.mountResult.ready, true, "workflow overview release artifact URL workflow mount");
assertEqual(releaseArtifactStatus.textContent, releaseArtifactRenderState.statusLine, "workflow overview release artifact rendered status"); assertEqual(releaseArtifactStatus.textContent, releaseArtifactRenderState.statusLine, "workflow overview release artifact rendered status");
assertEqual( assertEqual(

View File

@@ -27,7 +27,10 @@
try { try {
const workflowDoc = await loadWorkflowOverviewFrame(); const workflowDoc = await loadWorkflowOverviewFrame();
const workflowApi = workflowDoc.defaultView.linuxCncIniPanelWorkflowOverviewApi; const workflowApi = workflowDoc.defaultView.linuxCncIniPanelWorkflowOverviewApi;
if (!workflowApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl) { if (
!workflowApi?.loadWorkflowOverviewReleaseReadinessArtifactUrl ||
!workflowApi?.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel
) {
throw new Error("workflow overview API did not expose release artifact URL workflow"); throw new Error("workflow overview API did not expose release artifact URL workflow");
} }
@@ -56,6 +59,8 @@
artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json", artifactUrl: "../../tests/fixtures/project-release-readiness-ready.json",
mount: true, mount: true,
}); });
const readyWorkflowSummary = workflowApi
.getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(readyWorkflow);
assertEqual( assertEqual(
readyWorkflow.apiName, readyWorkflow.apiName,
"ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow", "ini-panel-shell-workflow-overview-release-readiness-artifact-url-workflow",
@@ -69,6 +74,11 @@
"Ready: Artifact evidence complete", "Ready: Artifact evidence complete",
"ready workflow validation summary", "ready workflow validation summary",
); );
assertEqual(
readyWorkflowSummary.statusLine,
"Ready: Artifact URL workflow complete",
"ready workflow summary view model",
);
assertEqual(readyWorkflow.renderState.statusLine, "Ready: No blocking reasons", "ready workflow status"); assertEqual(readyWorkflow.renderState.statusLine, "Ready: No blocking reasons", "ready workflow status");
assertEqual(readyWorkflow.mountResult.ready, true, "ready workflow mount readiness"); assertEqual(readyWorkflow.mountResult.ready, true, "ready workflow mount readiness");
assertEqual(readyWorkflow.mountResult.renderResult.rowCount, 6, "ready workflow mount rows"); assertEqual(readyWorkflow.mountResult.renderResult.rowCount, 6, "ready workflow mount rows");

View File

@@ -42,6 +42,7 @@ for (const phrase of [
"embedded gate manifest, result matrix, and action plan", "embedded gate manifest, result matrix, and action plan",
"validateWorkflowOverviewReleaseReadinessArtifactJson()", "validateWorkflowOverviewReleaseReadinessArtifactJson()",
"loadWorkflowOverviewReleaseReadinessArtifactUrl()", "loadWorkflowOverviewReleaseReadinessArtifactUrl()",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel()",
"render-state", "render-state",
"DOM readiness", "DOM readiness",
"createIniPanelShellApiSurfaceInventory()", "createIniPanelShellApiSurfaceInventory()",

View File

@@ -26,6 +26,7 @@ import {
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomContract,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDomReadiness,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createLinuxCncIniSdk, createLinuxCncIniSdk,
createLinuxCncInterpSdk, createLinuxCncInterpSdk,
@@ -166,6 +167,10 @@ const requiredExports = [
"createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness", "createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness",
createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness, createIniPanelShellWorkflowOverviewEmbeddingMountDomReadiness,
], ],
[
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
],
[ [
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
@@ -365,6 +370,12 @@ assert.equal(
releaseReadinessArtifactUrlWorkflow.validationSummaryViewModel.statusLine, releaseReadinessArtifactUrlWorkflow.validationSummaryViewModel.statusLine,
"Ready: Artifact evidence complete", "Ready: Artifact evidence complete",
); );
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
releaseReadinessArtifactUrlWorkflow,
).statusLine,
"Ready: Artifact URL workflow complete",
);
assert.equal( assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState( createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel( createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel(

View File

@@ -164,6 +164,7 @@ const requiredShellExports = [
"mountIniPanelShellWorkflowOverviewEmbeddingMountState", "mountIniPanelShellWorkflowOverviewEmbeddingMountState",
"validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson", "validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson",
"loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl", "loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
"createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState", "createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState",

View File

@@ -83,6 +83,7 @@ assert.deepEqual(manifest, {
"getWorkflowOverviewReadiness", "getWorkflowOverviewReadiness",
"mountWorkflowOverviewEmbedding", "mountWorkflowOverviewEmbedding",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingReport",
"getWorkflowOverviewEmbeddingDisplayViewModel", "getWorkflowOverviewEmbeddingDisplayViewModel",
@@ -244,6 +245,7 @@ assert.match(launchText, /\bgetWorkflowOverviewContract\b/);
assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/); assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/);
assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/);
assert.match(launchText, /\bloadWorkflowOverviewReleaseReadinessArtifactUrl\b/); assert.match(launchText, /\bloadWorkflowOverviewReleaseReadinessArtifactUrl\b/);
assert.match(launchText, /\bgetWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel\b/);
assert.match(launchText, /\bgetWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDisplayViewModel\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDisplayViewModel\b/);

View File

@@ -53,6 +53,7 @@ import {
mountIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState,
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson,
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
@@ -188,7 +189,7 @@ assert.deepEqual(readiness, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 60, launchMethods: 61,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -251,7 +252,7 @@ assert.deepEqual(handoffSummary, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 60, launchMethods: 61,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -791,6 +792,7 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
"getWorkflowOverviewPersistenceSummary", "getWorkflowOverviewPersistenceSummary",
"validateWorkflowOverviewReleaseReadinessArtifactJson", "validateWorkflowOverviewReleaseReadinessArtifactJson",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
"getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactRenderState",
@@ -837,6 +839,7 @@ assert.equal(typeof renderIniPanelShellWorkflowOverviewEmbeddingMountState, "fun
assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingMountState, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbeddingMountState, "function");
assert.equal(typeof validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, "function"); assert.equal(typeof validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, "function");
assert.equal(typeof loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, "function"); assert.equal(typeof loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, "function");
@@ -852,6 +855,10 @@ assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel().phase, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel().phase,
"blocked", "blocked",
); );
assert.equal(
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel().phase,
"blocked",
);
assert.deepEqual( assert.deepEqual(
createIniPanelShellWorkflowOverviewReadiness({ createIniPanelShellWorkflowOverviewReadiness({
overviewApi: { overviewApi: {
@@ -866,6 +873,7 @@ assert.deepEqual(
"getWorkflowOverviewPersistenceSummary", "getWorkflowOverviewPersistenceSummary",
"validateWorkflowOverviewReleaseReadinessArtifactJson", "validateWorkflowOverviewReleaseReadinessArtifactJson",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
"getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactRenderState",
@@ -1292,7 +1300,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 60, launchMethods: 61,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },

View File

@@ -58,6 +58,7 @@ import {
mountIniPanelShellWorkflowOverviewEmbeddingMountState, mountIniPanelShellWorkflowOverviewEmbeddingMountState,
validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson, validateIniPanelShellWorkflowOverviewReleaseReadinessArtifactJson,
loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactDisplayViewModel,
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState, createIniPanelShellWorkflowOverviewReleaseReadinessArtifactRenderState,
@@ -690,6 +691,7 @@ assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, {
"getWorkflowOverviewPersistenceSummary", "getWorkflowOverviewPersistenceSummary",
"validateWorkflowOverviewReleaseReadinessArtifactJson", "validateWorkflowOverviewReleaseReadinessArtifactJson",
"loadWorkflowOverviewReleaseReadinessArtifactUrl", "loadWorkflowOverviewReleaseReadinessArtifactUrl",
"getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel", "getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel",
"getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel", "getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel",
"getWorkflowOverviewReleaseReadinessArtifactRenderState", "getWorkflowOverviewReleaseReadinessArtifactRenderState",
@@ -1413,6 +1415,18 @@ assert.equal(
assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons"); assert.equal(releaseArtifactUrlWorkflow.renderState.statusLine, "Ready: No blocking reasons");
assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true); assert.equal(releaseArtifactUrlWorkflow.mountResult.ready, true);
assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 6); assert.equal(releaseArtifactUrlWorkflow.mountResult.renderResult.rowCount, 6);
const releaseArtifactUrlWorkflowSummary =
createIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel(
releaseArtifactUrlWorkflow,
);
assert.equal(
releaseArtifactUrlWorkflowSummary.statusLine,
"Ready: Artifact URL workflow complete",
);
assert.equal(
releaseArtifactUrlWorkflowSummary.rows.find(({ id }) => id === "validation-summary")?.value,
"Ready: Artifact evidence complete",
);
const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({ const releaseArtifactUrlWorkflowMissingDom = await loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl({
artifactUrl: "/project-release-readiness.json", artifactUrl: "/project-release-readiness.json",
fetchRef: async () => ({ fetchRef: async () => ({
@@ -1452,6 +1466,7 @@ const workflowOverviewApi = {
getWorkflowOverviewPersistenceSummary: () => shellViewModel.shellPersistenceSummary, getWorkflowOverviewPersistenceSummary: () => shellViewModel.shellPersistenceSummary,
validateWorkflowOverviewReleaseReadinessArtifactJson: () => ({ ready: true }), validateWorkflowOverviewReleaseReadinessArtifactJson: () => ({ ready: true }),
loadWorkflowOverviewReleaseReadinessArtifactUrl: loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl, loadWorkflowOverviewReleaseReadinessArtifactUrl: loadIniPanelShellWorkflowOverviewReleaseReadinessArtifactUrl,
getWorkflowOverviewReleaseReadinessArtifactUrlWorkflowSummaryViewModel: () => releaseArtifactUrlWorkflowSummary,
getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: () => releaseArtifactValidationSummary, getWorkflowOverviewReleaseReadinessArtifactValidationSummaryViewModel: () => releaseArtifactValidationSummary,
getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel: () => releaseArtifactDisplay, getWorkflowOverviewReleaseReadinessArtifactDisplayViewModel: () => releaseArtifactDisplay,
getWorkflowOverviewReleaseReadinessArtifactRenderState: () => releaseArtifactRenderState, getWorkflowOverviewReleaseReadinessArtifactRenderState: () => releaseArtifactRenderState,