Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
0bafcc5
test: cover nuclear review correctness regressions
arzafran Jul 10, 2026
0f91008
fix: enforce correctness boundaries from nuclear review
arzafran Jul 10, 2026
776c5c8
test: cover review concurrency and wrapper regressions
arzafran Jul 10, 2026
8157231
test: cover stale focus transition ownership
arzafran Jul 10, 2026
249a99c
test: let unit regressions run before artifact guard
arzafran Jul 10, 2026
f70f7c5
ci: gate expensive suites on unit tests
arzafran Jul 10, 2026
9e9bd4a
fix: isolate concurrent focus and remote sessions
arzafran Jul 10, 2026
fca0756
test: cover lazy CLI dispatch and cache locking
arzafran Jul 10, 2026
d54c891
refactor: harden CLI cache and dependency boundaries
arzafran Jul 10, 2026
cf542e6
test: cover reload and CI runner boundaries
arzafran Jul 10, 2026
62b97ec
fix: propagate CI failures and normalize reloads
arzafran Jul 10, 2026
a9427cd
test: enforce exhaustive CLI and password boundaries
arzafran Jul 10, 2026
317886a
test: let CLI regressions run before unit bundle
arzafran Jul 10, 2026
187cf3c
test: keep CLI sockets within macOS path limits
arzafran Jul 10, 2026
d8b66a2
fix: validate every CLI boundary before connecting
arzafran Jul 10, 2026
9680a55
refactor: remove audit debt and warning-only guards
arzafran Jul 10, 2026
a756dde
fix: isolate release helper entitlements
arzafran Jul 10, 2026
9af30ad
ci: isolate CLI regression artifacts
arzafran Jul 10, 2026
9b65334
ci: isolate stateful unit tests
arzafran Jul 10, 2026
da8b1be
ci: gate expensive suites and split stateful unit tests
arzafran Jul 10, 2026
c021e3e
fix: allow dragging the window from the sidebar's empty area
lsoengas Jul 10, 2026
4a8ae57
ci: speed up release-critical workflows and gate non-essential tests
arzafran Jul 10, 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
22 changes: 21 additions & 1 deletion .github/workflows/build-ghosttykit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,25 @@ on:
push:
branches:
- main
paths:
- "ghostty/**"
- ".gitmodules"
- "scripts/ensure-ghosttykit.sh"
- "scripts/download-prebuilt-ghosttykit.sh"
- "scripts/update-ghosttykit.sh"
- ".github/workflows/build-ghosttykit.yml"
pull_request:
paths:
- "ghostty/**"
- ".gitmodules"
- "scripts/ensure-ghosttykit.sh"
- "scripts/download-prebuilt-ghosttykit.sh"
- "scripts/update-ghosttykit.sh"
- ".github/workflows/build-ghosttykit.yml"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
cancel-in-progress: true

jobs:
build-ghosttykit:
Expand Down Expand Up @@ -93,6 +107,12 @@ jobs:
set -euo pipefail
rm -rf GhosttyKit.xcframework
cp -R ghostty/macos/GhosttyKit.xcframework GhosttyKit.xcframework
ARCHIVE="$(find GhosttyKit.xcframework -type f -name 'libghostty.a' -print -quit)"
if [ -z "$ARCHIVE" ]; then
echo "GhosttyKit.xcframework does not contain libghostty.a" >&2
exit 1
fi
./scripts/verify-release-architectures.sh "$ARCHIVE"
tar czf GhosttyKit.xcframework.tar.gz GhosttyKit.xcframework

- name: Upload xcframework release
Expand Down
132 changes: 88 additions & 44 deletions .github/workflows/ci-macos-compat.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,97 @@
name: macOS Compatibility

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

on:
push:
branches:
- main
pull_request:
paths:
- "Sources/**"
- "CLI/**"
- "daemon/**"
- "programaTests/**"
- "vendor/**"
- "scripts/**"
- ".github/workflows/ci-macos-compat.yml"
- "GhosttyTabs.xcodeproj/**"
- "ghostty/**"
- ".gitmodules"

workflow_dispatch:

jobs:
change-detection:
runs-on: ubuntu-latest
outputs:
run_compat_tests: ${{ steps.detect.outputs.run_compat_tests }}
steps:
- name: Checkout
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
fetch-depth: 0

- name: Detect changed files
id: detect
run: |
set -euo pipefail

if [[ "${{ github.event_name }}" != "pull_request" ]]; then
echo "run_compat_tests=true" >> "$GITHUB_OUTPUT"
exit 0
fi

BASE_SHA="${{ github.event.pull_request.base.sha }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
git fetch --no-tags --depth=1 origin "${BASE_SHA}" "${HEAD_SHA}"
CHANGED_FILES="$(git diff --name-only "${BASE_SHA}...${HEAD_SHA}")"
RUN_COMPAT_TESTS=false
if [[ -z "${CHANGED_FILES}" ]]; then
RUN_COMPAT_TESTS=true
fi

while IFS= read -r path; do
[[ -z "$path" ]] && continue

case "$path" in
*.md|docs/*|plans/*|AGENTS.md|CHANGELOG.md|PROJECTS.md|TODO.md|README.md|LICENSE*|THIRD_PARTY_LICENSES.md|.editorconfig|.gitattributes|.gitignore|*.png|*.jpg|*.jpeg|*.gif|*.webp|*.svg)
continue
;;
.github/*)
continue
;;
Resources/*.xcstrings|Resources/*/*.xcstrings|Resources/*.strings|Resources/*/*.strings|Resources/*.lproj/*)
continue
;;
*)
RUN_COMPAT_TESTS=true
break
;;
esac
done <<< "$CHANGED_FILES"

echo "run_compat_tests=${RUN_COMPAT_TESTS}" >> "$GITHUB_OUTPUT"

{
echo "### CI scope decision"
if [[ "$RUN_COMPAT_TESTS" == "true" ]]; then
echo "Changed file set contains app-relevant changes; running compat matrix."
else
echo "Pull request appears docs/localization-only; skipping compatibility matrix."
fi
echo ""
echo "Changed files:"
if [[ -z "${CHANGED_FILES}" ]]; then
echo "- <none>"
else
printf '%s\n' "${CHANGED_FILES}"
fi
} >> "$GITHUB_STEP_SUMMARY"
compat-tests:
needs: change-detection
if: needs.change-detection.outputs.run_compat_tests == 'true'
strategy:
fail-fast: false
fail-fast: true
matrix:
include:
- os: macos-15
Expand Down Expand Up @@ -121,47 +203,9 @@ jobs:
- name: Run unit tests
env:
PROGRAMA_SKIP_ZIG_BUILD: ${{ matrix.skip_zig && '1' || '0' }}
PROGRAMA_UNIT_TEST_SCOPE: split-stateful
run: |
set -euo pipefail
SOURCE_PACKAGES_DIR="$PWD/.ci-source-packages"
run_unit_tests() {
xcodebuild -project GhosttyTabs.xcodeproj -scheme programa-unit -configuration Debug \
-clonedSourcePackagesDirPath "$SOURCE_PACKAGES_DIR" \
-disableAutomaticPackageResolution \
-destination "platform=macOS" \
-skip-testing:programaTests/AppDelegateShortcutRoutingTests/testCmdWClosesWindowWhenClosingLastSurfaceInLastWorkspace \
test 2>&1
}

set +e
run_unit_tests | tee /tmp/test-output.txt
EXIT_CODE=${PIPESTATUS[0]}
OUTPUT=$(cat /tmp/test-output.txt)
set -e

# SwiftPM binary artifact resolution can occasionally fail on ephemeral
# runners. Retry once after clearing caches.
if [ "$EXIT_CODE" -ne 0 ] && echo "$OUTPUT" | grep -q "Could not resolve package dependencies"; then
echo "SwiftPM package resolution failed, clearing caches and retrying once"
rm -rf ~/Library/Caches/org.swift.swiftpm
mkdir -p ~/Library/Caches/org.swift.swiftpm
rm -rf ~/Library/Developer/Xcode/DerivedData/GhosttyTabs-*
set +e
run_unit_tests | tee /tmp/test-output.txt
EXIT_CODE=${PIPESTATUS[0]}
OUTPUT=$(cat /tmp/test-output.txt)
set -e
fi

if [ "$EXIT_CODE" -ne 0 ]; then
SUMMARY=$(echo "$OUTPUT" | grep "Executed.*tests.*with.*failures" | tail -1)
if echo "$SUMMARY" | grep -q "(0 unexpected)"; then
echo "All failures are expected, treating as pass"
else
echo "Unexpected test failures detected"
exit 1
fi
fi
./scripts/ci-run-unit-tests.sh

- name: Create virtual display
if: matrix.smoke
Expand Down
Loading
Loading