Merge pull request #14 from JayeMcC/feat/live-model-error-tracking #118
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: 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 |