Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
beeed14
feat: lay foundation for macOS support
OneNoted Mar 16, 2026
9442524
feat: bootstrap native macOS preview host
OneNoted Mar 16, 2026
e15b123
fix: improve macOS preview input and smoke validation
OneNoted Mar 16, 2026
eec1ba4
feat: add cross-platform taskers launcher
OneNoted Mar 16, 2026
60bdf30
fix: polish launcher release flow
OneNoted Mar 17, 2026
49326a5
fix: harden launcher release publication
OneNoted Mar 17, 2026
3fdd8c0
fix: scrub inherited terminal env
OneNoted Mar 17, 2026
d382691
build: split Linux launcher from macOS DMG releases
OneNoted Mar 17, 2026
6ed4c82
fix: harden Linux desktop entry registration
OneNoted Mar 17, 2026
a1c9e07
chore: prepare 0.3.0 release
OneNoted Mar 17, 2026
8b1aa23
chore: validate 0.3.0 publish dry-runs
OneNoted Mar 17, 2026
1a80445
fix: stop macOS preview from pulling GTK
OneNoted Mar 17, 2026
2be6e41
fix: unblock macOS preview workflow
OneNoted Mar 17, 2026
62e260b
chore: follow up after macOS workflow unblock
OneNoted Mar 17, 2026
b2f15ce
fix: set macOS test host explicitly
OneNoted Mar 17, 2026
8852ba1
fix: bootstrap macOS preview dependencies before xcodebuild
OneNoted Mar 17, 2026
5055c33
fix: guard Ghostty pixel format for older macOS SDKs
OneNoted Mar 17, 2026
fd59853
fix: drop unsupported Ghostty pixel format enum tag
OneNoted Mar 17, 2026
f91b2fe
fix: skip Ghostty app build during macOS preview bootstrap
OneNoted Mar 17, 2026
51b23f0
fix: copy Ghostty xcframework from the actual macOS build path
OneNoted Mar 17, 2026
326051c
fix: import GhosttyKit through the xcframework module
OneNoted Mar 17, 2026
f2ad256
fix: resolve macOS host Swift compile errors
OneNoted Mar 17, 2026
eb2cefb
fix: link macOS host against system deps
OneNoted Mar 17, 2026
abc7fd9
fix: keep macOS test host alive under XCTest
OneNoted Mar 17, 2026
b2725cf
fix: preserve macOS snapshot map order
OneNoted Mar 17, 2026
e2d8d01
fix: harden macOS Ghostty teardown
OneNoted Mar 17, 2026
306c097
fix: keep macOS Ghostty launch strings alive
OneNoted Mar 17, 2026
1f6436b
fix: unblock macOS preview Swift build
OneNoted Mar 17, 2026
a21d194
fix: restore macOS modifier return value
OneNoted Mar 17, 2026
e89aad5
fix: marshal macOS Ghostty close callbacks to main
OneNoted Mar 17, 2026
d53b175
fix: keep macOS Ghostty views in stable host containers
OneNoted Mar 17, 2026
4ad7e19
fix: defer macOS Ghostty surface frees
OneNoted Mar 17, 2026
f431244
chore: trace macOS smoke lifecycle
OneNoted Mar 17, 2026
d4a41b2
chore: trace macOS smoke lifecycle via NSLog
OneNoted Mar 17, 2026
7cf44aa
fix: expose macOS debug trace helper
OneNoted Mar 17, 2026
45f9b18
fix: decouple macOS smoke test from embedded host
OneNoted Mar 17, 2026
8e71909
fix: avoid macOS test layout recursion
OneNoted Mar 17, 2026
3702120
fix: avoid macOS split view layout recursion
OneNoted Mar 17, 2026
38b06b2
chore: monitor macOS preview
OneNoted Mar 17, 2026
1150e75
fix: initialize Ghostty before macOS bootstrap
OneNoted Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions .github/workflows/macos-preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
name: macOS Preview

on:
pull_request:
push:
branches:
- main
workflow_dispatch:

jobs:
macos-preview:
strategy:
fail-fast: false
matrix:
runner:
- macos-14
- macos-15
- macos-15-intel
runs-on: ${{ matrix.runner }}

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2

- name: Install macOS build tools
run: |
brew update
brew install xcodegen zig

- name: Run shared Rust validation
run: |
cargo test -p taskers-control -p taskers-core -p taskers-macos-ffi -p taskers-paths

- name: Confirm crates.io launcher is blocked on macOS
run: |
set +e
output="$(cargo install --locked --path crates/taskers-launcher 2>&1)"
status=$?
set -e

printf '%s\n' "$output"

if [[ $status -eq 0 ]]; then
echo "expected cargo install --path crates/taskers-launcher to fail on macOS" >&2
exit 1
fi

grep -F "taskers on crates.io currently supports x86_64 Linux only" <<<"$output"
grep -F "Download the macOS DMG" <<<"$output"

- name: Generate Xcode project
run: bash scripts/generate_macos_project.sh

- name: Build and test Taskers.app
run: |
mkdir -p build/macos
set -o pipefail
xcodebuild test \
-project macos/Taskers.xcodeproj \
-scheme TaskersMac \
-configuration Debug \
-derivedDataPath build/macos/DerivedData \
-resultBundlePath build/macos/Taskers-${{ matrix.runner }}.xcresult \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
| tee build/macos/xcodebuild-test-${{ matrix.runner }}.log

- name: Sign debug app bundle
run: bash scripts/sign_macos_app.sh build/macos/DerivedData build/macos/DerivedData/Build/Products/Debug/Taskers.app

- name: Smoke launch bundled app
run: |
APP_PATH="build/macos/DerivedData/Build/Products/Debug/Taskers.app"
if [[ ! -d "${APP_PATH}" ]]; then
echo "expected app bundle at ${APP_PATH}" >&2
exit 1
fi

TASKERS_SMOKE_TEST=1 \
"${APP_PATH}/Contents/MacOS/Taskers"

- name: Package signed app
if: always()
run: |
APP_PATH="build/macos/DerivedData/Build/Products/Debug/Taskers.app"
if [[ -d "${APP_PATH}" ]]; then
ditto -c -k --sequesterRsrc --keepParent \
"${APP_PATH}" \
"build/macos/Taskers-${{ matrix.runner }}.zip"
fi

- name: Upload build artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: taskers-macos-${{ matrix.runner }}
if-no-files-found: ignore
path: |
build/macos/Taskers-${{ matrix.runner }}.zip
build/macos/Taskers-${{ matrix.runner }}.xcresult
build/macos/xcodebuild-test-${{ matrix.runner }}.log
build/macos/DerivedData/Logs/Build/*.xcactivitylog
179 changes: 179 additions & 0 deletions .github/workflows/release-assets.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
name: Release Assets

on:
push:
tags:
- "v*"
workflow_dispatch:

permissions:
contents: write

jobs:
linux-bundle:
runs-on: ubuntu-latest

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2

- name: Install Linux bundle tools
run: |
sudo apt-get update
sudo apt-get install -y zig xvfb libgtk-4-dev libadwaita-1-dev

- name: Build Linux bundle
run: bash scripts/build_linux_bundle.sh

- name: Run Linux smoke checks
run: |
bash scripts/smoke_taskers_ui.sh
bash scripts/smoke_taskers_focus_churn.sh
bash scripts/smoke_linux_release_launcher.sh

- name: Upload Linux bundle
uses: actions/upload-artifact@v4
with:
name: linux-bundle
path: dist/taskers-linux-bundle-v*.tar.xz

macos-universal-dmg:
runs-on: macos-15
env:
TASKERS_MACOS_CERTIFICATE_P12_BASE64: ${{ secrets.TASKERS_MACOS_CERTIFICATE_P12_BASE64 }}
TASKERS_MACOS_CERTIFICATE_PASSWORD: ${{ secrets.TASKERS_MACOS_CERTIFICATE_PASSWORD }}
TASKERS_MACOS_CODESIGN_IDENTITY: ${{ secrets.TASKERS_MACOS_CODESIGN_IDENTITY }}
TASKERS_MACOS_NOTARY_APPLE_ID: ${{ secrets.TASKERS_MACOS_NOTARY_APPLE_ID }}
TASKERS_MACOS_NOTARY_TEAM_ID: ${{ secrets.TASKERS_MACOS_NOTARY_TEAM_ID }}
TASKERS_MACOS_NOTARY_PASSWORD: ${{ secrets.TASKERS_MACOS_NOTARY_PASSWORD }}

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache Rust artifacts
uses: Swatinem/rust-cache@v2

- name: Install macOS build tools
run: |
brew update
brew install xcodegen zig

- name: Validate macOS release credentials
run: |
missing=0
for name in \
TASKERS_MACOS_CERTIFICATE_P12_BASE64 \
TASKERS_MACOS_CERTIFICATE_PASSWORD \
TASKERS_MACOS_CODESIGN_IDENTITY \
TASKERS_MACOS_NOTARY_APPLE_ID \
TASKERS_MACOS_NOTARY_TEAM_ID \
TASKERS_MACOS_NOTARY_PASSWORD; do
if [[ -z "${!name:-}" ]]; then
echo "::error::Missing required secret ${name}"
missing=1
fi
done

if [[ $missing -ne 0 ]]; then
exit 1
fi

- name: Install Developer ID certificate
run: bash scripts/install_macos_codesign_certificate.sh

- name: Generate Xcode project
run: bash scripts/generate_macos_project.sh

- name: Build universal Taskers.app
run: |
xcodebuild build \
-project macos/Taskers.xcodeproj \
-scheme TaskersMac \
-configuration Release \
-derivedDataPath build/macos/DerivedData \
ARCHS="arm64 x86_64" \
ONLY_ACTIVE_ARCH=NO \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO

- name: Sign universal Taskers.app
run: bash scripts/sign_macos_app.sh

- name: Build universal DMG
run: bash scripts/build_macos_dmg.sh

- name: Notarize and staple universal DMG
run: |
version="$(sed -n 's/^version = \"\\(.*\\)\"/\\1/p' Cargo.toml | head -n1)"
bash scripts/notarize_macos_dmg.sh "dist/Taskers-v${version}-universal2.dmg"

- name: Upload universal DMG
uses: actions/upload-artifact@v4
with:
name: macos-universal-dmg
path: dist/Taskers-v*-universal2.dmg

release-manifest:
needs:
- linux-bundle
runs-on: ubuntu-latest

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Download built assets
uses: actions/download-artifact@v4
with:
path: dist

- name: Flatten downloaded artifacts
run: |
mkdir -p dist/release
find dist -type f -exec cp {} dist/release/ \;

- name: Build release manifest
run: python3 scripts/build_release_manifest.py --dist-dir dist/release

- name: Upload release manifest
uses: actions/upload-artifact@v4
with:
name: release-manifest
path: dist/release/taskers-manifest-v*.json

upload-github-release:
if: startsWith(github.ref, 'refs/tags/v')
needs:
- release-manifest
- macos-universal-dmg
runs-on: ubuntu-latest

steps:
- name: Download built assets
uses: actions/download-artifact@v4
with:
path: dist

- name: Flatten downloaded artifacts
run: |
mkdir -p dist/release
find dist -type f -exec cp {} dist/release/ \;

- name: Create draft GitHub release with assets
uses: softprops/action-gh-release@v2
with:
draft: true
files: |
dist/release/taskers-manifest-v*.json
dist/release/taskers-linux-bundle-v*.tar.xz
dist/release/Taskers-v*-universal2.dmg
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
build/
dist/
build/
macos/Taskers.xcodeproj/
Loading
Loading