steam_packer is an independent packaging and Azure publication repository.
It accepts a normalized release plan from any non-interactive caller, assembles the packaging workspace, stages the payload and bundled toolchain, repacks deterministic platform archives, uploads them to Azure Blob Storage, and refreshes the root hagicode-steam/index.json entry without changing the downstream Steam hydration contract.
- Owns Portable Version packaging-safe workspace assembly
- Owns archive generation, artifact inventory, and checksum emission
- Owns Azure Blob publication and root-index refresh
- Exposes reusable CI and CLI entrypoints for external callers
- Keeps release metadata compatible with downstream Steam hydration consumers
portable-version is currently one caller, but steam_packer is not coupled to that repository.
The primary input is a build-plan JSON artifact. The caller is responsible for producing it.
The plan must contain:
release.tagplatforms[]platformMatrix.include[]upstream.desktop.*upstream.service.*downloads.desktop.containerUrldownloads.service.containerUrlbuild.shouldBuildbuild.forceRebuildbuild.dryRunhandoff.schema = steam-packer-handoff/v1
steam_packer validates the release plan before any workspace mutation. Missing fields fail fast at the build-plan-validation stage.
Reusable workflow:
.github/workflows/package-release.yml
Expected caller behavior:
- Produce a normalized build plan and upload it as an artifact.
- Call the reusable workflow in
steam_packer. steam_packervalidates the plan and fans out packaging by platform.steam_packerpublishes merged metadata and refreshes the Azure root index.
Manual trigger behavior:
workflow_dispatchis supported for maintainers.- Manual dispatch auto-resolves the latest Desktop index release and the latest Service index release.
- Manual dispatch defaults to the three supported publication targets:
linux-x64,win-x64, andosx-universal. - Manual dispatch only exposes
force_rebuildanddry_run; it does not require a build-plan parameter. - Manual runs still require the same Azure SAS secrets as reusable runs.
From repos/steam_packer:
npm test
npm run verify:dry-run
npm run verify:publication
npm run verify:release-planFor fixture-driven diagnostics:
node scripts/run-release-plan.mjs \
--plan /path/to/build-plan.json \
--desktop-asset-source /path/to/desktop.zip \
--service-asset-source /path/to/service.zip \
--toolchain-config /path/to/portable-toolchain.json \
--force-dry-runResult stages are attributed as:
build-plan-validationdelegated-packagingazure-publication
steam_packer preserves the existing publication layout:
hagicode-steam/<releaseTag>/<archive>.ziphagicode-steam/<releaseTag>/<releaseTag>.build-manifest.jsonhagicode-steam/<releaseTag>/<releaseTag>.artifact-inventory.jsonhagicode-steam/<releaseTag>/<releaseTag>.checksums.txthagicode-steam/index.json
The root index entry remains compatible with current Steam hydration consumers:
versionmetadata.buildManifestPathmetadata.artifactInventoryPathmetadata.checksumsPathsteamAppIdsteamDepotIds.linuxsteamDepotIds.windowssteamDepotIds.macosartifacts[]
Publication now resolves both steamAppId and steamDepotIds from the shared Steam dataset:
- default
steamAppKey:hagicode - optional override:
--steam-app-key,STEAM_PACKER_STEAM_APP_KEY, orSTEAM_APP_KEY --steam-data-pathorSTEAM_PACKER_STEAM_DATA_PATH- By default,
steam_packerdownloads the dataset fromhttps://index.hagicode.com/steam/index.json. --steam-data-path/STEAM_PACKER_STEAM_DATA_PATHremain compatibility overrides, and can point to either a local JSON file or an explicithttps://...URL.
steam_packer resolves the canonical steamAppId from applications[].key and maps applications[].platformAppIds to steamDepotIds. The resolved values are reused for dry-run output, publication result metadata, and every versions[] entry written back to hagicode-steam/index.json. Legacy entries that predate steamAppId are backfilled from the same resolved value, while any conflicting non-empty steamAppId still aborts the write.
The current Portable Version integration is documented in docs/portable-version-migration.md.