diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 93a7da8..8feab20 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -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 diff --git a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json index 6e255fd..ba87f5b 100644 --- a/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json +++ b/runtimes/incubating/eve-unity-scene/eve-runtime-capability.json @@ -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." diff --git a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json index 6da3300..64e2ef0 100644 --- a/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json +++ b/runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json @@ -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.", diff --git a/scripts/run-eveunity-release-artifact-smoke.ps1 b/scripts/run-eveunity-release-artifact-smoke.ps1 index 18a1123..fcc53d7 100644 --- a/scripts/run-eveunity-release-artifact-smoke.ps1 +++ b/scripts/run-eveunity-release-artifact-smoke.ps1 @@ -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) { diff --git a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 index edf38c6..b41d91d 100644 --- a/scripts/run-eveunity-scene-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-scene-lifecycle-smoke.ps1 @@ -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") diff --git a/scripts/run-eveunity-scene-release-artifact-smoke.ps1 b/scripts/run-eveunity-scene-release-artifact-smoke.ps1 new file mode 100644 index 0000000..b76bee3 --- /dev/null +++ b/scripts/run-eveunity-scene-release-artifact-smoke.ps1 @@ -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" +} diff --git a/scripts/run-eveunity-scene-release-contract-smoke.ps1 b/scripts/run-eveunity-scene-release-contract-smoke.ps1 index a6151c7..38e7e0f 100644 --- a/scripts/run-eveunity-scene-release-contract-smoke.ps1 +++ b/scripts/run-eveunity-scene-release-contract-smoke.ps1 @@ -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" } diff --git a/scripts/run-eveunity-scene-split-handoff-smoke.ps1 b/scripts/run-eveunity-scene-split-handoff-smoke.ps1 index a7778d9..3808f06 100644 --- a/scripts/run-eveunity-scene-split-handoff-smoke.ps1 +++ b/scripts/run-eveunity-scene-split-handoff-smoke.ps1 @@ -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" } diff --git a/scripts/run-parity-harness.ps1 b/scripts/run-parity-harness.ps1 index 38ec27b..964dd7a 100644 --- a/scripts/run-parity-harness.ps1 +++ b/scripts/run-parity-harness.ps1 @@ -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") diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index a361025..1005577 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -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" ` diff --git a/scripts/run-split-target-conformance-consumer-smoke.ps1 b/scripts/run-split-target-conformance-consumer-smoke.ps1 index 1d988a7..9c4ca62 100644 --- a/scripts/run-split-target-conformance-consumer-smoke.ps1 +++ b/scripts/run-split-target-conformance-consumer-smoke.ps1 @@ -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 ` diff --git a/tools/eveunity/eveunity-release-artifact.test.mjs b/tools/eveunity/eveunity-release-artifact.test.mjs index eb0ccd5..c2561b6 100644 --- a/tools/eveunity/eveunity-release-artifact.test.mjs +++ b/tools/eveunity/eveunity-release-artifact.test.mjs @@ -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 }); diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 88a8bbf..22427e3 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -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": {