PakFu uses numeric-only version identifiers so Qt QVersionNumber comparisons
stay stable for updater decisions.
Rules:
VERSIONmust always be numeric dot-segments only (nov, no suffixes).- Git tags are always
v<version>. - Stable releases use
MAJOR.MINOR.PATCH. - Nightly releases use
MAJOR.MINOR.PATCH.BUILD.
Nightly version generation:
- Computed by
scripts/nightly_version.py. - Base (
MAJOR.MINOR.PATCH) is derived from Conventional Commit bump rules relative to the latest stable tag. BUILDincrements for each nightly on that base.- Nightly runs only publish when meaningful commits exist since the previous
nightly tag (
chore(release): ...commits are ignored).
Stable/beta/dev manual version generation:
- Computed by
scripts/next_version.pyforauto_version.yml.
CHANGELOG.mdremains the source of truth.- Nightly release notes include:
- The generated nightly changelog entry.
- The full
CHANGELOG.mdcontent.
- Changelog/release-note rendering scripts:
scripts/update_changelog.pyscripts/nightly_release_notes.pyscripts/release_notes.py(manual channel releases)
Packaged artifacts must follow this canonical pattern:
pakfu-<version>-<platform>-<arch>-<kind>.<ext>
Required assets per platform:
- Windows:
portable.zipandinstaller.msi - macOS:
portable.zipandinstaller.pkg - Linux:
portable.tar.gzandinstaller.AppImage
Current updater behavior prefers installer assets and falls back to portable
archives when needed.
Runtime update checks are asynchronous and do not block the main window from
opening. When the GUI updater downloads an asset, it first downloads the
matching pakfu-<version>-release-manifest.json asset and verifies the selected
package by exact asset name, byte size, and SHA-256 before opening the downloaded
folder or launching an installer handoff.
Linux portable archives are produced from the same deployed AppDir used for the
AppImage, so Qt and other runtime libraries are bundled in both Linux assets.
The archive includes a top-level pakfu launcher for extracted-directory use.
The release pipeline also emits:
pakfu-<version>-release-manifest.json(checksums + distribution metadata)CHANGELOG-<version>.md
Validation tooling:
scripts/validate_build.pyscripts/validate_release_assets.pyscripts/release_manifest.py
Nightly automation:
- Workflow:
.github/workflows/nightly.yml - Trigger: scheduled nightly + manual dispatch (
forceoptional) - Stages:
prepare: compute nightly version + change gatebuild: compile on Windows/macOS/Linuxvalidate: run CLI smoke checks on each platform build (and optionally--run-practical-qafor UI file-ops smoke checks)package: build installer + portable assets per platformrelease: tag, validate completeness, publish nightly release with full changelog context
Manual release channels:
- Workflow:
.github/workflows/auto_version.yml - Trigger: manual dispatch only
- Purpose: stable/beta/dev tagged releases from selected channel policy
Manual rebuild of an existing ref:
- Workflow:
.github/workflows/release.yml
Preview manual next version:
python scripts/next_version.py --channel devPreview nightly decision/version:
python scripts/nightly_version.py --format json