Skip to content

Merge pull request #14 from JayeMcC/feat/live-model-error-tracking #118

Merge pull request #14 from JayeMcC/feat/live-model-error-tracking

Merge pull request #14 from JayeMcC/feat/live-model-error-tracking #118

Workflow file for this run

name: E2E (macOS)
on:
push:
branches: ['main', 'dev', 'feature/**']
workflow_dispatch:
jobs:
e2e-macos:
runs-on: macos-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri
- name: Install Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: npm
- name: Install root frontend dependencies
run: npm ci
- name: Build maiTerm (debug)
# Debug build for speed (~5min vs ~15min release). The MCP server +
# tab/PTY paths the E2E suite exercises are identical to release.
# --no-bundle skips the .app/.dmg packaging; we run the raw binary
# at src-tauri/target/debug/aiterm directly.
run: npx tauri build --debug --no-bundle
- name: Install E2E dependencies
working-directory: tests/e2e
run: npm install --no-audit --no-fund
- name: Typecheck E2E
working-directory: tests/e2e
run: npm run typecheck
- name: Run E2E suite
working-directory: tests/e2e
env:
MAITERM_BINARY: ${{ github.workspace }}/src-tauri/target/debug/aiterm
# The createWindow test asserts frontendReady=true, which fails
# deterministically if the loading spinner never flips (the blank-
# white-window regression this suite was extended to catch).
run: npm test
# Visual sanity check for the "new window renders" story. The
# createWindow test already proves it via a DOM round-trip
# (frontendReady=true), but a screenshot as an artifact lets a human
# eyeball what the CI runner actually saw — useful when future
# regressions produce a *partially* blank window that still passes
# the DOM check. Screenshot runs even on success so we always have a
# baseline; failure keeps the artifact + logs.
- name: Capture screen for visual verification
if: always()
run: |
mkdir -p artifacts
# `screencapture -x` = silent, no shutter sound. -t png explicit.
# macos-latest runners have a WindowServer available in headless
# mode so a screen capture yields a real render, not black.
screencapture -x -t png artifacts/screen-after-e2e.png || \
echo "screencapture unavailable (headless runner without WindowServer)"
- name: Upload E2E artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: maiterm-e2e-artifacts
# tauri-plugin-log follows the Tauri identifier — which now varies
# by build (see state/persistence.rs::log_dir_slug):
# debug → com.aiterm.dev2
# release → com.aiterm.app2
# This CI job builds --debug, so logs land in com.aiterm.dev2/.
# The other two paths are uploaded defensively so a partial
# regression (fell back to the wrong slug) isn't invisible.
path: |
~/Library/Logs/com.aiterm.dev2/
~/Library/Logs/com.aiterm.app2/
~/Library/Logs/com.aiterm.app/
~/.claude/ide/
artifacts/
if-no-files-found: ignore