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. scripts/sync_doc_versions.pykeeps the README version badge and current documentation version declarations aligned withVERSION.
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.- Release notes are user-facing summaries generated from the current release's changelog entry, not full historical changelog dumps.
- Technical-only changes are omitted unless they affect downloads, installs, startup behavior, performance, memory use, format support, previews, archive behavior, or CLI workflows.
- Related commits should be grouped into one user benefit instead of listed as separate implementation steps.
- New game support and filetype support must be kept in the summary even when the implementation spans loaders, viewers, file associations, fixtures, and documentation. Collapse the work into a format-focused user benefit instead of dropping it as internal plumbing.
- Vague roll-up commits are summarized from their touched product areas as well as their subject line, so broad implementation commits can still produce a few useful collapsed bullets.
- 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 AppDir also carries the PakFu desktop entry, shared-mime-info package,
AppStream metadata, and hicolor icon so AppImage/desktop integration can expose
the same supported file types as the app.
macOS bundles declare PakFu document types in Contents/Info.plist, and Windows
builds keep file associations user-managed through the in-app Open With
registration UI.
The release pipeline also emits:
pakfu-<version>-release-manifest.json(checksums + distribution metadata)
Standalone raw binaries (pakfu, pakfu.exe) and standalone changelog assets
(CHANGELOG-<version>.md) are not release assets. scripts/validate_release_assets.py
fails the release if unexpected files are present in dist.
Each installer and portable package includes a packaged HTML user guide generated
from the user-facing sections of README.md by scripts/build_user_guide.py.
The guide is stored where users expect product documentation:
- Windows portable/MSI payload:
Documentation/index.html - macOS portable archive:
Documentation/index.htmlbesidePakFu.app - macOS installer app bundle:
PakFu.app/Contents/Resources/Documentation/index.html - Linux portable archive:
Documentation/index.htmlat the archive root, plus/usr/share/doc/pakfu/index.htmlin the bundled runtime tree - Linux AppImage:
/usr/share/doc/pakfu/index.htmlinside the AppDir
Validation tooling:
scripts/sync_doc_versions.pyscripts/validate_build.pyscripts/validate_release_assets.pyscripts/release_manifest.pyscripts/build_user_guide.py
scripts/validate_build.py treats the CLI as a platform contract. In addition
to version/help checks, it runs --platform-report and --plugin-report so
packaged binaries prove their runtime paths, extension discovery, and
integration diagnostics are available on every supported OS.
Pull request gates:
- Workflow:
.github/workflows/pr-ci.yml - Trigger: pull requests, pushes to
main, and manual dispatch - Required checks to configure in branch protection:
build-test-windows-latestbuild-test-macos-latestbuild-test-ubuntu-latestsanitize-and-fuzzfrom.github/workflows/hardening.yml
- Coverage: each platform configures a non-packaging Meson build, compiles the app and core tests, runs the support-matrix fixture explicitly, runs the full Meson test suite, and validates the CLI binary including platform and extension diagnostics. The hardening gate runs the sanitizer/libFuzzer smoke build where Clang support is available.
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 plus--platform-report/--plugin-reporton 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 curated user-facing notes
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 jsonCheck documentation version declarations:
python scripts/sync_doc_versions.py --checkPreview the packaged HTML user guide:
python scripts/build_user_guide.py --output dist/Documentation