Merge pull request #5605 from nodetool-ai/claude/anti-slop-ui-primiti… #2649
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Flatpak CI | |
| # Triggers: workflow_dispatch and push to main (non-blocking) | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| paths: | |
| - 'electron/**' | |
| - 'web/**' | |
| - '.github/workflows/flatpak-ci.yml' | |
| # No special permissions required for build-only mode | |
| permissions: | |
| contents: read | |
| jobs: | |
| build-flatpak: | |
| name: Build Flatpak | |
| runs-on: ubuntu-latest | |
| # Use Flatpak-capable container | |
| container: | |
| image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-24.08 | |
| options: --privileged | |
| # Prevent node-gyp header extraction from calling fchown, which fails in | |
| # overlayfs/container filesystems with "TAR_ENTRY_ERROR EINVAL: invalid | |
| # argument, fchown". These vars are picked up by npm regardless of whether | |
| # npm is invoked directly or through flatpak-builder. | |
| env: | |
| npm_config_tar_ignore_ownership: "true" | |
| npm_config_unsafe_perm: "true" | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v7 | |
| with: | |
| # Fetch full history for proper versioning | |
| fetch-depth: 0 | |
| - name: Set up build environment | |
| run: | | |
| # Generate machine-id required by rofiles-fuse/dbus during flatpak-builder | |
| dbus-uuidgen | tee /etc/machine-id | |
| # Start D-Bus session daemon for headless CI environment | |
| mkdir -p /run/dbus | |
| dbus-daemon --system --fork || true | |
| eval $(dbus-launch --sh-syntax) || true | |
| # Display environment info | |
| echo "Building Flatpak for commit: ${GITHUB_SHA:0:8}" | |
| echo "Branch: ${GITHUB_REF_NAME}" | |
| flatpak --version | |
| flatpak-builder --version | |
| - name: Cache Flatpak SDK and runtime | |
| uses: actions/cache@v6 | |
| with: | |
| path: | | |
| ~/.local/share/flatpak | |
| key: flatpak-sdk-${{ runner.os }}-24.08-${{ hashFiles('electron/ai.nodetool.NodeTool.flatpak.yml') }} | |
| restore-keys: | | |
| flatpak-sdk-${{ runner.os }}-24.08- | |
| flatpak-sdk-${{ runner.os }}- | |
| - name: Cache node_modules | |
| uses: actions/cache@v6 | |
| with: | |
| path: | | |
| web/node_modules | |
| electron/node_modules | |
| ~/.npm | |
| key: node-modules-${{ runner.os }}-${{ hashFiles('package-lock.json') }} | |
| restore-keys: | | |
| node-modules-${{ runner.os }}- | |
| - name: Install Flatpak dependencies | |
| run: | | |
| # Add Flathub repository | |
| flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo | |
| # Install required runtime and SDK | |
| flatpak install --user -y flathub org.freedesktop.Platform//24.08 | |
| flatpak install --user -y flathub org.freedesktop.Sdk//24.08 | |
| flatpak install --user -y flathub org.electronjs.Electron2.BaseApp//24.08 | |
| - name: Validate Flatpak manifest | |
| run: | | |
| # Check manifest syntax | |
| if ! flatpak-builder --show-manifest electron/ai.nodetool.NodeTool.flatpak.yml > /dev/null 2>&1; then | |
| echo "ERROR: Flatpak manifest validation failed" | |
| exit 1 | |
| fi | |
| echo "Manifest validation passed" | |
| - name: Build Flatpak | |
| id: build | |
| run: | | |
| # Create build directory | |
| mkdir -p build-dir | |
| # Build Flatpak | |
| flatpak-builder \ | |
| --user \ | |
| --install-deps-from=flathub \ | |
| --force-clean \ | |
| --disable-rofiles-fuse \ | |
| --repo=flatpak-repo \ | |
| build-dir \ | |
| electron/ai.nodetool.NodeTool.flatpak.yml | |
| # Check build success | |
| if [ $? -ne 0 ]; then | |
| echo "ERROR: Flatpak build failed" | |
| exit 1 | |
| fi | |
| echo "Flatpak build completed successfully" | |
| - name: Create Flatpak bundle | |
| id: bundle | |
| run: | | |
| # Generate artifact name with commit SHA and architecture | |
| COMMIT_SHA="${GITHUB_SHA:0:8}" | |
| ARCH="x86_64" | |
| BUNDLE_NAME="nodetool-${COMMIT_SHA}-${ARCH}.flatpak" | |
| # Create bundle from repository | |
| flatpak build-bundle \ | |
| flatpak-repo \ | |
| "${BUNDLE_NAME}" \ | |
| ai.nodetool.NodeTool \ | |
| stable | |
| # Verify bundle was created | |
| if [ ! -f "${BUNDLE_NAME}" ]; then | |
| echo "ERROR: Failed to create Flatpak bundle" | |
| exit 1 | |
| fi | |
| # Get bundle size | |
| BUNDLE_SIZE=$(du -h "${BUNDLE_NAME}" | cut -f1) | |
| echo "Bundle created: ${BUNDLE_NAME} (${BUNDLE_SIZE})" | |
| # Set output for artifact upload | |
| echo "bundle_name=${BUNDLE_NAME}" >> $GITHUB_OUTPUT | |
| echo "bundle_path=${BUNDLE_NAME}" >> $GITHUB_OUTPUT | |
| - name: Upload Flatpak artifact | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: ${{ steps.bundle.outputs.bundle_name }} | |
| path: ${{ steps.bundle.outputs.bundle_path }} | |
| retention-days: 30 | |
| if-no-files-found: error | |
| - name: Build summary | |
| if: always() | |
| run: | | |
| echo "## Flatpak Build Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Commit**: ${GITHUB_SHA:0:8}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Branch**: ${GITHUB_REF_NAME}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Status**: ${{ job.status }}" >> $GITHUB_STEP_SUMMARY | |
| if [ "${{ steps.bundle.outputs.bundle_name }}" != "" ]; then | |
| echo "- **Artifact**: ${{ steps.bundle.outputs.bundle_name }}" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### Installation" >> $GITHUB_STEP_SUMMARY | |
| echo '```bash' >> $GITHUB_STEP_SUMMARY | |
| echo "# Download the artifact from GitHub Actions" >> $GITHUB_STEP_SUMMARY | |
| echo "# Then install with:" >> $GITHUB_STEP_SUMMARY | |
| echo "flatpak install --user ${{ steps.bundle.outputs.bundle_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "flatpak run ai.nodetool.NodeTool" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY |