name: Terminal IME E2E on: # Why workflow_call and not pull_request: pr.yml owns the path filter that decides when an IME # change is worth a real ibus session. A pull_request trigger here would run it on every PR. workflow_call: workflow_dispatch: schedule: - cron: '30 9 * * *' permissions: contents: read jobs: linux-x11: name: Linux X11 terminal IME runs-on: ubuntu-22.04 timeout-minutes: 25 steps: - name: Checkout uses: actions/checkout@v6 with: persist-credentials: false - name: Install native build and IME tools run: >- sudo apt-get update && sudo apt-get install -y build-essential dbus-x11 dconf-gsettings-backend ibus ibus-hangul libglib2.0-bin python3 xdotool xfwm4 xvfb - name: Setup Node.js uses: actions/setup-node@v6 with: node-version-file: package.json - name: Setup pnpm uses: pnpm/setup@v2 with: install: false - name: Use external node-gyp to avoid pnpm bundled copy run: | npm install -g node-gyp@11.5.0 echo "npm_config_node_gyp=$(npm root -g)/node-gyp/bin/node-gyp.js" >> "$GITHUB_ENV" - name: Install dependencies run: pnpm install --frozen-lockfile - name: Build Electron app for E2E run: pnpm exec electron-vite build --mode e2e - name: Run deterministic terminal IME boundary tests run: >- xvfb-run --auto-servernum env SKIP_BUILD=1 ORCA_E2E_FORWARD_APP_LOGS=1 pnpm run test:e2e -- tests/e2e/terminal-ime-exact-byte.spec.ts --workers=1 - name: Run native IBus Hangul exact-byte tests # Why not the default success(): the synthetic step above runs first, so its failure used # to skip this one entirely — the real-IME half reported nothing on exactly the PRs that # broke IME code. The two signals are independent and both belong in the log. if: '!cancelled()' env: SKIP_BUILD: '1' run: pnpm run test:e2e:terminal-ime-native - name: Upload terminal IME evidence if: always() uses: actions/upload-artifact@v7 with: name: terminal-ime-evidence path: test-results/ retention-days: 7 if-no-files-found: ignore