# Quick static checks for the release pipeline (seconds, no Rust build): workflow syntax, the # packaging shell and PowerShell scripts, and the Linux desktop/AppStream/Flatpak metadata. # Adapted from PhotoCraft's (storytold/photocraft, Apache-2.0; see ATTRIBUTION.md). name: Packaging lint on: push: branches: [main] paths: [".github/workflows/**", "packaging/**", "assets/**"] pull_request: paths: [".github/workflows/**", "packaging/**", "assets/platforms/**"] workflow_dispatch: permissions: contents: read concurrency: group: packaging-lint-${{ github.ref }} cancel-in-progress: true jobs: lint: runs-on: ubuntu-latest env: ACTIONLINT_VERSION: 1.7.12 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Install tools run: | sudo apt-get update sudo apt-get install -y --no-install-recommends shellcheck desktop-file-utils appstream libxml2-utils python3-yaml jq curl -fsSL "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" \ | tar -xz -C "$RUNNER_TEMP" actionlint - name: actionlint run: '"$RUNNER_TEMP/actionlint" -color' - name: shellcheck run: shellcheck packaging/*.sh packaging/*/*.sh packaging/linux/AppRun - name: Nightly release selection regression run: python3 packaging/tests/nightly_test.py - name: Windows executable icon validation regression run: python3 packaging/tests/windows_icon_test.py - name: Flatpak desktop smoke validation regression run: python3 packaging/tests/flatpak_test.py - name: PowerShell shell: pwsh run: | foreach ($f in Get-ChildItem packaging/windows/*.ps1) { $errors = $null [System.Management.Automation.Language.Parser]::ParseFile($f.FullName, [ref]$null, [ref]$errors) | Out-Null if ($errors) { $errors | ForEach-Object { Write-Output "::error file=$($f.Name)::$_" }; exit 1 } Write-Output "ok $($f.Name)" } - name: XML, desktop entry, AppStream, Flatpak manifest run: | xmllint --noout assets/platforms/windows/solidcraft.wxs assets/platforms/windows/solidcraft.en-us.wxl assets/platforms/macos/*.plist* assets/platforms/linux/*.xml* desktop-file-validate assets/platforms/linux/ai.storyteller.solidcraft.desktop # The window's X11 class is its app id; the old id stays only as the rename shims. grep -qx 'StartupWMClass=ai.storyteller.solidcraft' assets/platforms/linux/ai.storyteller.solidcraft.desktop grep -q 'ai.storyteller.solvecraft' assets/platforms/linux/ai.storyteller.solidcraft.metainfo.xml.in grep -qF -e '--end-of-life-rebase=' packaging/flatpak-site.sh sed -e 's/@VERSION@/0.0.0/' -e 's/@DATE@/2026-01-01/' assets/platforms/linux/ai.storyteller.solidcraft.metainfo.xml.in >"$RUNNER_TEMP/ai.storyteller.solidcraft.metainfo.xml" appstreamcli validate --no-net --explain "$RUNNER_TEMP/ai.storyteller.solidcraft.metainfo.xml" python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/flatpak/ai.storyteller.solidcraft.bundle.yml')); assert m['id'] == 'ai.storyteller.solidcraft' and m['command'] == 'solidcraft'" python3 -c "import yaml; m = yaml.safe_load(open('packaging/linux/snap/snapcraft.yaml')); assert m['name'] == 'solidcraft' and m['confinement'] == 'strict' and m['apps']['solidcraft']['command'] == 'usr/bin/solidcraft'" python3 -m py_compile packaging/linux/snap-smoke.py