Add EveUnity scene UPM artifact smoke

This commit is contained in:
Meta Vens 2026-07-09 17:38:00 +01:00
commit b20e534c9c
13 changed files with 101 additions and 12 deletions

View file

@ -652,10 +652,12 @@ Recently cut:
Unity UI Toolkit. The `unity-scene` runtime capability manifest names
`gamecult.eve.runtime_release_request.v1`, the shared
`tools/eveunity/eveunity-release-contract.mjs` request builder,
`tools/eveunity/eveunity-release-artifact.mjs` artifact builder,
`runtimes/incubating/eve-unity-scene/package.json` as the version source, and
the `eveunity-scene-v{version}` tag/artifact pattern.
`scripts/run-eveunity-scene-release-contract-smoke.ps1` proves the request
without pretending the tagged UPM package has been published.
`scripts/run-eveunity-scene-release-artifact-smoke.ps1` now produces the
declared Unity scene UPM `.tgz` as local smoke evidence without pretending the
tagged UPM package has been published from EveUnity.
- EveTui capture lifecycle now carries a structured terminal cell-grid capture
contract and typed artifact. `captureContract` names the TUI runtime,
`terminal-cell-grid` capture kind, `json-grid` artifact kind, conformance

View file

@ -77,7 +77,7 @@
"lifecycle": {
"release": {
"ownerRepo": "EveUnity",
"status": "pending-unity-scene-package",
"status": "unity-scene-upm-artifact-smoke",
"releaseContract": {
"ownerRepo": "EveUnity",
"packageName": "org.gamecult.eve.unity-scene",
@ -87,6 +87,7 @@
"artifactKind": "upm-package",
"requestSchema": "gamecult.eve.runtime_release_request.v1",
"requestBuilder": "tools/eveunity/eveunity-release-contract.mjs",
"artifactBuilder": "tools/eveunity/eveunity-release-artifact.mjs",
"artifactPattern": "artifacts/eveunity-scene-release/{version}/org.gamecult.eve.unity-scene-{version}.tgz",
"publishProof": "Tagged Unity scene package release is created from the EveUnity repo and references the provider-agnostic scene package root.",
"requiredPackageDependencies": [
@ -109,8 +110,11 @@
"runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json",
"scripts/run-eveunity-scene-split-handoff-smoke.ps1",
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
"tools/eveunity/eveunity-release-contract.mjs",
"tools/eveunity/eveunity-release-contract.test.mjs"
"tools/eveunity/eveunity-release-contract.test.mjs",
"tools/eveunity/eveunity-release-artifact.mjs",
"tools/eveunity/eveunity-release-artifact.test.mjs"
],
"pendingProofs": [
"Unity scene package release is cut from EveUnity rather than Eve incubation."

View file

@ -25,6 +25,24 @@
"destinationOwner": "EveUnity",
"replacementProof": "EveUnity hosts a provider-agnostic Unity scene lowerer that consumes provider advertisements and world surfaces without importing Aetheria runtime internals."
},
{
"id": "unity-scene-upm-package",
"stage": "release",
"currentPaths": [
"runtimes/incubating/eve-unity-scene/package.json",
"runtimes/incubating/eve-unity-scene/Runtime/GameCult.Eve.UnityScene.asmdef",
"runtimes/incubating/eve-unity-scene/Runtime/EveUnitySceneSurfaceLowerer.cs",
"runtimes/incubating/eve-unity-scene/Tests/Editor/GameCult.Eve.UnityScene.Tests.asmdef",
"tools/eveunity/eveunity-release-contract.mjs",
"tools/eveunity/eveunity-release-contract.test.mjs",
"tools/eveunity/eveunity-release-artifact.mjs",
"tools/eveunity/eveunity-release-artifact.test.mjs",
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
"scripts/run-eveunity-scene-release-artifact-smoke.ps1"
],
"destinationOwner": "EveUnity",
"replacementProof": "EveUnity builds the provider-agnostic Unity scene UPM package artifact now; the split is not complete until the tagged Unity scene release is cut from EveUnity."
},
{
"id": "unity-scene-world-surface-lowering",
"stage": "world-surface-lowering",
@ -120,6 +138,7 @@
],
"requiredExternalProofs": [
"EveUnity publishes a Unity scene runtime capability manifest.",
"EveUnity builds the provider-agnostic Unity scene UPM package artifact.",
"EveUnity owns a provider-agnostic scene graph lowerer that consumes advertised worldInteraction boundaries without importing Aetheria internals.",
"EveUnity owns the provider-agnostic scene graph lowerer outside Eve incubation.",
"EveUnity owns the Unity scene Sai projection adapter outside Eve incubation without importing Sai story state or VN/Ink internals.",

View file

@ -1,7 +1,8 @@
param(
[string] $CapabilityManifestPath = "packages\org.gamecult.eve.unity-uitoolkit\eve-runtime-capability.json",
[string] $RequestOutputPath = "artifacts\eveunity-uitoolkit-release-contract\latest\release-request.json",
[string] $ProofOutputPath = "artifacts\eveunity-uitoolkit-release\latest\release-artifact.json"
[string] $ProofOutputPath = "artifacts\eveunity-uitoolkit-release\latest\release-artifact.json",
[string] $ReleaseContractSmokePath = "scripts\run-eveunity-release-contract-smoke.ps1"
)
$ErrorActionPreference = "Stop"
@ -45,13 +46,21 @@ $artifactBuilderPath = Join-Path $projectRoot $releaseContract.artifactBuilder
if (-not (Test-Path -LiteralPath $artifactBuilderPath)) {
throw "EveUnity release artifact builder not found: $($releaseContract.artifactBuilder)"
}
$releaseContractSmoke = if ([System.IO.Path]::IsPathRooted($ReleaseContractSmokePath)) {
$ReleaseContractSmokePath
} else {
Join-Path $projectRoot $ReleaseContractSmokePath
}
if (-not (Test-Path -LiteralPath $releaseContractSmoke)) {
throw "EveUnity release contract smoke not found: $ReleaseContractSmokePath"
}
node --test (Join-Path $projectRoot "tools\eveunity\eveunity-release-artifact.test.mjs")
if ($LASTEXITCODE -ne 0) {
throw "EveUnity release artifact tests failed with exit code $LASTEXITCODE"
}
& (Join-Path $projectRoot "scripts\run-eveunity-release-contract-smoke.ps1") `
& $releaseContractSmoke `
-CapabilityManifestPath $CapabilityManifestPath `
-OutputPath $RequestOutputPath
if ($LASTEXITCODE -ne 0) {

View file

@ -142,7 +142,7 @@ foreach ($stage in @("release", "test", "capture")) {
}
$releaseContract = $manifest.lifecycle.release.releaseContract
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactBuilder", "artifactPattern", "publishProof")) {
if (-not $releaseContract.$field) {
throw "EveUnity scene release contract missing $field"
}
@ -157,7 +157,7 @@ foreach ($pathProperty in @("packageRoot", "versionSource")) {
throw "EveUnity scene release contract $pathProperty does not exist: $relativePath"
}
}
foreach ($pathProperty in @("requestBuilder")) {
foreach ($pathProperty in @("requestBuilder", "artifactBuilder")) {
$relativePath = $releaseContract.$pathProperty
$absolutePath = Join-Path $projectRoot $relativePath
if (-not (Test-Path -LiteralPath $absolutePath)) {
@ -223,6 +223,7 @@ foreach ($pathProperty in @("requestBuilder", "advertisementPath")) {
& (Join-Path $projectRoot "scripts\run-eveunity-scene-split-handoff-smoke.ps1")
& (Join-Path $projectRoot "scripts\run-eveunity-scene-provider-shell-smoke.ps1")
& (Join-Path $projectRoot "scripts\run-eveunity-scene-release-contract-smoke.ps1")
& (Join-Path $projectRoot "scripts\run-eveunity-scene-release-artifact-smoke.ps1")
& (Join-Path $projectRoot "scripts\run-eveunity-scene-capture-contract-smoke.ps1")
& (Join-Path $projectRoot "scripts\run-eveunity-scene-capture-smoke.ps1")

View file

@ -0,0 +1,18 @@
param(
[string] $CapabilityManifestPath = "runtimes\incubating\eve-unity-scene\eve-runtime-capability.json",
[string] $RequestOutputPath = "artifacts\eveunity-scene-release-contract\latest\release-request.json",
[string] $ProofOutputPath = "artifacts\eveunity-scene-release\latest\release-artifact.json"
)
$ErrorActionPreference = "Stop"
$projectRoot = Split-Path -Parent $PSScriptRoot
& (Join-Path $projectRoot "scripts\run-eveunity-release-artifact-smoke.ps1") `
-CapabilityManifestPath $CapabilityManifestPath `
-RequestOutputPath $RequestOutputPath `
-ProofOutputPath $ProofOutputPath `
-ReleaseContractSmokePath "scripts\run-eveunity-scene-release-contract-smoke.ps1"
if ($LASTEXITCODE -ne 0) {
throw "EveUnity scene release artifact smoke failed with exit code $LASTEXITCODE"
}

View file

@ -26,7 +26,7 @@ $releaseContract = $manifest.lifecycle.release.releaseContract
if ($null -eq $releaseContract) {
throw "EveUnity scene release contract missing lifecycle.release.releaseContract"
}
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactPattern", "publishProof")) {
foreach ($field in @("ownerRepo", "packageName", "packageRoot", "versionSource", "tagPattern", "artifactKind", "requestSchema", "requestBuilder", "artifactBuilder", "artifactPattern", "publishProof")) {
if (-not $releaseContract.$field) {
throw "EveUnity scene release contract missing $field"
}
@ -45,9 +45,10 @@ if ($releaseContract.artifactKind -ne "upm-package") {
}
$builderPath = Join-Path $projectRoot $releaseContract.requestBuilder
$artifactBuilderPath = Join-Path $projectRoot $releaseContract.artifactBuilder
$packagePath = Join-Path $projectRoot $releaseContract.versionSource
$packageRoot = Join-Path $projectRoot $releaseContract.packageRoot
foreach ($path in @($builderPath, $packagePath, $packageRoot)) {
foreach ($path in @($builderPath, $artifactBuilderPath, $packagePath, $packageRoot)) {
if (-not (Test-Path -LiteralPath $path)) {
throw "EveUnity scene release contract path not found: $path"
}

View file

@ -44,6 +44,7 @@ if (-not (Test-Path -LiteralPath $sourcePackageRoot)) {
$moveSets = @($handoff.moveSets)
$expectedMoveSets = @{
"unity-scene-runtime-body" = "runtime-body"
"unity-scene-upm-package" = "release"
"unity-scene-world-surface-lowering" = "world-surface-lowering"
"unity-scene-sai-plugin-projection" = "plugin-projection"
"unity-scene-norn-plugin-projection" = "plugin-projection"
@ -68,7 +69,7 @@ foreach ($id in $expectedMoveSets.Keys) {
}
$currentPaths = if ($null -eq $moveSet.currentPaths) { @() } else { @($moveSet.currentPaths) }
$observedProviderPaths = if ($null -eq $moveSet.observedProviderPaths) { @() } else { @($moveSet.observedProviderPaths) }
if ($id -in @("unity-scene-runtime-body", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-tex-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) {
if ($id -in @("unity-scene-runtime-body", "unity-scene-upm-package", "unity-scene-world-surface-lowering", "unity-scene-sai-plugin-projection", "unity-scene-norn-plugin-projection", "unity-scene-tex-plugin-projection", "unity-scene-command-transport", "unity-scene-capture-lifecycle")) {
if ($currentPaths.Count -eq 0) {
throw "EveUnity scene split handoff move set $id must name current Eve incubation paths"
}

View file

@ -71,6 +71,7 @@ try {
& (Join-Path $PSScriptRoot "run-eveunity-split-handoff-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveunity-release-artifact-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveunity-scene-split-handoff-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveunity-scene-release-artifact-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveunity-scene-lifecycle-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveelectron-split-handoff-smoke.ps1")
& (Join-Path $PSScriptRoot "run-eveelectron-lifecycle-smoke.ps1")

View file

@ -218,7 +218,7 @@ node $consumerScript $consumerExport `
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" `
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.1.providerId:aetheria" `
--expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.additionalProviderSurfaces.1.surfaceId:aetheria.daemon.editor" `
--expect-runtime-lifecycle-status unity-scene:release:pending-unity-scene-package `
--expect-runtime-lifecycle-status unity-scene:release:unity-scene-upm-artifact-smoke `
--expect-runtime-lifecycle-status unity-scene:test:provider-shell-contract-skeleton `
--expect-runtime-lifecycle-status unity-scene:capture:pending-unity-scene-capture `
--expect-runtime-lifecycle-pending "unity-scene:release:Unity scene package release" `
@ -230,6 +230,7 @@ node $consumerScript $consumerExport `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.versionSource:runtimes/incubating/eve-unity-scene/package.json" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requestSchema:gamecult.eve.runtime_release_request.v1" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requestBuilder:tools/eveunity/eveunity-release-contract.mjs" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.artifactBuilder:tools/eveunity/eveunity-release-artifact.mjs" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.artifactPattern:artifacts/eveunity-scene-release/{version}/org.gamecult.eve.unity-scene-{version}.tgz" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requiredPackageDependencies.0.packageName:org.gamecult.eve.surface" `
--expect-runtime-lifecycle-field "unity-scene:release:releaseContract.requiredPackageDependencies.0.ownerRepo:Eve" `

View file

@ -51,6 +51,7 @@ try {
--expect-split-target-blocker-record EveUnity:runtime-status:unity-scene `
--expect-split-target-blocker-record "EveUnity:pending-proof:Unity scene runtime body graduates to EveUnity outside Aetheria product code." `
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneSurfaceLowerer.cs `
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-upm-package:current:exists:eveunity-release-artifact.mjs `
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneSurfaceLowerer.cs `
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-sai-plugin-projection:current:exists:SaiVisualNovelUnitySceneProjectionAdapter.cs `
--expect-split-handoff-move EveUnity:unity-scene:unity-scene-norn-plugin-projection:current:exists:NornGraphUnitySceneProjectionAdapter.cs `

View file

@ -6,6 +6,8 @@ import { buildUnityReleaseArtifactPlan } from "./eveunity-release-artifact.mjs";
const capabilityManifest = JSON.parse(readFileSync(new URL("../../packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json", import.meta.url), "utf8"));
const packageManifest = JSON.parse(readFileSync(new URL("../../packages/org.gamecult.eve.unity-uitoolkit/package.json", import.meta.url), "utf8"));
const sceneCapabilityManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-unity-scene/eve-runtime-capability.json", import.meta.url), "utf8"));
const scenePackageManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-unity-scene/package.json", import.meta.url), "utf8"));
test("plans npm pack for the EveUnity UI Toolkit UPM artifact", () => {
const request = buildUnityReleaseRequest({
@ -28,6 +30,27 @@ test("plans npm pack for the EveUnity UI Toolkit UPM artifact", () => {
]);
});
test("plans npm pack for the EveUnity scene UPM artifact", () => {
const request = buildUnityReleaseRequest({
capabilityManifest: sceneCapabilityManifest,
packageManifest: scenePackageManifest,
capabilityManifestPath: "runtimes/incubating/eve-unity-scene/eve-runtime-capability.json",
packageManifestPath: "runtimes/incubating/eve-unity-scene/package.json",
});
const plan = buildUnityReleaseArtifactPlan({ request, packageManifest: scenePackageManifest });
assert.equal(plan.packageRoot, "runtimes/incubating/eve-unity-scene");
assert.equal(plan.artifactPath, "artifacts/eveunity-scene-release/0.1.0/org.gamecult.eve.unity-scene-0.1.0.tgz");
assert.equal(plan.artifactDirectory, "artifacts/eveunity-scene-release/0.1.0");
assert.equal(plan.expectedFileName, "org.gamecult.eve.unity-scene-0.1.0.tgz");
assert.deepEqual(plan.npmPackArguments, [
"pack",
"runtimes/incubating/eve-unity-scene",
"--pack-destination",
"artifacts/eveunity-scene-release/0.1.0",
]);
});
test("rejects release artifact plans for mismatched package identity", () => {
const request = buildUnityReleaseRequest({ capabilityManifest, packageManifest });

View file

@ -654,6 +654,7 @@
"evidencePaths": [
"runtimes/incubating/eve-unity-scene/eve-runtime-capability.json",
"scripts/run-eveunity-scene-lifecycle-smoke.ps1",
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
"scripts/run-eveunity-scene-provider-shell-smoke.ps1"
]
},
@ -1089,11 +1090,14 @@
"runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json",
"scripts/run-eveunity-scene-lifecycle-smoke.ps1",
"scripts/run-eveunity-scene-release-contract-smoke.ps1",
"scripts/run-eveunity-scene-release-artifact-smoke.ps1",
"scripts/run-eveunity-scene-provider-shell-smoke.ps1",
"scripts/run-eveunity-scene-capture-contract-smoke.ps1",
"scripts/run-eveunity-scene-capture-smoke.ps1",
"tools/eveunity/eveunity-release-contract.mjs",
"tools/eveunity/eveunity-release-contract.test.mjs",
"tools/eveunity/eveunity-release-artifact.mjs",
"tools/eveunity/eveunity-release-artifact.test.mjs",
"tools/eveunity/eveunity-capture-contract.mjs",
"tools/eveunity/eveunity-capture-contract.test.mjs",
"tools/eveunity/eveunity-scene-capture-artifact.mjs",
@ -1135,6 +1139,10 @@
{
"path": "tools/eveunity/eveunity-release-contract.test.mjs",
"contains": ["builds EveUnity scene UPM release request from package manifest", "eveunity-scene-v0.1.0", "artifacts/eveunity-scene-release/0.1.0/org.gamecult.eve.unity-scene-0.1.0.tgz"]
},
{
"path": "tools/eveunity/eveunity-release-artifact.test.mjs",
"contains": ["plans npm pack for the EveUnity scene UPM artifact", "runtimes/incubating/eve-unity-scene", "org.gamecult.eve.unity-scene-0.1.0.tgz"]
}
],
"capture": {