diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index 327df87..e901c82 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -65,6 +65,7 @@ powershell -ExecutionPolicy Bypass -File scripts\automation\test.ps1 -Preset des powershell -ExecutionPolicy Bypass -File scripts\automation\build.ps1 -Preset windows-msvc-default -Configuration Debug -Target pano_cli cmake --preset android-arm64 powershell -ExecutionPolicy Bypass -File scripts\automation\platform-build.ps1 -Presets android-arm64 +powershell -ExecutionPolicy Bypass -File scripts\automation\package-smoke.ps1 -Preset windows-msvc-default -Configuration Debug ``` Known local toolchain state: diff --git a/docs/modernization/debt.md b/docs/modernization/debt.md index 9ef1b01..05b3328 100644 --- a/docs/modernization/debt.md +++ b/docs/modernization/debt.md @@ -29,6 +29,7 @@ agent or engineer to remove them without reconstructing context from chat. | DEBT-0008 | Open | Modernization | `windows-msvc-default` preset is used for local validation because the VS 2026 generator is not installed here | The target VS 2026 preset must remain, but this machine configures with Visual Studio 17 2022 | `cmake --preset windows-msvc-default`; `ctest --preset desktop-fast --build-config Debug` | Validate `windows-vs2026-x64` on a machine with Visual Studio 2026 installed and make it the default Windows validation preset | | DEBT-0009 | Open | Modernization | Android root CMake validation currently builds headless targets only, not APK/package variants | Platform app entrypoints still live in legacy Gradle/CMake projects and need Phase 6 alignment | `powershell -ExecutionPolicy Bypass -File scripts\automation\platform-build.ps1 -Presets android-arm64` | Android standard, Quest, and Focus/Wave package targets consume shared component targets and have package smoke commands | | DEBT-0010 | Open | Modernization | `pp_document` is a pure layer/document model but is not yet wired to legacy `Canvas`, PPI load/save, animation frames, or undo/redo | Keep extraction incremental while preserving app behavior | `ctest --preset desktop-fast --build-config Debug`; `pano_cli create-document --width 64 --height 32 --layers 2` | Legacy document behavior is represented by `pp_document` tests and the app consumes it through a boundary/facade | +| DEBT-0011 | Open | Modernization | `package-smoke` validates the Windows CMake app artifact only, not AppX/APK/Apple/WebGL package outputs | Platform package targets are not migrated to root CMake yet | `powershell -ExecutionPolicy Bypass -File scripts\automation\package-smoke.ps1 -Preset windows-msvc-default -Configuration Debug` | Package-smoke covers Windows AppX, Android APK variants, Apple bundles, and WebGL output where local toolchains are present | ## Closed Debt diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index b9e41a8..30b71fe 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -242,10 +242,11 @@ Gate: Goal: make each component reachable by automated tools and future agents. Status: in progress. `tests/` exists, `desktop-fast` runs headlessly, and -PowerShell/bash wrappers exist for configure/build/test/analyze/platform-build. -`pano_cli` exists with JSON automation commands for creating a `pp_document` -model and inspecting image signatures; full document/app integration is -debt-tracked as DEBT-0010. +PowerShell/bash wrappers exist for +configure/build/test/analyze/platform-build/package-smoke. `pano_cli` exists +with JSON automation commands for creating a `pp_document` model and +inspecting image signatures; full document/app integration is debt-tracked as +DEBT-0010. Implementation tasks: @@ -520,6 +521,7 @@ powershell -ExecutionPolicy Bypass -File scripts\automation\test.ps1 -Preset des powershell -ExecutionPolicy Bypass -File scripts\automation\build.ps1 -Preset windows-msvc-default -Configuration Debug -Target pano_cli cmake --preset android-arm64 powershell -ExecutionPolicy Bypass -File scripts\automation\platform-build.ps1 -Presets android-arm64 +powershell -ExecutionPolicy Bypass -File scripts\automation\package-smoke.ps1 -Preset windows-msvc-default -Configuration Debug ``` Results: @@ -539,6 +541,8 @@ Results: `out/build/windows-msvc-default/Debug/PanoPainter.exe`. - PowerShell build/test automation wrappers return JSON summaries and passed local smoke checks. +- PowerShell package-smoke wrapper validates the Windows CMake app executable + and runtime `data/` copy. - Android arm64 configured with NDK 29.0.14206865 through the platform-build wrapper and compiled headless foundation/tool/test targets. - Known remaining warnings: legacy project/vendor diagnostics, Visual Studio diff --git a/scripts/automation/package-smoke.ps1 b/scripts/automation/package-smoke.ps1 new file mode 100644 index 0000000..95317f7 --- /dev/null +++ b/scripts/automation/package-smoke.ps1 @@ -0,0 +1,48 @@ +[CmdletBinding()] +param( + [string]$Preset = "windows-msvc-default", + [string]$Configuration = "Debug", + [string]$Target = "PanoPainter" +) + +$ErrorActionPreference = "Stop" +$started = Get-Date + +& cmake --build --preset $Preset --config $Configuration --target $Target +$buildExitCode = $LASTEXITCODE +if ($buildExitCode -ne 0) { + $elapsed = [int]((Get-Date) - $started).TotalMilliseconds + [ordered]@{ + command = "package-smoke" + preset = $Preset + configuration = $Configuration + target = $Target + stage = "build" + exitCode = $buildExitCode + elapsedMs = $elapsed + } | ConvertTo-Json -Compress + exit $buildExitCode +} + +$binaryDir = Join-Path (Join-Path (Join-Path (Get-Location) "out/build/$Preset") $Configuration) "$Target.exe" +$dataDir = Join-Path (Join-Path (Join-Path (Get-Location) "out/build/$Preset") $Configuration) "data" +$checks = @( + [ordered]@{ name = "executable"; path = $binaryDir; exists = Test-Path -LiteralPath $binaryDir -PathType Leaf }, + [ordered]@{ name = "data"; path = $dataDir; exists = Test-Path -LiteralPath $dataDir -PathType Container } +) + +$failed = @($checks | Where-Object { -not $_.exists }) +$exitCode = if ($failed.Count -eq 0) { 0 } else { 2 } +$elapsedMs = [int]((Get-Date) - $started).TotalMilliseconds + +[ordered]@{ + command = "package-smoke" + preset = $Preset + configuration = $Configuration + target = $Target + exitCode = $exitCode + elapsedMs = $elapsedMs + checks = $checks +} | ConvertTo-Json -Compress -Depth 5 + +exit $exitCode diff --git a/scripts/automation/package-smoke.sh b/scripts/automation/package-smoke.sh new file mode 100644 index 0000000..551eec4 --- /dev/null +++ b/scripts/automation/package-smoke.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh +set -u + +preset="${1:-linux-clang}" +configuration="${2:-Debug}" +target="${3:-PanoPainter}" +artifact="${4:-out/build/$preset/$target}" +start="$(date +%s)" + +cmake --build --preset "$preset" --config "$configuration" --target "$target" +build_exit="$?" +if [ "$build_exit" -ne 0 ]; then + end="$(date +%s)" + elapsed_ms="$(( (end - start) * 1000 ))" + printf '{"command":"package-smoke","preset":"%s","configuration":"%s","target":"%s","stage":"build","exitCode":%s,"elapsedMs":%s}\n' "$preset" "$configuration" "$target" "$build_exit" "$elapsed_ms" + exit "$build_exit" +fi + +if [ -e "$artifact" ]; then + exit_code=0 +else + exit_code=2 +fi + +end="$(date +%s)" +elapsed_ms="$(( (end - start) * 1000 ))" +printf '{"command":"package-smoke","preset":"%s","configuration":"%s","target":"%s","artifact":"%s","exists":%s,"exitCode":%s,"elapsedMs":%s}\n' "$preset" "$configuration" "$target" "$artifact" "$([ "$exit_code" -eq 0 ] && printf true || printf false)" "$exit_code" "$elapsed_ms" +exit "$exit_code"