$ErrorActionPreference = "Stop" $requiredFiles = @( "backend/package.json", "backend/package-lock.json", "backend/tsconfig.json", "backend/.env.example", "backend/src/app.ts", "backend/src/config.ts", "backend/src/routes/health.ts", "backend/src/server.ts", "backend/tests/backend-contract.test.mjs", "deploy/pm2/ecosystem.config.cjs" ) foreach ($path in $requiredFiles) { if (-not (Test-Path $path)) { throw "Required backend file missing: $path" } } & npm --prefix backend test if ($LASTEXITCODE -ne 0) { throw "backend contract test failed" } & npm --prefix backend run build if ($LASTEXITCODE -ne 0) { throw "backend build failed" } $oldHost = $env:QIPAI_API_HOST $oldPort = $env:QIPAI_API_PORT $oldVersion = $env:QIPAI_API_VERSION $env:QIPAI_API_HOST = "127.0.0.1" $env:QIPAI_API_PORT = "3101" $env:QIPAI_API_VERSION = "0.1.0-test" $server = $null try { $server = Start-Process -FilePath node -ArgumentList "dist/server.js" -WorkingDirectory "backend" -PassThru -WindowStyle Hidden $appHealth = $null $adminHealth = $null for ($attempt = 0; $attempt -lt 20; $attempt++) { try { $appHealth = Invoke-RestMethod -Uri "http://127.0.0.1:3101/app-api/health" -Headers @{ "x-trace-id" = "codex-health-app" } $adminHealth = Invoke-RestMethod -Uri "http://127.0.0.1:3101/admin-api/health" -Headers @{ "x-trace-id" = "codex-health-admin" } break } catch { if ($server.HasExited) { throw "backend server exited before health checks completed" } Start-Sleep -Milliseconds 500 } } if (-not $appHealth -or -not $adminHealth) { throw "backend health checks did not respond" } if (-not $appHealth.ok -or $appHealth.service -ne "qipai-api" -or $appHealth.traceId -ne "codex-health-app") { throw "app health response mismatch" } if (-not $adminHealth.ok -or $adminHealth.service -ne "qipai-api" -or $adminHealth.traceId -ne "codex-health-admin") { throw "admin health response mismatch" } } finally { if ($server -and -not $server.HasExited) { Stop-Process -Id $server.Id -Force } $env:QIPAI_API_HOST = $oldHost $env:QIPAI_API_PORT = $oldPort $env:QIPAI_API_VERSION = $oldVersion } Write-Host "PASS: backend M01-A build and HTTP health checks passed."