fix(app): UX pass — layout, scroll, wrap, copy & design-slop cleanup #22
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: CI | |
| # Right-sized cross-platform CI for the Deckard virtual workspace. | |
| # | |
| # Why this shape: the GPUI app renders with Metal on macOS and wgpu/Vulkan on Linux, and the tray is | |
| # OS-specific (objc2 on macOS, GTK/appindicator on Linux) — THAT is what genuinely needs both OSes. | |
| # The headless crates (deckard-core / -contract / -signerd) are OS-independent, so we TEST them once | |
| # (Linux) and only BUILD + lint the app's macOS-specific path on macOS. Testing the same crypto/wire | |
| # logic twice buys nothing. | |
| # | |
| # quick (fmt, ~1 min) ──┬── linux : full build + clippy + test --workspace (+ anvil/Foundry) | |
| # ├── macos : build the shipping binaries + lint the macOS-only tray path | |
| # └── cargo-deny : supply-chain gate (non-blocking) | |
| # | |
| # The `quick` gate fails cheap on the most common trivial mistake (unformatted code) before the two | |
| # heavy runners ever spin up. | |
| # | |
| # COST: free on PUBLIC repos (the macOS 10x multiplier only bills PRIVATE repos). If you make this | |
| # repo private, add to the macos job: `if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/tags/v')`. | |
| # Don't switch to "*-large" runners — those are billed even on public repos. | |
| on: | |
| push: | |
| branches: [main] | |
| tags: ["v*"] | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| # Fail-fast gate: formatting is OS-independent, so check it once, fast, before the heavy builds. | |
| quick: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| # rustup (preinstalled) auto-installs the rust-toolchain.toml-pinned version + rustfmt on the | |
| # first cargo call. No build needed — `cargo fmt` only parses, so this is ~1 min. | |
| - run: cargo fmt --all --check | |
| # The full logic gate. Everything OS-independent (all crates' clippy + tests) runs here, once. | |
| linux: | |
| needs: quick | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| # The dep tree (gpui + Helios/revm/bls + the Railgun ZK tree) overflows the stock ubuntu | |
| # runner's ~14 GB and OOMs the build / cache-save. Reclaim ~20 GB of preinstalled toolchains we | |
| # never use, first. (macOS runners have the headroom, so this is Linux-only.) | |
| - name: Free up disk space | |
| run: | | |
| sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc \ | |
| /opt/hostedtoolcache/CodeQL /usr/local/share/boost || true | |
| sudo docker image prune --all --force >/dev/null 2>&1 || true | |
| df -h / | |
| # System libraries GPUI needs on Linux (X11 + Wayland + Vulkan + fonts), plus GTK/appindicator | |
| # + libxdo for the optional tray feature (tray-icon/muda link against libxdo). | |
| - name: Install system dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends \ | |
| build-essential pkg-config \ | |
| libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev \ | |
| libwayland-dev libxkbcommon-dev \ | |
| libvulkan-dev \ | |
| libfontconfig1-dev libfreetype6-dev \ | |
| libssl-dev \ | |
| libgtk-3-dev libayatana-appindicator3-dev libxdo-dev | |
| # Foundry (anvil) for the deckard-signerd broadcast integration tests. Pass GITHUB_TOKEN so the | |
| # release-tag fetch is authenticated — the unauthenticated path hits a 403 API rate-limit. | |
| - uses: foundry-rs/foundry-toolchain@v1 | |
| with: | |
| token: ${{ github.token }} | |
| # --locked everywhere: reproducibility lives in the committed Cargo.lock (exact git pins). | |
| - run: cargo build --locked --workspace | |
| - run: cargo build --locked -p deckard-app --features tray | |
| - run: cargo test --locked --workspace | |
| - run: cargo clippy --locked --workspace --all-targets -- -D warnings | |
| - run: cargo clippy --locked -p deckard-app --all-targets --features tray -- -D warnings | |
| # Cross-platform compile proof. The app (Metal renderer) + the macOS-only objc2 tray are the only | |
| # things that genuinely need macOS coverage, and that's a compile/link concern, not a logic one | |
| # (logic is tested on Linux). So we build the two shipping binaries and lint the macOS-only tray | |
| # path — no redundant tests, and no Foundry (the anvil tests run on Linux; this also removes the | |
| # GitHub-API 403 flake from the 10x-billed runner). | |
| macos: | |
| needs: quick | |
| runs-on: macos-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: Swatinem/rust-cache@v2 | |
| - run: cargo build --locked -p deckard-app -p deckard-signerd | |
| - run: cargo build --locked -p deckard-app --features tray | |
| - run: cargo clippy --locked -p deckard-app --all-targets --features tray -- -D warnings | |
| # Supply-chain gate (advisories / licenses / bans / sources). Config: deny.toml. NON-BLOCKING | |
| # (continue-on-error) until the license allow-list is seeded from a local `cargo deny check | |
| # licenses` and the unmaintained-transitive advisories are triaged — then drop continue-on-error. | |
| # Rationale: docs/AGENTIC-ENGINEERING.md §4. | |
| cargo-deny: | |
| needs: quick | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: EmbarkStudios/cargo-deny-action@v2 | |
| with: | |
| command: check advisories bans sources licenses |