name: Build & Release # Trigger on version tags (e.g. git tag v1.0.0 && git push --tags) on: push: tags: - "v*" # Manual run from Actions tab (useful for testing the workflow itself) workflow_dispatch: jobs: build: strategy: fail-fast: false matrix: include: - os: macos-latest platform: macOS artifact: BetterClaudeConfig-macOS.zip - os: windows-latest platform: Windows artifact: BetterClaudeConfig-Windows.zip - os: ubuntu-latest platform: Linux artifact: BetterClaudeConfig-Linux.tar.gz runs-on: ${{ matrix.os }} name: Build (${{ matrix.platform }}) steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Python 3.12 (Linux) if: runner.os == 'Linux' uses: actions/setup-python@v5 with: python-version: "3.12" - name: Set up Python venv (macOS) if: runner.os == 'macOS' run: | PYBIN="$(command -v python3.12 || echo /opt/homebrew/bin/python3.12)" "$PYBIN" -m venv .venv echo "$PWD/.venv/bin" >> "$GITHUB_PATH" - name: Set up Python venv (Windows) if: runner.os == 'Windows' shell: pwsh run: | py -3.12 -m venv .venv Add-Content -Path $env:GITHUB_PATH -Value "$env:GITHUB_WORKSPACE\.venv\Scripts" - name: Install dependencies run: pip install -r requirements-dev.txt # macOS: build app.icns from source PNGs (iconutil is built into macOS) - name: Generate app.icns (macOS) if: runner.os == 'macOS' run: python scripts/build_icons.py # Windows: generate app.ico using Pillow (already installed via requirements-dev.txt) - name: Generate app.ico (Windows) if: runner.os == 'Windows' run: python scripts/build_icons.py - name: Build with PyInstaller run: pyinstaller bcc.spec # ── Package ────────────────────────────────────────────────────────── - name: Package (macOS) if: runner.os == 'macOS' run: | cd dist zip -r --symlinks "../${{ matrix.artifact }}" BetterClaudeConfig.app - name: Package (Windows) if: runner.os == 'Windows' shell: pwsh run: | Compress-Archive -Path dist\BetterClaudeConfig.exe ` -DestinationPath "${{ matrix.artifact }}" - name: Package (Linux) if: runner.os == 'Linux' run: | tar -czf "${{ matrix.artifact }}" -C dist BetterClaudeConfig # ── Upload artifact for the release job ────────────────────────────── - name: Upload artifact uses: actions/upload-artifact@v3 with: name: ${{ matrix.artifact }} path: ${{ matrix.artifact }} # ── Create GitHub Release with all three artifacts ────────────────────── release: name: Publish Release needs: build runs-on: ubuntu-latest # Only publish when a tag was pushed (not on workflow_dispatch without a tag) if: startsWith(github.ref, 'refs/tags/') permissions: contents: write steps: - name: Download all artifacts uses: actions/download-artifact@v3 with: path: artifacts - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: name: Better Claude Config ${{ github.ref_name }} draft: false prerelease: false generate_release_notes: false files: artifacts/**/* body: | ## Better Claude Config ${{ github.ref_name }} A GUI for managing MCP server configurations for Claude Desktop and Claude Code — no hand-editing JSON. ### Download | Platform | File | |----------|------| | macOS | `BetterClaudeConfig-macOS.zip` — unzip and drag **BetterClaudeConfig.app** to Applications | | Windows | `BetterClaudeConfig-Windows.zip` — unzip and run **BetterClaudeConfig.exe** | | Linux | `BetterClaudeConfig-Linux.tar.gz` — extract and run **BetterClaudeConfig** | ### macOS note The app is not code-signed. On first launch, right-click → **Open** to bypass Gatekeeper, or run: ``` xattr -cr /Applications/BetterClaudeConfig.app ``` ### Requirements No Python installation needed — the app is self-contained.