Graduate Electron runtime to EveElectron
This commit is contained in:
parent
29515102c0
commit
3baf125b38
26 changed files with 141 additions and 2218 deletions
|
|
@ -82,23 +82,18 @@ try {
|
|||
--expect-command-boundary-coverage aetheria:aetheria.daemon.editor:tui:covered:EveTui:tui `
|
||||
--expect-split-target-proof "EveUnity:Aetheria daemon 3D ARPG world lowers through a generic EveUnity playable-world client" `
|
||||
--expect-runtime-capture-artifact unity-uitoolkit:json-projection:gamecult.eve.unity_uitoolkit_projection.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-artifact electron-shell:json-projection:gamecult.eve.electron_shell_projection.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-probe electron-shell:contract-artifact-missing:png:EveElectron `
|
||||
--expect-runtime-capture-artifact tui:json-grid:gamecult.eve.tui_grid.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-split-handoff-move EveTui:tui:tui-runtime-body:current:exists:eve-tui-shell.mjs `
|
||||
--expect-split-handoff-move EveTui:tui:tui-world-surface-lowering:current:exists:eve-tui-shell.mjs `
|
||||
--expect-split-handoff-move EveTui:tui:tui-command-transport:current:exists:eve-tui-shell.mjs `
|
||||
--expect-split-target-blocker "EveElectron:Electron shell runtime body graduates to EveElectron outside Aetheria product code" `
|
||||
--expect-split-target-proof "EveElectron:Aetheria consumes EveElectron for generic window and preload authority" `
|
||||
--expect-split-target-blocker "EveElectron:Electron packaged window PNG capture artifacts are attached to conformance output" `
|
||||
--expect-split-target-blocker "EveTui:TUI package release is cut from EveTui rather than Eve incubation" `
|
||||
--expect-split-target-blocker "EveTui:TUI capture path is owned by EveTui rather than Eve incubation" `
|
||||
--expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Packages/manifest.json `
|
||||
--expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:GameCult.Eve.UnityUIToolkit.csproj `
|
||||
--expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-shell-runtime:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-command-transport:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-world-surface-lowering:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-shell-runtime:observed-provider:exists:Aetheria.Rts.Web/Electron `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-command-transport:observed-provider:exists:Aetheria.Rts.Web/Client/app.ts `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-world-surface-lowering:observed-provider:exists:Aetheria.Rts.Web/Client `
|
||||
--expect-provider-command aetheria:aetheria.daemon.commands `
|
||||
--expect-provider-receipt-state aetheria:accepted `
|
||||
--expect-provider-receipt-state aetheria:pending `
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ try {
|
|||
--expect-screenshot-metric electron-shell:aetheria-world:bounding-boxes:pending-capture `
|
||||
--expect-runtime-capture-probe unity-uitoolkit:semantic-artifact-present-capture-pending:png:EveUnity `
|
||||
--expect-runtime-capture-probe unity-scene:control-artifact-present-product-capture-pending:png:EveUnity `
|
||||
--expect-runtime-capture-probe electron-shell:semantic-artifact-present-capture-pending:png:EveElectron `
|
||||
--expect-runtime-capture-probe electron-shell:contract-artifact-missing:png:EveElectron `
|
||||
--expect-runtime-capture-probe tui:contract-artifact-present:json-grid:EveTui `
|
||||
--expect-capability-gap "split-target:EveUnity:EveUnity:proof:Tagged UPM release" `
|
||||
--expect-conformance-handoff
|
||||
|
|
|
|||
|
|
@ -1,99 +0,0 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-electron\eve-runtime-capability.json",
|
||||
[string] $AdvertisementPath = "web\fixtures\aetheria.provider-advertisement.json",
|
||||
[string] $OutputPath = "artifacts\eveelectron-capture-contract\latest\capture-request.json",
|
||||
[string] $Stamp = "smoke"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$absoluteCapabilityPath = if ([System.IO.Path]::IsPathRooted($CapabilityManifestPath)) {
|
||||
$CapabilityManifestPath
|
||||
} else {
|
||||
Join-Path $projectRoot $CapabilityManifestPath
|
||||
}
|
||||
$absoluteAdvertisementPath = if ([System.IO.Path]::IsPathRooted($AdvertisementPath)) {
|
||||
$AdvertisementPath
|
||||
} else {
|
||||
Join-Path $projectRoot $AdvertisementPath
|
||||
}
|
||||
$absoluteOutputPath = if ([System.IO.Path]::IsPathRooted($OutputPath)) {
|
||||
$OutputPath
|
||||
} else {
|
||||
Join-Path $projectRoot $OutputPath
|
||||
}
|
||||
|
||||
foreach ($path in @($absoluteCapabilityPath, $absoluteAdvertisementPath)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveElectron capture contract input not found: $path"
|
||||
}
|
||||
}
|
||||
|
||||
$manifest = Get-Content -LiteralPath $absoluteCapabilityPath -Raw | ConvertFrom-Json
|
||||
$captureContract = $manifest.lifecycle.capture.captureContract
|
||||
if ($null -eq $captureContract) {
|
||||
throw "EveElectron capture contract missing lifecycle.capture.captureContract"
|
||||
}
|
||||
foreach ($field in @("ownerRepo", "runtimeId", "targetId", "requestSchema", "requestBuilder", "advertisementPath", "captureKind", "artifactKind", "artifactPattern", "conformanceAttachment", "requiredProvider", "requiredSurface", "authority", "publishProof")) {
|
||||
if (-not $captureContract.$field) {
|
||||
throw "EveElectron capture contract missing $field"
|
||||
}
|
||||
}
|
||||
if ($captureContract.ownerRepo -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron capture owner: $($captureContract.ownerRepo)"
|
||||
}
|
||||
if ($captureContract.runtimeId -ne "electron-shell") {
|
||||
throw "Unexpected EveElectron capture runtime: $($captureContract.runtimeId)"
|
||||
}
|
||||
if ($captureContract.targetId -ne "electron-shell") {
|
||||
throw "Unexpected EveElectron capture target: $($captureContract.targetId)"
|
||||
}
|
||||
if ($captureContract.requestSchema -ne "gamecult.eve.runtime_capture_request.v1") {
|
||||
throw "Unexpected EveElectron capture request schema: $($captureContract.requestSchema)"
|
||||
}
|
||||
|
||||
$builderPath = Join-Path $projectRoot $captureContract.requestBuilder
|
||||
if (-not (Test-Path -LiteralPath $builderPath)) {
|
||||
throw "EveElectron capture request builder not found: $($captureContract.requestBuilder)"
|
||||
}
|
||||
if ((Join-Path $projectRoot $captureContract.advertisementPath) -ne $absoluteAdvertisementPath) {
|
||||
throw "EveElectron capture advertisement path mismatch: $($captureContract.advertisementPath) vs $AdvertisementPath"
|
||||
}
|
||||
|
||||
node --test (Join-Path $projectRoot "tools\eveelectron\eveelectron-capture-contract.test.mjs")
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron capture contract tests failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
node $builderPath --capability $absoluteCapabilityPath --advertisement $absoluteAdvertisementPath --output $absoluteOutputPath --stamp $Stamp
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron capture request builder failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath $absoluteOutputPath)) {
|
||||
throw "EveElectron capture request was not written: $absoluteOutputPath"
|
||||
}
|
||||
|
||||
$request = Get-Content -LiteralPath $absoluteOutputPath -Raw | ConvertFrom-Json
|
||||
foreach ($expectation in @(
|
||||
@{ field = "schema"; value = "gamecult.eve.runtime_capture_request.v1" },
|
||||
@{ field = "runtimeId"; value = "electron-shell" },
|
||||
@{ field = "ownerRepo"; value = "EveElectron" },
|
||||
@{ field = "providerId"; value = "aetheria" },
|
||||
@{ field = "surfaceId"; value = "aetheria.daemon.game" },
|
||||
@{ field = "targetId"; value = "electron-shell" },
|
||||
@{ field = "commandBoundary"; value = "aetheria.daemon.commands" },
|
||||
@{ field = "receiptSchema"; value = "aetheria.eve_command_acceptance_status.v1" },
|
||||
@{ field = "captureKind"; value = "electron-window-png" },
|
||||
@{ field = "artifactKind"; value = "png" },
|
||||
@{ field = "conformanceAttachment"; value = "runtime.captureArtifacts[]" }
|
||||
)) {
|
||||
if ($request.($expectation.field) -ne $expectation.value) {
|
||||
throw "EveElectron capture request $($expectation.field) expected $($expectation.value) got $($request.($expectation.field))"
|
||||
}
|
||||
}
|
||||
if ($request.artifactPath -ne "artifacts/eveelectron-capture/$Stamp/electron-shell.png") {
|
||||
throw "Unexpected EveElectron capture artifact path: $($request.artifactPath)"
|
||||
}
|
||||
|
||||
Write-Host "EveElectron capture contract smoke passed: $absoluteOutputPath"
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-electron\eve-runtime-capability.json",
|
||||
[string] $AdvertisementPath = "web\fixtures\aetheria.provider-advertisement.json",
|
||||
[string] $SurfacePath = "web\fixtures\aetheria-world-surface.json",
|
||||
[string] $OutputPath = "artifacts\eveelectron-capture\latest\electron-shell-projection.json",
|
||||
[string] $RequestOutputPath = "artifacts\eveelectron-capture\latest\capture-request.json",
|
||||
[string] $Stamp = "latest",
|
||||
[string] $ExpectedProviderId = "aetheria",
|
||||
[string] $ExpectedSurfaceId = "aetheria.daemon.game",
|
||||
[string] $ExpectedCommandBoundary = "aetheria.daemon.commands",
|
||||
[string] $ExpectedReceiptSchema = "aetheria.eve_command_acceptance_status.v1"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
function Resolve-RepoPath([string] $candidate) {
|
||||
if ([System.IO.Path]::IsPathRooted($candidate)) {
|
||||
return $candidate
|
||||
}
|
||||
return Join-Path $projectRoot $candidate
|
||||
}
|
||||
|
||||
$absoluteCapabilityPath = Resolve-RepoPath $CapabilityManifestPath
|
||||
$absoluteAdvertisementPath = Resolve-RepoPath $AdvertisementPath
|
||||
$absoluteSurfacePath = Resolve-RepoPath $SurfacePath
|
||||
$absoluteOutputPath = Resolve-RepoPath $OutputPath
|
||||
$absoluteRequestOutputPath = Resolve-RepoPath $RequestOutputPath
|
||||
|
||||
foreach ($path in @($absoluteCapabilityPath, $absoluteAdvertisementPath, $absoluteSurfacePath)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveElectron capture input not found: $path"
|
||||
}
|
||||
}
|
||||
|
||||
node --test (Join-Path $projectRoot "tools\eveelectron\eveelectron-capture-artifact.test.mjs")
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron capture artifact tests failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
node (Join-Path $projectRoot "tools\eveelectron\eveelectron-capture-artifact.mjs") `
|
||||
--capability $absoluteCapabilityPath `
|
||||
--advertisement $absoluteAdvertisementPath `
|
||||
--surface $absoluteSurfacePath `
|
||||
--output $absoluteOutputPath `
|
||||
--request-output $absoluteRequestOutputPath `
|
||||
--stamp $Stamp
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron capture artifact builder failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
foreach ($path in @($absoluteOutputPath, $absoluteRequestOutputPath)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveElectron capture artifact output missing: $path"
|
||||
}
|
||||
}
|
||||
|
||||
$projection = Get-Content -LiteralPath $absoluteOutputPath -Raw | ConvertFrom-Json
|
||||
foreach ($expectation in @(
|
||||
@{ field = "schema"; value = "gamecult.eve.electron_shell_projection.v1" },
|
||||
@{ field = "runtimeId"; value = "electron-shell" },
|
||||
@{ field = "providerId"; value = $ExpectedProviderId },
|
||||
@{ field = "surfaceId"; value = $ExpectedSurfaceId },
|
||||
@{ field = "commandBoundary"; value = $ExpectedCommandBoundary },
|
||||
@{ field = "receiptSchema"; value = $ExpectedReceiptSchema },
|
||||
@{ field = "artifactKind"; value = "json-projection" },
|
||||
@{ field = "captureKind"; value = "electron-shell-projection-json" }
|
||||
)) {
|
||||
if ($projection.($expectation.field) -ne $expectation.value) {
|
||||
throw "EveElectron projection $($expectation.field) expected $($expectation.value) got $($projection.($expectation.field))"
|
||||
}
|
||||
}
|
||||
if (-not $projection.root.id) {
|
||||
throw "EveElectron projection capture must contain a root shell node"
|
||||
}
|
||||
|
||||
Write-Host "EveElectron capture smoke passed: $absoluteOutputPath"
|
||||
|
|
@ -1,199 +0,0 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-electron\eve-runtime-capability.json"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$absoluteManifestPath = if ([System.IO.Path]::IsPathRooted($CapabilityManifestPath)) {
|
||||
$CapabilityManifestPath
|
||||
} else {
|
||||
Join-Path $projectRoot $CapabilityManifestPath
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $absoluteManifestPath)) {
|
||||
throw "EveElectron runtime capability manifest not found: $absoluteManifestPath"
|
||||
}
|
||||
|
||||
$manifest = Get-Content -LiteralPath $absoluteManifestPath -Raw | ConvertFrom-Json
|
||||
|
||||
if ($manifest.schema -ne "gamecult.eve.runtime_capability.v1") {
|
||||
throw "Unexpected EveElectron manifest schema: $($manifest.schema)"
|
||||
}
|
||||
if ($manifest.runtimeId -ne "electron-shell") {
|
||||
throw "Unexpected EveElectron runtime id: $($manifest.runtimeId)"
|
||||
}
|
||||
if ($manifest.owner -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron owner: $($manifest.owner)"
|
||||
}
|
||||
if ($manifest.incubation.ownerRepo -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron incubation owner: $($manifest.incubation.ownerRepo)"
|
||||
}
|
||||
if ($manifest.incubation.currentHostRepo -ne "Eve") {
|
||||
throw "Unexpected EveElectron current host repo: $($manifest.incubation.currentHostRepo)"
|
||||
}
|
||||
if ($manifest.incubation.splitTarget -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron split target: $($manifest.incubation.splitTarget)"
|
||||
}
|
||||
if (-not $manifest.incubation.splitHandoff.manifestPath) {
|
||||
throw "EveElectron manifest missing split handoff path"
|
||||
}
|
||||
|
||||
foreach ($feature in @("providerAdvertisements", "commandTransport", "surfaceTreeProjection", "embeddedDocuments", "pluginProjection")) {
|
||||
if (-not (@($manifest.supportedFeatures) -contains $feature)) {
|
||||
throw "EveElectron manifest missing provider-shell feature: $feature"
|
||||
}
|
||||
}
|
||||
|
||||
$expectedPlugins = @{
|
||||
"sai.vn" = @("vn.stage", "story.choose", "story.continue", "story.jump")
|
||||
"norn.graph" = @("embed.norn")
|
||||
"tex.math" = @("embed.tex", "tex.inline", "tex.block")
|
||||
}
|
||||
foreach ($pluginId in $expectedPlugins.Keys) {
|
||||
$supported = @($manifest.supportedPlugins) | Where-Object { $_.pluginId -eq $pluginId } | Select-Object -First 1
|
||||
if (-not $supported) {
|
||||
throw "EveElectron manifest missing supported plugin declaration: $pluginId"
|
||||
}
|
||||
foreach ($capability in $expectedPlugins[$pluginId]) {
|
||||
if (-not (@($supported.capabilities) -contains $capability)) {
|
||||
throw "EveElectron supported plugin $pluginId missing capability: $capability"
|
||||
}
|
||||
}
|
||||
if ($supported.projectionAdapter -ne "EveElectronShell.buildPluginProjection") {
|
||||
throw "EveElectron supported plugin $pluginId has unexpected projection adapter: $($supported.projectionAdapter)"
|
||||
}
|
||||
}
|
||||
|
||||
$worldSurfaceLoweringClaims = @()
|
||||
if ($null -ne $manifest.worldSurfaceLowering) {
|
||||
$worldSurfaceLoweringClaims = @($manifest.worldSurfaceLowering)
|
||||
}
|
||||
if ($worldSurfaceLoweringClaims.Count -ne 1) {
|
||||
throw "EveElectron must claim exactly one world-surface lowering target"
|
||||
}
|
||||
$worldSurfaceLoweringClaim = $worldSurfaceLoweringClaims | Where-Object { $_.targetId -eq "electron-shell" } | Select-Object -First 1
|
||||
if (-not $worldSurfaceLoweringClaim) {
|
||||
throw "EveElectron manifest missing electron-shell world-surface lowering claim"
|
||||
}
|
||||
if ($worldSurfaceLoweringClaim.supportLevel -ne "electron-shell-surface-tree-command-surface") {
|
||||
throw "Unexpected EveElectron world-surface support level: $($worldSurfaceLoweringClaim.supportLevel)"
|
||||
}
|
||||
if ($worldSurfaceLoweringClaim.ownership -ne "runtime-lowers-provider-world-surface-without-owning-world-state") {
|
||||
throw "Unexpected EveElectron world-surface ownership: $($worldSurfaceLoweringClaim.ownership)"
|
||||
}
|
||||
foreach ($evidencePath in @($worldSurfaceLoweringClaim.evidencePaths)) {
|
||||
$absoluteEvidencePath = Join-Path $projectRoot $evidencePath
|
||||
if (-not (Test-Path -LiteralPath $absoluteEvidencePath)) {
|
||||
throw "EveElectron world-surface claim missing evidence path: $evidencePath"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($pluginId in $expectedPlugins.Keys) {
|
||||
$unsupported = @($manifest.unsupportedPlugins) | Where-Object { $_.pluginId -eq $pluginId } | Select-Object -First 1
|
||||
if ($unsupported) {
|
||||
throw "EveElectron manifest must not report $pluginId unsupported while the shell projection is declared"
|
||||
}
|
||||
}
|
||||
|
||||
if ($manifest.commandTransport.schema -ne "gamecult.eve.command_invocation.v1") {
|
||||
throw "Unexpected EveElectron command schema: $($manifest.commandTransport.schema)"
|
||||
}
|
||||
if ($manifest.commandTransport.status -ne "provider-shell-contract-skeleton") {
|
||||
throw "Unexpected EveElectron command transport status: $($manifest.commandTransport.status)"
|
||||
}
|
||||
|
||||
foreach ($stage in @("release", "test", "capture")) {
|
||||
$stageDocument = $manifest.lifecycle.$stage
|
||||
if ($null -eq $stageDocument) {
|
||||
throw "EveElectron lifecycle missing stage: $stage"
|
||||
}
|
||||
if ($stageDocument.ownerRepo -ne "EveElectron") {
|
||||
throw "EveElectron lifecycle stage $stage has unexpected owner: $($stageDocument.ownerRepo)"
|
||||
}
|
||||
if (-not $stageDocument.status) {
|
||||
throw "EveElectron lifecycle stage $stage missing status"
|
||||
}
|
||||
foreach ($evidencePath in @($stageDocument.evidencePaths)) {
|
||||
$absoluteEvidencePath = Join-Path $projectRoot $evidencePath
|
||||
if (-not (Test-Path -LiteralPath $absoluteEvidencePath)) {
|
||||
throw "EveElectron lifecycle stage $stage missing evidence path: $evidencePath"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$releaseContract = $manifest.lifecycle.release.releaseContract
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
|
||||
if (-not $releaseContract.$field) {
|
||||
throw "EveElectron release contract missing $field"
|
||||
}
|
||||
}
|
||||
if ($releaseContract.requestSchema -ne "gamecult.eve.runtime_release_request.v1") {
|
||||
throw "EveElectron release contract has unexpected request schema: $($releaseContract.requestSchema)"
|
||||
}
|
||||
foreach ($pathProperty in @("packageRoot", "versionSource")) {
|
||||
$relativePath = $releaseContract.$pathProperty
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron release contract $pathProperty does not exist: $relativePath"
|
||||
}
|
||||
}
|
||||
foreach ($pathProperty in @("requestBuilder")) {
|
||||
$relativePath = $releaseContract.$pathProperty
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron release contract $pathProperty does not exist: $relativePath"
|
||||
}
|
||||
}
|
||||
|
||||
$testContract = $manifest.lifecycle.test.testContract
|
||||
foreach ($field in @("ownerRepo", "runnerKind", "runnerScript", "consumerProject", "packageName", "testAssembly", "testPlatform", "resultsArtifact", "logArtifact", "manifestMutation")) {
|
||||
if (-not $testContract.$field) {
|
||||
throw "EveElectron test contract missing $field"
|
||||
}
|
||||
}
|
||||
foreach ($pathProperty in @("runnerScript", "consumerProject")) {
|
||||
$candidate = $testContract.$pathProperty
|
||||
$absolutePath = if ([System.IO.Path]::IsPathRooted($candidate)) {
|
||||
$candidate
|
||||
} else {
|
||||
Join-Path $projectRoot $candidate
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron test contract $pathProperty does not exist: $candidate"
|
||||
}
|
||||
}
|
||||
|
||||
$captureContract = $manifest.lifecycle.capture.captureContract
|
||||
foreach ($field in @("ownerRepo", "runtimeId", "targetId", "requestSchema", "requestBuilder", "advertisementPath", "captureKind", "artifactKind", "artifactPattern", "conformanceAttachment", "requiredProvider", "requiredSurface", "authority", "publishProof")) {
|
||||
if (-not $captureContract.$field) {
|
||||
throw "EveElectron capture contract missing $field"
|
||||
}
|
||||
}
|
||||
if ($captureContract.runtimeId -ne "electron-shell") {
|
||||
throw "EveElectron capture contract has unexpected runtime: $($captureContract.runtimeId)"
|
||||
}
|
||||
if ($captureContract.targetId -ne "electron-shell") {
|
||||
throw "EveElectron capture contract has unexpected target: $($captureContract.targetId)"
|
||||
}
|
||||
if ($captureContract.requestSchema -ne "gamecult.eve.runtime_capture_request.v1") {
|
||||
throw "EveElectron capture contract has unexpected request schema: $($captureContract.requestSchema)"
|
||||
}
|
||||
if ($captureContract.captureKind -ne "electron-window-png") {
|
||||
throw "EveElectron capture contract has unexpected capture kind: $($captureContract.captureKind)"
|
||||
}
|
||||
foreach ($pathProperty in @("requestBuilder", "advertisementPath")) {
|
||||
$relativePath = $captureContract.$pathProperty
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron capture contract $pathProperty does not exist: $relativePath"
|
||||
}
|
||||
}
|
||||
|
||||
& (Join-Path $projectRoot "scripts\run-eveelectron-split-handoff-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveelectron-release-contract-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveelectron-provider-shell-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveelectron-capture-contract-smoke.ps1")
|
||||
& (Join-Path $projectRoot "scripts\run-eveelectron-capture-smoke.ps1")
|
||||
|
||||
Write-Host "EveElectron lifecycle smoke passed: $absoluteManifestPath"
|
||||
50
scripts/run-eveelectron-owner-smoke.ps1
Normal file
50
scripts/run-eveelectron-owner-smoke.ps1
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
param(
|
||||
[string] $EveElectronRoot = "E:\Projects\EveElectron",
|
||||
[string] $AetheriaRoot = "E:\Projects\Aetheria"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$manifestPath = Join-Path $EveElectronRoot "eve-runtime-capability.json"
|
||||
$packagePath = Join-Path $EveElectronRoot "package.json"
|
||||
$shellPath = Join-Path $EveElectronRoot "src\eve-electron-shell.mjs"
|
||||
$windowPath = Join-Path $EveElectronRoot "src\window-host.mjs"
|
||||
$preloadPath = Join-Path $EveElectronRoot "src\eve-provider-preload.cjs"
|
||||
foreach ($path in @($manifestPath, $packagePath, $shellPath, $windowPath, $preloadPath)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) { throw "EveElectron owner path missing: $path" }
|
||||
}
|
||||
|
||||
$manifest = Get-Content -LiteralPath $manifestPath -Raw | ConvertFrom-Json
|
||||
if ($manifest.schema -ne "gamecult.eve.runtime_capability.v1" -or $manifest.runtimeId -ne "electron-shell" -or $manifest.owner -ne "EveElectron") {
|
||||
throw "EveElectron owner manifest identity is invalid."
|
||||
}
|
||||
foreach ($feature in @("providerAdvertisements", "commandTransport", "surfaceTreeProjection", "securePreloadBridge", "windowLifecycle")) {
|
||||
if (-not (@($manifest.supportedFeatures) -contains $feature)) { throw "EveElectron owner manifest missing feature: $feature" }
|
||||
}
|
||||
|
||||
$main = Get-Content -LiteralPath (Join-Path $AetheriaRoot "Aetheria.Rts.Web\Electron\main.ts") -Raw
|
||||
$preload = Get-Content -LiteralPath (Join-Path $AetheriaRoot "Aetheria.Rts.Web\Electron\preload.cjs") -Raw
|
||||
$renderer = Get-Content -LiteralPath (Join-Path $AetheriaRoot "Aetheria.Rts.Web\Client\app.ts") -Raw
|
||||
foreach ($symbol in @("createEveElectronWindow", "registerEveWindowControls", "@gamecult/eve-electron")) {
|
||||
if (-not $main.Contains($symbol)) { throw "Aetheria Electron host does not consume owner symbol: $symbol" }
|
||||
}
|
||||
if (-not $preload.Contains("installEveProviderBridge") -or -not $preload.Contains("@gamecult/eve-electron/preload")) {
|
||||
throw "Aetheria preload does not consume EveElectron's generic provider bridge."
|
||||
}
|
||||
if ($preload.Contains('eveSurface: request =>') -or $preload.Contains('submitEveCommand: request =>')) {
|
||||
throw "Aetheria product namespace still publishes duplicate generic Eve methods."
|
||||
}
|
||||
if (-not $renderer.Contains("window.eveProvider.providerAdvertisement") -or $renderer.Contains("window.aetheriaRts.eveProviderAdvertisement")) {
|
||||
throw "Aetheria renderer has not transferred generic provider authority to window.eveProvider."
|
||||
}
|
||||
|
||||
Push-Location $EveElectronRoot
|
||||
try {
|
||||
node --test test/*.test.mjs test/*.test.cjs
|
||||
if ($LASTEXITCODE -ne 0) { throw "EveElectron owner tests failed with exit code $LASTEXITCODE" }
|
||||
npm pack --dry-run | Out-Null
|
||||
if ($LASTEXITCODE -ne 0) { throw "EveElectron owner package smoke failed with exit code $LASTEXITCODE" }
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
Write-Host "EveElectron owner smoke passed: $EveElectronRoot"
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-electron\eve-runtime-capability.json"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$absoluteManifestPath = if ([System.IO.Path]::IsPathRooted($CapabilityManifestPath)) {
|
||||
$CapabilityManifestPath
|
||||
} else {
|
||||
Join-Path $projectRoot $CapabilityManifestPath
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $absoluteManifestPath)) {
|
||||
throw "EveElectron runtime capability manifest not found: $absoluteManifestPath"
|
||||
}
|
||||
|
||||
$manifest = Get-Content -LiteralPath $absoluteManifestPath -Raw | ConvertFrom-Json
|
||||
|
||||
if ($manifest.runtimeId -ne "electron-shell") {
|
||||
throw "Unexpected EveElectron runtime id: $($manifest.runtimeId)"
|
||||
}
|
||||
if ($manifest.lifecycle.test.status -ne "provider-shell-contract-skeleton") {
|
||||
throw "Unexpected EveElectron provider shell status: $($manifest.lifecycle.test.status)"
|
||||
}
|
||||
|
||||
foreach ($feature in @("providerAdvertisements", "commandTransport", "surfaceTreeProjection", "pluginProjection")) {
|
||||
if (-not (@($manifest.supportedFeatures) -contains $feature)) {
|
||||
throw "EveElectron provider shell missing supported feature: $feature"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($pluginId in @("sai.vn", "norn.graph", "tex.math")) {
|
||||
$supported = @($manifest.supportedPlugins) | Where-Object { $_.pluginId -eq $pluginId } | Select-Object -First 1
|
||||
if (-not $supported) {
|
||||
throw "EveElectron provider shell missing supported plugin projection: $pluginId"
|
||||
}
|
||||
}
|
||||
|
||||
$worldSurfaceLoweringClaims = @()
|
||||
if ($null -ne $manifest.worldSurfaceLowering) {
|
||||
$worldSurfaceLoweringClaims = @($manifest.worldSurfaceLowering)
|
||||
}
|
||||
if ($worldSurfaceLoweringClaims.Count -ne 1) {
|
||||
throw "EveElectron must claim exactly one provider world-surface lowering target"
|
||||
}
|
||||
$worldSurfaceLoweringClaim = $worldSurfaceLoweringClaims | Where-Object { $_.targetId -eq "electron-shell" } | Select-Object -First 1
|
||||
if (-not $worldSurfaceLoweringClaim) {
|
||||
throw "EveElectron missing electron-shell world-surface lowering claim"
|
||||
}
|
||||
foreach ($surfaceKind in @("interactive-world", "interactive-world-editor")) {
|
||||
if (-not (@($worldSurfaceLoweringClaim.surfaceKinds) -contains $surfaceKind)) {
|
||||
throw "EveElectron world-surface claim missing surface kind: $surfaceKind"
|
||||
}
|
||||
}
|
||||
foreach ($projectionKind in @("provider-authored-world-surface", "provider-authored-world-editor-surface")) {
|
||||
if (-not (@($worldSurfaceLoweringClaim.projectionKinds) -contains $projectionKind)) {
|
||||
throw "EveElectron world-surface claim missing projection kind: $projectionKind"
|
||||
}
|
||||
}
|
||||
if ($worldSurfaceLoweringClaim.supportLevel -ne "electron-shell-surface-tree-command-surface") {
|
||||
throw "Unexpected EveElectron support level: $($worldSurfaceLoweringClaim.supportLevel)"
|
||||
}
|
||||
if ($worldSurfaceLoweringClaim.ownership -ne "runtime-lowers-provider-world-surface-without-owning-world-state") {
|
||||
throw "Unexpected EveElectron ownership: $($worldSurfaceLoweringClaim.ownership)"
|
||||
}
|
||||
foreach ($evidencePath in @($worldSurfaceLoweringClaim.evidencePaths)) {
|
||||
$absoluteEvidencePath = Join-Path $projectRoot $evidencePath
|
||||
if (-not (Test-Path -LiteralPath $absoluteEvidencePath)) {
|
||||
throw "EveElectron world-surface claim missing evidence path: $evidencePath"
|
||||
}
|
||||
}
|
||||
|
||||
$expectedFiles = @(
|
||||
"runtimes\incubating\eve-electron\package.json",
|
||||
"runtimes\incubating\eve-electron\src\eve-electron-shell.mjs",
|
||||
"runtimes\incubating\eve-electron\test\eve-electron-shell.test.mjs",
|
||||
"scripts\run-eveelectron-capture-contract-smoke.ps1",
|
||||
"tools\eveelectron\eveelectron-capture-contract.mjs"
|
||||
)
|
||||
|
||||
foreach ($relativePath in $expectedFiles) {
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron provider shell missing file: $relativePath"
|
||||
}
|
||||
}
|
||||
|
||||
$shellSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-electron\src\eve-electron-shell.mjs") -Raw
|
||||
foreach ($symbol in @("EveElectronShell", "selectSurface", "lowerSurface", "createCommandIntent", "normalizeSurfaceDocument", "buildShellNode", "buildPluginProjection", "shellElementKind", "sai.vn", "norn.graph", "tex.math", "sidecar-advertised-plugin-abi", "worldInteraction", "commandBoundary", "receiptSchema", "electron-shell")) {
|
||||
if (-not $shellSource.Contains($symbol)) {
|
||||
throw "EveElectron provider shell source missing symbol: $symbol"
|
||||
}
|
||||
}
|
||||
|
||||
$testSource = Get-Content -LiteralPath (Join-Path $projectRoot "runtimes\incubating\eve-electron\test\eve-electron-shell.test.mjs") -Raw
|
||||
foreach ($symbol in @("selects the active advertised provider surface", "lowers provider surface trees into an Electron shell projection", "lowers Sai, Norn, and TeX sidecar plugin shells without owning semantics", "sai-vn-stage-shell", "norn-graph-shell", "tex-math-shell", "rejects surface documents that do not match the advertised target", "command intents carry provider-advertised boundaries", "aetheria.daemon.commands", "aetheria.eve_command_acceptance_status.v1")) {
|
||||
if (-not $testSource.Contains($symbol)) {
|
||||
throw "EveElectron provider shell test missing symbol: $symbol"
|
||||
}
|
||||
}
|
||||
|
||||
Push-Location (Join-Path $projectRoot "runtimes\incubating\eve-electron")
|
||||
try {
|
||||
npm test
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron provider shell tests failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
Write-Host "EveElectron provider shell smoke passed: $absoluteManifestPath"
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
param(
|
||||
[string] $CapabilityManifestPath = "runtimes\incubating\eve-electron\eve-runtime-capability.json",
|
||||
[string] $OutputPath = "artifacts\eveelectron-release-contract\latest\release-request.json"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$absoluteCapabilityPath = if ([System.IO.Path]::IsPathRooted($CapabilityManifestPath)) {
|
||||
$CapabilityManifestPath
|
||||
} else {
|
||||
Join-Path $projectRoot $CapabilityManifestPath
|
||||
}
|
||||
$absoluteOutputPath = if ([System.IO.Path]::IsPathRooted($OutputPath)) {
|
||||
$OutputPath
|
||||
} else {
|
||||
Join-Path $projectRoot $OutputPath
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $absoluteCapabilityPath)) {
|
||||
throw "EveElectron release contract input not found: $absoluteCapabilityPath"
|
||||
}
|
||||
|
||||
$manifest = Get-Content -LiteralPath $absoluteCapabilityPath -Raw | ConvertFrom-Json
|
||||
$releaseContract = $manifest.lifecycle.release.releaseContract
|
||||
if ($null -eq $releaseContract) {
|
||||
throw "EveElectron release contract missing lifecycle.release.releaseContract"
|
||||
}
|
||||
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
|
||||
if (-not $releaseContract.$field) {
|
||||
throw "EveElectron release contract missing $field"
|
||||
}
|
||||
}
|
||||
if ($releaseContract.ownerRepo -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron release owner: $($releaseContract.ownerRepo)"
|
||||
}
|
||||
if ($releaseContract.packageName -ne "eve-electron") {
|
||||
throw "Unexpected EveElectron package name: $($releaseContract.packageName)"
|
||||
}
|
||||
if ($releaseContract.requestSchema -ne "gamecult.eve.runtime_release_request.v1") {
|
||||
throw "Unexpected EveElectron release request schema: $($releaseContract.requestSchema)"
|
||||
}
|
||||
if ($releaseContract.artifactKind -ne "electron-app") {
|
||||
throw "Unexpected EveElectron release artifact kind: $($releaseContract.artifactKind)"
|
||||
}
|
||||
|
||||
$builderPath = Join-Path $projectRoot $releaseContract.requestBuilder
|
||||
$packagePath = Join-Path $projectRoot $releaseContract.versionSource
|
||||
$packageRoot = Join-Path $projectRoot $releaseContract.packageRoot
|
||||
foreach ($path in @($builderPath, $packagePath, $packageRoot)) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveElectron release contract path not found: $path"
|
||||
}
|
||||
}
|
||||
|
||||
node --test (Join-Path $projectRoot "tools\eveelectron\eveelectron-release-contract.test.mjs")
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron release contract tests failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
||||
node $builderPath --capability $absoluteCapabilityPath --package $packagePath --output $absoluteOutputPath
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "EveElectron release request builder failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
if (-not (Test-Path -LiteralPath $absoluteOutputPath)) {
|
||||
throw "EveElectron release request was not written: $absoluteOutputPath"
|
||||
}
|
||||
|
||||
$request = Get-Content -LiteralPath $absoluteOutputPath -Raw | ConvertFrom-Json
|
||||
$packageManifest = Get-Content -LiteralPath $packagePath -Raw | ConvertFrom-Json
|
||||
foreach ($expectation in @(
|
||||
@{ field = "schema"; value = "gamecult.eve.runtime_release_request.v1" },
|
||||
@{ field = "ownerRepo"; value = "EveElectron" },
|
||||
@{ field = "repository"; value = "GameCult/EveElectron" },
|
||||
@{ field = "packageName"; value = "eve-electron" },
|
||||
@{ field = "version"; value = $packageManifest.version },
|
||||
@{ field = "packageRoot"; value = "runtimes/incubating/eve-electron" },
|
||||
@{ field = "versionSource"; value = "runtimes/incubating/eve-electron/package.json" },
|
||||
@{ field = "artifactKind"; value = "electron-app" }
|
||||
)) {
|
||||
if ($request.($expectation.field) -ne $expectation.value) {
|
||||
throw "EveElectron release request $($expectation.field) expected $($expectation.value) got $($request.($expectation.field))"
|
||||
}
|
||||
}
|
||||
|
||||
$expectedTagName = $releaseContract.tagPattern.Replace("{version}", $packageManifest.version)
|
||||
if ($request.tagName -ne $expectedTagName) {
|
||||
throw "Unexpected EveElectron release tag: $($request.tagName)"
|
||||
}
|
||||
$expectedArtifactPath = $releaseContract.artifactPattern.Replace("{version}", $packageManifest.version)
|
||||
if ($request.artifactPath -ne $expectedArtifactPath) {
|
||||
throw "Unexpected EveElectron release artifact path: $($request.artifactPath)"
|
||||
}
|
||||
if ($request.main -ne $packageManifest.main) {
|
||||
throw "EveElectron release request lost package main entry"
|
||||
}
|
||||
|
||||
Write-Host "EveElectron release contract smoke passed: $absoluteOutputPath"
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
param(
|
||||
[string] $HandoffPath = "runtimes\incubating\eve-electron\eveelectron-split-handoff.json"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$absoluteHandoffPath = if ([System.IO.Path]::IsPathRooted($HandoffPath)) {
|
||||
$HandoffPath
|
||||
} else {
|
||||
Join-Path $projectRoot $HandoffPath
|
||||
}
|
||||
|
||||
if (-not (Test-Path -LiteralPath $absoluteHandoffPath)) {
|
||||
throw "EveElectron split handoff manifest not found: $absoluteHandoffPath"
|
||||
}
|
||||
|
||||
$handoff = Get-Content -LiteralPath $absoluteHandoffPath -Raw | ConvertFrom-Json
|
||||
|
||||
if ($handoff.schema -ne "gamecult.eve.runtime_split_handoff.v1") {
|
||||
throw "Unexpected EveElectron split handoff schema: $($handoff.schema)"
|
||||
}
|
||||
if ($handoff.splitTarget -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron split handoff target: $($handoff.splitTarget)"
|
||||
}
|
||||
if ($handoff.ownerRepo -ne "EveElectron") {
|
||||
throw "Unexpected EveElectron split handoff owner: $($handoff.ownerRepo)"
|
||||
}
|
||||
if ($handoff.currentHostRepo -ne "Eve") {
|
||||
throw "Unexpected EveElectron split handoff host: $($handoff.currentHostRepo)"
|
||||
}
|
||||
if ($handoff.runtimeId -ne "electron-shell") {
|
||||
throw "Unexpected EveElectron split handoff runtime: $($handoff.runtimeId)"
|
||||
}
|
||||
|
||||
$moveSets = @($handoff.moveSets)
|
||||
foreach ($stage in @("runtime-body", "command", "world-surface-lowering", "plugin-projection", "capture")) {
|
||||
$moveSet = $moveSets | Where-Object { $_.stage -eq $stage } | Select-Object -First 1
|
||||
if (-not $moveSet) {
|
||||
throw "EveElectron split handoff missing move set for stage: $stage"
|
||||
}
|
||||
if ($moveSet.destinationOwner -ne "EveElectron") {
|
||||
throw "EveElectron split handoff stage $stage has unexpected destination owner: $($moveSet.destinationOwner)"
|
||||
}
|
||||
if (-not $moveSet.replacementProof) {
|
||||
throw "EveElectron split handoff stage $stage missing replacement proof"
|
||||
}
|
||||
foreach ($relativePath in @($moveSet.currentPaths)) {
|
||||
$absolutePath = Join-Path $projectRoot $relativePath
|
||||
if (-not (Test-Path -LiteralPath $absolutePath)) {
|
||||
throw "EveElectron split handoff stage $stage references missing current path: $relativePath"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($id in @("electron-shell-runtime", "electron-command-transport", "electron-world-surface-lowering")) {
|
||||
$moveSet = $moveSets | Where-Object { $_.id -eq $id } | Select-Object -First 1
|
||||
if (-not $moveSet) {
|
||||
throw "EveElectron split handoff missing move set: $id"
|
||||
}
|
||||
$observedPaths = @($moveSet.observedProviderPaths)
|
||||
if ($observedPaths.Count -eq 0) {
|
||||
throw "EveElectron split handoff move set $id must name observed Aetheria paths to replace"
|
||||
}
|
||||
foreach ($path in $observedPaths) {
|
||||
if (-not (Test-Path -LiteralPath $path)) {
|
||||
throw "EveElectron split handoff observed provider path missing: $path"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$captureMoveSet = $moveSets | Where-Object { $_.id -eq "electron-capture-lifecycle" } | Select-Object -First 1
|
||||
if (-not $captureMoveSet) {
|
||||
throw "EveElectron split handoff missing move set: electron-capture-lifecycle"
|
||||
}
|
||||
if (@($captureMoveSet.currentPaths).Count -eq 0) {
|
||||
throw "EveElectron capture lifecycle move set must declare currentPaths"
|
||||
}
|
||||
|
||||
$pluginMoveSet = $moveSets | Where-Object { $_.id -eq "electron-plugin-projection" } | Select-Object -First 1
|
||||
if (-not $pluginMoveSet) {
|
||||
throw "EveElectron split handoff missing move set: electron-plugin-projection"
|
||||
}
|
||||
foreach ($relativePath in @(
|
||||
"runtimes/incubating/eve-electron/src/eve-electron-shell.mjs",
|
||||
"runtimes/incubating/eve-electron/test/eve-electron-shell.test.mjs",
|
||||
"web/fixtures/sai-vn-surface.json"
|
||||
)) {
|
||||
if (-not (@($pluginMoveSet.currentPaths) -contains $relativePath)) {
|
||||
throw "EveElectron plugin projection move set missing current path: $relativePath"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($contract in @(
|
||||
"gamecult.eve.surface.v1",
|
||||
"gamecult.eve.command.v1",
|
||||
"gamecult.eve.provider_advertisement.v1",
|
||||
"gamecult.eve.plugin_advertisement.v1",
|
||||
"gamecult.eve.plugin.v1",
|
||||
"gamecult.eve.conformance_export.v1"
|
||||
)) {
|
||||
if (-not (@($handoff.contractInputs) -contains $contract)) {
|
||||
throw "EveElectron split handoff missing contract input: $contract"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($proof in @($handoff.requiredExternalProofs)) {
|
||||
if (-not $proof) {
|
||||
throw "EveElectron split handoff contains an empty required external proof"
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($forbiddenImport in @(
|
||||
"Sai story state, VN/Ink semantics, or story command interpretation as Electron shell authority",
|
||||
"Norn graph layout, graph state, or command semantics as Electron shell authority",
|
||||
"TeX parsing, typesetting, baseline metrics, or render-cache semantics as Electron shell authority"
|
||||
)) {
|
||||
if (-not (@($handoff.forbiddenImports) -contains $forbiddenImport)) {
|
||||
throw "EveElectron split handoff missing forbidden import: $forbiddenImport"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "EveElectron split handoff smoke passed: $absoluteHandoffPath"
|
||||
|
|
@ -36,15 +36,6 @@ try {
|
|||
-ExpectedSurfaceId "eve.world-smoke.surface" `
|
||||
-ExpectedCommandBoundary "eve.world-smoke.commands" `
|
||||
-ExpectedReceiptSchema "eve.world_smoke.command_receipt.v1"
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-capture-smoke.ps1") `
|
||||
-AdvertisementPath "web\fixtures\eve-world-smoke.provider-advertisement.json" `
|
||||
-SurfacePath "web\fixtures\eve-world-smoke-surface.json" `
|
||||
-OutputPath "artifacts\eveelectron-capture\latest\eve-world-smoke-electron-shell-projection.json" `
|
||||
-RequestOutputPath "artifacts\eveelectron-capture\latest\eve-world-smoke-capture-request.json" `
|
||||
-ExpectedProviderId "eve.world-smoke" `
|
||||
-ExpectedSurfaceId "eve.world-smoke.surface" `
|
||||
-ExpectedCommandBoundary "eve.world-smoke.commands" `
|
||||
-ExpectedReceiptSchema "eve.world_smoke.command_receipt.v1"
|
||||
& (Join-Path $PSScriptRoot "run-evetui-capture-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-evetui-capture-smoke.ps1") `
|
||||
-AdvertisementPath "web\fixtures\eve-world-smoke.provider-advertisement.json" `
|
||||
|
|
@ -61,8 +52,7 @@ try {
|
|||
& (Join-Path $PSScriptRoot "run-aetheria-provider-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveunity-release-artifact-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-lifecycle-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-eveelectron-owner-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-evetui-split-handoff-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-evetui-lifecycle-smoke.ps1")
|
||||
& (Join-Path $PSScriptRoot "run-conformance-consumer-smoke.ps1")
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-status android-flutter:active `
|
||||
--expect-runtime-status unity-uitoolkit:active `
|
||||
--expect-runtime-status unity-scene:active `
|
||||
--expect-runtime-status electron-shell:pending `
|
||||
--expect-runtime-status electron-shell:active `
|
||||
--expect-runtime-status tui:active `
|
||||
--expect-runtime-status direct2d:external-adapter-spike `
|
||||
--expect-runtime-feature web:providerAdvertisements `
|
||||
|
|
@ -106,7 +106,7 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-world-field unity-scene:unity-scene:supportLevel:unity-playable-world-scene-command-surface `
|
||||
--expect-runtime-world-field unity-scene:unity-scene:ownership:runtime-lowers-provider-world-surface-without-owning-world-state `
|
||||
--expect-runtime-world-target electron-shell:electron-shell `
|
||||
--expect-runtime-world-field electron-shell:electron-shell:supportLevel:electron-shell-surface-tree-command-surface `
|
||||
--expect-runtime-world-field electron-shell:electron-shell:supportLevel:provider-shell-surface-tree-command-surface `
|
||||
--expect-runtime-world-field electron-shell:electron-shell:ownership:runtime-lowers-provider-world-surface-without-owning-world-state `
|
||||
--expect-runtime-world-target tui:tui `
|
||||
--expect-runtime-world-field tui:tui:supportLevel:terminal-grid-command-surface `
|
||||
|
|
@ -165,16 +165,14 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-capture-artifact unity-uitoolkit:json-projection:gamecult.eve.unity_uitoolkit_projection.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-artifact unity-uitoolkit:json-projection:gamecult.eve.unity_uitoolkit_projection.v1:eve.world-smoke:eve.world-smoke.surface `
|
||||
--expect-runtime-capture-status unity-scene:partial-world-smoke-playmode-capture `
|
||||
--expect-runtime-capture-status electron-shell:json-projection `
|
||||
--expect-runtime-capture-artifact electron-shell:json-projection:gamecult.eve.electron_shell_projection.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-artifact electron-shell:json-projection:gamecult.eve.electron_shell_projection.v1:eve.world-smoke:eve.world-smoke.surface `
|
||||
--expect-runtime-capture-status electron-shell:pending-owner-window-capture `
|
||||
--expect-runtime-capture-status tui:json-grid `
|
||||
--expect-runtime-capture-artifact tui:json-grid:gamecult.eve.tui_grid.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-artifact tui:json-grid:gamecult.eve.tui_grid.v1:eve.world-smoke:eve.world-smoke.surface `
|
||||
--expect-runtime-capture-status direct2d:missing `
|
||||
--expect-runtime-capture-probe unity-uitoolkit:semantic-artifact-present-capture-pending:png:EveUnity `
|
||||
--expect-runtime-capture-probe unity-scene:control-artifact-present-product-capture-pending:png:EveUnity `
|
||||
--expect-runtime-capture-probe electron-shell:semantic-artifact-present-capture-pending:png:EveElectron `
|
||||
--expect-runtime-capture-probe electron-shell:contract-artifact-missing:png:EveElectron `
|
||||
--expect-runtime-capture-probe tui:contract-artifact-present:json-grid:EveTui `
|
||||
--expect-screenshot-metric web:embedded-surface:structure:pass `
|
||||
--expect-screenshot-metric web:embedded-surface:color-tokens:pass `
|
||||
|
|
@ -263,29 +261,25 @@ node $consumerScript $consumerExport `
|
|||
--expect-runtime-lifecycle-field "unity-scene:capture:captureContract.requiredSurface:aetheria.daemon.game" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:capture:captureContract.additionalProviderSurfaces.0.providerId:eve.world-smoke" `
|
||||
--expect-runtime-lifecycle-field "unity-scene:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" `
|
||||
--expect-runtime-lifecycle-status electron-shell:release:pending-electron-package `
|
||||
--expect-runtime-lifecycle-status electron-shell:test:provider-shell-contract-skeleton `
|
||||
--expect-runtime-lifecycle-status electron-shell:capture:pending-electron-window-capture `
|
||||
--expect-runtime-lifecycle-pending "electron-shell:release:Electron packaged app release" `
|
||||
--expect-runtime-lifecycle-pending "electron-shell:test:Electron provider-advertisement smoke runs from EveElectron in a packaged Electron window" `
|
||||
--expect-runtime-lifecycle-pending "electron-shell:capture:Electron window capture artifact" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.artifactKind:electron-app" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.versionSource:runtimes/incubating/eve-electron/package.json" `
|
||||
--expect-runtime-lifecycle-status electron-shell:release:owner-npm-package `
|
||||
--expect-runtime-lifecycle-status electron-shell:test:owner-package-tests-and-aetheria-live-smoke `
|
||||
--expect-runtime-lifecycle-status electron-shell:capture:pending-owner-window-capture `
|
||||
--expect-runtime-lifecycle-pending "electron-shell:capture:Capture one non-product and one Aetheria window" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.artifactKind:npm-package" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.versionSource:package.json" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.requestSchema:gamecult.eve.runtime_release_request.v1" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.requestBuilder:tools/eveelectron/eveelectron-release-contract.mjs" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.artifactPattern:artifacts/eveelectron-release/{version}/eve-electron-{version}.zip" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:test:testContract.runnerKind:electron-provider-shell-smoke" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:test:testContract.runnerScript:scripts/run-eveelectron-provider-shell-smoke.ps1" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.requestBuilder:npm pack" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:release:releaseContract.artifactPattern:gamecult-eve-electron-{version}.tgz" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:test:testContract.runnerKind:node-and-provider-live-smoke" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:test:testContract.runnerScript:npm test" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.captureKind:electron-window-png" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.targetId:electron-shell" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.requestSchema:gamecult.eve.runtime_capture_request.v1" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.requestBuilder:tools/eveelectron/eveelectron-capture-contract.mjs" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.advertisementPath:web/fixtures/aetheria.provider-advertisement.json" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.requiredSurface:aetheria.daemon.game" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.requestBuilder:pending" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.advertisementPath:provider-supplied" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.requiredSurface:aetheria.game" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.additionalProviderSurfaces.0.providerId:eve.world-smoke" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.additionalProviderSurfaces.1.providerId:aetheria" `
|
||||
--expect-runtime-lifecycle-field "electron-shell:capture:captureContract.additionalProviderSurfaces.1.surfaceId:aetheria.daemon.editor" `
|
||||
--expect-runtime-lifecycle-status tui:release:pending-tui-package `
|
||||
--expect-runtime-lifecycle-status tui:test:provider-shell-contract-skeleton `
|
||||
--expect-runtime-lifecycle-status tui:capture:cell-grid-json-capture `
|
||||
|
|
|
|||
|
|
@ -52,21 +52,9 @@ try {
|
|||
--expect-split-target-blocker "EveUnity:Tagged UPM release" `
|
||||
--expect-split-target EveElectron `
|
||||
--expect-split-target-status EveElectron:incubating `
|
||||
--expect-split-target-proof "EveElectron:EveElectron split handoff is machine-readable" `
|
||||
--expect-split-target-proof "EveElectron:EveElectron lifecycle contract is machine-readable" `
|
||||
--expect-runtime-capture-artifact electron-shell:json-projection:gamecult.eve.electron_shell_projection.v1:aetheria:aetheria.daemon.game `
|
||||
--expect-runtime-capture-artifact electron-shell:json-projection:gamecult.eve.electron_shell_projection.v1:eve.world-smoke:eve.world-smoke.surface `
|
||||
--expect-split-target-blocker "EveElectron:runtime:electron-shell:status:pending" `
|
||||
--expect-split-target-blocker-record EveElectron:runtime-status:electron-shell `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-shell-runtime:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-command-transport:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-world-surface-lowering:current:exists:eve-electron-shell.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-plugin-projection:current:exists:sai-vn-surface.json `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-capture-lifecycle:current:exists:eveelectron-capture-contract.mjs `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-shell-runtime:observed-provider:exists:Aetheria.Rts.Web/Electron `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-command-transport:observed-provider:exists:Aetheria.Rts.Web/Client/app.ts `
|
||||
--expect-split-handoff-move EveElectron:electron-shell:electron-world-surface-lowering:observed-provider:exists:Aetheria.Rts.Web/Client `
|
||||
--expect-split-target-blocker "EveElectron:Electron shell runtime body graduates to EveElectron outside Aetheria product code" `
|
||||
--expect-split-target-proof "EveElectron:EveElectron owner repository publishes the generic runtime package" `
|
||||
--expect-split-target-proof "EveElectron:EveElectron owns secure window and preload lifecycle" `
|
||||
--expect-split-target-blocker "EveElectron:Electron packaged window PNG capture artifacts are attached to conformance output" `
|
||||
--expect-split-target EveTui `
|
||||
--expect-split-target-status EveTui:incubating `
|
||||
--expect-split-target-proof "EveTui:EveTui split handoff is machine-readable" `
|
||||
|
|
|
|||
Loading…
Reference in a new issue